Small Memory mini-HOWTO
Todd
Burgess
tburgess@uoguelph.ca
JF Project
日本語訳
JF@linux.or.jp
メモリ容量が少ないシステム上で Linux を動かす方法
2000-12-12
0.1
2000-12-01
tb
イントロダクション
メモリを買って追加するという手もありますが、それ以外にも Linux が消費する
メモリの量を節約する方法はたくさんあります。
メモリ消費の観点からすると、インストールした直後のディストリビューション
では、たいてい非常に無駄の多いメモリの使い方をしています。わたしたちの
大部分が使いもしないようなサービスや機能が動いているのです。そうした過剰な
サービスの多くを削除することで、数 MB の実メモリを解放できます。
著者自身のシステムは、486DX2 66MHz の CPU と 12 MB の物理メモリ、および 12 MB
のスワップスペースという環境です。これでここ 3 年間なんの不満もなく Linux を
動かしています。たぶん、あと数年はこのまま Linux を動かし続けるでしょう。 :)
Linux カーネル
ディストリビューション付属のカーネルは、どれも肥大しすぎであり、誰も使わない
ような機能まで付加されています。これまでカーネルを再コンパイルしたことがない
としても、この際、是非やってみることをおすすめします。カーネルの再コンパイル
の方法はこの文書の範疇を越えますが、それについて丁寧に解説された優れた Linux
本やガイドはたくさんあります。
カーネルを再コンパイルする場合は、必要な機能以外は一切組み込まないという方針
を忘れないでください。たとえば、読者のうち、カーネルの PLIP サポートを必要と
するひとがどれだけいるでしょうか? その機能を組み込んだとして、実際に使う
ひとがどれだけいますか? カーネルを小さくすれば、ロード時間が短くなり、
メモリの消費は減少し、CPU サイクルも短縮されます。
もうひとつ、モジュールの問題があります。モジュールは扱いがやっかいだと
思っているので、個人的には使っていません。しかし、もし使ってみて特に
問題だと感じないなら、「カーネルの肥大化」を抑えるには効果的です。
仮想コンソール
仮想コンソールの数を減らすと、使用メモリを大幅に節約できます。大部分の Linux
ディストリビューションでは、初期状態で 6 個の仮想コンソールが作動していまが、
6 個の仮想コンソールを作動させると、だいたい平均で、約 4MB のメモリを消費
します。
この数を減らせば、数 MB 単位でメモリを節約できます。たいていのユーザは、
3 個か 4 個で充分です。いくつまで減らすかは使う人の好みにもよりますが、
仮想コンソールの数を減らせば減らすだけ、その分アプリケーションが使用できる
メモリの量が増えるということを忘れないでください。
仮想コンソールをいくつ動作させるかは、/etc/inittab
に記述されています。仮想コンソールの数を減らすには、次のようにしてください。
テキストエディタで、/etc/inittab を開きます。
次のように書かれている行を見つけます(先頭が c1 で始まっているところが
ポイントです)。
c1:12345:respawn:/sbin/getty tty1 38400 linux
このような行のうち、一番大きな数字で始まる行(たとえば、c6 )の行頭に # を
書き込んでコメントアウトします(左側に空白をいれないようにしてください)。
この作業を必要な回数だけ繰り返してください。1 行コメントアウトするごとに、
起動するコンソールがひとつ減ります。
システムを再起動すると、設定が有効になります。
デーモンプロセス
多くの Linux ディストリビューションでは、わたしたちのほとんどが使いもしない
ようなデーモンが起動するようになっています。そうしたデーモンの大部分は、
スクリプトによってロードされています。ただ、そのスクリプトの名前や置かれている
位置は、ディストリビューションによって異なっています。Slackware の場合だと、
セットアップスクリプトは /etc/rc.d/rc.* にあります
(訳注:Red Hat/Caldera/Debian でのデーモンの止め方は、日本語訳について をご覧ください)。
ここからの説明においては、Unix シェルスクリプト・プログラミングの知識があると
非常に役に立ちます。とはいえ、Unix シェルスクリプトを書いたことがないひとの
ために、以下に簡単ではありますが、シェルスクリプトの紹介をしようと思います。
次のシェルスクリプトをご覧ください。
#!/bin/sh
echo "hello world"
#echo "good bye cruel world"
上記のコードは、"hello world" という文字列を表示するものです。シェルスクリプト
には、まず次のような記述が、最初の行の先頭に含まれていなければなりません。
#!/bin/sh
それに続くすべての行では、実行に先立ってあらかじめキーボード上で打ち込んで
おいたコマンドがそのまま一行づつ実行されます(良くできたキーボードマクロの
ようなものと考えてください)。
'#' で始まる行は、シェルによって実行されないので、コメントとなります。
デーモンをロードする場合、起動スクリプトのほとんどは次のようなかたちに
なっています。
if somecondition
do something
fi
必要なのは、次の記述で始まり、
if
次の記述で終わる行、
fi
こうした行をすべてコメントアウトすることです。
特定のデーモンがどこで起動されているか知りたい場合は、そのデーモンの名前を
初期化スクリプト内で探してください。たとえば、inetd
が Slackware のどこからロードされるのか知りたい場合、わたしなら次のように
します。
$ cd /etc/rc.d
$grep -n inetd rc.*
inetd
inetd は、telnet や
ftp コマンドを使ったり、あなたのマシンに talk
リクエストを送ったりできるようにするデーモンです。自分のマシンをサーバとして
使ったり、リモートでアクセスしたりする必要がないなら、inetd
は削除してかまいません。
lpd
lpd は、lpr コマンドを使って、
ファイルをプリンタで印刷する際に使用します。お手元の Linux で印刷をしない場合
は、lpd を削除してかまいません。ただ、もしお使いの
プリンターが HP Deskjet ™ プリンタであり、それで印刷をするのであれば、
dj-printcap というパッケージをおすすめします。このパッケージは以下の場所で
入手できます。
ftp://sunsite.unc.edu/pub/Linux/system/Printing/dj-printcap.tar.gz
nfsd と
mountd
これらふたつのデーモンは、NFS サーバを稼働させる際に使用します。お使いの
Linux システムを NFS サーバとして利用しないのであれば、このふたつのデーモンは
削除したほうが安全です。
portmap
portmap デーモンは、RPC サービスを処理する際に
使用します。NFS サーバやその多の RPC プログラムを稼働させないなら、
portmap は削除してかまいません。
sendmail
sendmail もかなり多くのメモリを消費するデーモン
です。お手元の Linux で送信メールを中継したり、送信されたメールを手元の Linux
で直接受信したりしないのであれば、sendmail は
削除してかまわないでしょう。手元の Linux からメールを送信する場合は、たいてい
(プロバイダ等が提供する)別のメールサーバを使ってメール送信が可能なように、
メールクライアントを設定できるようになっています。
others
システム上で起動されるデーモンのなかには、他にも不必要なものがあると思います。
不要だと思ったら削除してしまいましょう。削除してはいけないデーモンは、
syslogd と klogd の
ふたつです。
あとがき
これまで説明したことは、わたしが自分の Linux マシンのメモリ使用量をできる
限り節約するためにとった方法です。Linux マシンのメモリ使用量を抑えるための
方法について、ちょっとした参考になればさいわいです。Good luck and happy
hacking!
日本語訳について
Red Hat/Caldera/Debian でのデーモンの起動の止め方(自己流)
訳者は RedHat 4.2 を使っているため、この文書にあるデーモンの起動を止める
ための手順をそのまま適用することはできませんでした。ここで、私のとった手
順を紹介しておきます。(Debian は触ったことはありませんが、PCMCIA HOWTO
によると System V 流のようなので、この手が使えるのではないでしょうか)
以下の方法はベストではないのかもしれませんが、少なくとも最悪の方法では
ないと信じています。^^;
(Debian ではディレクトリ配置が多少異なる場合がありますが、方法は
同じです。y.s.)
注意!!: この方法に関して起きるいかなる損害も訳者は一切その責任は
とることはできません。*自分の責任* において行ってくださいね。
◎手順
/etc/rc.d に移動し、root 権限で
cp -pdr rc3.d rc3.d.backup と入力。
オリジナルのバックアップをとっておく。(以後の操作も root 権限で。)
なお、オプションは正確にいれてください!
/etc/rc.d/rc3.d に移動し、止めたいもの
を入れるディレクトリを作成する(ここでは mkdir stop
とします)。
/etc/rc.d/rc3.d にあるのが個々の
デーモンを起動するために使用されるファイルなので、不要と思われる名前のものを
2.で作成したディレクトリに移動する。 (例: mv S60n* stop)
注意 1
決して消さないように。あくまでも移動です。
注意 2
十分な知識なしに一度にいくつも移動すると、問題が起こるかも
しれません。1回で移動するファイルは最小限にして一歩一歩進みましょう。
リブートする。
これら一連の作業を行う前に、起動直後のメモリの状態を
cat /proc/meminfo 等で調べておいて、作業後の値と比較すると
幸せになれるかもしれません。
この方式の利点は、
現在の状態から 1つ 1つ変更していけるので、問題が起こった時の原因の判
別がしやすい。
もし立ち上がらなくなっても、ブートフロッピーからブートして、最後に移
動したファイルを元のディレクトリ (
/etc/rc.d/rc3.d) にコピーするだけ
で 1つ前の状態に戻せる。
にっちもさっちもいかなくなった時は、ブートフロッピーからブートし、
1.でとったバックアップで rc3.d を置き換えてやれば、
(cp -pdrf rc3.d.backup rc3.d) 一番最初に戻れる。
mkdir と cp と mv
しか使わない。(リカバリーも楽)
というわけで、私のような超初心者にはいいのではないかと思います。
訳者および謝辞
翻訳:中野正剛(1998/03/28)
日本語版の謝辞: この文書の作成に当たっては、有益なご助言をいただいた
川岸 良治さん、中野 武雄 さん ほか、JF の皆さんに感謝いたします。
更新:千旦裕司(2001/03/17)
(Red Hat/Caldera/Debian でのデーモンの
起動の止め方は、中野正剛さんが作成しています。)