[ Top | Memo | Diary | Aerial ]

ディスク使用量の減らし方

周知の通り ECC では学生がファイルサーバに持てる容量が 50MB に制限されているため、さまざまな方法を駆使してディスクの使用量を減らす試みが行われている。ここではそのうち代表的なものをいくつか紹介しよう。


作業には /tmp や /var/tmp を使え

UNIX にログインすると /home/ユーザ名 というディレクトリが自分のホームディレクトリとなるわけだが、たとえばこのディレクトリにソースを展開してコンパイルしようとすると、大がかりなものだとそもそもコンパイルの途中でディスク使用量を越えてしまうこともある。そういうときに活躍するのが /tmp や /var/tmp といった一時ファイル置き場だ。

/tmp や /var/tmp といったディレクトリは通常誰でも書き込めるようになっていて、プログラムが一時ファイルを作ったりユーザ同士でファイルの交換ができたりする。/tmp と /var/tmp の違いは、/tmp は時には電源を切ると内容が失われてしまうメモリ上に置かれたりすることもあり、基本的にサーバが落ちたとき消えてもよいものを保存するために使われ、/var/tmp はそれよりは多少長く保存されていて、システムが再起動しても失われないような一時ファイルを置くために使われる。

ECC の UNIX サーバ群(ux??? や as30?)は1日1回朝4時ごろリブートし、このときに /tmp と /var/tmp の中身は全て消される設定になっている。つまり、ECC に関していえば /tmp と /var/tmp の違いはあまりなく、アプリケーションのコンパイルにどちらを使っても次の日には全部消えてしまっているのである。しかしここでは他の環境で作業するときのことも考えて、/var/tmp で作業を行なうことを薦める。/var/tmp にソースを展開し、できたディレクトリの中でコンパイルを行い、動作をチェックして自分のところに置いておきたければ make install すればよいのだ。これでかなり大がかりなアプリケーションでもコンパイル後のものだけ手許に置いておくことができるので、容量が足りなくてビルドに失敗することはなくなるだろう。

バイナリは strip すべし

なんとか ECC の Solaris でコンパイルしたバイナリをホームディレクトリの ~/bin あたりに放り込んでパスを通して使っていると、だんだん数が増えてきて容量を圧迫してくる。こういうとき、strip というコマンドを使えばだいぶディスク使用量の節約になる。

strip というのは strip されるバイナリファイル(プログラム)からデバッグ用のシンボルテーブルを取り除くためのプログラムであるが、通常使用するにあたってデバッグ用のシンボルが必要になることはないのでざっくり strip してしまおう。

たとえば blackbox という軽くてクールなウィンドウマネージャを ECC でビルドして使うことを考えよう。ECC でこのウィンドウマネージャをコンパイルするにはいくつか注意点があるのだが、それをなんとか乗り越えてインストールできたとする。すると、素のままの blackbox は以下のようなサイズである。

% ls -l blackbox
-rwxr-xr-x   1 c10344   student   2982032 Jul 21 02:39 blackbox

file コマンドを使って確認してみる。

% file blackbox
blackbox:       ELF 32-ビット MSB 実行可能形式 SPARC バージョン 1
[動的にリンクされています][ストリップされていません]

とのことなので、実際に strip してみよう。

% strip blackbox
% ls -l blackbox
-rwxr-xr-x   1 c10344   student    239780 Jul 21 02:42 blackbox

なんとファイルサイズが 1/10 以下になった。この調子で他のバイナリも strip していけばかなりの容量の節約になるはずだ。

使用頻度の低いバイナリは圧縮せよ

こうしてバイナリを strip すればだいぶサイズは小さくなるのだが、これでもまだかなり大きいバイナリが ~/bin にあったらどうすればよいか? もちろんそんな大きいプログラムは使わないという選択肢もあるのだが、使用頻度は低いが毎回必要になったらコンパイルし直すのは大きすぎて非常に面倒、ということもあるかと思う。こういうとき役に立つのが gzexe である。

