vagrantとpakcerでシリアルコンソールを有効化したイメージを作成する

スポンサード リンク

いちいちvirshでKVMの仮想マシンを管理したくない。 だからvagrantで楽をしたい。

でも,仮想マシンのネットワークが壊れたときのために, virsh console でシリアルコンソールの操作はしたい。 vagrant-libvirtのイメージでシリアルコンソール対応のイメージはなさそう。

自分で作るにしても,vagrantのイメージ作成はめんどくさい。 だからpackerで楽をしたい。

ということで,packerを使ってシリアルコンソール対応のUbuntuイメージを作成したのでやり方をメモしておく。

作成したpakcerスクリプトは tsuyukusa/libvirt-packer-scripts として公開したので,単に使うだけならば,次のように git clone して pakcer build すればよい。

git clone https://github.com/nrclark/libvirt-packer-scripts.git
cd libvirt-packer-scripts/ubuntu-16.40
packer build ubuntu-16.04-minimal.json

環境

  • Ubuntu Xenial

    • Vagrant 1.9.3
    • vagrant-libvirt 0.0.37
    • Packer 1.0.0

環境構築

# install kvm
sudo apt-get install kvm libvirt-bin virtinst bridge-utils

# install vagrant
wget https://releases.hashicorp.com/vagrant/1.9.3/vagrant_1.9.3_x86_64.deb
sudo dpkg -i vagrant_1.9.3_x86_64.deb
rm -f vagrant_1.9.3_x86_64.deb

# install vagrant-libvirt
sudo apt-get install libxslt-dev libxml2-dev libvirt-dev zlib1g-dev
vagrant plugin install vagrant-libvirt

# install vagrant-mutate
vagrant plugin install vagrant-mutate

# install packer
wget https://releases.hashicorp.com/packer/1.0.0/packer_1.0.0_linux_amd64.zip
unzip packer_1.0.0_linux_amd64.zip
sudo mv pakcer /usr/local/bin/

packerスクリプトの作成

最初に,ベースとするvagrant-libvirt用のpakcerスクリプトをクローンする。

git clone https://github.com/nrclark/libvirt-packer-scripts.git
cd libvirt-packer-scripts.

シリアルコンソールを有効化するスクリプトを作る

pakcerの仕組みは単純で,ハイパーバイザを起動してスクリプトを実行し,完成したイメージを保存するだけ。 今回はシリアルコンソールを有効化するため,以下の内容で scripts/console.sh を作成する。

#!/bin/sh -eux

# Add Console Support to the Ubuntu image

ubuntu_version="`lsb_release -r | awk '{print $2}'`";
ubuntu_major_version="`echo $ubuntu_version | awk -F. '{print $1}'`";

cat <<EOF >/etc/init/ttyS0.conf
start on stopped rc RUNLEVEL=[12345]
stop on runlevel [!12345]

respawn
exec /sbin/getty -L 115200 ttyS0 vt102
EOF

current_line='GRUB_CMDLINE_LINUX="'
modified_line='GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0, 115200n8 "'
sed -i "s/^$current_line/$modified_line/" /etc/default/grub

スクリプトの実行を指定する

次に, console.sh を実行するため ubuntu-16.04-minimal.json を次のように編集する。 network.shGRUB_CMD_LINE_LINUX の内容を上書きするため,それよりも後に console.sh を記述すること。

ついでにisoファイルのURLが403になっていたので,修正を加えた。

diff --git a/ubuntu-16.04/ubuntu-16.04-minimal.json b/ubuntu-16.04/ubuntu-16.04-minimal.json
index 733754b..9185a4a 100644
--- a/ubuntu-16.04/ubuntu-16.04-minimal.json
+++ b/ubuntu-16.04/ubuntu-16.04-minimal.json
@@ -10,8 +10,8 @@
             "accelerator": "kvm",
             "headless": true,
             "disk_size": "{{user `disk_size`}}",
-            "iso_url": "http://releases.ubuntu.com/16.04/ubuntu-16.04-server-amd64.iso",
-            "iso_checksum": "23e97cd5d4145d4105fbf29878534049",
+            "iso_url": "http://releases.ubuntu.com/16.04/ubuntu-16.04.2-server-amd64.iso",
+            "iso_checksum": "2bce60d18248df9980612619ff0b34e6",
             "iso_checksum_type": "md5",
             "http_directory": "http",
             "ssh_username": "vagrant",
@@ -46,6 +46,7 @@
                 "scripts/update.sh",
                 "scripts/vagrant.sh",
                 "scripts/network.sh",
+                "scripts/console.sh",
                 "scripts/shrink.sh"
             ]
         }

packerでイメージをビルドする

packer build ubuntu-16.04-minimal.json

を実行してしばらく待っていると, output/xenial64-minimal-libvirt.box が生成される。

vagrant box add output/xenial64-minimal-libvirt.box

で追加すれば利用できるようになる。

Comments !

social