VMware上のLinuxにシリアルコンソールで接続する

ちょっとしたkernelのテストをするためにVMwareの環境を作って、シリアルコンソールで接続できるようにした。やり方はRemote Serial Console HOWTOと、たごーさんのシリアルコンソールを仕込んでみるに従った。

VMware上のLinuxでの設定はHOWTOに従う。GRUBを使っているので、menu.lstに以下のようなものを書き加える。

password --md5 $1$.....
serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

さらに、kernelのブートパラメータにconsole=tty0 console=ttyS0,9600n8を加えておく。Debian環境ならkopt=にも書いておく。

## ## Start Default Options ##
## default kernel options
# [...]
# kopt=root=/dev/sda1 ro console=tty0 console=ttyS0,9600n8
 
# [...]
 
## ## End Default Options ##
 
title           Debian GNU/Linux, kernel 2.6.18-4-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-4-686 root=/dev/sda1 ro console=tty0 console=ttyS0,9600n8
initrd          /boot/initrd.img-2.6.18-4-686
savedefault

次にinittabでgettyを起動する設定をするのだが、サンプルの記述がコメントとして用意されているので、これを生かせばよい。T0のコメントを外す。

# Example how to put a getty on a serial line (for a terminal)
#
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

続いてVMware上のマシンのシリアルポートをVMware外部に接続するための設定と、それにアクセスするための準備をする。こちらはたごーさんの記事に従う。

シリアルポートをひとつずつ追加し、Use named pipeを選択、pipeの名前は後で識別しやすいように/tmp/serial-hostname portとした。また、今回このシリアルポートはhostから使うので、This end is the serverおよびThe other end is an applicationを選択。

[The day-to-day thoughts: シリアルコンソールを仕込んでみるより引用]

さらに、同記事のスクリプトをほとんどそのまま使わせてもらう。socatパッケージはインストールされていない可能性が高そうなので、これをインストールしておくことを忘れない。

#! /bin/sh
# http://blog.tagoh.jp/archives/id/1271
set -e
 
if [ $# -eq 0 ]; then
    echo "$0 <short hostname>"
    exit 1
fi
 
PORT=$2
if [ "x$PORT" = "x" ]; then
    PORT=0
fi
 
if [ ! -S /tmp/vmware-serial-$1-$PORT ]; then
    echo "Unknown hostname"
    exit 1
fi
 
socat unix-connect:/tmp/vmware-serial-$1-$PORT \
    pty:link=/tmp/ttyv$1$PORT,raw,echo=0,waitslave &
SOPID=$!
if ls /proc/$SOPID > /dev/null 2>&1; then
    while [ ! -h /tmp/ttyv$1$PORT ]; do
        sleep 1;
    done
    cu -l /tmp/ttyv$1$PORT
else
    echo failed.
fi

以上、これだけ。たごーさんの記事のおかげで、手間のほとんどをはぶくことができた。