RaspbianのrootfsをReadOnlyにした
fsprotectとroot-ro
Raspberry PIでRaspbianを使っている時、rootfsのReadOnly化については、fsprotectを使った方法を過去に試したことがあった。
fsprotectはdebianパッケージとしてインストールして、/boot/cmdline.txt
にfsprotect
パラメータを追加するだけで設定できるのだけど、
Raspbianではaufsのパッチを当ててカーネルを再構築する必要があり、非力なRaspberry PIでカーネルビルドするの辛いのでPCでクロスコンパイルってことになって、前提条件を達成する作業が結構大変だった。
で、他の方法を調べていたら、最近root-roというものを知った。
root-roはoverlayfsを利用しているので、カーネルの再構築が不要で簡単に導入できる。
ただ、/boot/config.txt
にinitramfs initrd.gz
を設定して、initramfsで起動する = ReadOnly
、initramfsで起動しない = 通常
となっていて、
このあたりは常にinitramfsで起動し、cmdlineパラメータでReadOnlyの有効/無効を切り替えられるfsprotectの方が好みだった。
また、root-roは/boot
パーティションもデフォルトでReadOnlyにしていて、
fsprotectは追加設定で/boot
もReadOnlyにできるがデフォルトではなっていないという違いがあった。
fsprotectを使っていた時はデフォルトのままで使っていたので、rootfsのReadOnlyを一時的に解除したいときは/boot/cmdline.txt
をちょっと編集して再起動するだけで良かった。
root-roもremountして/mnt/boot-ro
を編集すれば良いという手はあるが、/boot
ではなく/mnt/boot-ro
を意識する必要があり、個人的には/boot
はReadOnlyじゃないほうが好みだった。
で、どうせRaspbianでしか使うつもりないしということもあり、好みを満たすために1から自分で作ってみた。
readonlyfs
作ったのはこれ。
仕組みはoverlayfsを利用してinitramfsでrootfsのマウントをtmpfsを使ったupperdir、lowerdir、workdirを組み合わせたものに取り替えるというもの。
ReadOnlyの有効/無効の切り替えはcmdlineパラメータにreadonlyfs
があるかどうかで行う。
とりあえずこれを適用したものとしていないものを用意して、Diskへの書き込みをログ取りしてみた。
ReadOnly化していないRaspbianでは次のようになり、Diskへの書き込みが発生していることがわかる。
ReadOnly化したRaspbianでは次のようになり、Diskへの書き込みが発生していないことがわかる。
最低限の実装なので、tmpfsのサイズ決めたり、/boot
パーティションをReadOnlyにする機能はつけていない。
とりあえずこれでしばらく様子見。