Squashfs
読み込み専用ですが、高い圧縮率で利用できるファイルシステムです。
kernelビルド
File systems --->
[*] Miscellaneous filesystems --->
<*> SquashFS 4.0 - Squashed file system support
[*] Include support for XZ compressed file systems
SquashFSを有効にしてkernelをビルドすると利用できます。
標準ではXZではなくZLIBが有効になっていますが、ZLIBだとgzip圧縮が利用できますがXZだと高圧縮率の
LZMAが利用できます。
イメージの作成
$ sudo mount rootfs.ext2 /mnt
$ sudo mksquashfs /mnt rootfs.squashfs -comp xz -b 128k
mksquashfsコマンドでファイルシステムのイメージが作成できます。
出力先ファイルが存在する場合はクリーンなイメージが作成できないようなので、存在する場合は削除してから作成する必要があります。
- compで圧縮形式が選択できますが、指定しない場合はgzipになります。xzを指定すると高圧縮ができます。
- bオプションはブロックサイズの指定ですが大きい値にしたほうが高圧縮になります。
- bオプションを指定しない場合は128kの様です。
- bオプションの範囲は4k(4096)から1m(1024k)の範囲です。
- bオプションを最低の4kにした場合でgzと同程度になり、最大の1mにした場合は3割程度容量を削減できます。
無圧縮のファイルシステムと比較して1/3程度はいけます。
bオプションは最大の1mでいいと思いますが、その場合無圧縮の1/4くらいのサイズが期待できます。
読み込み専用なので、Overlayfsなどを利用して書き換え可能にする事例が多いようですが、
Overlayfsはマウント済みファイルシステム上のディレクトリを重ねて1つにするファイルシステムなため、
rootを1つのデバイスしか指定できない通常の起動方法では利用できず、initrdやinitramfsを使用してrootを変更しないと利用できないと思われます。
私は、initrdやinitramfsは使用せずにrootfs全体をSquashfsで作成して、書き換えしたい箇所のみ別のパーティションをマウントする方法にしました。
やり方は
init.sh を参照してください。