読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

Plamo-4.6 で upstart-0.3.9 を使う

とりあえず目標は現在の Plamo の起動スクリプトをそのまま動かす事.

make

configure で --enable-compat を付けないと,sysvinit 互換モードで起動に必要なコマンドがインストールされません.起動に必要なスクリプト群は /etc/event.d に置きます.

$ ./configure --prefix=/opt/upstart --sysconfdir=/etc --enable-compat
# make install
# tar zxvf example-jobs-0.3.9.tar.gz -C /etc/event.d

rc.S 呼び出し

起動するとまず /etc/event.d/rcS が呼ばれます.rcS の最後の方で

exec /etc/init.d/rcS

としている所を

exec /etc/rc.d/rc.S

とします.

rcS 終了後

/etc/event.d/rc-default が呼ばれます.このファイルでやることは特に変更はないのですが,実行するコマンドは /opt/upstart/sbin 以下のものを使わなければいけないので,

  • runlevel → /opt/upstart/sbin/runlevel
  • telinit → /opt/upstart/sbin/telinit

というように書き換えが必要です.

各 runlevel のファイル

rc-default で各 runlevel に移行します.Plamo-4.6 だと /etc/inittab が存在し,デフォルトでは

id:3:initdefault:

というようになっているので,何もしてないと runlevel 3 に移行するので,/etc/event.d/rc3 が呼ばれます.

デフォルトの runlevel を 4 にしている場合は /etc/event.d/rc4 が呼ばれます.

/etc/event.d/rc[2-5] の各ファイルの最後で

exec /etc/init.d/rc 3 (← rc3 ファイルの場合)

のように書かれている所を

exec /etc/rc.d/rc.M

と書き換えます.rc[2-5] のファイル全て rc.M を呼びます.

tty? ファイル

example-jobs-0.3.9.tar.gz には tty[1-6] の 6 つのファイルが付いてます.

それぞれ,各 runlevel に入った時に /sbin/getty を実行するように

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

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

respawn
exec /sbin/getty 38400 tty1 linux

のように書かれています (これは tty1 ファイル).

まず,Plamo だと /sbin/getty はないので,ここを /sbin/agetty とします.これだけでも起動はしますが,このままだと各 runlevel に入った時点で agetty が実行されるので,rc.M の実行と重なってしまい,通常の Plamo の起動と異なります.そこで "start on runlevel 3" のような行を "start on stopped rc3" のように /etc/event.d/rc[2-5] ファイルの実行と同時に tty[1-6] を実行するようにします.

tty1 ファイルは以下のようになります.

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/agetty 38400 tty1

これでログインプロンプトは出ます.

rc0, rc6

これも /etc/event.d/rc[2-5] ファイルと同様で,スクリプトの最後の方で

exec /etc/init.d/rc 0

のような行があるので,

  • rc0 ファイルは "exec /etc/rc.d/rc.0"
  • rc6 ファイルは "exec /etc/rc.d/rc.6"

をそれぞれ呼びます.Plamo だと rc.0 は rc.6 へのシンボリックなので,まあ,両方 rc.6 でもいいんですがね.

rc1

これも同様で "exec /etc/init.d/rc 1" のような行を

exec /etc/rc.d/rc.K

のようにします.(これは未確認)

(追記) これはダメです.rc.K 内で telinit とか呼んでいるため.また調査します.

rcS-sulogin

このファイルは,起動時オプションでシングルユーザモードが指定されたとき ("S" とか "single" とか "-s" とか指定したとき) に実行されます.これもファイル中のコマンドを

  • runlevel → /opt/upstart/sbin/runlevel
  • telinit → /opt/upstart/sbin/telinit

のようにフルパス指定にします.sulogin コマンドは既存のをそのままなので "/sbin/sulogin" で OK です.

control-alt-delete

/etc/event.d/control-alt-delete ファイルは文字通り Ctrl+Alt+Del キーが押されたときのスクリプトで,リブートさせたい場合は必要です.これも "exec shutdown -r now "Control-Alt-Delete pressed" のように書かれている部分の shutdown コマンドをフルパスで /opt/upstart/sbin/shutdown にすれば OK です.

以上で,Plamo 上で Upstart が使えます.起動時のオプションとして

init=/opt/upstart/sbin/init

を指定すれば Ok です.grub.conf に以下のような行を追加で書いておけば良いですね.

title Plamo-4.6 (Upstart)
  root (hd0,1)
  kernel (hd0,1)/boot/vmlinuz root=/dev/hda2 ro vt.default_utf8=0 vga16 unicon=eucjp resume=/dev/hda1 init=/opt/upstart/sbin/init