Saving_disk-mini-HOWTO

菊谷 誠 (kikutani@bekkoame.or.jp)

v0.1, July 7 1995
ディスクスペースを増やすための工夫

JF より:この文書は、1995年7月7日以来、更新されていません。 現在とは異なる部分があるので、ご注意ください。

1. はじめに

2. ファイル圧縮の方法

3. 実行ファイルの圧縮

4. データ・ファイルの圧縮

5. double

6. 番外編 -- thsfs

7. 免責


1. はじめに

ハードディスクは最近とても安くなっていますし、デスクトップ機では SCSI などで外付けの増設することも容易です。しかし、ノート PC では増設は 困難です。今あるディスクでなんとかやりくりしてしのぐしかありません。 この mini-HOWTO は、ファイルを圧縮してディスクを節約するための tips です。

2. ファイル圧縮の方法

私の思い付く方法としては以下のものがあります。

このほか、広義な Saving_disk としては、MS-Windows の SWAP ファイルと Linux の SWAP ファイルを共用するという手法も入るでしょうが、それは Swap-Space という mini-HOWTO をご覧ください。

上の方法を順に説明します。

3. 実行ファイルの圧縮

3.1 gzexe

gzip とともに標準でついてくる tool です。詳しくは man gzexe で見ていただくほうがいいですが、使い方は簡単です。foo を実行ファイル とすると

gzexe foo

で圧縮されます。foo~ という名のバックアップができます。 普通はバックアップは消してしまいますから、foo を非圧縮に戻すときは

gzexe -d foo

です。

gzexe のしくみは単純です。圧縮された fooless で 見ていただくとわかりますが、シェルスクリプト+ gzip で圧縮された バイナリになっていて、foo を実行すると、/tmp の下に decompress したテンポラリなファイルを作り、それを実行します。

gzexe は setuid root された実行ファイルにはかけられません (security hole のためでしょう)。また、シェルスクリプト中で tail など 他の tool を使っているので、たとえば tail のある /usr/bin の ディレクトリで何かの実行ファイルを圧縮すると、生成されたシェルスクリプトに ./tail という形で入ってしまうので他のディレクトリから実行できなく なってしまいます(バグだと思う)。この場合は /usr/bin 以外の ディレクトリから gzexe をかけます。

gzexe の欠点は、頻繁に実行するコマンドをこれで圧縮してしまうと、実行の たびに /tmp に書き出すので遅くなることです。次の tcx がこの 問題の改善案です。

3.2 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 の下にファイルが残ったままでダウンしてしまうのでやめたほうが いいです。

4. データ・ファイルの圧縮

4.1 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 されたものを読めますし)。

4.2 zlibc

上のように 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/linuxfind . -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 です。

5. 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?)が出るまで待ちたいと思います。

6. 番外編 -- thsfs

普通の DOS パーティションは直接 Linux からマウントできますが、DoubleSpace (など)で圧縮されたパーティションは Linux からマウントできません。thsfs はそれを可能にするものです。ただし今のバージョンは Read Only で のみマウントできます。 私のサブノートのように、DOS のブートディスク(Cドライブ)まで DoubleSpace で 圧縮してる場合には役立つこともあります(dosemuを使う手もありますが)。

以前のバージョンは遅すぎて使い物にならなかったですが、最近のはわりと 使えます。

入手先:

dcssoft.anu.edu.au/pub/steveb/ths/thsfs.tgz モジュールで入れるので、使っているカーネルに対応した modules パッケージが必要になる場合もあります。

使い方はソースの README を御覧ください。

7. 免責

わたくし菊谷は、このドキュメントによってあなたの PC、ディスク、メモリ、 MOなどが損害を受けた場合でも、一切その責任を負いません。 すべてご自分のリスクでやってください。

以上

(sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)