Linux Kernel のインストール

提供: fukudat
移動: 案内検索

ShuttleSB83G5 という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

参考文献

個人用ツール
名前空間

変種
操作
案内
ツールボックス