Raspberry Pi に fsprotect

さて。ようやく fsprotect に帰ってきました。もっとも、これも目的ではなくて手段に過ぎないのですが。
背景ですが、フラッシュメモリは書換を繰り返すと寿命が短くなることがあります。これを防ぐにはフラッシュメモリを read only でディスクマウントしてあげれば良いのですが、Linux の各種ディストリビューションは通常、ファイルシステムが read/write 可能なことを前提として設計されているので、単純に read only にするという訳にはいきません。そこで fsprotect です。
ドキュメントを読む限り、fsprotect の本来の動機は

  • OS やシステムの動作に何か問題が起きたとき、ハードウェアのリセットですぐにシステムを回復させる。つまり、fsck などのお世話にはならない。
  • 停電などで急に OS が落ちたとしても、ファイルシステムを破損させない。ま、上記と似たような理由ですが。

ということのようですが、これはフラッシュメモリファイルシステム保護(延命)にも役立ちます。という訳で、以下にインストール手順を示します。
1. fsprotect をインストールします。これは Raspbian ではパッケージマネージャでインストールできます。

rpi$ sudo apt-get install fsprotect

2. initramfs を設定します。fsprotect のドキュメントにもあるように、fsprotect は Linux の initramfs を前提としているので、これがないと動きません(たぶん)。私の Raspberry Pi では initramfs が動いてないので、おそらく Raspbian のデフォルトでは initramfs を使ってないものと思います。(カーネルフラッシュメモリ上の ext4 を直接マウントできるから。)
iniitramfs は、Debian のドキュメント (http://kernel-handbook.alioth.debian.org/ch-initramfs.html) にもあるように、Debian の update-initramfs でセットアップ可能です。

rpi$ uname -r
rpi$ sudo update-initramfs -c -k `uname -r`

これで、例えば /boot/initrd.img-3.10.38+ のようなファイルができます。この名前は、以下で config.txt に指定します。
3. fsprotect を有効にします。インストールしただけでは有効にならないので、以下を実行します。/boot/cmdline.txt と /boot/config.txt は、好みのエディタで修正してください。http://elinux.org/RPi_config.txt にもあるように、/boot/config.txt における initramfs の指定は、ちょっと構文が特殊(= でなくスペースで区切る)なので注意してください。

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fsprotect

  • config.txt に以下を追加します。先ほどのファイル名です。繰り返しですが、= でなくスペースで区切ります。
initramfs initrd.img-3.10.38+

4. ここまでできたら、リブートします。リブート後、mount コマンドの結果が次のような感じになっていれば OK です。ポイントは、/dev/mmcblk0p2 (本来の root パーティション)が /fsprotect 下に ro (read only) でマウントされていることと、aufs の記述があることの 2点です。

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=53469,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=44800k,mode=755)
/dev/mmcblk0p2 on /fsprotect/system type ext4 (ro,relatime,data=ordered)
none on /fsprotect/tmp type tmpfs (rw,relatime,size=524288k,mode=755)
none on / type aufs (rw,noatime,si=c2218b7e)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=89600k)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

ここまでできたら、(/boot 以外の)適当なディレクトリに何かファイルを作ったり、変更したり、ブチ壊したりしてみましょう。fsprotect が動いていれば、電源の切/入で、元に戻るはずです。
さて、このままではファイルシステム(/boot 以外)に変更が利かなくなります。fsprotect を無効にするには、/boot/cmdline.txt から fsprotect の指定を外せば(消せば) OK です。
5. おまけ。cmdline.txt の fsprotect にはオプション指定があります。
fsprotect では、read only のファイルシステムにかぶせて書換え可能な RAM ディスク(tmpfs)を使ってますが、そのサイズは無限ではありません(当たり前ですが)。この RAM ディスクのサイズをオプションとして指定できます。cmdline.txt で、たとえば次のような記述が可能です。この指定は、mount コマンドで tmpfs を指定するときの size= オプションに渡されます。(fsprotect 以外の記述は省略しています)

  • fsprotect=256M ((K, M, G)を略すとバイト指定になるそうです。)
  • fsprotect=30%

なお、デフォルトではシステムメモリの 50% が RAM ディスクのサイズになります。この指定が大きいとたくさんの一時ファイルを作成できますが、作れば作るほどカーネルの空きメモりが減っていきます。このオプションを指定することで、この最大サイズを制限することができるということです。
おしまい。