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
<!--Introduction-->イントロダクション メモリを買って追加するという手もありますが、それ以外にも Linux が消費する メモリの量を節約する方法はたくさんあります。 メモリ消費の観点からすると、インストールした直後のディストリビューション では、たいてい非常に無駄の多いメモリの使い方をしています。わたしたちの 大部分が使いもしないようなサービスや機能が動いているのです。そうした過剰な サービスの多くを削除することで、数 MB の実メモリを解放できます。 著者自身のシステムは、486DX2 66MHz の CPU と 12 MB の物理メモリ、および 12 MB のスワップスペースという環境です。これでここ 3 年間なんの不満もなく Linux を 動かしています。たぶん、あと数年はこのまま Linux を動かし続けるでしょう。 :) <!--Linux Kernel-->Linux カーネル ディストリビューション付属のカーネルは、どれも肥大しすぎであり、誰も使わない ような機能まで付加されています。これまでカーネルを再コンパイルしたことがない としても、この際、是非やってみることをおすすめします。カーネルの再コンパイル の方法はこの文書の範疇を越えますが、それについて丁寧に解説された優れた Linux 本やガイドはたくさんあります。 カーネルを再コンパイルする場合は、必要な機能以外は一切組み込まないという方針 を忘れないでください。たとえば、読者のうち、カーネルの PLIP サポートを必要と するひとがどれだけいるでしょうか? その機能を組み込んだとして、実際に使う ひとがどれだけいますか? カーネルを小さくすれば、ロード時間が短くなり、 メモリの消費は減少し、CPU サイクルも短縮されます。 もうひとつ、モジュールの問題があります。モジュールは扱いがやっかいだと 思っているので、個人的には使っていません。しかし、もし使ってみて特に 問題だと感じないなら、「カーネルの肥大化」を抑えるには効果的です。 <!--Virtual Consoles-->仮想コンソール 仮想コンソールの数を減らすと、使用メモリを大幅に節約できます。大部分の Linux ディストリビューションでは、初期状態で 6 個の仮想コンソールが作動していまが、 6 個の仮想コンソールを作動させると、だいたい平均で、約 4MB のメモリを消費 します。 この数を減らせば、数 MB 単位でメモリを節約できます。たいていのユーザは、 3 個か 4 個で充分です。いくつまで減らすかは使う人の好みにもよりますが、 仮想コンソールの数を減らせば減らすだけ、その分アプリケーションが使用できる メモリの量が増えるということを忘れないでください。 仮想コンソールをいくつ動作させるかは、/etc/inittab に記述されています。仮想コンソールの数を減らすには、次のようにしてください。 テキストエディタで、/etc/inittab を開きます。 次のように書かれている行を見つけます(先頭が c1 で始まっているところが ポイントです)。 c1:12345:respawn:/sbin/getty tty1 38400 linux このような行のうち、一番大きな数字で始まる行(たとえば、c6 )の行頭に # を 書き込んでコメントアウトします(左側に空白をいれないようにしてください)。 この作業を必要な回数だけ繰り返してください。1 行コメントアウトするごとに、 起動するコンソールがひとつ減ります。 システムを再起動すると、設定が有効になります。 <!--Daemons-->デーモンプロセス 多くの 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.* <application>inetd</application> inetd は、telnet ftp コマンドを使ったり、あなたのマシンに talk リクエストを送ったりできるようにするデーモンです。自分のマシンをサーバとして 使ったり、リモートでアクセスしたりする必要がないなら、inetd は削除してかまいません。 <application>lpd</application> lpd は、lpr コマンドを使って、 ファイルをプリンタで印刷する際に使用します。お手元の Linux で印刷をしない場合 は、lpd を削除してかまいません。ただ、もしお使いの プリンターが HP Deskjet ™ プリンタであり、それで印刷をするのであれば、 dj-printcap というパッケージをおすすめします。このパッケージは以下の場所で 入手できます。 ftp://sunsite.unc.edu/pub/Linux/system/Printing/dj-printcap.tar.gz <application>nfsd</application> <!--and-->と <application>mountd</application> これらふたつのデーモンは、NFS サーバを稼働させる際に使用します。お使いの Linux システムを NFS サーバとして利用しないのであれば、このふたつのデーモンは 削除したほうが安全です。 <application>portmap</application> portmap デーモンは、RPC サービスを処理する際に 使用します。NFS サーバやその多の RPC プログラムを稼働させないなら、 portmap は削除してかまいません。 <application>sendmail</application> sendmail もかなり多くのメモリを消費するデーモン です。お手元の Linux で送信メールを中継したり、送信されたメールを手元の Linux で直接受信したりしないのであれば、sendmail は 削除してかまわないでしょう。手元の Linux からメールを送信する場合は、たいてい (プロバイダ等が提供する)別のメールサーバを使ってメール送信が可能なように、 メールクライアントを設定できるようになっています。 others システム上で起動されるデーモンのなかには、他にも不必要なものがあると思います。 不要だと思ったら削除してしまいましょう。削除してはいけないデーモンは、 syslogdklogd の ふたつです。 <!--Conclusions-->あとがき これまで説明したことは、わたしが自分の 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) 一番最初に戻れる。 mkdircpmv しか使わない。(リカバリーも楽) というわけで、私のような超初心者にはいいのではないかと思います。 訳者および謝辞 翻訳:中野正剛(1998/03/28) 日本語版の謝辞: この文書の作成に当たっては、有益なご助言をいただいた 川岸 良治さん、中野 武雄 さん ほか、JF の皆さんに感謝いたします。 更新:千旦裕司(2001/03/17) (Red Hat/Caldera/Debian でのデーモンの 起動の止め方は、中野正剛さんが作成しています。)