「コラム: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