▼FreeBSD 10.x を libvirt なホストに、シリアルコンソール経由でインストールする▼

インストール完了後に、シリアルコンソールを有効にする方法は Handbookに書いてありますが、 libvirt な仮想環境で TTYアクセス(ssh)しかない、VNCコンソールが使えない、 場合に、最初からシリアルコンソールでインストールしたい場合もあります。

FreeBSDではシリアルコンソールのみのインストールは対応しているかどうかは 明記されていませんが、一応できるようです。 FreeBSDの記事 に 「遠隔コンソールなしでの遠隔インストール」 がありますが、そこまで凝ったことをしなくてもできました。 (2014/11)

$Id: fb10-qemu-kvm.html,v 1.6 2014-11-28 10:25:59+09 kabe Exp $

$Keywords: qemu-kvm, FreeBSD guest, virt-install, serial console, console=comconsole, hw.broken_txfifo $


virt-install を起動する

host# qemu-img create -f qcow2 -o preallocation=off \
	/home/libvirt/images/ldap3.qcow2 6G

host# virt-install -n fb-ldap3 -r 128 --vcpus=1 \
	--disk /home/libvirt/images/ldap3.qcow2,format=qcow2,bus=virtio \
	--cdrom /home/libvirt/images/FreeBSD-10.0-RELEASE-amd64-dvd1.iso \
	--network=network=net-172-22-53,model=virtio \
	--video=vga --graphics none

これで、「VGAデバイスはあるが、VNCコンソールは無い」状態で qemu-kvm なゲストが作成され、シリアルコンソールに自動接続されます。

boot(8) は、メッセージを VGA にも書き出す関係上、 最初は VGA デバイスを必要とするようです。


SeaBIOS (version seabios-0.6.1.2-28.el6)

Machine UUID 9059d162-bfd5-cf2e-776f-6dd699a261ec




gPXE (http://etherboot.org) - 00:03.0 CB00 PCI2.10 PnP BBS PMM07E0@10 CB00

Press Ctrl-B to configure gPXE (PCI 00:03.0)...




Booting from DVD/CD...

CD Loader 1.2


Building the boot loader arguments

/
Looking up /BOOT/LOADER... Found
Consoles: internal video/keyboard
BIOS CD is cd0
BIOS drive C: is disk0r
FreeBSD/x86 bootstrap loader, Revision 1.1
BIOS 630kB/130036kB available memory
(root@snap.freebsd.org, Thu Jan 16 22:18:05 UTC 2014)

-
Loading /boot/defaults/loader.conf

/boot/kernel/kernel text=0xed9008 data=0x117d28+0x176650 syms=[0x8+0x137988+0x8+0x1515f8]
\ ______               ____   _____ _____
||  ____|             |  _ \ / ____|  __ \
/| |___ _ __ ___  ___ | |_) | (___ | |  | |
-|  ___| '__/ _ \/ _ \|  _ < \___ \| |  | |
\| |   | | |  __/  __/| |_) |____) | |__| |
|| |   | | |    |    ||     |      |      |
/|_|   |_|  \___|\___||____/|_____/|_____/    ```                        `
-                                            s` `.....---.......--.```   -/
\+------------Welcome to FreeBSD-----------+ +o   .--`         /y:`      +.
||                                         |  yo`:.            :o      `+-
/|  1. Boot Multi User [Enter]             |   y/               -/`   -o/
-|  2. Boot Single User                    |  .-                  ::/sy+:.
\|  3. Escape to loader prompt             |  /                     `--  /
||  4. Reboot                              | `:                          :`
/|                                         | `:                          :`
-|  Options:                               |  /                          /
\|  5. Configure Boot Options...           |  .-                        -.
||                                         |   --                      -.
/|                                         |    `:`                  `:`
-|                                         |      .--             `--.
\|                                         |         .---.....----.
|+-----------------------------------------+
/
-
To get back to the menu, type `menu' and press ENTER
or type `boot' and press ENTER to start FreeBSD.
Type '?' for a list of commands, 'help' for more detailed help.
OK _

Consoles: internal video/keyboard の部分は、 本当は serial port になって欲しいんですが、 CDROMのブートコードはシリアル端末でも認識してくれるようです。

で、loader(8) のメニュー画面が出たら、[3] もしくは [Esc] を押せば OK プロンプトに落とせるので、

OK set console=comconsole
OK boot
でインストーラーがシリアルコンソールで起動します。

...
Creating and/or trimming log files.
Starting syslogd.
ELF ldconfig path: /lib /usr/lib /usr/lib/compat
32-bit compatibility ldconfig path: /usr/lib32
Clearing /tmp (X related).
Starting local daemons:
Welcome to FreeBSD!

Please choose the appropriate terminal type for your system.
Common console types are:
   ansi     Standard ANSI terminal
   vt100    VT100 or compatible terminal
   xterm    xterm terminal emulator (or compatible)
   cons25w  cons25w terminal

Console type [vt100]: xterm

Console type は、色々試してみて、見やすいものを選びましょう。 ansi は罫線を使わないので化けにくいですが、 ハイライトされた部分がさっぱりわからないので、可能なら vt100 か xterm がおすすめです。


