JF より:この文書は、1995年7月7日以来、更新されていません。 現在とは異なる部分があるので、ご注意ください。
double
thsfs
ハードディスクは最近とても安くなっていますし、デスクトップ機では SCSI などで外付けの増設することも容易です。しかし、ノート PC では増設は 困難です。今あるディスクでなんとかやりくりしてしのぐしかありません。 この mini-HOWTO は、ファイルを圧縮してディスクを節約するための tips です。
私の思い付く方法としては以下のものがあります。
gzexe
tcx
gzip
gzip+zlibc
double
このほか、広義な Saving_disk としては、MS-Windows の SWAP ファイルと Linux の SWAP ファイルを共用するという手法も入るでしょうが、それは Swap-Space という mini-HOWTO をご覧ください。
上の方法を順に説明します。
gzexe
gzip
とともに標準でついてくる tool です。詳しくは man gzexe
で見ていただくほうがいいですが、使い方は簡単です。foo
を実行ファイル
とすると
gzexe foo
で圧縮されます。foo~
という名のバックアップができます。
普通はバックアップは消してしまいますから、foo
を非圧縮に戻すときは
gzexe -d foo
です。
gzexe
のしくみは単純です。圧縮された foo
を less
で
見ていただくとわかりますが、シェルスクリプト+ gzip
で圧縮された
バイナリになっていて、foo
を実行すると、/tmp
の下に
decompress
したテンポラリなファイルを作り、それを実行します。
gzexe
は setuid root された実行ファイルにはかけられません
(security hole のためでしょう)。また、シェルスクリプト中で tail
など
他の tool を使っているので、たとえば tail
のある /usr/bin
の
ディレクトリで何かの実行ファイルを圧縮すると、生成されたシェルスクリプトに
./tail
という形で入ってしまうので他のディレクトリから実行できなく
なってしまいます(バグだと思う)。この場合は /usr/bin
以外の
ディレクトリから gzexe
をかけます。
gzexe
の欠点は、頻繁に実行するコマンドをこれで圧縮してしまうと、実行の
たびに /tmp
に書き出すので遅くなることです。次の tcx
がこの
問題の改善案です。
tcx
sunsiteの下の utils/compress/tcx-linux.tar.gz
というのがあり、
これがいろいろな CD-ROM に入ってますが、私の持ってるものはなぜか
man page(tcx.1, untcx.1)
だけ欠落してました。Unix 汎用のソースを
探して持ってきたほうがいいでしょう。
インストールは、付属のドキュメントの README
に従って簡単にできる
でしょう。
使い方は gzexe
と似たようなもので、圧縮は
tcx foo
で、非圧縮に戻すのは
untcx -u foo
です。実行時に /tmp
の下(の特別な場所)に実行ファイルを書き出して実行
するのは gzexe
と同じなのですが、その実行が終ったあとも一定時間
(設定可)だけ /tmp
の下に存在するので、コマンドの連続実行でも性能は
落ちません。圧縮アルゴリズムは選べますが、デフォルトは gzip
です。
こちらも setuid root された実行ファイルにはかけられません。
シャットダウンの際に使われるコマンドを tcx
で圧縮してしまうと、
/tmp
の下にファイルが残ったままでダウンしてしまうのでやめたほうが
いいです。
gzip
言わずと知れた gzip
です。
ディレクトリ foodir
以下のファイル群が、消したくはないけどめったに
使わないというような場合、ディレクトリごと
tar zcf - foodir > foodir.tar.gz; rm -rf foodir
などとして保存する方法はよくやりますね。戻すのは
tar zxf foodir.tar.gz
です。ただし、こういう tar+gzip 形式ですと、中のファイルの一つを見るのに いったん全部を戻さなければなりません。
[ ファイル・ユーティリティである mc
(Midnight Commander) の次の
バージョン (おそらく2.5) では、tar+gzip 形式のままで、中のファイルを見る機能
が加わっているはずです。]
そこで、foodir
におりて
find . -type f -exec gzip --best {} \;
とでもして、各々のファイルを圧縮するにとどめておいたほうがいいでしょう。
読むときはいちいち gzip -d
しなくても、zcat, zgrep, zless
等が使えます (最近の less
はそのまま gzip されたものを読めますし)。
上のように gzip
で圧縮したファイルを透過的に読めるようにした
ライブラリです。
「zペケペケ」のコマンド群でなくとも、圧縮したファイルがあたかも非圧縮の
ファイルのように扱えます。
sunsite の下の libs/zlibc-0.7.src.tar.gz
が最新です
(バイナリもあり)。
sunsite のミラーか、いずれ Linux 関係の CD-ROM から入手できるでしょう。
0.7 では最近の ELF ライブラリ (libc.so.5.0.9) をサポートするそうです。
付属のドキュメント INSTALL.linux
に従ってインストールすると
/libc.so.4 -> /libc.so.4.5.26
が
/libc.so.4 -> /libc.so.4.5.26.z.0.5
のように置き換えられます。詳細は man zlibc.so
をご覧ください。
また、「どのようなファイルは圧縮してはいけないか」が FAQ という
ドキュメントに書いてます。この FAQ はマニュアルに近い性格なので、
最初に通して読んだほうがいいです。
インストール後いったんリブートします。*.gz
のファイルのある
ディレクトリで ls
すると、.gz
の付かないファイルのように
表示されます。ただし Slackware の
「色付き ls
」だと、ファイル名が特殊な色になる上に、最後に「|
」が
付けられて表示されるので判別はできます。
単にlsすると .gz
は付きませんが、あらわに ls foo.c.gz
などとやると見えるのが少し奇妙です。
zlibc
が効果を発揮する例を書きます。
最近の Linux カーネルのソースは大きいので展開すると 10MB くらいになります。
これを /usr/src/linux
で find . -type f -exec gzip {} \;
をやると 3MB くらいにまで減ります。
zlibc
の面白い点は、「このまま make
できる」ことです。
もちろん make にかかる時間は増えます。以前測ったことがありますが、30 分
かかっていた make zImage
がちょうど倍の 60 分になりました。
zlibc
の原理自体は簡単で、open(2)
がコールされて、ファイル
が見つからなくて失敗したら .gz
を付けたファイルを開こうとし、もし
あれば gunzip
のパイプをつなげて読む、というものです。つまり単純に
ファイルの拡張子で判別しているのでした。
プログラムによっては勝手にこういう真似をされては困る物もあるかもしれません。
そういう場合は ~/.zlibrc
というファイルで細かく設定できるそうです
(man zlibrc
)。私はデフォルトの設定で今のところ不都合は出ていません。
zlibc
の動作を一時的にやめたいときは
export ZLIB_DISABLE=1
とします(csh
な人は setenv ZLIB_DISABLE 1
)。
ただし、これは完全に zlibc
の機能を止めることはできないようで、
*.gz
のあるディレクトリで ls *.gz
をしても「ないよ」と
怒られます。
完全に止めるには /libc.so.4
のリンクを元に戻してからリブートするしか
ないでしょう。
さて、zlibc
を入れていて、foo.c.gz
を編集しようとして
vi foo.c
とするとバッファは開きますが、readonly になってます。つまり、
書き込み時の再圧縮はしれくれません。これをやってくれるのが次に述べる
double
です。
double
名前から想像されるように、DOS の圧縮ディスクに似た物です。
圧縮アルゴリズムはいろいろ選べるのですが、スピードとのトレードオフで
選ばれている、デフォルトの LZV というアルゴリズムでは、だいたい圧縮率 1.7 前後
でしょうか。double
はカーネルにパッチが必要です。ファイルシステムには
依存していません(最近の版では MSDOS や UMSDOS に対応しているそうです)。
double
が安定していれば、実行ファイルにもデータ・ファイルにも使える
ので Saving_disk の決定版と言えるのですが、いかんせん、まだ実用段階からは
遠いようなので簡単な紹介だけにとどめます。
比較的安定した版は 0.3 で、tsx-11 の(ミラーの)下の ALPHA/double/double-0.3a.tar.gz というものがあります。最新の 0.4 は ときどき tsx-11 や sunsiteにupdate されますが、本家は achaz.saclay.cea.fr:/pub/double です。
0.3 で β版になったのが、0.4 ではまた α版に戻ってしまいました。 0.3 では「ディスク・フル状態」になったとき奇妙な動作をするので それを改善すべく 0.4 が進行中です。現時点での最新は 0.4l1 で、カーネルの 1.2.5 にまで対応しています。
私は 0.3 のときはかなり使ってました。何も起きないときは問題ないです
(あたりまえか)。何かの原因で Linux が凍って、電源ボタンを押さなければ
ならなくなったときによくファイル・システムが壊れました。まあこの場合は
double
でなくてもやられることはありますが、double
では
可能性が非常に高かったです。
0.3 は古いカーネル(たしか 1.1.5x 前後)までしか使えないので、 今試すなら 0.4 でしょうが、こちらは 0.3 よりも不安定です。
double
はなかなか面白い試みだと思います。パーティション全体でも
できますし、パーティションの一部に double
用ファイルを作って、
それをファイルシステムとしてマウントすることもできます。
アルゴリズムを用途によって変えられる柔軟性もあります。
テスターとして寄与したい方は是非試していただきたいですが、個人的には 次の β版(0.5?)が出るまで待ちたいと思います。
thsfs
普通の DOS パーティションは直接 Linux からマウントできますが、DoubleSpace
(など)で圧縮されたパーティションは Linux からマウントできません。thsfs
はそれを可能にするものです。ただし今のバージョンは Read Only で
のみマウントできます。
私のサブノートのように、DOS のブートディスク(Cドライブ)まで DoubleSpace で
圧縮してる場合には役立つこともあります(dosemuを使う手もありますが)。
以前のバージョンは遅すぎて使い物にならなかったですが、最近のはわりと 使えます。
dcssoft.anu.edu.au/pub/steveb/ths/thsfs.tgz モジュールで入れるので、使っているカーネルに対応した modules パッケージが必要になる場合もあります。
使い方はソースの README
を御覧ください。
わたくし菊谷は、このドキュメントによってあなたの PC、ディスク、メモリ、 MOなどが損害を受けた場合でも、一切その責任を負いません。 すべてご自分のリスクでやってください。
以上
(sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)