[新]なんでも日記[新]なんでも日記ジャンル不定の日記です。難しくて断念して/etcと/homeだけ書き換えできるようにした。rootfsをoverlayfsにするつもりだったが、overlayfsは2つ以上のディレクトリを重ねるシステムなので、片方にリードオンリーなsquashfsを使って書き換えできるようにするには2つのファイルシステムを先にマウントする必要がある。kernel起動パラメータroot=の部分で指定することはできない。現在のプロセスのみ/を変更する。元の/には別のファイルシステムがマウントされていてはいけない。元の/と新/は別のファイルシステムでなければいけない。元の/にあるファイルは全削除される。システム全体を変更したいのでchrootはナシ。switch_rootは、元の/のファイルが削除されるというのはなんでだろ?マウントポイントがなくなるだけではないの?initramfsで使われることが多いみたいだが一時的なramディスクでないと問題あり?pivot_rootはなんか制約が多い。新/が別のファイルシステムだと/の下にマウントしなきゃいけないから2つのファイルシステムは必ず存在することになるのでわかりにくい。実際にpivot_rootとかswitch_rootを試してみようかと思ったが、起動中のシステムでやろうとしてもエラーでうまく行かなかった。そこをどうにかしようと考えて、rwなパーティションを/mnt/rwにマウントして、その下のディレクトリを/etcと/homeにマウントすることにした。ディレクトリ作ったりしてる作業中に、rootfsの/etcをrw/etcに全コピーしてして/etcを消すときに気づいたが、linux起動時は/sbin/initが実行されて、/etc/inittabが処理され、/etc/fstabに記載されたデバイスがマウントされる。/etc/inittabが別デバイス上じゃ読めないじゃん!ということで再度悩んだが、kernel起動パラメータのinit=で/sbin/init以外を指定すればinitプログラムを代えることができる!と気づいた。/sbin/initkernel起動パラメータで最初に実行するinit。rwデバイスをマウントして、下にあるetcとhomeを/etcと/homeにbindする。最初procをマウントしなかったらデバイスのmountができなかった。マウントしたら本来の/sbin/initを実行。-arootfsの/etcは空にしてるんでrwデバイス側。先に/init.shでbindされるんで/etc/inittabとして扱える。procのマウントは/init.sh側に移したのでコメントアウト。メモリは256MBも積んでるがストレージ(SPIフラッシュ)は16MBしかないのでswap要らん。いうわけでkernelビルド時に無効にしてるんでswaponもコメントアウトしといた。/dev/ptsと/dev/shmは最初からあるからmkdirする必要あるのか?思って一旦コメントアウトしたが、/devにdevtmpfsがkernelにマウントされるから無くなるんだね。mkdirしないとエラー出た。mkdirするには/をrwでremountする必要があるってことみたい。0これもrwデバイス側。/mnt/rwは手動マウントするんで追加しなくても起動するが、シャットダウン時に自動アンマウントさせるためにnoautoで追加しといた。これでumountしてくれる?こんな感じで、/をsquashfsにした上で/etcの変更ができるシステムができた。/run/は6MBになった。他にboot用のパーティションがzImageとかで頑張っても4MBまでしか削れない。余裕もたせてboot=6MB,root=8MBで残り2MBくらいか?と思ったが、どうせ書き込み用のイメージ化しなきゃいけないんだし最適化するスクリプトでも作るか。uhttpdの設定とかもしなきゃだが、rwの/etc上だからro部分はこれで完成か?遂にSPIフラッシュでの起動を試みるか。Buildrootのブート処理[AD]rentafree.net。