試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

透過的な圧縮機能を提供し複数の圧縮方式に対応したFuseCompressについて(使い方・注意点・圧縮の対象について)

透過的な圧縮機能を提供し複数の圧縮方式に対応したFuseCompressについて(概要とディストリのパッケージ)」の続き。

使い方

マウントオプションにfc_c:[圧縮方式]を付けて圧縮ファイルの保存ディレクトリとマウントポイントを指定する。既定の方式はzlib。

(lzo:高速/低圧縮率/読み書きが頻繁な場合)
$ fusecompress -o fc_c:lzo [圧縮ファイルの保存ディレクトリ] [マウントポイント]
(zlib:やや高速/やや低圧縮率/一般的)
$ fusecompress [圧縮ファイルの保存ディレクトリ] [マウントポイント]
(bzip2:やや低速/やや高い圧縮率/圧縮率優先の場合)
$ fusecompress -o fc_c:bzip2 [圧縮ファイルの保存ディレクトリ] [マウントポイント]
(lzma:特に圧縮が非常に低速/非常に高い圧縮率/圧縮率優先・読み込みが多い場合)
$ fusecompress -o fc_c:lzma [圧縮ファイルの保存ディレクトリ] [マウントポイント]

コマンドが特にメッセージを出さずに終了すればOKで、マウントポイントのディレクトリ以下にデータを書き込んだときに圧縮ファイルの保存ディレクトリ以下に同名のファイルが圧縮されて保存される。ただし、オプション無しで実行したときに

Files with any of the following mime type will not be compressed:
  application/ogg                   application/pdf
  application/vnd.rn-realmedia      application/x-arc
  application/x-arj                 application/x-bzip2
  application/x-compress            application/x-cpio
  application/x-debian-package      application/x-gzip
  application/x-lharc               application/x-quicktime
  application/x-rar                 application/x-rpm
  application/x-shockwave-flash     application/x-zip
  application/x-zoo                 audio/mp4
  audio/mpeg                        audio/x-mod
  audio/x-pn-realaudio              image/gif
  image/jp2                         image/jpeg
  image/png                         image/x-quicktime
  video/3gpp                        video/mp2t
  video/mp4                         video/mp4v-es
  video/mpeg                        video/mpv
  video/quicktime

のように注意書きが出るように、上記の「既に圧縮されている」ファイル形式は圧縮しないようになっている。PDFやオーディオのMODなども圧縮形式扱い。*1
マウント解除は「fusermount -u」で行う。

$ fusermount -u [マウントポイント]

デスクトップ環境によってはデスクトップにマウントポイントのアイコンが出るが、GUIでそのまま「マウント解除」の操作を行ってもうまくいかないことが多い?

注意点

lsコマンドに-lオプションを付けたときに一番上に出る「合計」やduコマンドの出力は圧縮後のサイズを示す。また、baobab(ディスク使用量の解析)のようなディスク使用量取得ツールも圧縮後のサイズを返すことがある。
例えば、カーネルのソースツリーをマウントポイント以下に展開してディスク使用量を計測すると下のように見える。

無圧縮のディレクトリでは下のようになる。

一方で、「ls -l」の各ファイルのサイズ部分は元のサイズを正しく表示する。NautilusなどのGUIファイルマネージャでも、各ファイルのサイズは元のサイズで表示される。
下は例としてカーネル(2.6.29.3)ソースツリーのfirmware/acenic/ディレクトリの内容を一覧している。

(無圧縮時)
$ ls -lh uncompressed/linux-2.6.29.3/firmware/acenic
合計 412K
-rw-r--r-- 1 [ユーザ] [グループ] 197K 2009-05-09 07:47 tg1.bin.ihex
-rw-r--r-- 1 [ユーザ] [グループ] 209K 2009-05-09 07:47 tg2.bin.ihex
(マウントポイント以下では合計の表示が各ファイルのサイズの合計と一致しない)
$ ls -lh fusecompress-bzip2-mp/linux-2.6.29.3/firmware/acenic 
合計 112K
-rw-r--r-- 1 [ユーザ] [グループ] 197K 2009-05-09 07:47 tg1.bin.ihex
-rw-r--r-- 1 [ユーザ] [グループ] 209K 2009-05-09 07:47 tg2.bin.ihex
(圧縮ファイルの保存ディレクトリでは各ファイルのサイズも合計も圧縮済みのもの)
$ ls -lh bzip2ed/linux-2.6.29.3/firmware/acenic 
合計 112K
-rw-r--r-- 1 [ユーザ] [グループ] 51K 2009-05-09 07:47 tg1.bin.ihex
-rw-r--r-- 1 [ユーザ] [グループ] 57K 2009-05-09 07:47 tg2.bin.ihex

