<!doctype linuxdoc system>
<article>
<title>Saving_disk-mini-HOWTO</title>
<author>菊谷 誠 (kikutani@bekkoame.or.jp)
<date>v0.1, July 7 1995</date>

<abstract>
ディスクスペースを増やすための工夫
</abstract>

<![IGNORE[
        Saving_disk-mini-HOWTO

                                    菊谷 誠(kikutani@bekkoame.or.jp)
                                    rev. 0.0   1-MAY-1995 draft
                                    rev. 0.1   7-JUL-1995
]]>

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

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

</sect>


<sect>ファイル圧縮の方法
<p>
私の思い付く方法としては以下のものがあります。

<itemize>

<item>実行ファイルの圧縮
  <itemize>
  <item><tt>gzexe</tt>
  <item><tt>tcx</tt>
  </itemize>

<item>データ・ファイルの圧縮
  <itemize>
  <item><tt>gzip</tt>
  <item><tt>gzip+zlibc</tt>
  </itemize>

<item>実行ファイルとデータ・ファイルの両方の圧縮
  <itemize>
  <item><tt>double</tt>
  </itemize>

</itemize>

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

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

</sect>


<sect>実行ファイルの圧縮
<p>

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

<tscreen><verb>
gzexe foo
</verb></tscreen>

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

<tscreen><verb>
gzexe -d foo
</verb></tscreen>

です。

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

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

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

</sect1>

<sect1><tt>tcx</tt>
<p>
<descrip>
<tag>入手先：</tag>
    sunsiteの下の <tt>utils/compress/tcx-linux.tar.gz</tt> というのがあり、
    これがいろいろな CD-ROM に入ってますが、私の持ってるものはなぜか
    <tt>man page(tcx.1, untcx.1)</tt> だけ欠落してました。Unix 汎用のソースを
    探して持ってきたほうがいいでしょう。
</descrip>

インストールは、付属のドキュメントの <tt>README</tt> に従って簡単にできる
でしょう。

使い方は <tt>gzexe</tt> と似たようなもので、圧縮は

<tscreen><verb>
tcx foo
</verb></tscreen>

で、非圧縮に戻すのは

<tscreen><verb>
untcx -u foo
</verb></tscreen>

です。実行時に <tt>/tmp</tt> の下(の特別な場所)に実行ファイルを書き出して実行
するのは <tt>gzexe</tt> と同じなのですが、その実行が終ったあとも一定時間
(設定可)だけ <tt>/tmp</tt> の下に存在するので、コマンドの連続実行でも性能は
落ちません。圧縮アルゴリズムは選べますが、デフォルトは <tt>gzip</tt> です。

こちらも setuid root された実行ファイルにはかけられません。
シャットダウンの際に使われるコマンドを <tt>tcx</tt> で圧縮してしまうと、
<tt>/tmp</tt> の下にファイルが残ったままでダウンしてしまうのでやめたほうが
いいです。

</sect1>

</sect>



<sect>データ・ファイルの圧縮
<p>

<sect1><tt>gzip</tt>
<p>
言わずと知れた <tt>gzip</tt> です。
ディレクトリ <tt>foodir</tt> 以下のファイル群が、消したくはないけどめったに
使わないというような場合、ディレクトリごと

<tscreen><verb>
  tar zcf - foodir &gt; foodir.tar.gz; rm -rf foodir
</verb></tscreen>

などとして保存する方法はよくやりますね。戻すのは

<tscreen><verb>
  tar zxf foodir.tar.gz
</verb></tscreen>

です。ただし、こういう tar+gzip 形式ですと、中のファイルの一つを見るのに
いったん全部を戻さなければなりません。

&lsqb; ファイル・ユーティリティである <tt>mc</tt> (Midnight Commander) の次の
バージョン (おそらく2.5) では、tar+gzip 形式のままで、中のファイルを見る機能
が加わっているはずです。&rsqb;

そこで、<tt>foodir</tt> におりて

<tscreen><verb>
  find . -type f -exec gzip --best {} \;
</verb></tscreen>

とでもして、各々のファイルを圧縮するにとどめておいたほうがいいでしょう。
読むときはいちいち <tt>gzip -d</tt> しなくても、<tt>zcat, zgrep, zless</tt> 
等が使えます (最近の <tt>less</tt> はそのまま gzip されたものを読めますし)。

</sect1>

<sect1>zlibc
<p>
上のように <tt>gzip</tt> で圧縮したファイルを透過的に読めるようにした
ライブラリです。
「ｚペケペケ」のコマンド群でなくとも、圧縮したファイルがあたかも非圧縮の
ファイルのように扱えます。

<descrip>
<tag>入手先：</tag>
    sunsite の下の <tt>libs/zlibc-0.7.src.tar.gz</tt> が最新です
    (バイナリもあり)。
    sunsite のミラーか、いずれ Linux 関係の CD-ROM から入手できるでしょう。
    0.7 では最近の ELF ライブラリ (libc.so.5.0.9) をサポートするそうです。
</descrip>


付属のドキュメント <tt>INSTALL.linux</tt> に従ってインストールすると

<tscreen><verb>
  /libc.so.4 -&gt; /libc.so.4.5.26
</verb></tscreen>

が

<tscreen><verb>
  /libc.so.4 -&gt; /libc.so.4.5.26.z.0.5
</verb></tscreen>

