読者です 読者をやめる 読者になる 読者になる

KVM にシリアルコンソールで Ubuntu をインストールする

最近はインフラ屋な山本です。

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

以上です。

--
http://twitter.com/ymmt2005