32ビットLinuxで大容量RAMを使う方法

 このところ、多くのマシンが2GBないし4GBのRAMを搭載しているが、所有者たちはある問題に悩まされている。そうしたマシンで32ビット版のGNU/Linuxディストリビューションを実行すると、大容量RAMを活かしきれないのだ。幸いにして、この問題は特定のパラメータをいくつか有効または無効にしたカーネルをインストールするかビルドするだけで解決できる。

 この問題の原因は、32ビット版のLinuxカーネルがデフォルトでは1GBまでのRAMにしかアクセスできないように作られていることにある。この制限への対処方法は、かつてDOSで使われていた仮想メモリによる解決を彷彿とさせるもので、仮想メモリの上位メモリ領域が絶えず物理アドレスにマッピングされるようにするというものだ。こうした上位メモリは、あるカーネルパラメータによって最大4GB、Pentium Pro以上のプロセッサでは別のパラメータによって最大64GBまで有効にできる。ただし、これらのパラメータは最近までほとんどのマシンで必要とされることがなかったため、多くのディストリビューションの標準カーネルではその設定が有効になっていない。

 4GBまでの上位メモリを有効にしたディストリビューションの数は、次第に増えている。Ubuntuのデフォルトカーネルでは遅くともバージョン6.10以降で、またFedora 7でもこの処理が有効になっている。これに対し、Debianのデフォルトの486カーネルは未対応である。皆無ではないにせよ、デフォルトで64GBまで対応しているディストリビューションはごくわずかだ。

 自分の使っているカーネルがRAM全体を使用する設定になっているかどうかは、free -mコマンドを実行すればわかる。このコマンドは、システムで未使用になっているRAMの容量のほか、スワップファイルのサイズもメガバイト単位で教えてくれる。たとえば、メモリの合計サイズが885となっている場合は、上位メモリ領域が有効になっていない(合計サイズが1GBより少ないのは、差分にあたる領域をカーネルが独自の目的で確保しているためである)。また、表示された合計サイズが1GBを超えていても、その値が搭載しているはずのメモリのサイズよりも少なく4GBに満たない場合は、パラメータによって上限が64GBではなく4GBになっていると考えられる。どちらの場合も、手持ちのRAMを最大限に活用するには新しいカーネルの追加が必要になる。

 ディストリビューションによっては、自分の要求に合った汎用カーネルをほんの数秒で追加できる。たとえばDebianの場合は、4GBまでのメモリをサポートしたければ、apt-cache searchコマンドを使って686プロセッサ用カーネルの最近のlinux-imageパッケージを探し出すことになる。また、64GBまでのサポートが必要なら、名前が686-bigmemで終わるカーネルを探せばよい。これらのカーネルによって64GBのサポートが可能になる。残念ながら、4GB専用の汎用カーネルは存在しない。同様に、Ubuntuではパッケージ名がsmpで終わる最近のカーネルイメージを探す。そうしたカーネルはデュアルコアプロセッサ用に作られたものだが、ときどき小さなパフォーマンスヒットが生じる以外はシングルプロセッサでも問題なく動作する。

 ディストリビューションに使えそうな汎用カーネルが含まれていない場合、またはシステムにおける上位メモリの利用に関して細かい調整を行う場合は、カスタムカーネルのコンパイルが必要になる。ソースコードとヘッダーの入手先、そうしたカーネルのコンパイルに関する特別な注意点といった詳細については、ディストリビューションのドキュメントを参照するとよいだろう。とはいえ、ファームウェアドライバのセクションに記されている上位メモリサポートの有効化に関係するパラメータは次の5つだけである。

  • CONFIG_NOHIGHMEMが設定されていないことを確認する。
  • CONFIG_HIGHMEM4GCONFIG_HIGHMEM64Gのうち、システムの搭載RAMにとって適切なほうをyesに設定する。搭載RAMが4GB未満の場合は4GB用のパラメータを、4GB以上の場合は64GB用のパラメータを使用すればよい(RAMが4GBとなっている場合、実際の容量はそれよりも若干多いことに注意)。
  • CONFIG_HIGHMEMyesに設定する。
  • また、エラーメッセージをログに出力したければ、CONFIG_DEBUG_HIGHMEMyesに設定する。多くの汎用カーネルでオフになっている以上、おそらくこのオプションの設定は不要だろう。新たにコンパイルしたカーネルが使えなかった場合でもコンピュータを起動できるように、ブートマネージャのメニューからほかのカーネルを削除したくないときは特にそうである。

 あとはカーネルの残り部分を好きなようにコンパイルし、ブートマネージャのメニューに追加する。詳しい方法については、ブートマネージャのドキュメントを参照してほしい。

 次回のシステム起動後に再びfree -mを実行すると、今度の出力結果には搭載されているRAMの実際の容量が反映されているはずだ。めったにないことだがもしそうなっていない場合は、システムのメモリ容量を指定するためのパラメータをブートマネージャに追加する。GRUBでもLILOでも、mem=<RAM総量>Mというのがそのパラメータで、カスタマイズしたカーネルの名前のすぐ後ろに置かれている。なお、RAMの容量はメガバイト単位で指定すること。

 いずれ、上位メモリに対応したカーネルがディストリビューションの標準になるか、最終的に64ビットLinuxへの移行が完了するかして、この問題は解消されるだろう。しかし、来年くらいまでは、ここで紹介した解決策が、システム上のメモリサイズが正しく認識されないとお困りの方々の役に立ちそうだ。

Bruce Byfieldは、Linux.comとIT Manager’s Journalに定期的に寄稿しているコンピュータジャーナリスト。

Linux.com 原文