はじめに

カーネルはソースコードからでなく、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"をセット
~略~