Ubuntu Server 11.10のHeadless install(シリアルコンソールでのインストール)

x86LinuxマシンにVGAとキーボードを使ってシリアルコンソールの設定をするという方法は広く知られているし、UbuntuのWikiにも載っているんだけど、一度もVGA・キーボードを繋がずに設定するにはどうしたらええのん、そもそもVGA刺さってないよみたいな環境でのHOWTO。

始める前に

あなたのマシンのシリアルポートはCOM1=ttyS0ですか、COM2=ttyS1ですか。

どのマシンでもttyS0だという訳ではありません。ttyS1だけが存在する場合もあります。

確認例:

$ dmesg|grep ttyS
[    0.509461] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.539653] 00:0b: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

ボーレートはいくつにしますか(BIOS Console Redirectionがある場合は、そちらの設定に合わせる)。

ISOにハードコーディングしてしまうので、最初にきちんと確認しておきましょう。

また、きちんとしたシリアルコンソール用のアプリを使いましょう。
Mac OS Xの場合、screenを使わないで下さい。化けます。
minicomなどをインストールすると良いでしょう。

カスタムISO作成

以下、ttyS1, 115200n8の場合の記述になっています。
各自の環境に合わせて記述を変えて下さい。

$ wget ftp://ftp.iij.ad.jp/pub/linux/ubuntu/releases/11.10/ubuntu-11.10-server-i386.iso
$ sudo mount -o loop,ro ubuntu-11.10-server-i386.iso /mnt
$ sudo cp -a /mnt/ ./ubuntu-serial-i386-ttyS1/

Ubuntu ServerのISOをダウンロードしてきて/mntにマウントし、./ubuntu-serail-i386-ttyS1にコピーします。

$ cd ./ubuntu-serial-i386-ttyS1/isolinux
$ sudo vi isolinux.cfg

isolinux.cfgを次のように編集します。

--- /mnt/isolinux/isolinux.cfg	2011-10-11 22:52:04.000000000 +0900
+++ isolinux.cfg	2011-12-09 16:00:31.558716174 +0900
@@ -1,6 +1,7 @@
+serial 0 115200 0x003
 # D-I config version 2.0
 include menu.cfg
 default vesamenu.c32
 prompt 0
 timeout 0
-ui gfxboot bootlogo
+#ui gfxboot bootlogo

serial 0 115200 0x003で、ttyS0,115200を指定しています。
間違いのように思えますが、手元のマシンでは何故かこうしないとttyS1から出力が行われませんでした。

BIOS経由でシリアルIOを行う場合とLinuxカーネル経由でシリアルIOを行う場合で初期化状態なども異なるからかもしれませんが、理由は把握できていません。

$ sudo vi txt.cfg

続いてtxt.cfgを次のように編集します。

--- /mnt/isolinux/txt.cfg	2011-10-11 22:52:04.000000000 +0900
+++ txt.cfg	2011-12-08 17:57:29.535055847 +0900
@@ -2,15 +2,15 @@
 label install
   menu label ^Install Ubuntu Server
   kernel /install/vmlinuz
-  append  file=/cdrom/preseed/ubuntu-server.seed vga=788 initrd=/install/initrd.gz quiet --
+  append  file=/cdrom/preseed/ubuntu-server.seed vga=788 initrd=/install/initrd.gz quiet console=tty0 console=ttyS1,115200n8 --
 label cloud
   menu label ^Enlist system with Ubuntu Orchestra Server
   kernel /install/vmlinuz
-  append  modules=cobbler-enlist-udeb vga=788 initrd=/install/initrd.gz quiet --
+  append  modules=cobbler-enlist-udeb vga=788 initrd=/install/initrd.gz quiet console=tty0 console=ttyS1,115200n8 --
 label check
   menu label ^Check disc for defects
   kernel /install/vmlinuz
-  append  MENU=/bin/cdrom-checker-menu vga=788 initrd=/install/initrd.gz quiet --
+  append  MENU=/bin/cdrom-checker-menu vga=788 initrd=/install/initrd.gz quiet console=tty0 console=ttyS1,115200n8 --
 label memtest
   menu label Test ^memory
   kernel /install/mt86plus

これは普通のカーネル引数の設定で、インストール済みイメージにシリアルコンソールの設定をする場合と変わりません。

$ cd ../..
$ sudo mkisofs -r -V "Ubuntu Serial Boot" -cache-inodes \
-l -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-o ubuntu-serial-i386-ttyS1.iso \
ubuntu-serial-i386-ttyS1

これでubuntu-serial-i386-ttyS1.isoが作成されるので、CD-Rに焼いてブートしてください。

成功すると、VGA経由のセットアップ時と同様のテキストモードのDebian Installerが走るのでセットアップを行います。
最後にインストールの完了通知と再起動を求められるので、ここで一旦”Go Back"してメニューに戻り、"Execute Shell"でシェルを実行して下さい。

# chroot /target
# vi /etc/default/grub

ここからはWikiに載っているインストール済みイメージへのシリアルコンソール設定操作と同じになります。
まずGRUBを設定します。

--- grub.ucf-dist	2011-10-14 18:40:37.090918167 +0900
+++ grub	2011-10-06 16:06:17.019994808 +0900
@@ -5,10 +5,10 @@
 
 GRUB_DEFAULT=0
 #GRUB_HIDDEN_TIMEOUT=0
-GRUB_HIDDEN_TIMEOUT_QUIET=true
+#GRUB_HIDDEN_TIMEOUT_QUIET=true
 GRUB_TIMEOUT=2
 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
-GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
 GRUB_CMDLINE_LINUX="console=ttyS1,115200n8r"
 
 # Uncomment to enable BadRAM filtering, modify to suit your needs
@@ -17,7 +17,7 @@
 #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"
 
 # Uncomment to disable graphical terminal (grub-pc only)
-#GRUB_TERMINAL=console
+GRUB_TERMINAL=serial
 
 # The resolution used on graphical terminal
 # note that you can use only modes which your graphic card supports via VBE
@@ -32,3 +32,5 @@
 
 # Uncomment to get a beep at grub start
 #GRUB_INIT_TUNE="480 440 1"
+
+GRUB_SERIAL_COMMAND="serial --unit=1 --speed=115200 --word=8 --parity=no --stop=1"
# update-grub

設定を反映します。

# cp /etc/init/tty1.conf /etc/init/ttyS1.conf
# vi /etc/init/ttyS1.conf
--- tty1.conf	2011-04-21 07:54:13.000000000 +0900
+++ ttyS1.conf	2011-10-06 16:08:06.179994820 +0900
@@ -1,10 +1,10 @@
-# tty1 - getty
+# ttyS1 - getty
 #
-# This service maintains a getty on tty1 from the point the system is
+# This service maintains a getty on ttyS1 from the point the system is
 # started until it is shut down again.
 
 start on stopped rc RUNLEVEL=[2345]
 stop on runlevel [!2345]
 
 respawn
-exec /sbin/getty -8 38400 tty1
+exec /sbin/getty -8 115200 ttyS1 vt102

ttyS1用のgettyの設定を作ります。

# exit
# exit

シェルから抜けて再起動を行います。

以上で、Headless installが完了します。

普段、インストーラ任せにしていてインストール時にシェルを使う習慣の無い人は、こんな感じに活用するやり方を覚えると色々便利になってカスタマイズも効くようになるし良いと思います。

出来上がったISO

ttyS1でi386なイメージとか欲しい人居ないと思うけど、一応置いておく。
http://www.megaupload.com/?d=BT9V9EFK