2010/01/14

Ubuntu 8.04 Hardyと9.10 KarmicでのttyS0の扱い方

AlixでUbuntu 8.04から9.10へアップグレードした時に、upstart-compat-sysvとupstartでの書式の違いからttyS0が認識されないという事態に陥りました。

Ubuntu 8.04でのttyS0の認識方法

8.04ではgettyが/etc/event.d/ディレクトリ以下のファイルで制御されています。 Ubuntu Forumなどで調べると次のような手順がいくつかみつかり、ttyS0ファイルを作成してシリアル経由でアクセスできました。

$ cd /etc/event.d
$ sudo rm tty?
$ sudo vi ttyS0

/etc/event.d/ttyS0ファイル

# ttyS0 - getty
#
start on stopped rc2
start on stopped rc3
start on stopped rc4
start on stopped rc5

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

respawn
exec /sbin/getty -L 38400 ttyS0 vt100
9.10へアップグレードした際の問題点

まとめると次のようなポイントで問題になります。

  • getty起動用スクリプトの配置場所の変更
  • 複数のstart行を受け付けない書式の変更
  • "start on stopped"に続く書式の変更

まずgettyを起動するスクリプトの配置場所が、9.10では/etc/initディレクトリ以下に変更されています。

単純にファイルを/etc/event.dから/etc/initに移せば良いかというと、そうではないようです。 いろいろ試してみるとスクリプト内に複数のstart行がある事で問題になることがわかります。

また他のファイルをみると、start on stoppedに続く書式が、rc2からrc RUNLEVEL=2のように変更されている事がわかります。

両バージョンへの対応

せめてファイルを移動するだけで済むように、 Ubuntu 8.04と9.10に対応するスクリプトの書き方を考えてみます。

問題となっているのが複数のstart行なので、これを1行にまとめます。

続いてstart on stoppedをやめることにしました。 これだと/etc/rc2.d/のスクリプトが起動している最中に端末が上がってしまいますが、 多少画面がみずらくなるぐらいで許容範囲と判断しました。

Ubunt 8.04での新しい/etc/event.d/ttyS0.conf

start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -L 38400 ttyS0 vt100

これで問題なく動くので、9.10ではこれを/etc/initディレクトリに移動する事にします。

$ lsb_release -r
Release:	9.10
$ mv /etc/event.d/ttyS0 /etc/init/ttyS0.conf

9.10にした後ではgettyが起動しないためシリアル経由で作業ができない事になりますが、grubからrecovery modeを選択する事でシリアルから起動する事ができます。 またCFカードを抜いて別マシンで作業する方法や、SSH経由でログインするなどして作業を行ないます。

さいごに

Ubuntu 8.04 LTSぐらいまでのよくあるttyS0の有効化の方法では、複数のstart行を記述しています。

まぁalixみたいにtty端末のないマシンでUbuntuを使うのはレアケースかもしれませんが、 Ubuntu 10.04 LTSがリリースされたらサーバー版の更新作業で多少の混乱が起るような気がします。

もし自動でマイグレーションするようpostinstスクリプトを書くなら、start, stop行は決めうちのテンプレートを準備して、respawnexecで始まる行だけ後ろにコピーすれば何とかなるかなぁ…。

0 件のコメント: