Linux Kernel のインストール
出典: Fukudat
このサーバーはShuttleのSB83G5 というCube型PC上で動いている Fedora Core ですが,内蔵の Ethernet を使用すると次のようなエラーログが毎秒発生します.
Jan 1 00:00:00 crew kernel: eth0: -- ERROR -- Jan 1 00:00:00 crew kernel: Class: internal Software error Jan 1 00:00:00 crew kernel: Nr: 0x19e Jan 1 00:00:00 crew kernel: Msg: Vpd: Cannot read VPD keys
これはShuttleのBIOSに問題があって,チェクサムが壊れているためと思われます.以下は,これをだまらせるパッチを当てるためにLinuxのカーネルをリビルド・インストールする方法のメモです.
ちなみに crew というのは,このサイトのサーバーの名前であると同時に,ロゴアイコンにもなっている犬の名前でもあります.
目次 |
Kernel ソースの入手
Fedora CoreはFC3あたりから標準ではカーネルソースがインストールされません.そこで,手動で入手してインストールする必要があります.
まずは,インストールするカーネルのバージョンを決めます.現在動いているバージョンは,
uname -r
で調べることができます.ここではバージョンを <version> と表すことにします(実際は,例えば 2.6.16-1.2069_FC4 といった感じの文字列です).
そのカーネルソースパッケージを http://download.fedora.redhat.com/pub/fedora/linux/core/updates/ から入手します.
それを次のコマンドでインストール(展開)します.
rpm -ivh kernel-<version>.src.rpm rpmbuild -bp --target=noarch /usr/src/redhat/SPECS/kernel-2.6.spec
すると,ソースは /usr/src/redhat/BUILD/<version> にインストールされます.
まあ,必ずしも Redhat が供給するパッケージを使用する必要はなくて,直接 http://kernel.org/ から tar-ball を入手して展開してもいいです.
ビルドするカーネルに名前を付ける
/usr/src/redhat/BUILD/<version>/Makefile の先頭の数行がこれからビルドするカーネルのバージョン番号や名前を指定しています.ここを書き換えてビルドしたカーネルと既存のカーネルが区別できるようにしておきましょう.
VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 16 EXTRAVERSION = -1.fukudat # <-- ここを書き換える NAME=Sliding Snow Leopard
.config の作成
カーネルの構成を定義します.1から全部指定する場合は,
cd /usr/src/redhat/BUILD/<version>/ make xconfig
を実行してGUIを通じて設定することが可能ですが,項目が多くて大変です.
そこで,いま動いているカーネルの設定を借用しましょう.つまり,/usr/src/kernels/<version>-smp-i686/.config をソースの展開されたディレクトリ /usr/src/redhat/BUILD/<version>/ にコピーします.
cp /usr/src/kernels/<version>-smp-i686/.config .
借用した .config のバージョンが古いときは
make oldconfig
を実行して,未定義部分を補います.
最後に
make xconfig
を実行して,設定の中身を確認しておきましょう.
パッチ
問題のチェクサム確認している部分を,以下のパッチを当ててコメントアウトします.
*** ./drivers/net/sk98lin/skvpd.c.orig 2006-03-20 14:53:29.000000000 +0900
--- ./drivers/net/sk98lin/skvpd.c 2006-04-03 12:12:21.000000000 +0900
***************
*** 498,509 ****
x += pAC->vpd.vpd_buf[i];
}
! if (x != 0) {
! /* checksum error */
! SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
! ("VPD Checksum Error\n"));
! return(1);
! }
/* find and check the end tag of the RW area */
if (!(r = vpd_find_para(pAC, VPD_RW, &rp))) {
--- 498,509 ----
x += pAC->vpd.vpd_buf[i];
}
! // if (x != 0) {
! // /* checksum error */
! // SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR | SK_DBGCAT_FATAL,
! // ("VPD Checksum Error\n"));
! // return(1);
! // }
/* find and check the end tag of the RW area */
if (!(r = vpd_find_para(pAC, VPD_RW, &rp))) {
ビルド
いよいよカーネルをコンパイルします.単に
make
とすればよいのですが,並列にコンパイルするように,
make -j 10
としてみては如何でしょうか.
カーネルのインストール
最後に,インストールします.まずモジュールをインストールします.
make modules_install
その後で,カーネルのインストールすると完了です.
make install
/etc/grub.conf に新しいエントリーができていればOKです. リブートしてためしてみましょう.
reboot
