ミルク色の記録

やったこと、やってみたこと

RaspbianのrootfsをReadOnlyにした

fsprotectとroot-ro

Raspberry PIでRaspbianを使っている時、rootfsのReadOnly化については、fsprotectを使った方法を過去に試したことがあった。

github.com

fsprotectはdebianパッケージとしてインストールして、/boot/cmdline.txtfsprotectパラメータを追加するだけで設定できるのだけど、 Raspbianではaufsのパッチを当ててカーネルを再構築する必要があり、非力なRaspberry PIでカーネルビルドするの辛いのでPCでクロスコンパイルってことになって、前提条件を達成する作業が結構大変だった。

で、他の方法を調べていたら、最近root-roというものを知った。

github.com

root-roはoverlayfsを利用しているので、カーネルの再構築が不要で簡単に導入できる。

ただ、/boot/config.txtinitramfs initrd.gzを設定して、initramfsで起動する = ReadOnlyinitramfsで起動しない = 通常となっていて、 このあたりは常に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

作ったのはこれ。

github.com

仕組みはoverlayfsを利用してinitramfsでrootfsのマウントをtmpfsを使ったupperdir、lowerdir、workdirを組み合わせたものに取り替えるというもの。

ReadOnlyの有効/無効の切り替えはcmdlineパラメータにreadonlyfsがあるかどうかで行う。

とりあえずこれを適用したものとしていないものを用意して、Diskへの書き込みをログ取りしてみた。

ReadOnly化していないRaspbianでは次のようになり、Diskへの書き込みが発生していることがわかる。

f:id:ushiboy:20190427100905p:plain
ReadOnlyなし

ReadOnly化したRaspbianでは次のようになり、Diskへの書き込みが発生していないことがわかる。

f:id:ushiboy:20190427100949p:plain
ReadOnlyあり

最低限の実装なので、tmpfsのサイズ決めたり、/bootパーティションをReadOnlyにする機能はつけていない。

とりあえずこれでしばらく様子見。