OpenMicroServer のカーネルビルド環境としてSSD/Linuxを用意しようと思う。
VMWare用のイメージが提供されているので以前はVMWare Fusionでそれを動かしたことがある。
今回は故あってKVM+qemu環境で動かすことになった。
インストール
サポートサイト からVMWare実行イメージをダウンロードする。zipで固められているのでこれを展開する。
% unzip ssdlinux-1.0.0-20121220.zip
このイメージは3つのディスクイメージから成っている。
% ls
hda.vmdk hdb.vmdk ssdlinux.vmx vmboot.fs
hda.vmdkがルートファイルシステム, hdb.vmdkがホームディレクトリらしい。
それでvmboot.fsがext2のrawイメージで起動用FDのイメージだ。
最初hda.vmdkの中にbootセクタを探そうとしたり、hda.vmdkをqcow2に変換したら動かなかったりといろいろ苦労した。幸いなことにqemuがそのままvmdkを読めるので特に変換はせずに使用する。
VMWare用のssdlinux.vmxを参考に、virsh用に次のようなドメインを定義した。
virt-managerの手も借りたので下記は最小セットではない。
<domain type='kvm'>
<name>v254</name>
<description>Build Environment for OMS firmware</description>
<memory>262144</memory>
<currentMemory>262144</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc-0.12'>hvm</type>
<boot dev='fd'/>
<bootmenu enable='yes'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='floppy'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/ssdlinux/vmboot.fs'/>
<target dev='fda' bus='fdc'/>
<alias name='fdc0-0-0'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='vmdk'/>
<source file='/var/lib/libvirt/images/ssdlinux/hda.vmdk'/>
<target dev='hda' bus='ide'/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='vmdk'/>
<source file='/var/lib/libvirt/images/ssdlinux/hdb.vmdk'/>
<target dev='hdb' bus='ide'/>
<alias name='ide0-0-1'/>
<address type='drive' controller='0' bus='0' unit='1'/>
</disk>
<controller type='ide' index='0'>
<alias name='ide0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='fdc' index='0'>
<alias name='fdc0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:99:cf:fe'/>
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='e1000'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/1'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/1'>
<source path='/dev/pts/1'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1' keymap='en-us'>
<listen type='address' address='127.0.0.1'/>
</graphics>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
</devices>
</domain>
このXMLをssdlinux.xmlに保存して、
% virsh define ssdlinux.xml
と定義する。
ここでvirt-managerを起動して、GUIからこのドメインを起動した。
シリアルコンソール
さて、何をするにせよvirt-managerのターミナルエミュレーション経由では不便極まる。
デフォルトでDHCPクライアントとSSHdが立ち上がるので、起動してからの作業ならSSHでも良い。でも
できればシリアルコンソールから操作したい。
そこでbootディスクをマウントして修正してやることにする。幸いなことに起動ディスクに入っているのは独自のブートローダーとかではなくGRUBなので、勝手は分かっている。
% mkdir /mnt/floppy
% mount -t ext2 /dev/fd0 /mnt/floppy
% cd /mnt/floppy/boot/grub
で、menu.lstの中身を編集してカーネルオプションとしてconsoleの指定を足してやる。
kernel (hd0,0)/vmlinuz root=/dev/hda1 clock=pit nosmp noapic nolapic console=tty0 console=ttyS0,9600n8
そうしたらアンマウントして再起動でOKだ。
% cd /
% umount /mnt/floppy
% shutdown -r now
virt-managerのView -> Text Consoles -> Serial1を選択すると仮想シリアルポートに起動中のメッセージが出るのが分かる。
これだけだとシリアルからはログインできないのでgettyも設定してやる。Graphical Console VNCの方に戻してログインしてから、
これでホスト環境で virsh console v254 とすればログインできるようになった。