FreeBSDのcpioやtarコマンドはlibarchiveに依存していて、このライブラリや依存が巨大なため、8M Flashのターゲットでも入れることはありませんでした。
イメージサイズ | 増加分 | |
---|---|---|
無し | 3573760 | - |
cpio,lib入り | 4592128 | 1018368 |
イメージは圧縮されていて一つのコマンドに1Mも使われてしまったので、たまったものではありません。
libarchiveのソースを見ても小さくビルドする設定はなさそうです。
FreeBSDはもともとは1.4Mのフロッピーで起動してインストールできたので、その中に入れる基本的な操作で使うコマンドは小さく作られていました。これは初期のi386マシンはフロッピーかHDDからしかブートできなかったためです。フロッピーにインストールイメージが入らなくなったりCDからもブートできるようになって、その事は忘れ去られました。
いろいろ調べて考えてGNU版のcpioをportsもどきに追加してみました。gcpioはlibcだけ有れば動くようです。2.13とちょっと古いものになっていますが。CVEの脆弱性はつぶされたものです。
イメージサイズ | 増加分 | |
---|---|---|
gcpio入り | 3635712 | 61952 |
tarはともかくcpioみたいなコマンドは元のまま小さいものにしておくべきだったと思います。
flashにバックアップ
# cat test
abc
# ls -1 test | /usr/local/bin/gcpio -C 65536 -o | dd of=/dev/flash/spi1 bs=64k
1 block
1+0 records in
1+0 records out
65536 bytes transferred in 0.519613 secs (126125 bytes/sec)
戻す時
# dd if=/dev/flash/spi1 bs=64k | /usr/local/bin/gcpio -i
1 block
# cat test
abc
flashにバックアップがない場合の判断ですが、zeroを書き込んだmd5値を確認して、もしそれと同じだたら入ってないと判断して、処理をしない方法が考えられます。
libarchiveは作りが雑な感じがします。bsdcpio敗れたり。
追記:
FreeBSDにはcpioと互換のある4.4BSD由来のpaxコマンドが入っていました。
イメージサイズ | 増加分 | |
---|---|---|
pax入り | 3608576 | 34816 |
paxがあったのでcpioやtarを拡張したのかもしれません。paxは真のBSDコマンドです。:)
入れ替える前はFreeBSDにはGNU tarが入ってようです。これはpaxのできがいまいちだったからなのかもしれません。BSDでもすべてが良いものとは限りません。:(
paxのブロックサイズの上限が64512で64Kより小さいので上記のような使い方は出来ないようです。
また展開の時にgcpioはアーカイブの終端でstdinをcloseするようですが、paxはすべて読み込んでいるようです。
flashに一日一回バックアップを書き込んだとして、flashが10万回の書き込み保証がある場合、274年使えます。