Saving_disk-mini-HOWTO 菊谷 誠 (kikutani@bekkoame.or.jp) v0.1, July 7 1995 ディスクスペースを増やすための工夫 JF より:この文書は、1995年7月7日以来、更新されていません。現在とは異 なる部分があるので、ご注意ください。 1. はじめに ハードディスクは最近とても安くなっていますし、デスクトップ機では SCSI などで外付けの増設することも容易です。しかし、ノート PC では増設は困難 です。今あるディスクでなんとかやりくりしてしのぐしかありません。この mini-HOWTO は、ファイルを圧縮してディスクを節約するための tips です。 2. ファイル圧縮の方法 私の思い付く方法としては以下のものがあります。 o 実行ファイルの圧縮 o gzexe o tcx o データ・ファイルの圧縮 o gzip o gzip+zlibc o 実行ファイルとデータ・ファイルの両方の圧縮 o double このほか、広義な 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 のしくみは単純です。圧縮された foo を less で見ていただくとわか りますが、シェルスクリプト+ 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/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 です。 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)