「コラム:お手軽シャットダウンフリー化」をHTML化してみました (QR1679)

QR1679

QR1679

「コラム:Raspberry Jam Session #2 お手軽シャットダウンフリー化」について

今回 USPマガジン2013年春号に寄稿した記事には、Raspberry Jam Session と称するコラムが2つ含まれています。このうち、大西さんのコラムについては、「えりぬき版」に収録されていますので全文をそのままお読みいただけますが、井町さんの「お手軽シャットダウンフリー化」はページ総量の関係で収録されませんでした。

大変興味深い内容なので、本誌に掲載されたものと同じ内容を HTML化してここに掲載します。なお、権利関係は調整してありますので、この記事は本サイトの他のページと同じように問題なく閲覧していただけます。

 

お手軽シャットダウンフリー化

Raspberry Piを組込み系で使うために、シャットダウン手順不要の環境を作ります。理想は完全RAM disk化ですが、Raspbian wheezeのAPTにUnionFSのパッケージがありますので、それを使ってお手軽に実現します。

UnionFSとは、複数のファイルシステムを束ねてマウントするシステムです。これを使い、SDカードとRAM disk (tmpfs)を束ねてrootにマウントすることで、SDカードはread only、新規作成・改変されたファイルはRAM diskに書き込まれる環境が実現できます。このためのサンプルスクリプトは、パッケージに含まれています。

Swap 無効化

この設定を行う場合、swapは意味がなくなりますので、あらかじめ無効化しておきます。

$ sudo update-rc.d -f dphys-swapfile remove

UnionFS パッケージの導入

パッケージ名はunionfs-fuseです。

$ sudo apt-get update
$ sudo apt-get install unionfs-fuse

スクリプトのコピーと編集

サンプルスクリプトは、/usr/share/doc/unionfs-fuse/examples/に生成されます。使用するのは、次の2つです。

S01a-unionfs-fuse-live-cd.sh

シャットダウンフリー化の核となるinitスクリプトです。/etc/init.d/a-unionfs-fuse-live-cdにコピーしておきます。

a-unionfs-fuse-omit-pid.sh

UnionFSのプロセス終防止処理を行うスクリプトです。/usr/local/sbinあたりにコピーして、initスクリプトから呼び出します。

initスクリプトは、update-rc.dに対応させるため、先頭にINIT INFOの記述が必要です。以下のように記述します。

### BEGIN INIT INFO
# Provides: a-unionfs-fuse-live-cd
# Required-Start: mountall-bootclean
# Required-Stop:
# Default-Start: S
# Default-Stop:
# X-Start-Before: procps udev-mtab urandom
# Short-Description: UnionFS mode
# Descrition: Shutdown process will not be required
### END INIT INFO

また、chroot前にtmpfsやdevtmpfsでマウントされているものは、chroot後も旧rootのものを使用することにします。pivot_root . oldroot の後に、以下を記述します。

mount -o remount,ro /dev/root /oldroot
for d in dev run run/lock sys run/shm dev/pts boot
do
  mount --bind /oldroot/$d /$d
done

さらに、UnionFSプロセス終了防止処理のスクリプトを呼び出します。init qの後に、以下を記述します。

/usr/local/sbin/a-unionfs-fuse-omit-pid
exit 0

設定の反映

設定反映ため、initスクリプトを有効にして再起動します。

$ sudo update-rc.d a-unionfs-fuse-live-cd defaults

設定に問題がなければ、UnionFSモードで起動します。

通常起動との切り替え

UnionFSモードをやめて通常起動させるには、initスクリプトを無効化すればよいのですが、UnionFSモードでupdate-rc.dを実行しても、変更はSDカードに反映されません。取りうる手段は、/etc/init.dにあるスクリプトの実体を削除してしまうことです。SDカードのファイルシステムは/oldroot/tmp/unionfs/oldrootにありますので、これをrwにremountしてから配下のファイルを操作します。

$ sudo mount-o rw,remount /dev/root /oldroot/tmp/unionfs/oldroot

/opt/unionfs等を作成してバックアップをコピーしておき、initスクリプトを削除します。

制限等

UnionFSモードで起動した場合、メモリ512MBのモデルでも起動後の空き容量は200MB強しかありません。これを追加・変更ファイルの収納とプロセスで共用しますので、できることは限られます。例えばX Windowは起動しますが、そこでWebブラウザを使うと破綻します。また、起動時間や処理速度も悪化しますので、そのあたりは割り切りが必要です。通常作業は通常起動で、組込みデバイスとして固定動作させる場合のみUnionFSモードを使うべきでしょう。


金沢大学総合メディア基盤センター
井町智彦

 

Last update 4/4/2013 by hohno