カーネルの再構築

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

 ここでは、Linuxカーネルの再構築について説明します。
カーネルは、Slackware 14 の バージョン3.2.29を使用します。
バージョンが多少異なっても、ほとんど問題はないとおもいます。


なぜ、カーネルを再構築するのか。

 あなたが現在の環境に満足している場合、カーネルの再構築はする必要はないでしょう。
しかし、現在のカーネルに何らかのパッチを当てたい場合や、無駄なモジュールを消したいとき、モジュールをカーネルに取り込むため、
もしくは、設定を変更したい場合など、自分用にチューニングしたい場合にカーネルの再構築が必要になります。
 なお、カーネルの再構築をする場合に、新しいカーネルで問題が発生し、起動出来なくなる可能性があるので、再構築する前のカーネルを残しておくことをおすすめします。

設定をする前に…

 カーネルの設定を行う場合に、自分の使用してるコンピュータのシステムについて理解しなければいけません。
ほとんどの情報はlspciによって収集することが可能のようです。
# lspci
00:00.0 Host bridge: Intel Corporation Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)
00:1b.0 Audio device: Intel Corporation N10/ICH 7 Family High Definition Audio Controller (rev 02)
00:1c.0 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 1 (rev 02)
00:1c.1 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 2 (rev 02)
00:1c.2 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 3 (rev 02)
00:1d.0 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #1 (rev 02)
00:1d.1 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #2 (rev 02)
00:1d.2 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #3 (rev 02)
00:1d.3 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #4 (rev 02)
00:1d.7 USB controller: Intel Corporation N10/ICH 7 Family USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)
00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7-M Family) SATA Controller [IDE mode] (rev 02)
00:1f.3 SMBus: Intel Corporation N10/ICH 7 Family SMBus Controller (rev 02)
03:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)
05:01.0 FireWire (IEEE 1394): Ricoh Co Ltd R5C832 IEEE 1394 Controller
05:01.1 SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 19)
05:01.2 System peripheral: Ricoh Co Ltd R5C843 MMC Host Controller (rev 01)
05:01.3 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host Adapter (rev 0a)
05:07.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8110SC/8169SC Gigabit Ethernet (rev 10)

また、現在使用してるモジュールを確認したい場合は、lsmodを使用すれば確認できます。
# lsmod
Module                  Size  Used by
下に、モジュール一覧が表示される。

設定しよう

 必要な情報を入手したら、カーネルの設定をします。
 作業は/usr/src/linux 内で行います。

 作業を行う前に、必要に応じて、Makefileを編集します。
 重要なところは前半です。
VERSION = 3
PATCHLEVEL = 2
SUBLEVEL = 29
EXTRAVERSION =
NAME = Saber-toothed Squirrel
 通常は変更する必要はありませんが、あなたが新しく作成したカーネルということでEXTRAVERSIONをつけておくことをおすすめします。
EXTRAVERSION = MyKernel

 古い設定を消去します
#make mrproper
 上記のコマンドによって、古い設定ファイル(.config)が削除されます。
 次に、設定を行うにはターミナル等で、以下のコマンドを使用します。
# make menuconfg
 特に設定のテスト時は、General setupにある、Local versionを設定しておきましょう。でないと、/lib/modules/ にある、カーネル毎のフォルダが上書きされてしまいます。
/lib/modules/に置かれるフォルダ名は、カーネルバージョンの末尾にローカルバージョンを付加したものになります。(EXTRAVERSION も設定した場合は未検証)
とはいっても、同じものが置かれる(はず)なので、(作っていないはずのモジュールが残っているのを気にしなければ)設定しないのもありですが・・

 設定後、新しい設定ファイルが作成されているとおもいます。

 もしも、Xが起動しているのであれば、
# make xconfig
 でGUIで設定も可能です。

 もしも、あなたがデフォルトの設定ファイルを使用したいときには、
