2010/07/28(Wed)Linuxカーネルコンパイル方法

2010/07/28 13:02 Software::Linux
最近カーネルいじり(モジュール開発)をよくやってるので、再々カーネルコンパイルするわけですが、時間が空くと忘れかけるのでメモ。
install系以外はrootで作業しない方が良い。
  1. 適当な所で、
    tar jxf linux-2.6.xxx.xxx.tar.bz2
    

  2. cd linux-2.6.xxx.xxx
    
  3. 設定項目の全てを初期化。
    make mrproper
    
    configを消さない場合はmake cleanでよい
  4. 現在のconfigを引き継ぐ。
    cp /boot/config-2.6.yyy.yyy .config
    
  5. 上でコピーしたベースのconfigファイルから、現在のカーネルで増えたモジュールのコンパイルオプションを変更
    make oldconfig
    
    以下のようなツリー構造で編集するタイプもあり。こっちの方が依存関係やコメントなども確認できるので、勝手がいいかも。
    make menuconfig(CUIツリー構造編集)
    
    make xconfig(X上でのツリー構造編集)
    
    なお、menuconfigにはncurses*1、xconfigにはqtとXi*2が予め必要。
  6. カーネルコアのコンパイル
    make -j2 bzImage
    
    (-jには並列コンパイルするプロセス数を指定。論理CPU数にすると良い)
  7. カーネルモジュールのコンパイル
    make -j2 modules
    
  8. カーネルモジュールを最初にインストール
    sudo make modules_install
    
    要root権限。/lib/modules/2.6.xxx.xxx/以下にコピーされる。
  9. カーネルコアのインストール
    sudo make install
    
    要root権限。/boot/vmlinuz,initramfs,System.map,config-2.6.xxx.xxxなど。
  10. (必要に応じて)grubメニューの編集
    vim /boot/grub/menu.conf
    
    注意として、hiddenmenuを消すかCtrlを押してないと、timeout値にかかわらず選択メニューが出ない。

*1 : パッケージだとncurses-develをインストールすればよい

*2 : パッケージだとqt3-develとlibXi-develをインストールすればよい

部分コンパイル 2011/06/14

特定のカーネルモジュールをデバッグする場合など、何度もツリー全体をコンパイルしていると時間がかかってしょうがない。
本来は後から追加するカーネルモジュールを/lib/modules/`uname -a`/buildでコンパイルするときに使うようだが、全体ツリーの一部分のコンパイルとしても使う事はできる。
特定のモジュール内で閉じた変更の場合は、以下のように特定のディレクトリ以下だけをmakeすると速い。

例えばnet/ipv6だけを再コンパイルする場合…
cd /path/to/linux-2.6.xxx.xxx/net/ipv6/

make -C /path/to/linux-2.6.xxx.xxx M=`pwd` KBUILD_VERBOSE=0 modules

make -C /path/to/linux-2.6.xxx.xxx M=`pwd` KBUILD_VERBOSE=0 modules_install
modules_installはコピーする前に、コピー先(/lib/modules/`uname -a`/kernel/...)の該当部を一旦全て削除してからコピーするので、変更されたカーネルモジュールが例えば1つに絞れる場合などは、手でcpする方がより高速。(私はそうしている)

さらに詳しくはLinux kernelに含まれるDocumentation/kbuild/modules.txtを参照。

参考文献