▼ 2010/07/28(Wed) Linuxカーネルコンパイル方法
最近カーネルいじり(モジュール開発)をよくやってるので、再々カーネルコンパイルするわけですが、時間が空くと忘れかけるのでメモ。
install系以外はrootで作業しない方が良い。
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を参照。
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクやはてブしていただけると助かります…。
コメントも歓迎です。
▼ コメント(0件)
- TB-URL http://mo.kerosoft.com/0162/tb/
