カーネルの設定変更と再構築の手順

 カーネルのコンパイルといえば、Linux好きの人にとっては醍醐味であり、初心者にとっては少々難関と言えます。
 というより初心者にとってカーネルの再コンパイルやアップデートなど、一体なんのメリットがあるのかも理解しかねます。。
 ですがここでは練習の意味でカーネルのカスタマイズとコンパイル、手順と失敗したときの復旧方法を記しておきます。
 ここではカーネルがなにか、などという解説はしません。Linuxが起動するのに必要なLinuxそのもの、と漠然と捉えれば十分でしょう。

 カーネルのソースコードは「/usr/src」ディレクトリにあるlinux-x.x.xx.xディレクトリの中にあります。
 
 画像の中で言えば、linux-2.6.22.5-31ディレクトリです(画像は10.3の様子)。存在するディレクトリの数字(バージョン)は環境によって異なります。

カーネルコードのインストール
 画像中のlinux-2.6.22.5-31に相当するディレクトリがない場合、カーネルソースコードがインストールされていません。
 とくにopenSUSEをデフォルトインストールしたときは入ってません。(つまり通常は必要ないということですね)
 カーネルのソースコードをYaSTのソフトウェア管理からインストールします。
 フィルタの項目から「パターン」を選択し、Linuxカーネル開発を選択します。
 

 インストールしてから、もう一度「/usr/src」を確認します。ディレクトリの存在が確認できましたか。
 openSUSE10.3のCDやDVDからインストールした場合は画像と同じくバージョン2.6.22.5-31のカーネルソースがインストールされます。
 アップデートからインストールすると、その段階で最新のカーネルソースがインストールされるかと思います。
 コマンドで「uname -a」とすると、現在使用しているカーネルのバージョンが見られます。
 unameで表示されたバージョンがカーネルソースのディレクトリと同じ数字なら、現在使用しているカーネルと同じバージョンのソースコードがインストールされたことになります。
 ディレクトリの数字がunameの表示より大きければ、新しくアップデートされたカーネルソースがインストールされたことになります。
 (カーネルのバージョンアップを行いたくない場合は、リポジトリをDVDなどに絞って、YaSTからオリジナルバージョンのカーネル開発をインストールしましょう)

 ですが、気になることがあります。
 /usr/srcにはlinuxという、いかにものディレクトリがあります。
 これはなんでしょう。
 中を見てみると、linux-2.6.22.5-31とまったく同じ内容のディレクトリです。
 /usr/src/linuxは/usr/src/linuxはlinux-2.6.22.5-31へ張られたシンボリックリンクです。
 

 なぜこんな複雑はなことをしているのでしょう。

 Linuxのカーネルは個人で自由に更新したりカスタマイズできたりするので、カーネルのバージョンは個人ごとに異なっていることが大いに考えられます。
 ユーザがどのバージョンを利用しているかは予測がつきません。ディレクトリもアテになりません。過去のソースが残っていたり、最新のソースがあるからといって最新のカーネルを使用しているとも限りません。
 カーネルソースを必要とするソフトを導入する際、ソフトは現在利用中のカーネルソースが保存されているディレクトリを見分けることが出来ません。
 そこで/usr/src/linuxで画一的にアクセスできるようにシンボリックリンクが張られています。
 より新しいカーネルソースを取得してきて展開したら、旧のカーネルソースのシンボリックリンクは上書きされます。

