透過的な圧縮機能を提供し複数の圧縮方式に対応したFuseCompressについて(概要とディストリのパッケージ)
以前「高速で透過的な圧縮機能を提供するLZOlayerFS」でLZOlayerFSについてを扱ったが、これと同様、マウントポイントのディレクトリ以下に書き込んだファイルが別のディレクトリに圧縮された形で保存される方式の透過的な圧縮機能を提供するFuseCompress(github.com/tex/fusecompress)を試してみた。
(2014/10/12)公式ページのURLを修正
対応形式
本家ページにあるように- lzo
- zlib(既定)
- bzip2
- lzma
に対応している。一番上のlzoが高速・低圧縮率で、読み書きが頻繁にある場合に推奨できる。下に行くにつれて圧縮率が上がり低速になっていくため、読み書き頻度の低いものや圧縮率重視の場合に役立つ。LZMAは圧縮が遅い割に伸長が高速なので、書き込みよりも読み込みの頻度が高いときにも使えそう。
ただ、要求されるLZMAのライブラリは(2009年5月現在)安定版でないこともあり、バージョンによってビルドが通らない場合があったりする。動作については未確認だが、ビルドできたとしても実験的なものとして見たほうがよいのかもしれない。
ディストリのパッケージについて
Gentoo Linux
Gentoo向けのebuildはbugs.gentoo.org/127433
にあり、LZMAライブラリ(lzma-utils-4.999.5)のebuildもともにアップロードされている。
Debian/Ubuntu
2009年5月現在、Debianでは不安定版ディストリ(sid)にのみパッケージが用意されている。Ubuntuでは9.10(Karmic)から入っている。依存パッケージを見る限り、LZMAサポートは外されているようだ。Mandriva Linux
2009.1の時点ではMandriva Linux向けのパッケージはないため、自前で作成した。ただ、LZMAライブラリのバージョン(4.999.8beta)ではmake all-recursive make[1]: Entering directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4' Making all in src make[2]: Entering directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4/src' g++ -DHAVE_CONFIG_H -I. -I.. -D_GNU_SOURCE -D_REENTRANT -D_POSIX_C_SOURCE=200112L -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=500 -pedantic -Wno-long-long -Wall -fpermissive -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=26 -DNDEBUG -DRLOG_COMPONENT="fusecompress" -O2 -g -pipe -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -MT lzma.o -MD -MP -MF .deps/lzma.Tpo -c -o lzma.o `test -f 'boost/iostreams/filter/lzma.cpp' || echo './'`boost/iostreams/filter/lzma.cpp In file included from boost/iostreams/filter/lzma.cpp:23: ./boost/iostreams/filter/lzma.hpp:50: error: ‘lzma_easy_level’ does not name a type ./boost/iostreams/filter/lzma.hpp:51: error: ‘lzma_easy_level’ does not name a type ./boost/iostreams/filter/lzma.hpp:52: error: ‘lzma_easy_level’ does not name a type ./boost/iostreams/filter/lzma.hpp:53: error: ‘lzma_easy_level’ does not name a type ./boost/iostreams/filter/lzma.hpp:91: error: expected `)' before ‘level’ ./boost/iostreams/filter/lzma.hpp:94: error: ‘lzma_easy_level’ does not name a type ./boost/iostreams/filter/lzma.hpp:189: error: ‘default_compression’ is not a member of ‘boost::iostreams::lzma’ ./boost/iostreams/filter/lzma.hpp:229: error: ‘default_compression’ is not a member of ‘boost::iostreams::lzma’ boost/iostreams/filter/lzma.cpp:31: error: ‘lzma_easy_level’ does not name a type boost/iostreams/filter/lzma.cpp:32: error: ‘lzma_easy_level’ does not name a type boost/iostreams/filter/lzma.cpp:33: error: ‘lzma_easy_level’ does not name a type boost/iostreams/filter/lzma.cpp:34: error: ‘lzma_easy_level’ does not name a type boost/iostreams/filter/lzma.cpp:42: error: ‘LZMA_HEADER_ERROR’ was not declared in this scope boost/iostreams/filter/lzma.cpp: In member function ‘void boost::iostreams::detail::lzma_base::do_init(const boost::iostreams::lzma_params&, bool, void* (*)(void*, size_t, size_t), void (*)(void*, void*), void*)’: boost/iostreams/filter/lzma.cpp:138: error: ‘const struct boost::iostreams::lzma_params’ has no member named ‘level’ make[2]: *** [lzma.o] Error 1 make[2]: Leaving directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4' make: *** [all] Error 2
のようにエラーとなってしまったため、configureスクリプトに--without-lzmaオプションを指定して無効にする必要があった(lzo/zlib/bzip2のみ使用可能)。また
checking for boostlib >= 1.33.1... yes checking build system type... x86_64-mandriva-linux-gnu checking whether the Boost::System library is available... yes configure: WARNING: BOOST_CPPFLAGS -I/usr/include checking whether the Boost::Serialization library is available... yes configure: error: Could not link against !
(x86_64上でのみ?)上のようになってconfigureスクリプトが通らない問題に対処するため、--with-boost-libdir=%{_libdir}オプションも付けている。
他に、src/Memory.cppの
size_t size = std::min(len, (size_t) block_offset - offset);
の部分を
size_t size = std::min(len, (size_t) (block_offset - offset));
にする必要もあった。*1
作成したパッケージは別館の配布ページで公開した。
(2009/7/2)2009.1向けに加え、「FuseCompressのMandriva Linux向け自作RPMパッケージのその後(2009/7/2現在)」で2009.0向けのパッケージも作成した。
(2010/7/4)2010.1からはパッケージ「fusecompress」が用意されており、バージョンが0.6系となっているが2010年1月時点のソースのようだ。
(2014/10/12)配布ページは削除済み。
使用したバージョン:
- FuseCompress 2.5
*1:最新開発版で修正されているのと同様に変更