Small Memory mini-HOWTO v0.1 日本語版 BY: TODD BURGESS TBURGESS@UOGUELPH.CA オリジナル日付: Nov. 17 1997 日本語版翻訳: 中野 正剛 <sx3m-nkn@asahi-net.or.jp> ver. 0.1-j1.0 March 28, 1998 まえがき この mini HOWTO の目的は、Linux をメモリ容量の少ないシステムで動かすた めの方法を述べることです。「メモリを買って追加する」という答えは論外と して、Linux が消費するメモリを減らすための方法というのはいくつもありま す。 Linux のディストリビューションの多くは、デフォルトの設定では大きすぎで メモリを浪費してしまっています。ほとんどの人にとっては必要ではないよう な、数々のサービスや機能が使えるように設定されているのです。これら多く の過剰なサービスを取り除くことで何メガバイトもの実メモリを空けることが 可能になります。 私が持っているシステムは 486DX2-66 でメモリは 12MB 搭載、スワップ領域 は 12MB です。この環境でこれまで 3年間全く何の不満も無く Linux を動か しています。たぶん、あと何年もこのまま幸せでいられるでしょう。 :) Linux カーネル 各ディストリビューションに含まれているカーネルは肥大しすぎています。全 ての人が必要としているわけではないような機能も多く持っています。まだカ ーネルを再コンパイルしたことがないのであれば、やってみることを強くお勧 めします。この文書では再コンパイルの手順等については触れません。再コン パイルの手順の詳細については、ほかに多くの優れた書物や、ガイド等があり ますので、そちらにゆずります。 [訳注: 日本でも色々な書籍や雑誌にカーネルの再構築の仕方が紹介されてい ますね。また、JF にある、Kernel-HOWTO も大変参考になる文書としてお勧め です] 再コンパイルの際に注意すべきことは、自分にとって必要な機能以外は入れな いようにすることです。例を挙げましょう。いったいどれだけ多くの人のカー ネルに PLIP のサポートが入っているのでしょうか。その中で実際に PLIP を 使っている人ははたしてどれだけいるのでしょうか。カーネルを小さくするこ とは、ロードの時間、メモリ、そして CPU のサイクルの短縮につながります。 もう一つの解はモジュール化です。個人的には、モジュールは扱いがやっかい だと思っているので使っていません。しかし、使ってみて特に問題だと感じな ければ、これは「カーネルの巨大化」に対して効果的な機能です。 仮想コンソール 仮想コンソールの数を調整することはメモリの節約に非常に効果的です。ほと んどの Linux ディストリビューションでは、デフォルトの状態で 6個の仮想 コンソールが使えるようになっています。仮想コンソールの数を 6個にした場 合、4MB 程度のメモリを消費します。この数を減らすことによって、メガバイ ト単位でメモリを節約することができます。 ほとんどのユーザーは、3個か4個で十分でしょう。いくつまで減らせるのかは 使う人によりますが、次のことは覚えておいてください。コンソールの数を減 らせば減らすだけ、その分アプリケーションが使えるメモリの量は増えるので す。 仮想コンソールの数は、/etc/inittab というファイルに記述されています。 仮想コンソールを減らすための手順は以下のとおりです。 1. /etc/inittab をテキストエディタで読み込みます。 2. 次のように書かれている行を見つけます。(先頭が c1 で始まっている行 を探してください。(*)) c1:12345:respawn:/sbin/getty tty1 38400 linux このような行のうち、一番数字の大きな行(例えば c6 )の一番最初 (行の 左端の1文字目。左に空白を入れないように) に # を入れて、その行をコ メントにしてください。この作業を数字の大きいほうから必要なだけ繰り 返してください。1行コメントにするごとにコンソールが1つ減ります。 [訳注: 訳者の使用している RedHat 4.2 では、この記述部分は c + 数字 ではなく、いきなり数字から始まっていました。inittab の最後の方の "# Run getty ...." とコメントのある部分が仮想コンソールの数を決め ている部分です。"getty" という文字列で探すのがよいでしょう。] 3. システムをリブートすると、設定が有効になります。 デーモン 多くの Linux ディストリビューションでは、いくつものデーモンを起動する ようになっていますが、そのほとんどは使われることはありません。デーモン のうちのほとんどは、スクリプトによってロードされます。これらのスクリプ トがどこにあって、どういう名前になっているかはディストリビューションに よって異なります。Slackware の場合でしたらセットアップスクリプトは、 /etc/rc.d/rc.* にあります(*)。 [訳注: RedHat など (たぶん Debian も) のディストリビューションでは、ス タートアップスクリプトの書式が Slackware とは異なり、System V 形式にな っています (Slackware は BSD 流)。そのために /etc/rc.d 周りがこの文書 での記述とは異なっています。この文書の最後に訳者のとっている手順を載せ ました。参考になれば幸いです。] Unix shell スクリプトプログラミングについて勉強するのはとてもよいこと です。しかし、もしいままで Unix shell スクリプトを書いたことがないので したら、これから述べる部分を参照してください。これは、これまで書かれた shell スクリプトプログラミングの紹介の中ではいちばん実践的なものだと思 います。 次に挙げるシェルスクリプトを書いて実行してみてください。(*) [訳注: エディタで下記の内容を入力し、適当な名前でセーブします(例とし て foo とします)。 このスクリプトを実行するには、まず chmod +x foo として実行属性を付け、プロンプトから ./foo と入力してやります。] #!/bin/sh echo "hello world" #echo "good bye cruel world" hello world という文字列が表示されたと思います。シェルスクリプトの 1行 目は、"#!/bin/sh" でなければなりません。それ以降の行は、キーボードから その文字列が入力されたときと同じように実行されます。(シェルスクリプト というのは、すごいようにいわれていますが、要はキーボードマクロに過ぎな いんです。) ある行の左端の文字が # であった場合、それはこの行がコメントであって、 シェルによって実行されないことを示します。ところで、スタートアップスク リプトのデーモンをロードする部分は、大抵は以下のようになっています。 if somecondition do something fi このデーモンを起動させたくなければ、if の行から fi の行までをコメント アウトしてしまえばよいのです。 デーモンをロードするための記述がどこにあるのかを知るためには、そのデー モンの名前をスタートアップスクリプトから捜し出せばよいのです。 たとえば、inetd がどこにあるのか調べる方法を Slackware の場合について 説明すると、以下のようになります。 1 cd /etc/rc.d 2 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 これら 2つのデーモンは、NFS サーバーとして動作する時に使用されます。 NFS サーバーとして使用しないのであれば、両方とも取り除いてかまいませ ん。 portmap portmap デーモンは、RPC サービスを扱うときのみ使われます。NFS サーバー やその他の RPC プログラムを使用しないのであれば、portmap は除いてしま ってかまいません。 sendmail sendmail もまた、かなり多くのメモリを消費するデーモンです。e-mail の中 継をしたり、メールサーバーとして動作させるのでなければ、sendmail を取 り除いてしまってもおそらく問題ないでしょう。e-mail をやりとりするとし ても、ほとんどのメールクライアントは、自分が走っている以外のマシン(*) をメールサーバーとして設定することが可能なのですから。 [訳注: 多くの場合はプロバイダのメールサーバーになるでしょう] その他 ほかにも起動時にスタートするデーモンのうち、あなたにとって必要でないも のがあることでしょう。必要でないと思ったものは起動しないようにしましょ う。ただし、syslogd と klogd は、かならず起動するように(削除しないよう に)しておいてください。 あとがき ここに挙げたやりかたは、私が Linux のメモリ使用量をできるかぎり削減す るためにとったものです。あなたが Linux の使用するメモリ量を節約しよう と思ったときに、この文書が何かの助けになれば幸いです。 Good luck and happy hacking! Todd Burgess tburgess@uoguelph.ca http://eddie.cis.uoguelph.ca/~tburgess [訳注: RedHat/Caldera/Debian の場合のデーモンの起動の止め方 (自己流) 訳者は RedHat 4.2 を使っているため、この文書にあるデーモンの起動を止める ための手順をそのまま適用することはできませんでした。ここで、私のとった手 順を紹介しておきます。(Debian は触ったことはありませんが、PCMCIA HOWTO によると System V 流のようなので、この手が使えるのではないでしょうか) 以下の方法はベストではないのかもしれませんが、少なくとも最悪の方法では ないと信じています。^^; [注意!!] この方法に関して起きるいかなる損害も訳者は一切その責任はとること はできません。*自分の責任*において行ってくださいね。 ◎手順 1. /etc/rc.d に移動し、root 権限で cp -pdr rc3.d rc3.d.backup と入力。 オリジナルのバックアップをとっておく。(以後の操作も root 権限で。) なお、オプションは正確にいれてください! 2. /etc/rc.d/rc3.d に移動し、止めたいものを入れるディレクトリを作成する (ここでは mkdir stop とします)。 3. /etc/rc.d/rc3.d にあるのが個々のデーモンを起動するために使用される ファイルなので、不要と思われる名前のものを 2.で作成したディレクトリ に移動する。 (例: mv S60n* stop) *注意1* 決して消さないように。あくまでも移動です。 *注意2* 十分な知識なしに一度にいくつも移動すると、問題が起こるかも しれません。1回で移動するファイルは最小限にして一歩一歩進みましょ う。 4. リブートする。 これら一連の作業を行う前に、起動直後のメモリの状態を cat /proc/meminfo 等で調べておいて、作業後の値と比較すると幸せになれるかもしれません。 この方式の利点は、 1. 現在の状態から 1つ 1つ変更していけるので、問題が起こった時の原因の判 別がしやすい。 2. もし立ち上がらなくなっても、ブートフロッピーからブートして、最後に移 動したファイルを元のディレクトリ (/etc/rc.d/rc3.d) にコピーするだけ で 1つ前の状態に戻せる。 3. にっちもさっちもいかなくなった時は、ブートフロッピーからブートし、 1.でとったバックアップで rc3.d を置き換えてやれば、 (cp -pdrf rc3.d.backup rc3.d) 一番最初に戻れる。 4. mkdir と cp と mv しか使わない。(リカバリーも楽) というわけで、私のような超初心者にはいいのではないかと思います。] [日本語版の謝辞: この文書の作成に当たっては、有益なご助言をいただいた 川岸 良治さん、中野 武雄 さん ほか、JF の皆さんに感謝いたします。 ]