カスタマイズとコンパイル
 さて、標準で入っているソースは必ずコンパイルが成功します。(するはずです)
 なので少しだけカスタマイズして、コンパイルしてみましょう。
 コンパイルしただけではシステムへ影響を与えません。
 ・カスタマイズ (カーネルソースのファイルの編集)
 ・コンパイル (ソースコードからバイナリファイルを生成します)
 ・インストール (生成したバイナリファイルをブート位置に配置して、ブートローダの設定を変更します。旧のカーネルは置き換えません)
 ・ドライバのコンパイル、インストール (カーネルに含まれるドライバソースのコンパイルと、配置)
 ・起動しない場合に備えてブートローダに予備のメニューを追加
 ・再起動
 という流れになります。

 とりあえず練習の意味で、カーネルのコンパイルを行ってみます。
 もし現在使用しているカーネルよりも新しいソースコードを取得してきたのなら、以下の作業を行うとカーネルのアップデートを行ったことなります。
 ここでは10.3オリジナルのバージョンである2.6.22.5-31のバージョンを使用します。
 多数の項目を変更するとマシンによって起動しなくなる恐れがありますので、ここでは単純な設定項目だけを一つ変更します。
 変更項目はISAバスの有効無効です。いまどきISAを使用していることも少ないでしょう。

 カーネルのカスタマイズにはいくつもの方法があります。
 ・手動でコンフィグファイルを編集する → 設定項目が膨大で記述ミスも考えられます
 ・対話式でYES/NO形式で編集する(make configu) → 質問事項が多すぎて面倒です
 ・GUI用編集メニューから設定する(make gconfig/xfonfig) → Gtk/Qtが必要で初期状態では巧く起動しません
 ・CUI用編集メニューから設定する(make menuconfig) → 多くの環境で実行可能で分かりやすい

 というわけで、ここではmake menuconfigを使用します。

 コマンド
 >cd /usr/src/linux
 >su
 #make menuconfig

 


 さらにメニューの中から「Bus options (PCI, PCMCIA, EISA, MCA, ISA)」の下、「ISAsupport」のチェックを外します。
 


 編集が終わったらExitし、「Do you wish to save your new kernelconfiguration?」に「yes」と答えて、保存します
 makeコマンドでコンパイルを開始します。

 #make

 コンパイルには通常時間がかかります。この環境、Pentium4 3.4GHz、RAM1GB(シングルチャネル)では50分から1時間ほどでした。
 なお並列してコンパイルを実行する「make -j3」(3重並列で行う例)というコマンドもあります。マルチコアならこちらのほうが速いでしょう。Pen4HTの環境では速度アップは確認できませんでした。
 


 次にモジュール・ドライバをコンパイルします。

 #make modules

 コンパイルしたカーネルをインストールします。ブートローダによって変化しますが、GUI環境では大抵GRUBです。

 ブートローダがGRUBの場合
 #make install

 ブートローダがLILOの場合
 #make bzlilo


 「make install」で「/boot」の配下にコンパイルしたカーネルが配置されます。
 (このとき、initrdから始まるファイルが生成されるはずですが、もしこのときinitrdから始まるカーネルバージョンのファイルが生成されていない場合は、もう一度make installを実行します。)
 とくに今回は、すでに存在しているカーネルと同じバージョンをインストールしたので、それまで使用していたオリジナルのカーネルファイル「vmlinuz-2.6.22.5-31-default」に「.old」という拡張子が付加されて退避されています。
 


 モジュール(ドライバなど)をインストールします。

 #make modules_install

 コンパイル時に「RAMドライブを作成…」というメッセージが表示された場合は、最後にramディスクを生成します。

 #mkinitrd


 この一連の作業でカーネルコンパイルとインストールは終了です。
 ここで再起動しても良いのですが、コンパイルによって作られたカーネルが貴方のパソコンで正常動作するかは神のみぞ知るです。
 万が一再起動しなかったときのために、ブートローダに予備の起動メニュー(従来のカーネルを選択して起動する項目)を追加しておきましょう。

 YaSTのシステム-ブートローダを選択します。
 

 現在のブートメニューを選択して、「追加」をクリックします。
 

 「選択したセクションの複製」を選択します。
 

 セクション名に適当な名前を入力します。カーネルイメージに従来のカーネルファイル名を指定します。 ここではvmlinuz-2.6.22.5-31-default.oldを入力します。
 
 結局カーネルのインストール、ブートとはブートローダがvmlinuzで始まるカーネルファイルを指定しているだけです。

 また、ここで「初期RAMディスク」にinitrdが指定されているかを確認します。
 記述されていない場合は、/boot/initrd-2.6.xxxという新しいカーネルバージョンのinitrdファイルを指定します。
 initrdファイルが生成されていない場合、「make moduls_install」の後にもう一度「make install」を実行します。


 なお、なぜかブートローダでカーネル指定を編集したあと、意図しない内容に変更されることがあります。もう一度ブートローダを起動して、確認することをお勧めします。
 再起動し、新しいカーネルを指定したメニューで起動できれば、カーネルのコンパイルは成功です。

 もしカーネルパニックでRAMディスクがなんたら、というエラーが現れたら、initrdがうまく生まれていないか、指定されていません。initrdファイルとブートローダの初期RAMディスクを確認します。

 ブートローダの古いカーネルの指定は、安定運用してきたら削除してもかまいません。
 カーネルのアップデートをした場合は、unameコマンドでカーネルバージョンを確認しましょう。

 新しいカーネルで起動が成功したところでカーネルをいじるまえのdmesgと、カーネル再コンパイル後のdmesgを調べてみました。
 
 左がISABUSを削除した新しいカーネルの起動メッセージ、右がオリジナルのカーネルの起動メッセージです。
 ちゃんとISAPnPの項目が消えています(fb0の真下)。つまりこのカーネルはもうISAバスに新しいカードを刺しても認識しないということです。
 こういったことを積み上げることでリソースを節約したり、USBやIEEE1394、Bluetoothといった外部接続を無効にしたり、バグのある不必要な機能を排除したり出来ます。

 さてカーネル変更後にちゃんと起動したときは良いのですが、起動できなかったときはあらかじめ作成しておいたブートメニューで起動し、問題に対処します。
 失敗したカーネルを削除し、古いカーネルの名前を戻し、ブートメニューを編集します。
 カーネルのコンフィグを見直してコンパイルし直したり、あるいはカーネルの再構築を諦めたりします。
 それでも全く起動できない場合は、DVDからブートして「Repair Installed System」を選択します。
 

 メニューから「Start Installation or System」を選択します。
 

 メニューから「Boot Installed Sytem」を選択します。
 
 これでインストールされているパーティションからシステムが起動できます。

 どちらにせよ、カーネルの入れ替えで失敗すると、とりあえず復旧にはスキルを要します。
 カーネルリビルドは強い自信と必要性がないと出来ませんね。

 こちらのサイトにカーネルメニューの解説がありますので、参考にしてください。
 http://itpro.nikkeibp.co.jp/linux/backnum/200603/kernel.html





prev.gif