Kernelの新しい機能をフルに使おうとすると、新しいkernelを使う必要があるのですが、例えばCentOS6系でシステムを運用していた場合に、新しいKernelを使うべくCentOS7とかにあげるとsystemd含め運用が大きく変わってしまうため中々踏み出せないという状況があると思います。
そこで、運用も含めた検証がてらCentOS6用(他のバージョンでも動くかも)のKernel4系あるいは3系のイメージのrpmを簡単にビルドするシステムを作りました。
使い方
Mac上でgit clone https://github.com/matsumoto-r/kernel-4-build-system-for-centos6.git
して、
make
するだけです。
すると、デフォルトではbuild/linux-4.1.1
以下に以下のように必要なrpmが生成されます。
ls build/linux-4.1.1/ kernel-4.1.1-2.x86_64.rpm kernel-devel-4.1.1-2.x86_64.rpm kernel-headers-4.1.1-2.x86_64.rpm
簡単!!!
後はこれを対象のサーバに持って行ってrpmをインストールしてgrub.confのdefaultイメージを変更して再起動するだけですね。
また、別バージョンを指定したい場合は、
make KERNEL_VER=3.18.18
とか
make KERNEK_VER=4.1.2
とかできます。
内部的な処理
内部では、
- vagrant
- vagrant-persistent-storage
- Itamae
を使っています。vagrant上のboxに対してitamaeでビルド環境を作り、その後にlocalで動作するビルドシステムである、
を持ってきてビルドしています。
このローカルで動作するビルドシステムは、例えばすでにKernelのビルド環境をお持ちの方は、わざわざMacとvagrantでビルドする事なく、build-kernel-4.x-for-centos6
リポジトリをlinuxのビルド環境上でcloneしてビルドしても良いです。その際は、READMEを参考にして下さい。
Kernel2.6からkernel4.1.1へのconfig作成時のエラーについて
今回、既に作成したkernelビルド用のconfigをリポジトリに同封しているのですが、これは基本CentOS6に入っているKernel2.6のconfigを再利用して作っています。
また、その際に幾つかエラーが出ていたのですが、参考までにそれの対応を簡単に紹介します。
ERROR: modinfo: could not find module ipt_LOG
Kernelのrpmの適用時に出力される場合があるのですが、ipt_LOGのカーネルモジュールは3系からxt_LOGに名前変更になったので、そのkernelモジュール作るようにconfigを修正しました。
ERROR: modinfo: could not find module power_meter
poer_meterのエラーは3系からkernelモジュール名がacpi_power_meterになったのでそのkernelモジュールを作るようにconfigを修正しました。
ERROR: modinfo: could not find module crc_t10dif
crc_t10difのエラーはモジュールからビルトインになったのでロードの必要がなくなりました。
cgconfigが/cgroup/memroy
関連で動作しない
- CONFIG_MEMCG
- CONFIG_CGROUP_HUGETLB
- CONFIG_CHECKPOINT_RESTORE
あたりを互換含めて機能に盛り込むようにconfigを修正しました。CONFIG_CHECKPOINT_RESTOREに関してはCRIUを使いたいから追加で盛り込んでいます。
上記のように対応していい感じのconfigを作っています。
基本的にkernelバージョンアップで ERROR: modinfo: could not find module
に関して調査していくポイントとして、
- kernelモジュール名が変わったかどうか
- kernel組込み機能になったかどうか
- CONFIG名が変更になった場合(たとえばcgroupのmemory機能のCONFIG名が変更された上ででデフォルト使わないとなっていると、/cgroup/memory機能が使えてたのに使えないとか)
- 単純にconfig漏れでモジュールが足りていないかどうか
であるが、前kernelのconfigをコピーしてからmake oldconfig
して作ったkernelであれば、基本的には1、2、3を疑えば良いように思います。色々例外はあると思いますが。
まとめ
ということで、細かい部分まで解説しましたが、Mac上でmake一発でKernel4のイメージをビルドするビルドシステムを作ってみました。一応、今後のバージョンアップもふまえて新しいバージョンも簡単にビルドできるように手は入れていますが、ここは使い勝手を見ながら修正していこうと思います。
同じような問題意識を抱えている方は、まずは検証等で使って頂くと色々捗ると思いますので是非ご活用下さい!