次のページ 前のページ 目次へ

        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などが損害を受けた場合でも、一切その責任を負いません。
すべてご自分のリスクでやってください。


以上

次のページ 前のページ 目次へ