32ビット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_HIGHMEM4G
とCONFIG_HIGHMEM64G
のうち、システムの搭載RAMにとって適切なほうをyes
に設定する。搭載RAMが4GB未満の場合は4GB用のパラメータを、4GB以上の場合は64GB用のパラメータを使用すればよい(RAMが4GBとなっている場合、実際の容量はそれよりも若干多いことに注意)。 -
CONFIG_HIGHMEM
をyes
に設定する。 - また、エラーメッセージをログに出力したければ、
CONFIG_DEBUG_HIGHMEM
もyes
に設定する。多くの汎用カーネルでオフになっている以上、おそらくこのオプションの設定は不要だろう。新たにコンパイルしたカーネルが使えなかった場合でもコンピュータを起動できるように、ブートマネージャのメニューからほかのカーネルを削除したくないときは特にそうである。
あとはカーネルの残り部分を好きなようにコンパイルし、ブートマネージャのメニューに追加する。詳しい方法については、ブートマネージャのドキュメントを参照してほしい。
次回のシステム起動後に再びfree -m
を実行すると、今度の出力結果には搭載されているRAMの実際の容量が反映されているはずだ。めったにないことだがもしそうなっていない場合は、システムのメモリ容量を指定するためのパラメータをブートマネージャに追加する。GRUBでもLILOでも、mem=<RAM総量>M
というのがそのパラメータで、カスタマイズしたカーネルの名前のすぐ後ろに置かれている。なお、RAMの容量はメガバイト単位で指定すること。
いずれ、上位メモリに対応したカーネルがディストリビューションの標準になるか、最終的に64ビットLinuxへの移行が完了するかして、この問題は解消されるだろう。しかし、来年くらいまでは、ここで紹介した解決策が、システム上のメモリサイズが正しく認識されないとお困りの方々の役に立ちそうだ。
Bruce Byfieldは、Linux.comとIT Manager’s Journalに定期的に寄稿しているコンピュータジャーナリスト。