のように置き換えられます。詳細は <tt>man zlibc.so</tt> をご覧ください。
また、「どのようなファイルは圧縮してはいけないか」が FAQ という
ドキュメントに書いてます。この FAQ はマニュアルに近い性格なので、
最初に通して読んだほうがいいです。

インストール後いったんリブートします。<tt>*.gz</tt> のファイルのある
ディレクトリで <tt>ls</tt> すると、<tt>.gz</tt> の付かないファイルのように
表示されます。ただし Slackware の
「色付き <tt>ls</tt>」だと、ファイル名が特殊な色になる上に、最後に「<tt>|
</tt>」が
付けられて表示されるので判別はできます。
単にlsすると <tt>.gz</tt> は付きませんが、あらわに <tt>ls foo.c.gz</tt> 
などとやると見えるのが少し奇妙です。

<tt>zlibc</tt> が効果を発揮する例を書きます。
最近の Linux カーネルのソースは大きいので展開すると 10MB くらいになります。
これを <tt>/usr/src/linux</tt> で <tt>find . -type f -exec gzip {} \;</tt> 
をやると 3MB くらいにまで減ります。
<tt>zlibc</tt> の面白い点は、「このまま <tt>make</tt> できる」ことです。
もちろん make にかかる時間は増えます。以前測ったことがありますが、30 分
かかっていた <tt>make zImage</tt> がちょうど倍の 60 分になりました。

<tt>zlibc</tt> の原理自体は簡単で、<tt>open(2)</tt> がコールされて、ファイル
が見つからなくて失敗したら <tt>.gz</tt> を付けたファイルを開こうとし、もし
あれば <tt>gunzip</tt> のパイプをつなげて読む、というものです。つまり単純に
ファイルの拡張子で判別しているのでした。

プログラムによっては勝手にこういう真似をされては困る物もあるかもしれません。
そういう場合は <tt>~/.zlibrc</tt> というファイルで細かく設定できるそうです
(<tt>man zlibrc</tt>)。私はデフォルトの設定で今のところ不都合は出ていません。

<tt>zlibc</tt> の動作を一時的にやめたいときは

<tscreen><verb>
  export ZLIB_DISABLE=1
</verb></tscreen>

とします(<tt>csh</tt> な人は <tt>setenv ZLIB_DISABLE 1</tt>)。
ただし、これは完全に <tt>zlibc</tt> の機能を止めることはできないようで、
<tt>*.gz</tt> のあるディレクトリで <tt>ls *.gz</tt> をしても「ないよ」と
怒られます。
完全に止めるには <tt>/libc.so.4</tt> のリンクを元に戻してからリブートするしか
ないでしょう。

さて、<tt>zlibc</tt> を入れていて、<tt>foo.c.gz</tt> を編集しようとして 
<tt>vi foo.c</tt> とするとバッファは開きますが、readonly になってます。つまり、
書き込み時の再圧縮はしれくれません。これをやってくれるのが次に述べる 
<tt>double</tt> です。

</sect1>

</sect>


<sect><tt>double</tt>
<p>
名前から想像されるように、DOS の圧縮ディスクに似た物です。
圧縮アルゴリズムはいろいろ選べるのですが、スピードとのトレードオフで
選ばれている、デフォルトの LZV というアルゴリズムでは、だいたい圧縮率 1.7 前後
でしょうか。<tt>double</tt> はカーネルにパッチが必要です。ファイルシステムには
依存していません(最近の版では MSDOS や UMSDOS に対応しているそうです)。

<tt>double</tt> が安定していれば、実行ファイルにもデータ・ファイルにも使える
ので Saving_disk の決定版と言えるのですが、いかんせん、まだ実用段階からは
遠いようなので簡単な紹介だけにとどめます。

<descrip>
<tag>入手先：</tag>
    比較的安定した版は 0.3 で、tsx-11 の(ミラーの)下の 
    ALPHA/double/double-0.3a.tar.gz というものがあります。最新の 0.4 は
    ときどき tsx-11 や sunsiteにupdate されますが、本家は
    achaz.saclay.cea.fr:/pub/double です。
</descrip>

0.3 で β版になったのが、0.4 ではまた α版に戻ってしまいました。
0.3 では「ディスク・フル状態」になったとき奇妙な動作をするので
それを改善すべく 0.4 が進行中です。現時点での最新は 0.4l1 で、カーネルの 
1.2.5 にまで対応しています。

私は 0.3 のときはかなり使ってました。何も起きないときは問題ないです
(あたりまえか)。何かの原因で Linux が凍って、電源ボタンを押さなければ
ならなくなったときによくファイル・システムが壊れました。まあこの場合は
<tt>double</tt> でなくてもやられることはありますが、<tt>double</tt> では
可能性が非常に高かったです。

0.3 は古いカーネル(たしか 1.1.5x 前後)までしか使えないので、
今試すなら 0.4 でしょうが、こちらは 0.3 よりも不安定です。

<tt>double</tt> はなかなか面白い試みだと思います。パーティション全体でも
できますし、パーティションの一部に <tt>double</tt> 用ファイルを作って、
それをファイルシステムとしてマウントすることもできます。
アルゴリズムを用途によって変えられる柔軟性もあります。

テスターとして寄与したい方は是非試していただきたいですが、個人的には
次の β版(0.5？)が出るまで待ちたいと思います。

</sect>


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

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

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

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

</sect>


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


以上


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

</article>
