June 16, 2007

シリアルコンソールを仕込んでみる

最近どうも安定して動かない上に、CPU load食いまくってsshで入るのも難儀なことが多く、その度にvmware-server-consoleを起動させては、ごにょごにょとあれこれや るはめになる。また、セキュリティ上外から902番ポートへ繋げないようにしてるので、sshでport forwardしてとかまあなんつーか面倒くさいことこの上ない。そこで、vmware上のシリアルポートをhostのttyへマップさせ、シリアルコン ソール替わりに使うことにした。

まず、各VMの設定を変更する。シリアルポートをひとつずつ追加し、Use named pipeを選択、pipeの名前は後で識別しやすいように/tmp/serial-hostname portとした。また、今回このシリアルポートはhostから使うので、This end is the serverおよびThe other end is an applicationを選択。あとは、/etc/inittabにgetty経由でログインできるように修正。Debianの場合はすでにコメントアウトされた行があるので、それを有効にするだけでよい。

次にhost側。先ほど指定したnamed pipeはhost上に作られるけど、そのままだとよくあるterminal系のアプリでは使えないので、socatを使ってptyに変換した。ついでにそのまま接続しちゃうように次のようなスクリプトを書いた。

#! /bin/sh

set -e

if [ $# -eq 0 ]; then
echo "$0 "
exit 1
fi

PORT=$2
if [ "x$PORT" = "x" ]; then
PORT=0
fi

if [ ! -S /tmp/serial-$1$PORT ]; then
echo "Unknown hostname"
exit 1
fi

socat unix-connect:/tmp/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

No comments: