2014年5月1日木曜日

CentOS 6.5 カーネル再構築 2.6.32-431.11.2.el6.x86_64編

CentOSのカーネル再構築メモ。
最新のLinuxカーネルで構築し直すんじゃなくて、今動いているシステムのカーネルソースいじって遊ぶぜ的な人向けの手順です。

バージョンによって前提パッケージが違ったり、ソースをダウンロードしてくるところが違ったり面倒だったので、なるべく汎用性ありそうな書き方で。

まずOS自体を最新バージョンにアップデート。

# yum update
# reboot

私がやったとき(2014/04/29)の最新バージョンは2.6.32-431.11.2です。64ビット版です。

続いて開発環境をインストール。これは他サイトからの受け売り。

# yum groupinstall "Development tools"  


で、次にその他の前提パッケージのインストール、ってのがありがちな書き方ですが、その前にソースをダウンロードして、インストールを試みます。ソースの置き場所もその時々で違ったりするので、CentOSのサイトで確認するといいんじゃないかと思います。
2014/04/29時点では、トップ→Get CentOS Linux Now→Need the Source?
とたどって、ソース置き場からとってきました。これを一般ユーザでインストールします。

$ wget http://vault.centos.org/6.5/updates/Source/SPackages/kernel-2.6.32-431.11.2.el6.src.rpm
$ rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm


で、rpmbuildを動かすと必要な前提パッケージを教えてくれます。 これがバージョンによって違ったりするようなので、違うバージョンの手順を真似るよりはrpmbuildに聞いた方が確実なんじゃないかと。

$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp kernel.spec --target=x86_64
ビルド対象プラットフォーム: x86_64
ターゲット x86_64 用にビルド中
エラー: ビルド依存性の失敗:
        xmlto は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        asciidoc は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        elfutils-libelf-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        elfutils-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        zlib-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        binutils-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        newt-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        python-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        audit-libs-devel は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        perl(ExtUtils::Embed) は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています
        hmaccalc は kernel-2.6.32-431.11.2.el6.x86_64 に必要とされています


で、これらをインストールします。perl(ExtUtils::Embed)はさすがにクォーテーションで囲まないとエラーになると思います。

# yum install xmlto asciidoc elfutils-libelf-devel elfutils-devel zlib-devel binutils-devel newt-devel python-devel audit-libs-devel "perl(ExtUtils::Embed)" hmaccalc


この後もう一回rpmbuild実行、~/rpmbuild/BUILDの該当バージョンというか、できてるディレクトリの下に行ってmake、インストールします。

$ rpmbuild -bp kernel.spec --target=x86_64
$ cd ~/rpmbuild/BUILD/kernel-2.6.32-431.11.2.el6/linux-2.6.32-431.11.2.el6.x86_64
$ vi Makefile
EXTRAVERSION = -selinux
$ make
# make modules_install
# make install
# reboot

ここではMakefileのEXTRAVERSIONを-selinuxにしています(個人的にSELinuxまわりの研究でやっているので)。
この場合OS起動時eをタイプすることで表示されるブートオプションの画面で、構築したカーネルが2.6.32-selinuxと表示されます。