2010/07/28(Wed)Linuxカーネルコンパイル方法
2010/07/28 13:02
install系以外はrootで作業しない方が良い。
- 適当な所で、
tar jxf linux-2.6.xxx.xxx.tar.bz2
cd linux-2.6.xxx.xxx
- 設定項目の全てを初期化。
make mrproper
configを消さない場合はmake cleanでよい - 現在のconfigを引き継ぐ。
cp /boot/config-2.6.yyy.yyy .config
- 上でコピーしたベースのconfigファイルから、現在のカーネルで増えたモジュールのコンパイルオプションを変更
make oldconfig
以下のようなツリー構造で編集するタイプもあり。こっちの方が依存関係やコメントなども確認できるので、勝手がいいかも。
make menuconfig(CUIツリー構造編集) make xconfig(X上でのツリー構造編集)
なお、menuconfigにはncurses*1、xconfigにはqtとXi*2が予め必要。 - カーネルコアのコンパイル
make -j2 bzImage
(-jには並列コンパイルするプロセス数を指定。論理CPU数にすると良い) - カーネルモジュールのコンパイル
make -j2 modules
- カーネルモジュールを最初にインストール
sudo make modules_install
要root権限。/lib/modules/2.6.xxx.xxx/以下にコピーされる。 - カーネルコアのインストール
sudo make install
要root権限。/boot/vmlinuz,initramfs,System.map,config-2.6.xxx.xxxなど。 - (必要に応じて)grubメニューの編集
vim /boot/grub/menu.conf
注意として、hiddenmenuを消すかCtrlを押してないと、timeout値にかかわらず選択メニューが出ない。
部分コンパイル
特定のカーネルモジュールをデバッグする場合など、何度もツリー全体をコンパイルしていると時間がかかってしょうがない。本来は後から追加するカーネルモジュールを/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_installmodules_installはコピーする前に、コピー先(/lib/modules/`uname -a`/kernel/...)の該当部を一旦全て削除してからコピーするので、変更されたカーネルモジュールが例えば1つに絞れる場合などは、手でcpする方がより高速。(私はそうしている)
さらに詳しくはLinux kernelに含まれるDocumentation/kbuild/modules.txtを参照。