/boot 内にある config-* を /usr/src/linux/.config にコピーしてから設定してください。
[/usr/src/linux] # cp /boot/onfig-huge-smp-3.2.29-smp   ./.config
[/usr/src/linux] # make menuconfig

 設定は先ほど入手した情報などを元に設定してください。


 バージョンをまたいで設定ファイルを再利用したい時、あるいは設定を変更した別バージョンを作りたい時は、
/boot 内にある config-* を /usr/src/linux-new/.config にコピーしてから、make oldconfigなどを利用して設定をインポートしてください。
例 (ソースを/usr/src/linux-new/に置き、/usr/src/linux-new-custom/で作業する場合)
[/usr/src/linux-new] # cp /boot/onfig-huge-smp-3.2.29-smp   ./.config
[/usr/src/linux-new] # make O=/usr/src/linux-new-custom oldconfig
[/usr/src/linux-new] # rm .config
[/usr/src/linux-new] # cd /usr/src/linux-new-custom/
[/usr/src/linux-new-custom] # make menuconfig
 oldconfig: コピー元にない設定項目は、設定値をどうするか質問されます
 olddefconfig: コピー元にない設定項目は、デフォルトの設定値になります (「ない」の判断が微妙なのか、設定の依存関係の影響か不明ですが、設定値がnだらけになる場合があるので、利用時は注意して下さい)
 どちらも、/usr/src/linux-new/.configをテンプレートとして、/usr/src/linux-new-custom/.configを作成します。
 ※ (/usr/src/linux-new/にある)コピー元の.configを消しておかないと、ビルド時(make bzImage modulesなど)で"make mrproper"が必要というエラーが発生します
 ※ O=(出力先) は、出力先の指定オプションです。

TODO: 設定について詳しく書く。

コンパイル、そしてインストール

 設定が完了したら、いよいよカーネルをコンパイルしましょう。
# make
 オプションに -j番号 を入力することによって、複数のプロセスを使用してコンパイルされます。(CPUの数 + 1 がいいらしい?)

 コンパイルが完了したらモジュールをビルドします。
# make modules_install
/lib/modules/(カーネルバージョン)(ローカルバージョン) にモジュールが配置され、depmod (バージョン)されます。

 次に、カーネルイメージを/boot にコピーします。(arch/x86/boot/bzImageなどの場合もあります。)
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-3.2.29-MyKernel
 .config もとっておきましょう
# cp /usr/src/linux/.config /boot/config-3.2.29-MyKernel
 System.map もコピーしましょう
# cp /usr/src/linux/System.map /boot/System.map-3.2.29-MyKernel
 (必要に応じて、/boot/System.mapのリンクも修正しましょう)


 必要に応じて、initrdも作成しましょう。(make menuconfigで、必要なモジュールを全て選択した場合は、initrdがなくても起動するはずです)
# cd /boot
# mkinitrd -c -k 3.2.29 -o initrd-3.2.29-MyKernel.gz
 -c オプションは、作業用フォルダ(/boot/initrd-tree)をクリアするオプションです。
 -k オプションで指定するのは、(カーネルバージョン)(ローカルバージョン) です。modules_installの際にdepmod の後ろに表示された、(カーネルバージョン)(ローカルバージョン)と同じです。(分からなくなった場合は、ls /lib/modules/ してみましょう)
 -o (出力先) オプションを指定しない場合は、/boot/initrd.gzに出力されます。特にinitrd.gzがリンクでなくファイルの実体の場合は、上書きに注意しましょう。




以上で再構築は終了です。ブートローダの設定で、再構築したカーネルを読み込めるように設定し、起動してみましょう!

補足:うっかり起動できない設定のまま再起動してしまった場合は、あわてず、インストール用DVDで起動してみましょう。(Setupは実行しないで)
ファイルの編集などもできるので、/etc/lilo.confなども修正できるはず!
ちなみに、shutdownコマンドが無くてあわてると思いますが、確かrebootコマンドがあったと思います。これで、shutdown(物理)しなくても大丈夫っ!


参考

最終更新:2015年05月25日 06:46
添付ファイル