連載
» 2008年08月28日 00時00分 公開

Linuxカーネルのコンフィグレーション手順実践でも役立つLPICドリル(5)(2/4 ページ)

[大竹龍史,ナレッジデザイン]

今回のディストリビューション: CentOS4.4、Fedora8

問題を解く鍵 【2】

【2】カーネルコンフィグレーション手順の各ステップの意味を把握しておく

make mrproper

 現在のコンフィグレーションファイル.configと、前回のカーネルコンフィグレーションで生成されたすべてのファイルを削除して初期状態に戻します。

make cleanとの違い cleanの場合はmrproperでは削除される現在のコンフィグレーションファイル.config やローダブルモジュールの生成に必要なファイルは削除されません。
mrproperの由来 トーバルス氏が、欧州で知られているMr.Properというクリーニング製品の名前にちなんで付けたとのこと。米国では同じ製品がMr.Cleanとして知られていて、製品のマスコットイメージはsailor(船乗り)だそうです。
make config make menuconfig make xconfig
make gconfig make oldconfig make defconfig


 カーネルのコンフィグレーションファイル.configを生成し、関連ファイルを設定します。

config

 設定項目1つ1つについて、順番に対話的に尋ねてくる、最もシンプルな形式です。

(例)
          * General setup
          *
          Prompt for development and/or incomplete code/drivers
          (EXPERIMENTAL) [Y/n/?]
          Local version - append to kernel release (LOCALVERSION) []
          Automatically append version information to the version string
          (LOCALVERSION_AUTO) [N/y/?]


menuconfig:

 cursesライブラリを利用した、端末ベースのメニュー形式のインターフェイスです。

(例)
※クリックで拡大
xconfig:

 QtベースのGUIツールです。

gconfig:

 GtkベースのGUIツールです。

oldconfig:

 既存の.configをデフォルトとして、新しい定義が必要な項目がある場合のみ、尋ねてきます。

defconfig:

 arch/$ARCH/defconfigをデフォルトとして、.configを生成します。

Makefileの編集:

 上記のいずれかのコマンドにより.configを生成して、独自にカスタマイズしたカーネルを作る場合、カーネルのバージョンで識別できるようにバージョンを変更しておく方がよいでしょう。カーネルバージョンを変更する場合は次のようにしてMakefileを編集してから、カーネル生成手順を実行します。

(例)カーネルバージョンを2.6.23から2.6.23test に変更する
   変更前              変更後 
   VERSION = 2            VERSION = 2
   PATCHLEVEL = 6          PATCHLEVEL = 6 
   SUBLEVEL = 23           SUBLEVEL = 23
   EXTRAVERSION =             EXTRAVERSION =test


make

 カーネルbzImageとローダブルモジュールを生成します。bzImageはarch/$ARCH/bootの下に、ローダブルモジュールは各サブディレクトリの下に生成されます。makeの代わりに、make bzImage、make zImageあるいはmake modulesを実行することで、カーネルあるいはローダブルモジュールをそれぞれ別々に生成することもできます。

 make bzImageあるいはmake zImageを実行してカーネルを生成する場合、makeの実行中にコンパイルされたbuildコマンド(arch/$ARCH/boot/tools/build)の実行により、最終的にbzImageあるいはzImageが出来上がります。最後に、生成されたカーネルの情報が表示されます。

