カテゴリー
コンピューター

【Vagrant】【CentOS7 Minimal】スクラッチからの新しいボックスの生成

CentOS7 Minimal の ISO イメージファイルから Vagrant Box をスクラッチで作成する手順の記録ですの!最後には vagrant box addvagrant upvagrant sshvagrant destroy、と確認しております。

環境は Mac で、Vagrant のプロバイダーは VirtualBox ですわ♪

なお、次の書籍の手順を基盤としております。

1. VirtualBox の仮想マシンの作成

  • Download CentOS から、CentOS-7-x86_64-Minimal-1511.iso をダウンロード
  • 仮想マシンの名前: CentOS-7-64-Minimal
  • 動的なサイズのドライブを使い、ディスクの領域には余裕を持たせて、40 から 100GB 程度で始めるのが よいでしょう。
    → デフォルトのままにした。可変サイズのストレージ、仮想的なサイズは 8 GB
  • デフォルトのメモリ割り当てを多め にしすぎないようにしましょう。
    → デフォルトのままにした。メモリは 768 MB
  • オーディオや USB、あるいはその他の不要な周辺機器のコントローラを 無効にしておきます。
    → 仮想マシンの設定(なお、オーディオ、USB の設定は、仮想マシン作成後に変更可能だった。)

    • システム > マザーボード > 起動順序: [フロッピー] のチェックを外す
    • オーディオ > [オーディオを有効化] のチェックを外す
    • USB > [USB コントローラーを有効化] のチェックを外す

2. 仮想マシンの基本的な設定

を参考にネットワーク設定を行い、進めました♪

# NAT ネットワーク設定
nmtui

起動後、次のように設定しました。

  1. [Edit a connection]
  2. enp0s3 (NAT に対応)
    • [IPv4 CONFIGURATION]
    • [IPv6 CONFIGURATION]
    • [X] Automatically connect
    • [X] Available to all users

その後、変更内容を仮想マシンへと反映しました。

# ネットワーク設定反映
systemctl restart NetworkManager

基本的な設定の最後として、パッケージのアップデートをいたしました。

# アップデート
yum update -y

3. 仮想マシンのオペレーティングシステムの設定

3-1. ポイント

  • Vagrant という SSH のデフォルトのユーザーを作成
  • SSH サーバーがインストールされて、システムの起動時に適切に立ち上がる
  • Vagrant に含まれている insecure private key を使って SSH のユーザーが認証されるように設定
  • SSH をユーザーは、パスワードなしで sudo を実行できる権限を持っていなければならない。sudoの設定をする際には、requirettyも必ず無効にする。
  • SSH を微調整して UseDNS を no に

3-2.Vagrant という SSH のデフォルトのユーザーを作成

# Vagrant ユーザー作成
# パスワードも vagrant とすること
useradd vagrant
passwd vagrant

3-3.SSH サーバーがインストールされて、システムの起動時に適切に立ち上がる

確認するコマンドを見つけるのに、上記ページが参考になりました。

# SSH のインストール確認
systemctl status sshd.service
# SSH の OS 起動時設定確認
systemctl list-unit-files -t service | grep sshd.service

3-4. Vagrant に含まれている insecure private key を使って SSH のユーザーが認証されるように設定

su - vagrant
mkdir ~/.ssh
chmod 700 ~/.ssh
curl -L -o ~/.ssh/authorized_keys  https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub
chmod 600 ~/.ssh/authorized_keys
chown -R vagrant ~/.ssh

3-5. SSH をユーザーは、パスワードなしで sudo を実行できる権限を持っていなければならない。sudoの設定をする際には、requirettyも必ず無効にする。

# sudo 設定
visudo
# Defaults    requiretty  # この行をコメントアウト

root    ALL=(ALL)   ALL
vagrant ALL=(ALL)   NOPASSWD:ALL  # この行を追記

3-6. SSH を微調整して UseDNS を no に

UseDNS no # UseDNS yes の行を修正して明示的に no を指定

4. VirtualBox Guest Additions のインストール

4-1. ポイント

  • VirtualBox に付属している VirtualBox Guest Additions を仮想マシンにインストールする。
  • インストールするにはコンパイラを仮想マシンにインストールする必要がある。
  • インストール時にエラーが発生するので、表示されるエラーメッセージにしたがって対処する。
  • エラー対処のポイント、概要
    • yum update を作業前に行っておき、uname -r のバージョンと yum install kernel-devel でインストールしたカーネルのバージョンと合わせておく。
    • yum installyum update したら仮想マシンを先起動する。
    • エラーで、無い、と言われたファイルをコピー。cp /usr/include/linux/version.h /lib/modules/3.10.0-327.13.1.el7.x86_64/build/include/linux/version.h