▼シリアルコンソール用の設定

インストーラーが終了間際にシェルを起動するか聞いてくるので、 Yes でシェルに落とします。


                   +-------Manual Configuration----------+
                   | The installation is now finished.   |
                   | Before exiting the installer, would |
                   | you like to open a shell in the new |
                   | system to make any final manual     |
                   | modifications?                      |
                   +-------------------------------------+
                   |         < Yes >     < No  >         |
                   +-------------------------------------+

This shell is operating in a chroot in the new system. When finished making conf
iguration changes, type "exit".
# _
このシェルから、 Handbookに書いてあるような シリアルコンソール用の設定を行います。
# echo '-h' > /boot.config
# echo 'boot_serial="YES"' > /boot/loader.conf
# echo 'console="comconsole"' >> /boot/loader.conf
# vi /etc/ttys
...
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyu0   "/usr/libexec/getty std.9600"   xterm   on secure
ttyu1   "/usr/libexec/getty std.9600"   dialup  off secure
...

# exit
FreeBSD 10.1 以降では、on の代わりに onifconsole なんてのが使えます。
ttyu0   "/usr/libexec/getty std.9600"   xterm   onifconsole secure

ゲストが再起動して、HDDから起動してくる際に、 /boot.config-hオプションを拾って シリアルコンソールにしてくれるはずです。 (メッセージはなぜか /boot/configになってますが…)

Booting from Hard Disk...		<<< ここまでがBIOSの出力
/boot/config: -h			<<< ここから boot(8) の出力
Consoles: serial port
BIOS drive C: is disk0
BIOS 630kB/130036kB available memory

FreeBSD/x86 bootstrap loader, Revision 1.1
(root@snap.freebsd.org, Thu Jan 16 22:18:05 UTC 2014)
Loading /boot/defaults/loader.conf
/boot/kernel/kernel text=0xed9008 data=0x117d28+0x176650 syms=[0x8+0x137988+0x8+0x1515f8]
/
...
uart0: <Non-standard ns8250 class UART with FIFOs> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
uart0: console (9600,n,8,1)
...

/etc/ttys の加工が成功していれば、 シリアルコンソールにて login: プロンプトが出るはずです。

Tue Nov 18 18:51:32 JST 2014

FreeBSD/amd64 (fb-ldap3.example.ac.jp) (ttyu0)

login: _

dmesg で出てくる <Non-standard ns8250 class UART with FIFOs> というのは、通信チップの判別のために受信用FIFOの大きさを計ったら 128バイトを超えていた、 程度の意味なので、qemu のような仮想環境上では気にしなくてかまいません。

ここまで動作確認できれば、 ゲストのVGAデバイス (libvirt的には<video>項)は 削除してかまいません。 で、VGAデバイスを削除してゲストを起動すると

...
Starting sshd.
Starting sendmail_submit.
Starting sendmail_msp_queue.
Starting cron.
Starting background file system checks in 60 seconds.

Tue Nov 18 19:14:17 JST 2014
Nov 18 19:14:17 fb-ldap3 getty[738]: open /dev/ttyv0: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[739]: open /dev/ttyv1: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[740]: open /dev/ttyv2: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[742]: open /dev/ttyv4: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[743]: open /dev/ttyv5: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[744]: open /dev/ttyv6: No such file or directory
Nov 18 19:14:17 fb-ldap3 getty[745]: open /dev/ttyv7: No such file or directory

FreeBSD/amd64 (fb-ldap3.example.ac.jp) (ttyu0)

login: Nov 18 19:14:17 fb-ldap3 getty[741]: open /dev/ttyv3: No such file or directory

存在しないVGAのバーチャルコンソールが開けないエラーが出るので、 気になる場合は /etc/ttysttyv0〜ttyv7off に変えます。

# vi /etc/ttys
...
ttyv0   "/usr/libexec/getty Pc"         xterm   off  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   off  secure
...

◆たまにシリアルコンソールが固まる

virsh console のシリアルコンソールで ls -lR / なんかの出力中に何かキー入力すると、 ほぼ確実に コンソールが固まります。 端末エミュレータでちょっと長め(32文字以上?)の文字列をペーストしても固まる。 ネットワーク経由で ttyu0 のシェルを殺しても、getty は再起動されますが、 コンソールには何も出てきません。 FreeBSD 10.1 だと /bin/login が CPU 100% で回り続ける… これでは怖くてシリアルコンソール使えません。

で、これは FreeBSD側 の uart(4) が悪いのではなく、 QEMU側のシリアルエミュレーションで割り込みが落ちてしまうためらしいです。 FreeBSD 8.4 以降に用意されている hw.broken_txfifo sysctl値でとりあえず回避できます。

# echo 'hw.broken_txfifo=1' >> /boot/loader.conf

sysctl値なので /etc/sysctl.conf に書いてもいいのでしょうけど、 シングルユーザーモードでハマりたくないので、 /boot/loader.conf/boot/device.hints に 書いておくのがいいんじゃないでしょうか。


kabe.sra-tohoku.co.jp