(例)アーキテクチャ $ARCH = i386 でbzImageを生成した例
                # make bzImage
                 .....................................
          BUILD   arch/i386/boot/bzImage
          Root device is (8, 5)
              Boot sector 512 bytes.
              Setup is 6889 bytes.
              System is 2489 kB
              Kernel: arch/i386/boot/bzImage is ready  (#1)


bzImage/zImageファイルの構成(各部のサイズはこの例でのものです)

Boot sector
(512bytes)
Setup
(6889bytes)
System
(2489KB)


Root device is (8, 5):

 ルートデバイス(この例ではメジャー番号8、マイナー番号5)は、デフォルトではカーネル構成時のルートデバイスが指定されてBoot sectorに書き込まれます。

 GRUBやLILOなどのブートローダにルートデバイスの指定がない場合は、ここで指定されたデバイスがルートデバイスになります。

Boot sector:

 SetupとSystem(圧縮されたカーネル)をロードするプログラムです。ブートローダにGRUBやLILO を使う場合はこのプログラムは使用しません。サイズは512バイト固定です。

Setup:

 Boot sectorあるいはLILOやGRUBのようなブートローダから呼び出されます。BIOSからハードウェア情報を読み取ってパラメータの設定を行うなど、リアルモードからプロテクトモードへ移行するために必要な作業を行います。作業が終わるとカーネルのエントリポイント(実行開始番地)に飛んで、カーネルに制御が移行します。この例ではサイズは6889バイトです。

(注1)リアルモード:実アドレスモード。8086プログラムを実行するモード。アドレス空間のサイズは20bit=1MB。プロテクトモード:プロテクトモードでは個々のアプリケーションは独立したアドレス空間を持ち、それぞれのアドレス空間へのアクセスはカーネルによって保護されます。アドレス空間のサイズは32bit=4GB。


System:

 gzipによって圧縮されたカーネルです。この例ではサイズは2489KBです。

 bzImageとzImageの違いについて:両者のSetupプログラムは異なり、カーネルのエントリポイントのアドレスも異なります。zImageが対応できる圧縮カーネルのサイズは512KBまで、bzImageはサイズ512KB以上の圧縮カーネルに対応できます。ただしbzImageの場合、そのSetupプログラムが利用するBIOSコールに対応していない古いBIOSの場合はカーネルをロードできません。カーネルを圧縮するコマンドはzImageもbzImageもgzipです。

カーネル2.4の場合:

 カーネル2.4の場合、カーネルzImage/bzImageとローダブルモジュールの生成手順は2.6とは若干異なり、まずmake depあるいはmake dependというステップを実行します。

# make dep
depはdependencyの意味で、プログラムの依存関係を記述する.depend
ファイルと、ヘッダファイル間の依存関係を記述する.hdependファイルを、この手順で前もって作成しておきます。あとは2.6とほとんど同じです。
# make zImage あるいは make bzImage
# make modules


make modules_install

 /lib/modules/カーネルバージョン(例:/lib/modules/2.6.23.1-42.fc8) ディレクトリを作成し、その下にサブディレクトリに分類してカーネルモジュールをコピーします。また、モジュールのパスと、モジュールの依存関係を記述したmodules.depファイルを生成します。

make install

 このコマンドは/lib/modules/カーネルバージョン(例:/lib/modules/2.6.23.1-42.fc8)ディレクトリを参照するので、make modules_installを実行しておきます。/bootの下にbzImageをvmlinuzとしてコピーし、System.mapをコピーし、initrdを生成します。また、/boot/grub/grub.confに新しく生成したカーネルのエントリを追加します。

init 6

 システムを再起動し、新しいカーネルで立ち上げます。

dmesgで確認

 カーネル立ち上げ時のメッセージをdmesgコマンドで表示して確認できます。

(例)
# dmesg | grep "Linux version"
Linux version 2.6.23test……


 unameコマンドでも確認できます。

(例)
# uname -r
2.6.23test


rdevコマンドについて

 既出の説明のとおり、bzImage/zImageのBoot sector部にはrootデバイスの情報が書き込まれていて、ブートローダでrootデバイスを指定しない場合は、これが使われます。rdevコマンドで、このrootデバイスの情報を表示、変更することができます。

(例)rootデバイスの表示
# rdev arch/i386/boot/bzImage
Root device /dev/sda1


(例)rootデバイスを/dev/sda5に変更
# rdev /boot/vmlinuz-2.6.23test /dev/sda5


(注2)rdevコマンドには上記機能のほかに、bzImage/zImageのBoot sector部に書き込まれているramディスクサイズやビデオモードを変更する機能もあります。


(注3)今回の例で取り上げたFedora 8のRPMパッケージutil-linux-ngにはrdevコマンドが含まれていないため、Fedora 7のSRPMパッケージutil-linuxのrdevをコンパイルして使用しました。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。