ジャンル不定の日記です。

Squashfsマウントできた

Orange pi R1用OS作成でSquashfsマウントできた。initramfsなしで。
リードオンリーになっちゃうけど、これで/sbin/init実行できるから/etc/fstabにoverlay書けばいいんじゃないかな?

まずinitramfsを使ってみようと思って、実機の方で作業しようと思ったがBusyBoxのcpioが違っててやり方がわかんなかったので母艦でやった。
$ su
# mount /dev/sdg2 /mnt
# mkdir /tmp/initrd
# mkdir /tmp/initrd/dev
# mkdir /tmp/initrd/bin
# mkdir /tmp/initrd/mnt
# cp -a /mnt/bin/busybox /tmp/initrd/bin
# ln -s busybox /tmp/initrd/bin/sh
# ln -s busybox /tmp/initrd/bin/mount
# ln -s busybox /tmp/initrd/bin/switch_root
# nano /tmp/initrd/init
# chmod 744 /tmp/initrd/init
# mount /dev/sdg2 /mnt
# cd /tmp/initrd
# find . | cpio -o | gzip -9 -c > /mnt/initramfs.img
こんな感じの作業内容かな?
作業ディレクトリのしたに dev bin mnt を作成。
binにbusyboxをコピーしてシンボリックリンクで sh mount switch_root を作る。
作業ディレクトリの直下に init スクリプトを作る。
initの内容は
#!/bin/sh
/bin/mount -t devtmpfs devtmpfs /dev
/bin/mount /dev/mmcblk0p2 /mnt

exec /bin/switch_root /mnt /sbin/init
/dev にdevをマウントする。
/mnt にrootfsをマウントする。
/mnt にswitch_root で/sbin/init を実行。
て感じかな?
initを実行可能にして作業ディレクトリをinitramfs化する。

てな感じでやってブートしてみてエラーでなかったが、もともとextのrootfsでinitramfsなしでブートできてたからよくわからん。
というわけで、rootfsをSquashfsにして起動してみたがダメ。initramfsなしでブートしてもダメ。
kernelをSquashfs有効にしないで作ってるから当然w

kernel作り直しだが、menuconfigの Miscellaneous filesystems の下にSquashfsあった。
これ有効にしてリビルド。
extのrootfsで起動確認したあとでSquashfsで起動してみたが、initramfsなしで起動できた。
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 7424      7424         0 100% /
devtmpfs                116652         0    116652   0% /dev
tmpfs                   125356         0    125356   0% /dev/shm
tmpfs                   125356        32    125324   0% /tmp
tmpfs                   125356        24    125332   0% /run
圧縮しても7MBで、u-bootとzImage等で別途5MBくらい必要だから余裕ないね。
今回のリビルドの際に要らないもん消したからzImageは4MB割ってるがあまり削減余地はなさそう。

Squashfs+overlayfsだとSquashfs側が変更されないから、もうちょいextで調整する。
寝てる間にlighttpdはやっぱuhttpdに変えてBuildrootもやり直してみるか。