CFやUSBメモリのrootfsに移動する方法

通常は CAT709, CAT760 の内蔵フラッシュ (/dev/mtdblock2 )で起動していて、
任意のタイミングで CFやUSBメモリー内に構築した rootfs に移動する方法

完成目標

# init 7

とタイプすると全てのデーモンやプロセス、マウントしているデバイスを閉じ、外部ストレージ上に構築した rootfs に移動して再起動する。(Runlevel=7 は未使用なので使用しても大丈夫)

準備

  • 外部rootfsは /dev/sda1 とする
  • /mnt にマウント可能とする
  • /mnt/old-root ディレクトリ(マウントポイント)を作っておく

作業

/sbin/pivot_root を置きます。
→ SH4 sarge 用 filepivot_root_sh4_sarge

# chmod +x /sbin/pivot_root
  • /etc/inittab (編集)
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
# Runlevel 7 is switch to USB memory rootfs   ← 追加
 
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
l7:7:wait:/etc/init.d/rc 7                    ← 追加
  • /etc/init.d/rc (編集)
case "$runlevel" in
        0|6|7)                 ← 7 を追加
                startup $i stop
                ;;
        *)
                startup $i start
                ;;
  • /etc/init.d/pivot_root (新規)
PATH=/sbin:/bin:/usr/sbin:/usr/bin

NEWROOT=/dev/sda1

echo -n "pivot_root ing... "

mount $NEWROOT /mnt/ -o ro -t ext3
cd /mnt/
pivot_root . old-root/
exec chroot . sh -c 'mount -t proc proc /proc; exec etc/init.d/rcS ' \
        <dev/console >dev/console 2>&1
  • /etc/init.d/init2 (新規)
#!/bin/sh
init 2
  • ランレベル6(reboot)を元に、ランレベル7を作る
# mkdir /etc/rc7.d
# cp -a /etc/rc6.d/*  /etc/rc7.d/
  • 若干編集
# cd /etc/rc7.d
# rm S90reboot
# ln -s ../init.d/pivot_root S90pivot_root
# ln -s ../init.d/init2 S91init2

新rootfs側の etc (/mnt/etc) の

  • /mnt/etc/inittab (ランレベル7を追加)
  • /mnt/etc/rc7.d (少なくとも S91init2 は必要)

も上と同じ状態にしておく必要がある

動作方法

# init 7

とタイプすると全てのデーモンを終了し、/mnt に移動して再起動が掛かる。

再起動後 /old-root に /dev/mtdblock2 がマウントされたままになっているが、

# umount -l /old-root

で強制的にアンマウントできる

関連