本体ほぼできた
pivot_rootでパスが役に立たなくなる問題は、結局マウントポイントのパスをpublicにする(と言うか、setとgetを両方作る)ことで解決。…まぁいっか。
pivot_rootは本当にあまりに天変地異過ぎる。絶対パスが絶対じゃない。
pivot("/sysroot", "/sysroot/initrd");
とやると、/ がそれまで /sysroot だったところに移動して、それまで / だったところは /initrd に移る。
/sysroot/proc は /proc になるし、/dev は /initrd/dev になる。
しかもすべてのプロセスが影響を受ける。chrootとは話が違う。
「絶対パスは、マウントポイントとそこからの相対パスで表される」ということで、ブロックデバイスクラスと相対パスクラスをメンバに持つ「絶対パスクラス」を作る、というのもチャレンジしたのだけど、変更箇所が多すぎるし、ごちゃごちゃしてくるので止めた。ブロックデバイスクラスが持つマウントポイントのパスも絶対パスクラスになるので、ひとつ間違えると無限ループになるし、pivot_root後の処理は少ないので、pivot_root後は適宜個別対処で。たぶん速度も速くなる。
ひとつのデバイスを複数のマウントポイントにマウントできないのでbindしよう、というのは、一応プログラムはできたけど、テストしていない。
次なるはカーネルのコンパイル。
必要なパッチをすぐ忘れるので、ちょうど良いここにメモ。
squashfs bootsplash cowloop(パッチは無く、外付け)
さらにお好みで
supermount reiser4 unicon xen ck-patchset shfs(外付け可) unionfs(外付け可) redhat-cluster(外付け) dnbd(外付け)
必須のコンフィグレーション
squashfsはビルトイン iso9660はビルトイン nbdはモジュール ext2はビルトイン loopはビルトイン RAMディスクのサイズは30MBくらいの十分な大きさにする(←すぐ忘れる!重要!) initrdをサポート af_packetはモジュール ide-diskはビルトイン(モジュールでも良いようにしておく?コメントアウトをひとつ外すだけだけど…)
まだ他にもあったような…。
URLもメモ
cowloop: 本家
squashfs: ウェブサイト SourceForgeサマリページ
bootsplash: 本家 最新カーネル用
supermount: 本家 最新カーネル用
reiser4: 本家 FTPサイト
unionfs: 本家
redhat-cluster: 本家
dnbd: 本家
bootsplashの代わりにfbsplashというのがあるらしいけど、使いかたがよくわからない。