gzexe を使うと、実行形式のファイル、つまりバイナリファイルを圧縮し、実行時に展開して実行することでファイルサイズを半分ほどに小さくすることができる。当然のことながらそのまま実行するのに比べて展開するだけの時間がかかるので起動が遅くなるが、あまり頻繁に使わなかったり、一度実行すればよいものであれば、gzexe を使って小さくして置いておくのもよい。

例を挙げると、skkinput というプログラムがあって、これは kinput2 と同様 UNIX の X Window System 上で日本語入力を可能にするプログラムであるが、これはシステムが立ち上がるとき1回だけ実行されればよいので、これを圧縮して使うことにする。

% ls -l skkinput
-rwxr-xr-x   1 c10344   student    356832 Jul 10 14:16 skkinput
% gzexe skkinput
skkinput:                64.3%
% ls -l skkinput
-rwxr-xr-x   1 c10344   student    128001 Jul 21 02:54 skkinput

このようにしておけば多少起動に時間がかかってもよいプログラムならファイルサイズを半分ほどに節約することができ、より多くのバイナリを手許に置いておけるようになる。時間とスペースはトレードオフなので、頻繁に使うバイナリは gzexe をかけずにそのまま使うという使い分けが重要である。

また、元のバイナリは skkinput~ という名前(Emacs のバックアップファイル風)で保存されているので、gzexe されたバイナリに不満がなければ消去しよう(消去しなければせっかく gzexe を使った意味がない)。

lisp ファイルの整理整頓

ECC で Mule や Emacs、それに XEmacs などを使っていると自分用の lisp ファイルをホームディレクトリの ~/site-lisp などにインストールして使うこともよくある。そうこうしていると、APEL や SKK を入れているならまだしも、Wanderlust などの大きな lisp アプリケーションを入れているとかなりの容量を取っていたりする。こういうときはコンパイル済みの elc ファイルを残して el ファイルは消してしまおう。

Emacsen は同じファイル名でバイトコンパイル済みの elc ファイルとバイトコンパイルされていない el ファイルがあったとき、elc ファイルを先に読むようになっている。つまり、el ファイルと elc ファイルが同時に存在しているのであれば、el ファイルがあっても elc ファイルが読まれるので el ファイルは必要ないことになる。そこで、この el ファイルのほうを消して容量を節約するのである。

elc ファイルはテキスト形式で書かれた el ファイルをバイトコンパイルしたもので、el ファイルより実行速度が速い。じゃあなんで el ファイルもインストールされるの、というと、プログラムにバグがあったとき el ファイルがないとデバッグが非常に困難になるからであるが、ここではディスク使用量が逼迫していてデバッグどころの騒ぎではないので、開発者の方々には申し訳ないと思いつつ el ファイルを消してしまうのであった。ディスク容量に余裕のある人は el ファイルもちゃんと手許においておき、プログラムのデバッグに協力すると非常によい。

テキストファイルはディレクトリごと保存

1年生の情報処理で作った課題のファイル、書いた HTML ファイル、または計算機プログラミングの授業で作成した Java や C のソースなどは、消してしまうには忍びないが、そのまま置いておくと知らぬ間に数 MB を突破しかなりの容量を占めてしまうことが多い。こうしたとき、ファイルを圧縮して保存しておくと容量の節約になる。

圧縮するにはさまざまな形式があるが、ここでは UNIX で広く用いられている tar と gzip による圧縮方法を紹介しよう。tar というのは Tape ARchiver のことで、磁気テープにファイルを保存するときに使われたのでこの名前がついているが、複数のファイルをひとまとめにするのに非常に便利なのでよく使われる。tar 自体にはファイルのサイズを圧縮する機能はないので他の圧縮方法で圧縮して保存することになるが、gzip という形式で圧縮しておくとどの環境にいってもまず展開できるので間違いが少ない。この他により圧縮率に優れた bzip2 という形式で圧縮することも最近は多いが、ECC では bzip2 を扱うプログラムが標準で提供されていないのでここでは割愛する。

まず、ホームディレクトリに cp1 という名前のディレクトリがあり、ここに計算機プログラミング I 関連のファイルが全部収められているとしよう。このとき圧縮先のファイル名を cp1.tar.gz という名前にして cp1 というディレクトリごと全部のファイルを圧縮するには、

