/usr/ports-*.uzip2006年03月25日 02時14分11秒

長年同じシステムをアップグレードしながら使っていると、どうしてもソフトウェア毎に更新の頻度が変わる。あるものは、古いやつのまま残していたり、あるものは新しいものに入れ換えたり。最初にシステムをインストールした後こそは package を使って入れたが、その後は、依存関係などの問題で ports でないとうまく入らないことが多くなる。

わざと古いソフトウェアを残しているため、古い ports も /usr/ports-20050812 などと残している。最初の頃は展開したままだったが、ports の構成上、tree の数が増えてくると瞬く間に inode が足りなくなる。そのため、頻繁に使う ports-tree 以外は、tar.bz2 として固めてあった。たまに必要になるので、展開して使い、終ったら消すのである。

この展開と削除にこれがまた時間がかかるのである。それに加えて、dump/restore を頻繁に使うので、これも ports のせいで、これまた時間がかかるのである。ports には大量のファイルがあるので、同じサイズのファイルがど〜んとあるよりも、アクセスに時間がかかるのである。

さて、この厄介ものの ports について考えてみた。ほとんどの ports tree は滅多に使わない。それゆえ、圧縮された状態で置いてある。必要になる度に展開して、使用後に削除。普段展開したままにしてある ports も滅多に編集しないのである。新しくインストールするときも、問題が無ければそのまま入れる。少しの努力で最新の ports からバックポートできる時のみ、バックポートする。なので、ほぼ読み込み専用状態である。work などは WRKDIRPREFIX で他を指定してもいいし、unionfs などでもいいのである。

つまり、ports tree は GEOM_UZIP を使うにはうってつけの所なのだ。普段は、圧縮してあり、必要なときだけ mount する。展開の手間もかからず、削除の必要もない。

Release のみを make world で追っている人には /usr/src にも同じことが言える。普段は uzip にしておけば dump/restore も早いし、余計なディスクスペースも要らないのである。


# du -s ports-20051011
296654  ports-20051011
# find ports-20051011 | wc
   95724   95724 4165847

まずは、ファイルの数とサイズを調べる。inode が後で足りなくならないようにだ。

# cd /usr
# rm md
# dd if=/dev/zero of=md count=1 seek=399 bs=1M
# mdconfig -a -t vnode -f md
1
# newfs -U -i 1024 md1
# mount /dev/md1 /usr/ports-20080812
# tar xvf ports-20080812.tar.bz2
# umount /usr/ports-20080812
# mdconfig -d -u 1
# mkuzip -v -s 65536 -o ports-200080812.uzip md
...
compressed data to 33761280 bytes, saved 385669120 bytes, 91.95% decrease.

mkuzip を使うためにファイルを作り、mdconfig を通して、mount しファイルを展開する。その後、mkuzip をするだけである。

なお、ここでは dd if=/dev/zero of=/usr/ports-20050812/zero などとして、使っていない領域をわざわざ埋める必要は無い。もともとが、全部 0 だったものに、ファイルを展開しただけだから、使われていないブロックには 0 が残っているからである。 以下のが dd でゼロ埋めをした後の mkuzip の結果である。圧縮できたバイト数は確かに増えているが微々たるものである。一時ファイルを作り、それを消すような事を大量に繰り返した場合は、もちろんゼロ埋め効果が上がる。なお、一時ファイルを作りそれを rename(2) するのは、inode やブロックを開放するわけでは無いので、ゼロ埋めの効果は上がらない。


compressed data to 33767424 bytes, saved 385662976 bytes, 91.95% decrease.

さらに、圧縮後の各種ファイルを比べてみる。

# ls -s ports-20051011.*
24560 ports-20051011.tar.bz2
32032 ports-20051011.tar.gz
35264 ports-20051011.uzip

bzip2 と比べると uzip は五割増しだ。gzip よりは劣るが一割程度でしか無い。完全展開した 300 MB と比べたら十分な大きさだ。今後の各種時間の短縮を考えると、元の取れる犠牲だ。

惜しむらくはもっと前から、GEOM_UZIPを知っていたらということぐらいだろう。

次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/03/25/302591/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。