Saving_disk-mini-HOWTO 菊谷 誠(kikutani@bekkoame.or.jp) rev. 0.0 1-MAY-1995 draft rev. 0.1 7-JUL-1995 1.0 はじめに ハードディスクは最近とても安くなっていますし、デスクトップ機では SCSIなどで外付けの増設することも容易です。しかし、ノートPCでは増設は 困難です。今あるディスクでなんとかやりくりしてしのぐしかありません。 このmini-HOWTOは、ファイルを圧縮してディスクを節約するためのtipsです。 2.0 ファイル圧縮の方法 私の思い付く方法としては以下のものがあります。 実行ファイルの圧縮 gzexe tcx データ・ファイルの圧縮 gzip gzip+zlibc 実行ファイルとデータ・ファイルの両方の圧縮 double このほか、広義なSaving_diskとしては、MS-WindowsのSWAPファイルと LinuxのSWAPファイルを共用するという手法も入るでしょうが、それは Swap-Spaceというmini-HOWTOをご覧ください。 上の方法を順に説明します。 3.0 実行ファイルの圧縮 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.0 データ・ファイルの圧縮 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.0 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.0 番外編 -- thsfs 普通のDOSパーティションは直接Linuxからマウントできますが、DoubleSpace(など)で 圧縮されたパーティションはLinuxからマウントできません。thsfsはそれを可能に するものです。ただし今のバージョンはRead Onlyでのみマウントできます。 私のサブノートのように、DOSのブートディスク(Cドライブ)までDoubleSpaceで 圧縮してる場合には役立つこともあります(dosemuを使う手もありますが)。 以前のバージョンは遅すぎて使い物にならなかったですが、最近のはわりと 使えます。 入手先: dcssoft.anu.edu.au/pub/steveb/ths/thsfs.tgz モジュールで入れるので、使っているカーネルに対応した modulesパッケージが必要になる場合もあります。 使い方はソースのREADMEを御覧ください。 7.0 免責 わたくし菊谷は、このドキュメントによってあなたのPC、ディスク、メモリ、 MOなどが損害を受けた場合でも、一切その責任を負いません。 すべてご自分のリスクでやってください。 以上