忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【Vagrant】Packerでboxファイルの作成

以前、vagrantの初歩的な使い方について記事を挙げましたが、その際に利用したBoxファイルはvagrantboxからダウンロードしていました。

mktktmr.hatenablog.jp

今回は他人が作ったBoxファイルを拝借していたのを、自作にしようというのが趣旨です。

環境

Packerの入手

Boxファイルを作成するツールは幾つかあるみたいですが、一番メジャーそうなPackerを使います。

Packer by HashiCorp

公式サイトからツールをダウンロードしてきます。

ダウンロードしたファイル(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.jsonubuntu.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仮想マシン起動

$ 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

うまく起動したでしょうか?

f:id:mktktmr:20160406192511p:plain

Boxファイルを自作しておけば、中身が分かるし、Boxファイルを余所からダウンロードする時間も省けるため、Boxファイルの登録が気軽にできて良いかと思います。

参考

Appendix B. Automating the installation using preseeding

Packerをつかって3ステップでVagrantのBoxを作る - Qiita

PreseedによるUbuntuの自動インストール入門 - Qiita

日本人向け Packer スクリプト差分 for Ubuntu Trusty - 来年読む。

「Packer」でDocker用のイメージファイルを作ってみよう - さくらのナレッジ

Packerを使ったISOイメージからの仮想マシン自動デプロイ - さくらのナレッジ