圧縮ファイルシステムの対象に関して再び考える

読み取るだけのファイルやディレクトリを圧縮しつつ、無圧縮時と同様に扱う(概要と準備)」でも圧縮の対象については扱っているが、書き込みが可能な点も踏まえてこの機会に使いどころについてをもう一度考えてみた。

テキストにはやはり効果大・実行形式は微妙

プレーンテキスト(文字情報のみ)のデータ*2についてはデータの性質上圧縮がしやすいため、かなり小さくなる。上のbaobabスクリーンショットにもあるが、Linux(カーネル)のバージョン2.6.29.3のソースツリーをbzip2で試したところ、ディスク使用量が364MiBから149MiB(約41%)になっている。
テキストの他、機械語のプログラムの類にも圧縮の余地が残っている場合が結構ある。ただ、実行形式のプログラムに圧縮ファイルシステムを使用すると起動が遅くなることやupxのように実行可能なまま高い圧縮率で縮めるツールがあったりすることなどから、おすすめはできない。
下はupxで実行形式を圧縮(pack)している例。

$ upx -9 cpufreqd-icon 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2008
UPX 3.03        Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2008

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     23256 ->      9976   42.90%  linux/ElfAMD   cpufreqd-icon                 

Packed 1 file.

圧縮後の実行形式は圧縮前と同じように実行できるが、(伸長(unpack)しないと)lddobjdumpなどの機械語に関するツールを使用することはできない。

圧縮しても直接アプリケーションから開けるものには使う必要がない

GIMPで画面全体(1280x1024)のスクリーンショットを撮ってそのまま保存したものをbzip2圧縮のマウントポイント以下に入れたところ、776KiBが282KiBになった。しかしGIMPでは元々「.xcf.bz2」の拡張子で保存するとbzip2圧縮されるようになっているため、あまり美味しいとは言えない。
ファイル自体が圧縮されているものというと、オフィスアプリケーションのOpenDocument形式などにおいて他にもZip圧縮されているものが結構ある。そういったものも同様に(元々小さなサイズで保存できるため)圧縮の余地がない。
SVG画像などはアプリケーションによっては圧縮をサポートしていることもある(例:Inkscape)が、SVG形式を扱うツールの全体から見ると一部なので、使い方によっては圧縮ファイルシステムが役に立つかもしれない。その他、無圧縮ながら圧縮しての保存ができない形式(例:.bmpファイル)をその形式のまま配置する必要のある場合にも役に立つと考えられる。

無圧縮オーディオでは可逆圧縮エンコードのほうがサイズ的には有利だが多少は小さくもできる

適当に録音した無圧縮wavファイルを用意してbzip2圧縮した場合と(エンコード/デコード時間のバランスの良い)可逆圧縮方式TTAエンコードした場合とで圧縮率を比べてみた。結果は

のようになり、TTAへのエンコードと比べると圧縮/伸長の時間と圧縮率の両方においてかなり劣ることが分かった。
ただ、.wavファイルのままで扱いたいのであれば使えなくもない(少しはディスク領域の節約になる)。

関連記事:

使用したバージョン:

  • FuseCompress 2.5
  • gnome-utils(baobabを含むパッケージ) 2.26.0
  • upx 3.03
  • ttaenc 3.4.1

関連URL:

*1:実際には圧縮するとある程度は縮むものもあるのだが、無駄が多いとされるためか、これらの形式は圧縮されない

*2:テキスト文書、受信した電子メール、(広い意味での)ソースコード、記録(ログ)ファイル、掲示板ブラウザのキャッシュ、設定ファイル、XPM画像など