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
# 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/のスクリプトが起動している最中に端末が上がってしまいますが、 多少画面がみずらくなるぐらいで許容範囲と判断しました。
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行は決めうちのテンプレートを準備して、respawn、execで始まる行だけ後ろにコピーすれば何とかなるかなぁ…。
0 件のコメント:
コメントを投稿