最近はインフラ屋な山本です。
KVMにシリアルコンソールで Ubuntu をインストールする、と題しているわけですが、
やりたいことはこんな感じです。
- インターネットにつながらない環境で
- X Window System とか VNC とかを使わずに
- Ubuntu Server をゲスト VM にインストール
実は、インターネットにつながる環境だとこれはとても簡単です。こんな感じ。
$ sudo virt-install --connect=qemu:///system -n test -r 2048 --serial pty -v --disk=... --nographics -l http://us.archives.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/ --extra-args=console=ttyS0,9600
"-l http://..." を "-c ISO_FILE" に置き換えたいところなわけですが、うまくいきません。ブートローダーがシリアルコンソールを認識しないんですかね。
そこで少し考えると、上のコマンドがうまくいく理由はおそらく、kernel をダウンロードしてきて "console=ttyS0" というカーネルブートパラメーターを与えて QEMU だか KVM だかがブートローダーがわりにブートしているんでしょう。推測ですが。
そこまで推測したらやることはひとつ、ISO をループバックマウントです。こんな感じ。
$ sudo mount -t iso9660 -o loop,ro ubuntu-10.04-server-amd64.iso /home/cybozu/cdrom
そして "-l http://..." を "-l /home/cybozu/cdrom/install" にしてみます。が、動きません。そこでおもむろに virt-install のコード(Python)を眺めると、以下のことがわかります。
- OSDistro.py がディストリビューションの自動判別をしている
- Ubuntu の自動判別に用いているファイルやディレクトリが ISO にはない
- でも、ISOにブートに必要なカーネルや initrd は存在する
ここまでわかればやることはひとつ。OSDistro.py にパッチをあてちゃいましょう。パッチは Ubuntu 10.04 専用ですけど、やってることは単純なんで他の distro に対応させたければ同じようにやってみてください。
あとひとつ。OSDitro.py は元々ネットワークインストール用にできてるのですが、このパッチをあてることで、DVDブート用のカーネルを立ち上げるようになります。が、当然 DVD が見える必要があるので、"--disk=ISO_FILE,device=cdrom,perms=ro" も追加します。
パッチをあてた virt-install で以下のように実行すると、見事シリアルコンソールで Ubuntu Server のインストールが開始できます。VNCやXやネットワークが使えないことはそうそうないでしょうけど、インフラ屋的にはとっても嬉しい?かなと。
$ sudo virt-install --connect=qemu:///system -n test -r 2048 --serial pty -v --disk=... --nographics --disk=ubuntu-10.04-server-amd64.iso,device=cdrom,perms=ro
-l /home/cybozu/cdrom/install --extra-args=console=ttyS0,9600
インストールが終わったら、そのままシリアル端末でログインできます。
ログインしたら、grub やゲストのVMカーネルがシリアル端末を使うように設定します。
c.f. Ubuntu Wiki
$ sudo vi /etc/default/grub GRUB_CMDLINE_LINUX="console=ttyS0,9600" GRUB_TERMINAL=serial
$ sudo update-grub $ sudo poweroff
最後にゲストVMの定義ファイルから、ISOファイルを削除しておきましょう。
$ virsh edit test $ virsh start test
ゲストVMのシリアル端末には以下のコマンドでアクセスできます。
$ sudo virsh console test
以上です。