人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

Mac上でCentOS6用のkernel{3,4}系イメージのrpmを一発でビルドするビルドシステム作った

Kernelの新しい機能をフルに使おうとすると、新しいkernelを使う必要があるのですが、例えばCentOS6系でシステムを運用していた場合に、新しいKernelを使うべくCentOS7とかにあげるとsystemd含め運用が大きく変わってしまうため中々踏み出せないという状況があると思います。

そこで、運用も含めた検証がてらCentOS6用(他のバージョンでも動くかも)のKernel4系あるいは3系のイメージのrpmを簡単にビルドするシステムを作りました。

github.com

使い方

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で動作するビルドシステムである、

github.com

を持ってきてビルドしています。

このローカルで動作するビルドシステムは、例えばすでに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 に関して調査していくポイントとして、

  1. kernelモジュール名が変わったかどうか
  2. kernel組込み機能になったかどうか
  3. CONFIG名が変更になった場合(たとえばcgroupのmemory機能のCONFIG名が変更された上ででデフォルト使わないとなっていると、/cgroup/memory機能が使えてたのに使えないとか)
  4. 単純にconfig漏れでモジュールが足りていないかどうか

であるが、前kernelのconfigをコピーしてからmake oldconfigして作ったkernelであれば、基本的には1、2、3を疑えば良いように思います。色々例外はあると思いますが。

まとめ

ということで、細かい部分まで解説しましたが、Mac上でmake一発でKernel4のイメージをビルドするビルドシステムを作ってみました。一応、今後のバージョンアップもふまえて新しいバージョンも簡単にビルドできるように手は入れていますが、ここは使い勝手を見ながら修正していこうと思います。

同じような問題意識を抱えている方は、まずは検証等で使って頂くと色々捗ると思いますので是非ご活用下さい!