はじめに
カーネルはソースコードからでなく、CentOSがリリースするソースパッケージ(SPRM)を使用。
CentOS(RHEL?)が選定した修正パッチの方が無難な気がして。
環境
CentOS6.0 x86_64環境
$ cat /etc/redhat-release CentOS Linux release 6.0 (Final) $ uname -a Linux zpc 2.6.32-71.29.1.el6.x86_64 #1 SMP Mon Nov 14 12:57:32 JST 2011 x86_64 x86_64 x86_64 GNU/Linux
事前準備
[ダウンロード]
理研から対象ファイルをダウンロード。今回はインストールされているバージョンと同じ(kernel-2.6.32-71.29.1.el6.src.rpm)を選択した。
[前提パッケージのインストール]
$ sudo yum install rpm-build redhat-rpm-config ncurses-devel $ sudo yum install zlib-devel binutils-devel hmaccalc elfutils-libelf-devel
[ファイルの展開]
下記rpmコマンド以前の2コマンドはrootでなく起動ユーザのディレクトリへファイル展開するためのオマジナイ。
$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} $ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
ダウンロードファイルのインストール( ~/Downloadsに保存されている事を想定)
$ rpm -ivh ~/Downloads/kernel-2.6.32-71.29.1.el6.src.rpm $ ll ~/rpmbuild/ ※ファイルが展開されていることを確認
"mockbuild は存在しません - root を使用します"という警告が出るが問題はなし(参考)
ソースパッケージのインストール
rpmbuildコマンドでソースコードを再構成する。"-p"オプションはパッチ適用を意味する。
$ cd ~/rpmbuild/SPECS/; pwd /home/hoge/rpmbuild/SPECS $ ll ※kernel.specファイルが存在することを確認 合計 368 -rw-r--r-- 1 hoge hoge 375019 6月 27 10:15 2011 kernel.spec $ rpmbuild -bp --target $(uname -m) kernel.spec ビルド対象プラットフォーム: x86_64 ターゲット x86_64 用にビルド中 実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.gkh29M + umask 022 + cd /hoge/rpmbuild/BUILD + LANG=C + export LANG + unset DISPLAY ~略~
[ファイル展開されたディレクトリへ移動]
$ cd ../BUILD/kernel-2.6.32-71.29.1.el6/linux-2.6.32-71.29.1.el6.x86_64/;pwd
ネットの情報を見ると他のバージョン/ディストリビューションだと「/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.xxx」あたりにカーネルソース、パッチ、スクリプトが展開されるらしいが、rpmbuildでの導入時はホームディレクトリのBUILD配下に展開された。
[Makefile編集]
EXTRAVERSIONを指定することで作成ファイルにリビジョン等の情報を付与することができる。
$ vi Makefile EXTRAVERSION = -71.29.1.el6.x86_64 ※太字部分を追記した。
[再構築環境の初期化]
$ make clean && make mrproper CLEAN scripts/basic CLEAN scripts/kconfig CLEAN scripts CLEAN include/config CLEAN .config .config.old
[".config"作成]
configs配下のファイルを元にカレントディレクトリにコピー
$ ll configs/ 合計 192 -rw-r--r-- 1 hoge hoge 98208 11月 14 12:00 2011 kernel-2.6.32-x86_64-debug.config -rw-r--r-- 1 hoge hoge 97901 11月 14 12:00 2011 kernel-2.6.32-x86_64.config $ cp configs/kernel-2.6.32-x86_64.config .config
備考
rpmでなくカーネルをダウンロードしてきた場合は、/boot配下のconfigをコピーして".config"を作成し、"oldconfig"コマンドで実行後に"make menuconfig"を行うと余計な定義をせずに済む。
# cp /boot/config-2.6.xxx.el5 ./.config # make oldconfig ※いくつかの対話的質問に対しては「Enter」を入力
その他、ネットにて/usr/src/kernelsへのシンボリックリンクを作成する手順が散見されるがこいつも割愛。
$ sudo ln -s /usr/src/kernels/`uname -r`-`uname -m` /usr/src/linux
make
[config作成]
$ make menuconfig ※コマンド実行後、設定用のコンソールが表示される。
config設定は下記Processor情報を変更すると効果あり。後は不要なモジュールを削る。
Processor type and features > Processor family => Core 2/newer Xeon Timer frequency => 1000 HZ
make menu時のエラー
「 *** Unable to find the ncurses libraries or the *** required header files.」のメッセージが出力される場合は、ncurses-develをインストールする必要
$ sudo yum install ncurses-devel
make
$ make $ sudo make modules_install $ sudo installkernel 2.6.32-71.29.1.el6.x86_64 arch/$(uname -m)/boot/bzImage System.map
grub設定
$ sudo vi /boot/grub/grub.conf
~略~
default=0 ※"0"をセット
~略~