Wakame-VDC のマシンイメージを作ってみる
これは Wakame-vdc / OpenVNet Advent Calendar 2014 3日目の投稿です。
昨日は @giraffeforestg さんの「2014年に書いたWakame-vdc/OpenVNetのblogを振り返ってみる」でした。
今日は「ぶっつけ本番で Wakame-VDC のマシンイメージを作ってみよう」です。
今まで中身が気になっていましたが、実は Wakame-VDC のマシンイメージの中身をちゃんと見たことありませんでした。もちろん作ってみたことも。ただ、前にあくしゅの山崎さんに「AWS で動くイメージなら動くよ」って言われたような言われてないような…もしかしたら酔って幻聴を聴いただけかもしれませんが、とりあえず「API だけ互換の Eucalyptus、API 以外は互換もする Wakame-VDC」って昔に言われた気がするので、ぶっつけ本番でマシンイメージを作っても何とかなるだろう?と始めたいと思います。(長い導入だ…)
で、いくら「ぶっつけ本番」とは言え、少しは事前知識を得たいので Wakame-VDC の既存のマシンイメージを見てみることにします。ってことで、調査対象はよくデモ環境とかで利用する ubuntu-lucid-kvm-md-32.raw.gz を開きます。
# gunzip ubuntu-lucid-kvm-md-32.raw.gz
すると ubuntu-lucid-kvm-md-32.raw っていうファイルが解凍されるので、このファイルをおもむろに file コマンドで見ます。
# file ubuntu-lucid-kvm-md-32.raw
ubuntu-lucid-kvm-md-32.raw: x86 boot sector
おんやぁ? AWS 的なフラットファイルを期待したんですが、どうやらこれはパーティションを含んでいる予感がするので、fdisk コマンドで見てみます。(ところで AWS のマシンイメージって今もフラットファイルなんすかね?)
# fdisk -l ubuntu-lucid-kvm-md-32.raw
Disk ubuntu-lucid-kvm-md-32.raw: 657 MB, 657457152 bytes
4 heads, 32 sectors/track, 10032 cylinders, total 1284096 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/ptimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e8e0
Device Boot Start End Blocks Id System
ubuntu-lucid-kvm-md-32.raw1 63 974609 487273+ 83 Linux
ubuntu-lucid-kvm-md-32.raw2 974848 1224703 124928 82 Linux swap / Solaris
ということで、2つのパーティションを含んでいました。1つ目は Linux パーティションで、2つ目は swap パーティションです。 となると、次にやることは1つ目のパーティションの中身を見ることです。
# mkdir -p ./raw
# mount -o loop,offset=$(( 63 * 512 )) ubuntu-lucid-kvm-md-32.raw ./raw/
ってやってマウントすると中身が見れます。
# ls -al ./raw/
total 49
drwxr-xr-x 21 root root 1024 Jul 17 2012 .
drwxr-xr-x 6 root root 600 Dec 3 00:11 ..
drwxr-xr-x 2 root root 3072 Jul 17 2012 bin
drwxr-xr-x 3 root root 1024 Jul 17 2012 boot
drwxr-xr-x 4 root root 3072 Jul 17 2012 dev
drwxr-xr-x 54 root root 5120 Jul 26 2012 etc
drwxr-xr-x 3 root root 1024 Jul 17 2012 home
lrwxrwxrwx 1 root root 37 Jul 17 2012 initrd.img -> boot/initrd.img-2.6.32-41-generic-pae
drwxr-xr-x 13 root root 7168 Jul 17 2012 lib
drwx------ 2 root root 12288 Jul 17 2012 lost+found
drwxr-xr-x 2 root root 1024 Jul 17 2012 media
drwxr-xr-x 2 root root 1024 Apr 23 2010 mnt
drwxr-xr-x 2 root root 1024 Jul 17 2012 opt
drwxr-xr-x 2 root root 1024 Apr 23 2010 proc
drwx------ 2 root root 1024 Jul 17 2012 root
drwxr-xr-x 2 root root 4096 Jul 17 2012 sbin
drwxr-xr-x 2 root root 1024 Dec 6 2009 selinux
drwxr-xr-x 2 root root 1024 Jul 17 2012 srv
drwxr-xr-x 2 root root 1024 Mar 30 2010 sys
drwxrwxrwt 2 root root 1024 Jul 17 2012 tmp
drwxr-xr-x 10 root root 1024 Jul 17 2012 usr
drwxr-xr-x 13 root root 1024 Jul 17 2012 var
lrwxrwxrwx 1 root root 34 Jul 17 2012 vmlinuz -> boot/vmlinuz-2.6.32-41-generic-pae
で、これまたおもむろに勘で rc.local を覗いてみると
# cat ./raw/etc/rc.local
/etc/wakame-init md
exit 0
起動処理の最後で wakame-init っていうコマンドを実行しています。これ何だ?と思い…
# file ./raw/etc/wakame-init
./raw/etc/wakame-init: Bourne-Again shell script, ASCII text executable
確認するとシェルスクリプトです。中身を見たところ、Wakame-VDC テイストではあるものの、IaaS のインスタンスには必要不可欠な処理が書かれていました。さしずめ Wakame-VDC 版 cloud-init という感じでしょうか。
で、github から元になるスクリプトを持ってきてもいいんですが、とりあえず手抜きでこのスクリプトを流用することにしました。ちなみに他に wakame を冠したファイルやディレクトリが無いかを見てみましたが、どうやらこの wakame-init だけのようです。(他の名前で何かあるかもしれないけど、未調査)
# cp ./raw/etc/wakame-init /tmp/
# find ./raw/|grep wakame
./raw/etc/wakame-init
さて次にマシンイメージを作りますが、いちから OS のインストールとかをやってもいいんですがそこは時間ないので割愛します。代わりに既存の Eucalyptus 用のマシンイメージを流用します。
# wget http://eucalyptus.machine-image.com/downloads/euca-large-gentoo-2012.07.19-x86_64.tgz
# tar -xzSf euca-large-gentoo-2012.07.19-x86_64.tgz
# file euca-large-gentoo-2012.07.19-x86_64/euca-large-gentoo-2012.07.19-x86_64.img
euca-large-gentoo-2012.07.19-x86_64/euca-large-gentoo-2012.07.19-x86_64.img: ReiserFS V3.6
上記のようにマシンイメージをダウンロードして展開します。そう、Eucalyptus 2.x 系の頃のマシンイメージなのでフラットファイルなんです。なのでこれをパーティション含みのファイルに変換します。(大人の事情で細かい説明は端折ります)
# mkdir -p ./{base,new}_img
# mount -o loop,ro euca-large-gentoo-2012.07.19-x86_64/euca-large-gentoo-2012.07.19-x86_64.img ./base_img/
# df -h
Filesystem Size Used Avail Use% Mounted on
dev/loop1 4.5G 2.7G 1.9G 59% /mnt/sda6/base_img
(使用サイズが 2.7GB なので、とりあえず 4GB の空ファイルを作成する)
# truncate -s 4GB euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
(作成した空ファイルをループバックデバイスに結びつける)
# losetup -f --show euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
/dev/loop2
(パーティショニングを実施)
# sfdisk /dev/loop2 << EOF
> ,400,L
> ,,S
> ;
> ;
> EOF
# losetup -d /dev/loop2
# kpartx -a euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
# mkfs.reiserfs /dev/mapper/loop2p1
# mkswap /dev/mapper/loop2p2
# mount /dev/mapper/loop2p1 ./new_img/
(フラットファイルの中身をコピー)
# rsync -PHSav ./base_img/ ./new_img/
# umount ./base_img
# umount ./new_img
# ls -l euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
-rw-r--r-- 1 root root 4000000000 Dec 3 11:43 euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
# ls -al /dev/loop2
brw-rw---- 1 root disk 7, 2 Dec 3 11:10 /dev/loop2
# echo "0 $(( 4000000000 / 512 )) linear 7:2 0" | dmsetup create hda
# ls -al /dev/mapper/
total 0
drwxr-xr-x 2 root root 80 Dec 3 13:08 .
drwxr-xr-x 16 root root 4360 Dec 3 13:08 ..
crw------- 1 root root 10, 236 Nov 28 17:11 control
lrwxrwxrwx 1 root root 7 Dec 3 13:08 hda -> ../dm-0
# kpartx -a /dev/mapper/hda
# ls -l /dev/mapper/hda*
lrwxrwxrwx 1 root root 7 Dec 3 13:08 /dev/mapper/hda -> ../dm-0
brw-rw---- 1 root disk 252, 1 Dec 3 13:09 /dev/mapper/hda1
brw-rw---- 1 root disk 252, 3 Dec 3 13:09 /dev/mapper/hda2
# mount /dev/mapper/hdb1 ./new_img/
# cp -a ./new_img/boot/grub/device.map ./new_img/boot/grub/device.map.orig
# echo '(hd0) /dev/mapper/hda' > ./new_img/boot/grub/device.map
# grub-install --root-directory=./new_img/ /dev/mapper/hdb
Installing for i386-pc platform.
grub-install.real: error: cannot find a GRUB drive for /dev/mapper/hdb. Check your device.map.
# mount -t proc none ./new_img/proc
# mount -o bind /dev/ ./new_img/dev/
# chroot ./new_img/ /bin/bash
# sed -i -e 's/hd0,1/hd0,0/' boot/grub/grub.conf
# grub --device-map=/boot/grub/device.map
grub> root (hd0,0)
Filesystem type is reiserfs, partition type 0x83
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/reiserfs_stage1_5" exists... yes
Running "embed /boot/grub/reiserfs_stage1_5 (hd0)"... failed (this is not fatal)
Running "embed /boot/grub/reiserfs_stage1_5 (hd0,0)"... failed (this is not fatal)
Running "install /boot/grub/stage1 (hd0) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
Done.
う〜ん、stage1_5 の追加が失敗している…。これ駄目な気がしますが「ぶっつけ本番」の名のもと進めます。
(chroot 下から抜けます)
# exit
# umount ./new_img/proc/ ./new_img/dev
# cp -a /tmp/wakame-init ./new_img/etc/
# cat >> ./new_img/etc/rc.local <<EOF
> /etc/wakame-init md
> exit 0
> EOF
# chmod 755 ./new_img/etc/rc.local
# sync
# # umount ./new_img
# kpartx -d /dev/mapper/hda
# dmsetup remove hda
# losetup -d /dev/loop2
# file euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img
euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img: x86 boot sector
ということで、何とか空のファイルがブータブルイメージのように見えます。で、これを Wakame-VDC に登録します。
# /opt/axsh/wakame-vdc/dcmgr/bin/vdc-manage -e
vdc-manage>> backupobject add \
> --uuid bo-gentoo \
> --display-name "Gentoo Linux" \
> --storage-id bkst-local \
> --object-key euca-large-gentoo-2012.07.19-x86_64.wakame-vdc.img.gz \
> --size 841701 \
> --allocation-size 4194304 \
> --container-format gz \
> --checksum 98f623f6d035b259496f18899c37bdb3
bo-gentoo
vdc-manage>> image add local bo-gentoo \
> --account-id a-shpoolxx \
> --uuid wmi-gentoo \
> --root-device /dev/sda1 \
> --display-name "Gentoo Linux 2012.07.19"
wmi-gentoo
と、登録の各種パラメータは勘で入れてるので間違っているかもしれません。まー「ぶっつけ本番」ですので…。
で、Wakame-VDC の WebUI を開くと…おぉ、登録したイメージが見れます。(当たり前だ)
このイメージを指定して起動をかけると…おぉ、起動します。
で、この起動したインスタンスに…残念ながら接続できませんでした。というのも心当たりは山程あるのですが、何故起動しなかったのか?を調べる話は他の日のネタにしようと思います。すみません<(_ _)>
ということで Wakame-vdc / OpenVNet Advent Calendar 2014 3日目の投稿でした。次の日は…まだエントリしていないようですが、僕のようなこんなグダグダな内容のエントリもあるので、気軽にエントリしてみてください。