CentOS7 Minimal の ISO イメージファイルから Vagrant Box をスクラッチで作成する手順の記録ですの!最後には vagrant box add
、vagrant up
、vagrant ssh
、vagrant destroy
、と確認しております。
環境は Mac で、Vagrant のプロバイダーは VirtualBox ですわ♪
なお、次の書籍の手順を基盤としております。
- P104 6.5 スクラッチからの新しいボックスの生成
O’Reilly Japan – 実践 Vagrant
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
起動後、次のように設定しました。
- [Edit a connection]
- enp0s3 (NAT に対応)
- [IPv4 CONFIGURATION]
- [IPv6 CONFIGURATION]
- [X] Automatically connect
- [X] Available to all users
- [IPv4 CONFIGURATION]
その後、変更内容を仮想マシンへと反映しました。
# ネットワーク設定反映 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 install
やyum 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
再起動時にカーネルを選択するよう求められました。最新版(インストールした)を選択いたします。
- 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/
- 仮想マシンの設定 > ストレージ > 光学ドライブ > 仮想ドライブからディスクを除去
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 を作れるようにいたします♪
最後に、参考文献やページを再度まとめておきます!
- P104 6.5 スクラッチからの新しいボックスの生成
O’Reilly Japan – 実践 Vagrant - Creating a Base Box – Vagrant by HashiCorp
- vagrant + CentOS7で開発環境を作る – Qiita
- CentOS7.0をvagrant用にbox化するメモ – hao’s work log
- CentOS7.1にてVagrant Base Boxを作成する – とあるエンジニアの技術メモ
以上です。