なお、この時の試行錯誤の詳細は、次のページでまとめております。

4-2. 実際の手順

まずは準備として、コンパイラを導入します。

# 準備。必要なパッケージを導入
yum update
yum install bzip2 gcc kernel-devel
reboot

再起動時にカーネルを選択するよう求められました。最新版(インストールした)を選択いたします。

  1. VirtualBox VM のメニューバーから、Devices > insert Guest Additions CD image…

で仮想マシンへ CD イメージを入れます。

そして、仮想マシンで root ユーザーで次の操作を行います。

# 実行。VirtualBox Guest Additions のインストール
mount /dev/cdrom /mnt
sh /mnt/VBoxLinuxAdditions.run

進捗を確認しますと、エラーとなっております><。

こちらのページの内容で解決できました。無いと言われたファイルをコピーし、再度コマンド実行で最後まで進むことができました♪

cp /usr/include/linux/version.h /lib/modules/3.10.0-327.13.1.el7.x86_64/build/include/linux/version.h

最後に、Guest Additions CD image をアンマウントし、仮想マシンから取り出します。

umount /mnt/
  1. 仮想マシンの設定 > ストレージ > 光学ドライブ > 仮想ドライブからディスクを除去

5. 仮想マシンの udev ルールの削除

永続的なネットワークデバイスの udev に関するルールがあるために Linux ベースのボックスがブートに失敗するそうです。
この問題を回避するに、すべての persistent-net ルールを削除いたします。

ところが事前に確認したところ、違う気がいたしましたので止めてしまいました。

# ll /etc/udev/rules.d/
total 4
-rw-r--r--. 1 root root 134 May  4 11:-6 60-vboxadd.rules

6. 最終的なボックスのサイズの最小化

下位のディスクにおけるフラグメンテーションの問題が解決され、後で行う圧縮の効率がよくなるそうなので、仮想ハードディスクをゼロで埋めて、ゼロで埋まったファイルを削除します。

# 不要となるログや一時ファイルを削除
yum clean all
rm -rf /tmp/*
rm -rf /var/log/*
rm -rf /var/tmp/*
rm -rf /usr/local/src/*
# 仮想ハードディスクをゼロ゙埋めし、ゼロで埋まったファイルを削除
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
# 最初化終了したのでシャットダウン
shutdown -h now

7. パッケージ化。VirtualBox の仮想マシンを Vagrant のボックスファイルに変換

# Vagrant ボックスファイル生成(引数は、VirtualBox の GUI での仮想マシンの名前)
vagrant package --base CentOS-7-64-Minimal

実際の様子

$ vagrant package --base CentOS-7-64-Minimal
==> CentOS-7-64-Minimal: Exporting VM...
==> CentOS-7-64-Minimal: Compressing package to: /Users/oki2a24/vagrant_create_box/package.box
$ ls
package.box

8. Vagrant Box の動作確認

# ボックスを追加
vagrant box add --name CentOS-7-64-Minimal package.box
# ボックスの確認
vagrant box list
# 別のディレクトリで Box を起動してみて確認
mkdir test
cd test/
vagrant init CentOS-7-64-Minimal
vagrant up
vagrant ssh
vagrant destroy

実際の様子

$ vagrant box add --name CentOS-7-64-Minimal package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS-7-64-Minimal' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/oki2a24/vagrant_create_box/package.box
==> box: Successfully added box 'CentOS-7-64-Minimal' (v0) for 'virtualbox'!
$ vagrant box list
CentOS-7-64-Minimal (virtualbox, 0)
$
$ mkdir test
$ cd test/
$ vagrant init CentOS-7-64-Minimal
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$ vim Vagrantfile
$
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS-7-64-Minimal'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: test_default_1462346779575_46392
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/oki2a24/vagrant_create_box/test
$ vagrant ssh
[vagrant@localhost ~]$ ログアウト
Connection to 127.0.0.1 closed.
$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
$

おわりに

これで、開発環境のベースとなる最小限の OS の Vagrant Box を作れるようになりました♪

今度は、これをベースに開発したい種類に合わせてさらに Vagrant Box を作れるようにいたします♪

最後に、参考文献やページを再度まとめておきます!

以上です。

コメントを残す