/usr/ports-*.uzip ― 2006年03月25日 02時14分11秒
わざと古いソフトウェアを残しているため、古い 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を知っていたらということぐらいだろう。
次回。
最近のコメント