光メディア上のファイルに対する透過的圧縮

 Linuxカーネルはバージョン2.4.14から、光メディア上のファイルの透過的展開をサポートしている。本記事ではこの透過的展開のサポートにより、mkzftreeツールとgenisoimageの-zオプションを用いて光メディアへの焼き付けを行う際に、どのような利点が得られるかを示す。これらのコマンドは、gzipと同じアルゴリズムを使用するzlibによってファイルを圧縮する。透過的圧縮エクステンションであるRock Ridgeを利用することにより、DVDにより多くのデータを格納することができる。

 焼き付けようとしているデータが既にしっかりと圧縮されているならば、透過的圧縮(展開)を用いても何の効果も得られない。たとえばJPEG画像、OGGオーディオ、bzip2で圧縮されたtarballなどを含むディスクを圧縮しても、透過的展開により得られるISOイメージは元のサイズよりもやや大きいものとなるだろう。

 HTMLやプレーンテキストファイルを含むディスクを焼く場合は、透過的展開による効果が得られる。UTF-8形式で保存されたテキストファイルならば効率よく圧縮され、LinuxカーネルはRock Ridgeエクステンションによる透過的展開を利用することにより、ディスクを読み出すアプリケーションにおいて圧縮が行われていることをユーザーに感じさせない。

 Fedora 9搭載システムにおいてgenisoimageとmkzftreeを使用するには、それぞれgenisoimageとzisofs-toolsをインストールする必要がある。openSUSE 11では、genisoimageとzisofs-toolsの両パッケージが1クリックインストールとして提供されている。Ubuntu Hardyでは、必要なツールはすべてgenisoimageパッケージに含まれている。

 ここではHTMLのLinux HOWTOファイルを用いて、透過的圧縮エクステンションRock Ridgeの仕組みとその効果を示す。HTML HOWTOファイルのtar.bz2は16MBで、XFSファイルシステムに展開すると72MBとなる。K3bでFilesystemタイプを「Linux/Unix + Windows」として、HTML HOWTOディレクトリをISOイメージに変換すると、イメージファイルのサイズは66MBとなるはずだ。透過的展開を用いれば、サイズをそれよりも小さくすることができる。

 まず以下のコマンド列により、HTML HOWTOのファイルツリーを入力として、2つの通常のISOイメージを作成した。

$ genisoimage -o HTML-normal.iso HTML
$ genisoimage -o HTML-rockridge.iso -r HTML

 genisoimageツールは実は圧縮を行わない。圧縮にはmkzftreeツールを用いる必要がある。圧縮ファイルのツリーを作成したら、genisoimageの-zオプションによって、透過的圧縮エクステンションRock Ridgeを有効化する。これによりディスクを読み出すOSは、ディスク上のファイルの一部を展開しなければならないことを認識する。-rなどのオプションにより、genisoimageに対してもRock Ridgeを有効化しておく必要がある。

$ mkzftree -p 4 --one-filesystem  HTML HTML-compressed
$ genisoimage -o HTML-rockridge-compress.iso -r -z  HTML-compressed
Warning: using transparent compression. This is a nonstandard Rock Ridge
         extension. The resulting filesystem can only be transparently
         read on Linux. On other operating systems you need to call
         mkzftree by hand to decompress the files.

 mkzftreeには他にも引数がある。--parallelism-p)オプションは、同時に実行する圧縮処理の数を指定するためのものである。ファイルシステムの境界に対処するための--one-filesystemのようなオプション群もある。mkzftreeが圧縮した出力を保存するためのディレクトリを作成する、入出力ディレクトリを指定することもできる。

 上記のコマンド列により生成されるISOファイルのサイズは、興味深いものである。

$ ls -lh *iso
-rw-rw---- 1 ben ben 64M 2008-10-21 11:45 HTML-normal.iso
-rw-rw---- 1 ben ben 33M 2008-10-21 11:56 HTML-rockridge-compress.iso
-rw-rw---- 1 ben ben 65M 2008-10-21 11:46 HTML-rockridge.iso

 最初に圧縮せずに作成した2つのISOイメージのサイズは、ソースファイルとほぼ同じとなっているのに対し、圧縮ファイルを含むISOイメージのサイズは、標準のISOイメージの約半分となっている。それでも元の圧縮されたtarballと比べると、サイズはその2倍もある。ISOイメージの方が大きいのは、tarballが単一のアーカイブファイルとして圧縮されているのに対し、ISO内の各ファイルは32KBのブロックに分割され、その個々のブロックが圧縮されるからである。一般的に圧縮するデータのブロックサイズが大きいほど、圧縮率は高くなる。Linuxカーネルが、圧縮ファイルの任意の部分にランダムアクセスできるようにするために、mkzftreeではファイルを多数のブロックに分けて圧縮しなければならないのだ。

 既存の圧縮ツリーに数ファイルを追加したい場合には、mkzftreeに--crib-treeオプションを指定する。mkzftreeのmanページには、--crib-treeではなく--crib-pathと記載されているものもあるが、--crib-pathでは動作しない。ファイルの追加は高速に処理される。上記のHTML圧縮ディレクトリは、約2.5秒で作成できた。このツリーに簡単なファイルを1つ追加し、--crib-treeを指定して新しいツリーを作成する、以下のコマンド列の実行には、わずか0.4秒しかかからなかった。

$ date > HTML/df1.txt
$ time mkzftree -p 4 --one-filesystem \
    --crib-tree  HTML-compressed \
    HTML  HTML-compressed_t5 2>/dev/null

 最後に1つだけ注意しておくと、透過的圧縮は非標準のRock Ridgeエクステンションである。ほとんどすべてのLinuxシステム上でメディアの読み出しは広くサポートされているが、他のプラットフォームで圧縮ファイルを読み出すには、mkzftreeツールの-uオプションによってファイルを展開しなければならないかもしれない。もちろんその前に、そのプラットフォームでmkzftreeをコンパイルしておく必要がある。

Ben Martin 10年以上にわたってファイルシステムを研究。博士課程を修了し、現在、libferris、ファイルシステム、検索ソリューションを中心にコンサルティングをしている。

Linux.com 原文(2008年10月31日)