2008年5月10日土曜日

ubuntuでもNTFSの圧縮フォルダ機能を

WindowsのNTFSはよく出来ていて、銀行のATMのHDDなんかもNTFSが使われたり、世界中で一番使われているファイルシステムなわけで信頼性が高かったりします。そのぶん読み書きがあまり速くなく、断片化もしやすいといた欠点もありますけどね。

 で、NTFSの便利な機能として、透過的に扱えるフォルダの圧縮機能があります。2chの過去ログを圧縮するなど用途によってはこの圧縮機能は便利なのですが、残念ながらubuntuの標準ファイルシステムである ext3 には圧縮機能がありません。
 まーいまどき500GBのHDDが七千円で買えちゃうんですから、ストレージ買えってことになっちゃうのかもしれませんが、でもねえ、4Gもの過去ログが半分のサイズになんかNTFSでなっているのをみると、ubuntuでもやりたくなるわけで・・・

ということで以下実験メモ。
残念ながらlinuxではあまり圧縮ファイルシステムは不毛なようです。ROMなど組み込み系で使用を前途にした読取専用ファイルシステムは結構あるんですけどねえ。
 色々調べた結果、こちらの記事を参考に FUSE を利用した LZOlayer ファイルシステム を試用してみることにしました。といってもやっていることはそのままなんですけどねw
LZOlayerFS の特徴はFUSE を利用したユーザランドで動く透過的な圧縮ファイルシステムです。圧縮アルゴリズムに lzo を採用し、高速な圧縮速度で通常のファイルシステムと違和感なく扱えます。
 lzo の圧縮速度についてはこちらのレポートが参考になります。

導入手順

LZOlayerFSをダウンロードし、ビルドします。あらかじめ開発環境と必要なライブラリを導入しておいて下さい。少なくてもfuse,zlib,lzo(liblzo2-dev) のライブラリが必要です。私の環境ではなぜか全部入っていましたw
wget http://north.one.pl/~kazik/pub/LZOlayer/LZOlayer_fs-20060306.tar.gz
tar zxvf LZOlayer_fs-20060306.tar.gz
cd LZOlayer_fs-20060306
make
sudo cp lzo_fs /usr/local/bin/
なのですが、そのままではエラーが出てコンパイルが通りませんので以下のように修正。

--- LZOlayer_fs.c.org
+++ LZOlayer_fs.c
@@ -7,13 +7,13 @@
Use it at your OWN RISK
Absolutely NO WARANTY
*/
+#define _LARGEFILE64_SOURCE
#define FUSE_USE_VERSION 22
#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#define __USE_LARGEFILE64
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
@@ -31,7 +31,7 @@
#define max_packets 2048
off_t block_size = 131072;
#define __LZOlayer_DEBUG 0
-#define VERSION "20060202-2"
+#define VERSION "20060306"

static char *srcPath;
static int zlibCompression = 0;
これで一応make通りました。出来た lzo_fs を~/bin なり /usr/local/bin なりにコピーしておいて下さい。

マウントしてみる

さっそく実験です。
まずはマウントポイントと、実際に圧縮されたファイルを格納するディレクトリを作成しておきます。
mkdir ~/lzo ~/lzo_compressed
さっそくマウント
lzo_fs ~/lzo_compressed ~/lzo -s

テスト

圧縮ディレクトリに2chのdatファイルを ~/lzo ディレクトリにコピーしてみます。datファイルのサイズは244Kバイト。
stat -c %s lzo/1208334590.dat
244031
stat -c %s lzo_compressed/1208334590.dat
112651
テキストファイルなので約半分に圧縮されてディスク上に格納されています。

アウンマウント

アウンマウントは、
fusermount -u ~/lzo


実際に使ってみて、普通に使えました。違和感なく。便利ですね。
ただ使用実績がないので信頼性は?ですけど。
大量のログファイルにHDDを占有されている人には一考の価値ありかも。

4 件のコメント:

たけし さんのコメント...

私の場合、ファイル名の拡張子がなんにせよ、既にその中身が圧縮済である場合以外、つまりほとんどテキストだったりするのであれば既存の圧縮ツールでログなんかは圧縮しています。作業や手順はスクリプトで好きに自動化できますし。

このファイルシステムの開発者のページには、「バグフィックスパッチを送ってくれれば適用するかもだけど、もうこのドライバはメンテしない」となっており、最後の更新が2006年初頭というのはちょっと不安でもあります。^^;

ayukawa さんのコメント...

コメントありがとうございます。
うちは全文検索用にhtmlファイルが2Gぐらいあります。ので透過的な圧縮機能があれば便利なんですよねえ。
とりあえず今回は実験的に使ってみました。もう開発終了なのですか。なにか他にいいFSないですかねえ><

たけし さんのコメント...

むかーしNamazuをシステム内の検索に使っていましたが、今はあれは流行らないのでしょうか。^^;

Namazuでは各種フォーマットのファイルを検索対象にできるので、「テキスト系」ファイルはがんがん圧縮してしまっていました。

が、「透過的に圧縮」となるとやはり圧縮をサポートしたファイルシステムのドライバしかないんでしょうね。

ntfs-3gが圧縮化されたボリュームの読み書きでもサポートしてくれれば、とは思っています。(しかしプロジェクトのページにはそれらしき機能を将来追加する予定ともなんとも書いてありませんが)

ayukawa さんのコメント...

私はHyper Estraierを使っています。htmlをgzしたものを扱うとなるとフィルタ書かないといけないし、Apacheにもモジュール入れないといけないのかな。まあ面倒くさいんでやってません(^_^;)
やっぱりHDD買うのがいいのかなあw