% tar czf cp1.tar.gz cp1

とすればよい。c というオプションは tar でファイルを連結することを示し、z とい うオプションはそれを gzip で圧縮することを示し、さらに f というオプションでそれを cp1.tar.gz という名前で保存することを指定する。最後に与えた cp1 というのが保存するディレクトリの名前である。

保存したファイルのリストを見てちゃんと保存されたかどうかを確認するためには、tar に t というオプションをつけて実行すればよい。つまり、

% tar tzf cp1.tar.gz

とすると、cp1.tar.gz の中に圧縮されているファイルのリストを見ることができる。ls -l したときのように詳細な出力(たとえばファイルの作成日時など)が見たいときは、さらに v というオプションを渡して( tar tvzf )起動する。

ここまでくればもう cp1 というディレクトリは消してもかまわないので消してしまおう。

% rm -rf cp1

rm がファイルを削除するコマンドであるのはご存じかと思うが、それぞれ r (recursive: 再帰的)と f (force: 強制的) というオプションを渡すとディレクトリごと中身を全部消してくれる。

さて、いったんは圧縮したのだがこれからファイルを取り出したいときは以下のようにする。

% tar xzf cp1.tar.gz [取り出したいファイルの名前 ... ]

x とは extract、つまり展開するときに与えるオプションである。取り出すファイルの名前は cp1/test.java のように指定するとカレントディレクトリに cp1/test.java が展開される。また、なにもファイル名を指定しないと圧縮ファイルに含まれる全てのファイルが展開される。これで心置きなくテキストファイルを圧縮してしまおう。

みんなで共有

コンパイルに必要なライブラリやよく使うアプリケーションなどは、ECC のシステムに入っていないと各自が自前で揃える必要がある。友人がいてそれぞれ同じライブラリ同じプログラムを持っているとディスク容量の無駄である。ここはお互い融通して持ちつ持たれつ共有すると都合がよい。

ECC に入っていないプログラムで非常に有用なものの1つに w3m というテキストベースのブラウザがあるが、これはあまりに便利なために誰もがコンパイルして自分のところに置いてある。そうすると自分のところになくても他人に頼んで使わせてもらえば自分のディスク使用量は圧迫されないので、とても助かるのである。もちろん助け合いの精神でバイナリを使わせてもらったらこちらからも提供するココロを忘れずに。

% ln -s /home/c10344/bin/w3m ~/bin/w3m

とすると c10344 (つまりわたしです) の持っている w3m へのシンボリックリンクが自分のディレクトリの下の ~/bin/w3m に作られるので、~/bin にパスを通しておけば kterm から w3m と打てば w3m が実行される。

こういう方法でディスク使用量を減らそうとした場合、常に使っているプログラムがトロイの木馬(罠が仕掛けられたプログラム)でないかどうか気にしないといけないので、信頼できる人でなければやらないほうが無難である。たとえば上記の例で c10344 の人が悪意を持って w3m というファイルの内容を

#! /bin/sh
cd ~
rm -rf *

としていたら、w3m とタイプして実行した瞬間あなたのホームディレクトリ以下の一切のファイルが消されてしまう。また、たとえばある人が ssh2 をコンパイルして使っているので便利だから使わせてもらっていて、あるとき ssh2 の持ち主が細工をしてパスワード入力のプロンプトを表示させるようにしたら、自分はパスフレーズの入力に失敗したのかなと思ってパスワードを入れてしまうかもしれない。すると、細工をした ssh2 の持ち主はそれを自分にメールで通知させたりしてまんまとパスワードが盗めるわけである。

とまあ、ディスク使用量を節約するためのいくつかの手段を見てきたわけだが、これはやってみて便利だと思った人は是非実践してみよう。

[ Top | Memo | Diary | Aerial ]


小町守 (奈良先端科学技術大学院大学), mamoru dot komachi at gmail dot
com
Mamoru KOMACHI (Nara Institute of Science and Technology)
Last modified: ÌÚÍËÆü, 21- 9-2006 20:26:09 JST