【Vagrant】Packerでboxファイルの作成
以前、vagrantの初歩的な使い方について記事を挙げましたが、その際に利用したBoxファイルはvagrantboxからダウンロードしていました。
今回は他人が作ったBoxファイルを拝借していたのを、自作にしようというのが趣旨です。
環境
- OS X 10.10.5
- Vagrant 1.8.1
- VirtualBox 5.0.16
- Packer 0.10.0
Packerの入手
Boxファイルを作成するツールは幾つかあるみたいですが、一番メジャーそうなPackerを使います。
公式サイトからツールをダウンロードしてきます。
ダウンロードしたファイル(packer_0.10.0_darwin_amd64.zip)を解凍すると"packer"になります。
自分は上記pakerを"/usr/local/bin/"ディレクトリに移動しました。
テンプレートの入手
一からBoxファイルのテンプレート(設定ファイル)を作成するのは大変なためboxcutterからテンプレートを入手します。
今回はUbuntuのBoxファイルを作るので、Ubuntuのリポジトリをgitクローンしておきます。
テンプレートの設定値を変えることで、作成する仮想マシンのディスク容量やメモリ量、ISOファイルのダウンロード先などを変更できますが、今回はいじらず、デフォルトで作成します。
$ git clone https://github.com/boxcutter/ubuntu.git Cloning into 'ubuntu'... remote: Counting objects: 1790, done. remote: Compressing objects: 100% (13/13), done. remote: Total 1790 (delta 3), reused 0 (delta 0), pack-reused 1776 Receiving objects: 100% (1790/1790), 323.25 KiB | 21.00 KiB/s, done. Resolving deltas: 100% (1178/1178), done. Checking connectivity... done. $ cd ubuntu $ ls -la -rw-r--r-- 1 hoge staff 9630 3 21 03:04 ubuntu1510.json -rw-r--r-- 1 hoge staff 421 3 21 03:04 ubuntu1404.json -rw-r--r-- 1 hoge staff 544 3 21 03:04 ubuntu1404-i386.json -rw-r--r-- 1 hoge staff 455 3 21 03:04 ubuntu1404-docker.json -rw-r--r-- 1 hoge staff 421 3 21 03:04 ubuntu1204.json -rw-r--r-- 1 hoge staff 544 3 21 03:04 ubuntu1204-i386.json -rw-r--r-- 1 hoge staff 455 3 21 03:04 ubuntu1204-docker.json -rw-r--r-- 1 hoge staff 547 3 21 03:04 ubuntu1204-desktop.json drwxr-xr-x 6 hoge staff 204 3 21 03:04 tpl drwxr-xr-x 5 hoge staff 170 3 21 03:04 test drwxr-xr-x 14 hoge staff 476 3 21 03:04 script drwxr-xr-x 5 hoge staff 170 3 21 03:04 floppy -rw-r--r-- 1 hoge staff 218 3 21 03:04 custom-script.sh drwxr-xr-x 10 hoge staff 340 3 21 03:04 bin -rw-r--r-- 1 hoge staff 7 3 21 03:04 VERSION -rw-r--r-- 1 hoge staff 8381 3 21 03:04 README.md -rw-r--r-- 1 hoge staff 4170 3 21 03:04 Makefile -rw-r--r-- 1 hoge staff 11335 3 21 03:04 LICENSE -rw-r--r-- 1 hoge staff 4528 3 21 03:04 CHANGELOG.md -rw-r--r-- 1 hoge staff 887 3 21 03:04 AUTHORS drwxr-xr-x 2 hoge staff 68 3 23 07:29 tmp -rw-r--r-- 1 hoge staff 8580 3 23 19:08 ubuntu.json drwxr-xr-x 6 hoge staff 204 3 25 21:41 iso drwxr-xr-x 3 hoge staff 102 3 25 21:46 packer_cache drwxr-xr-x 6 hoge staff 204 3 25 21:50 http -rw-r--r-- 1 hoge staff 565 3 27 10:48 ubuntu1404-desktop.json drwxr-xr-x 5 hoge staff 170 3 27 15:26 box
boxファイルの作成
packer buildでbuildを実行。
boxcutterのテンプレートはpacker buildの-var-fileオプションで設定するテンプレートを組み合わせることで、 様々なOSバージョンやアーキテクチャに対応できるように構成されています。
今回はUbuntu14.04のデスクトップ版のBoxファイルを作成するため、ubuntu1404-desktop.jsonとubuntu.jsonを組み合わせてbuildします。
ちなみに、packer buildはISOファイルのダウンロードなどあるためかなり時間がかかります(1時間くらい)。
気長に待ちましょう。
# 今回作成するBoxファイルはVirtualBox向けのものだけなので、オプションに-only=virtualbox-isoを設定しています $ packer build -only=virtualbox-iso -var-file=ubuntu1404-desktop.json ubuntu.json virtualbox-iso output will be in this color. ==> virtualbox-iso: Downloading or copying Guest additions virtualbox-iso: Downloading or copying: file:///Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso ==> virtualbox-iso: Downloading or copying ISO virtualbox-iso: Downloading or copying: file:///Users/hoge/Documents/ubuntu-14.04.4-server-amd64.iso ==> virtualbox-iso: Creating floppy disk... virtualbox-iso: Copying: http/preseed.cfg ==> virtualbox-iso: Creating virtual machine... ==> virtualbox-iso: Creating hard drive... ==> virtualbox-iso: Attaching floppy disk... ==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 2590) ==> virtualbox-iso: Executing custom VBoxManage commands... virtualbox-iso: Executing: modifyvm ubuntu1404-desktop --memory 2048 virtualbox-iso: Executing: modifyvm ubuntu1404-desktop --cpus 1 ==> virtualbox-iso: Starting the virtual machine... ==> virtualbox-iso: Waiting 10s for boot... ==> virtualbox-iso: Typing the boot command... ==> virtualbox-iso: Waiting for SSH to become available... ==> virtualbox-iso: Connected to SSH! ==> virtualbox-iso: Uploading VirtualBox version info (5.0.16) ==> virtualbox-iso: Uploading VirtualBox guest additions ISO... ==> virtualbox-iso: Provisioning with shell script: script/update.sh virtualbox-iso: ==> Disabling the release upgrader virtualbox-iso: ==> Updating list of repositories virtualbox-iso: Ign http://us.archive.ubuntu.com trusty InRelease virtualbox-iso: Hit http://security.ubuntu.com trusty-security InRelease virtualbox-iso: Hit http://us.archive.ubuntu.com trusty-updates InRelease #〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(中略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 virtualbox-iso: 0 upgraded, 1296 newly installed, 0 to remove and 26 not upgraded. virtualbox-iso: Need to get 549 MB of archives. virtualbox-iso: After this operation, 2,093 MB of additional disk space will be used. virtualbox-iso: Get:1 http://us.archive.ubuntu.com/ubuntu/ trusty/main libavahi-common-data amd64 0.6.31-4ubuntu1 [21.2 kB] virtualbox-iso: Get:2 http://us.archive.ubuntu.com/ubuntu/ trusty/main libavahi-common3 amd64 0.6.31-4ubuntu1 [21.7 kB] virtualbox-iso: Get:3 http://us.archive.ubuntu.com/ubuntu/ trusty/main libavahi-client3 amd64 0.6.31-4ubuntu1 [25.1 kB] virtualbox-iso: Get:4 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main libcups2 amd64 1.7.2-0ubuntu1.7 [179 kB] virtualbox-iso: Get:5 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main libcupsmime1 amd64 1.7.2-0ubuntu1.7 [12.1 kB] virtualbox-iso: Get:6 http://us.archive.ubuntu.com/ubuntu/ trusty/main libpaper1 amd64 1.1.24+nmu2ubuntu3 [13.4 kB] #〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(中略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 virtualbox-iso: Get:1292 http://us.archive.ubuntu.com/ubuntu/ trusty/main unity-lens-friends amd64 0.1.3+14.04.20140317-0ubuntu1 [22.9 kB] virtualbox-iso: Get:1293 http://us.archive.ubuntu.com/ubuntu/ trusty/main unity-scope-gdrive all 0.9+13.10.20130723-0ubuntu1 [11.6 kB] virtualbox-iso: Get:1294 http://us.archive.ubuntu.com/ubuntu/ trusty/main usb-modeswitch-data all 20140327-1 [27.0 kB] virtualbox-iso: Get:1295 http://us.archive.ubuntu.com/ubuntu/ trusty/main usb-modeswitch amd64 2.1.1+repack0-1ubuntu1 [50.0 kB] virtualbox-iso: Get:1296 http://us.archive.ubuntu.com/ubuntu/ trusty/main xfonts-mathml all 6ubuntu1 [42.5 kB] virtualbox-iso: [sudo] password for vagrant: debconf: unable to initialize frontend: Dialog virtualbox-iso: debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.) virtualbox-iso: debconf: falling back to frontend: Readline virtualbox-iso: debconf: unable to initialize frontend: Readline virtualbox-iso: debconf: (This frontend requires a controlling tty.) virtualbox-iso: debconf: falling back to frontend: Teletype virtualbox-iso: dpkg-preconfigure: unable to re-open stdin: virtualbox-iso: Fetched 549 MB in 34min 7s (268 kB/s) virtualbox-iso: Selecting previously unselected package libavahi-common-data:amd64. virtualbox-iso: (Reading database ... 61160 files and directories currently installed.) virtualbox-iso: Preparing to unpack .../libavahi-common-data_0.6.31-4ubuntu1_amd64.deb ... virtualbox-iso: Unpacking libavahi-common-data:amd64 (0.6.31-4ubuntu1) ... #〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜(中略)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 virtualbox-iso: zenity-common install virtualbox-iso: zip install virtualbox-iso: zlib1g:amd64 install virtualbox-iso: ==> Clearing last login information virtualbox-iso: 118528559+0 records in virtualbox-iso: 118528559+0 records out virtualbox-iso: 121373244416 bytes (121 GB) copied, 438.839 s, 277 MB/s virtualbox-iso: 189341+0 records in virtualbox-iso: 189341+0 records out virtualbox-iso: 193885184 bytes (194 MB) copied, 0.553525 s, 350 MB/s virtualbox-iso: ==> Clear out swap and disable until reboot virtualbox-iso: dd: error writing ‘/dev/dm-1’: No space left on device virtualbox-iso: 2049+0 records in virtualbox-iso: 2048+0 records out virtualbox-iso: 2147483648 bytes (2.1 GB) copied, 3.58726 s, 599 MB/s virtualbox-iso: dd exit code 1 is suppressed virtualbox-iso: mkswap: /dev/dm-1: warning: don't erase bootbits sectors virtualbox-iso: on whole disk. Use -f to force. virtualbox-iso: Setting up swapspace version 1, size = 2097148 KiB virtualbox-iso: no label, UUID=a02f609d-1d2e-4086-8ed6-b3c1340a89cc virtualbox-iso: dd: error writing ‘/EMPTY’: No space left on device virtualbox-iso: 122139+0 records in virtualbox-iso: dd exit code 1 is suppressed virtualbox-iso: 122138+0 records out virtualbox-iso: 128071041024 bytes (128 GB) copied, 292.316 s, 438 MB/s virtualbox-iso: ==> Disk usage before cleanup virtualbox-iso: Filesystem Size Used Avail Use% Mounted on udev 990M 4.0K 990M 1% /dev tmpfs 201M 476K 200M 1% /run /dev/mapper/vagrant--vg-root 123G 3.4G 114G 3% / none 4.0K 0 4.0K 0% /sys/fs/cgroup none 5.0M 0 5.0M 0% /run/lock none 1001M 0 1001M 0% /run/shm none 100M 0 100M 0% /run/user /dev/sda1 236M 39M 185M 18% /boot virtualbox-iso: ==> Disk usage after cleanup virtualbox-iso: Filesystem Size Used Avail Use% Mounted on virtualbox-iso: udev 990M 8.0K 990M 1% /dev virtualbox-iso: tmpfs 201M 476K 200M 1% /run virtualbox-iso: /dev/mapper/vagrant--vg-root 123G 3.4G 114G 3% / virtualbox-iso: none 4.0K 0 4.0K 0% /sys/fs/cgroup virtualbox-iso: none 5.0M 0 5.0M 0% /run/lock virtualbox-iso: none 1001M 0 1001M 0% /run/shm virtualbox-iso: none 100M 0 100M 0% /run/user virtualbox-iso: /dev/sda1 236M 39M 185M 18% /boot ==> virtualbox-iso: Gracefully halting virtual machine... virtualbox-iso: Removing floppy drive... ==> virtualbox-iso: Preparing to export machine... virtualbox-iso: Deleting forwarded port mapping for the communicator (SSH, WinRM, etc) (host port 2590) ==> virtualbox-iso: Exporting virtual machine... virtualbox-iso: Executing: export ubuntu1404-desktop --output output-ubuntu1404-desktop-virtualbox-iso/ubuntu1404-desktop.ovf ==> virtualbox-iso: Unregistering and deleting virtual machine... ==> virtualbox-iso: Running post-processor: vagrant ==> virtualbox-iso (vagrant): Creating Vagrant box for 'virtualbox' provider virtualbox-iso (vagrant): Copying from artifact: output-ubuntu1404-desktop-virtualbox-iso/ubuntu1404-desktop-disk1.vmdk virtualbox-iso (vagrant): Copying from artifact: output-ubuntu1404-desktop-virtualbox-iso/ubuntu1404-desktop.ovf virtualbox-iso (vagrant): Renaming the OVF to box.ovf... virtualbox-iso (vagrant): Using custom Vagrantfile: tpl/vagrantfile-ubuntu1404-desktop.tpl virtualbox-iso (vagrant): Compressing: Vagrantfile virtualbox-iso (vagrant): Compressing: box.ovf virtualbox-iso (vagrant): Compressing: metadata.json virtualbox-iso (vagrant): Compressing: ubuntu1404-desktop-disk1.vmdk Build 'virtualbox-iso' finished. ==> Builds finished. The artifacts of successful builds are: --> virtualbox-iso: 'virtualbox' provider box: box/virtualbox/ubuntu1404-desktop-nocm-0.1.0.box
ここまででBoxファイルの作成は完了です。
box/virtualboxディレクトリ下に
ubuntu1404-desktop-nocm-0.1.0.boxというBoxファイルが出来上がっているはずなので、確認してみてください。
vagrantへのbox追加
これ以降は以前挙げたVagrantの使い方と同じなのですが、一応手順載せておきます。
作業は適当なディレクトリを掘って行ってください。
vagrant box addでboxファイルを登録
$ vagrant box add test box/virtualbox/ubuntu1404-desktop-nocm-0.1.0.box ==> box: Box file was not detected as metadata. Adding it directly... ==> box: Adding box 'test' (v0) for provider: box: Unpacking necessary files from: file:///Users/hoge/Documents/ubuntu/box/virtualbox/ubuntu1404-desktop-nocm-0.1.0.box ==> box: Successfully added box 'test' (v0) for 'virtualbox'!
Vagrantfileの作成
vagrant initでVagrantfaileファイルを生成
$ vagrant init test 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.
vagrantの実行
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'test2'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: ubuntu1404-desktop_default_1458702162155_73549 ==> 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: Running 'pre-boot' VM customizations... ==> 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: 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/hoge/Documents/vagrant/ubuntu1404-desktop
うまく起動したでしょうか?
Boxファイルを自作しておけば、中身が分かるし、Boxファイルを余所からダウンロードする時間も省けるため、Boxファイルの登録が気軽にできて良いかと思います。
参考
Appendix B. Automating the installation using preseeding
Packerをつかって3ステップでVagrantのBoxを作る - Qiita
PreseedによるUbuntuの自動インストール入門 - Qiita
日本人向け Packer スクリプト差分 for Ubuntu Trusty - 来年読む。