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

Squashfsでどの程度サイズが減るのか確認してみた

Orange pi R1用OSをSPIフラッシュにのせるために16MB未満への容量削減を考えてるが、
一般的な圧縮ファイルシステムは読み込み専用な模様。
読み込み専用のファイルシステムを/に使うなら書き込み可能なファイルシステムを重ねる必要がある。
というわけで、いくつか選択肢はあるようだがカーネルにoverlayfsという重ねるFSはあり、圧縮の方はSquashfsというのがよく使われるぽい。

まず、Squashfsで圧縮した場合、目的が達成できそうか確認のために、Buildrootで作ったext4のrootfsをSquashfsにしてみた。

$ df
ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
.
.
.
/dev/sdg2            55397     13211      37886   26% /home/user/stock/sbc/opi-r1/mnt
ext4のSDカードをマウントしたが13MB強。
kernelとかは別なんでこれでは16MBをオーバーしちゃう。

$ sudo mksquashfs mnt squashfs.img
$ sudo umount mnt
$ sudo mount squashfs.img mnt
$ df
ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
.
.
.
/dev/loop0            4864      4864          0  100% /home/user/stock/sbc/opi-r1/mnt
4.8MBまで減った!
mksquashfs は ソースディレクトリと出力イメージファイルを引数にすればgz圧縮してくれるみたい。
他の圧縮タイプも選べる感じ。

この方法で目的達成できそう。

だが、Squashfsはカーネルに組み込めなそうなんで、Squashfsをmountするためにinitramfsかinitrdが必要そう。
中にはSquashfsをmountするためのモジュール、initスクリプトを実行するためのシェル本体とスクリプト。
容量がもったいない気もするが、initrdなら再利用できそうだけどinitramfsは圧縮できることを考えるとinitramfsでいいのかな?

kernelをoverlayfs対応させるためにもう一回作り直す必要があるので、
Buildrootはもう一回やり直してlinux 5.4.11で作り直そうと思う。