インストール完了後に、シリアルコンソールを有効にする方法は
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/ttys
の
ttyv0〜ttyv7
を off
に変えます。
# 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
に
書いておくのがいいんじゃないでしょうか。