ELRepoのspecを参考にkmod対応ドライバをビルドした話
Intelのigbドライバなんかは、tarballにspecが含まれていて
rpmbuild -ta ./SOURCES/igb-3.4.7.tar.gz
こんな感じですぐビルドできるステキな感じになっています。
が、これをやるとビルド時のkernelに依存するドライバができてしまうため、
エラッタでカーネルのアップデートが入った場合に既定のドライバに戻ってしまいます。
Redhat/CentOSには、KMP (Kernel Module Package)、kmodというカーネルに追従するための仕組みがあるので、これをやってみました。
KMP/kmodの仕組み自体はこちらのページがよくまとめていただいています。
http://d.hatena.ne.jp/dayflower/20090728/1248754899
KMP対応のモジュールをビルドするための手引きがCentOSの公式Wikiにあります。*1
http://wiki.centos.org/HowTos/BuildingKernelModules#head-b86b6eec08d5719cf1838929f26a64af88e2b7f0
で、手引きをもとに対応のためのいろいろな手順をやってみていたのですが、けっこう難しく苦戦していたところ以下のようなものがありました。
ELRepo
http://elrepo.org/
名前だけは知っていたのですがハードウェアに関するパッケージを提供するプロジェクトとのことで、上記のCentOSのWikiページを記述された方*2がfounderの一人になっていらっしゃるみたい。
ここにkmod対応版のigbやe1000eなど、各種のパッケージがあります。そのまま使えそうですが、勉強になるのでSRPMから再パッケージしてみました。
SRPMをインストールすると、こんな感じのファイルが展開されます。igbの場合、
SPECS/igb-kmod.spec SOURCES/igb-X.X.X.tar.gz SOURCES/kmodtool-igb-el6.sh
kmodtool-igb-el6.shがkmodのためのヘルパースクリプト。
詳細は割愛しますが、kmodtoolスクリプト中でProvidesなどの指定も行われています。私は以下の変更だけ入れてみました。
Provides: ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Provides: ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} Obsoletes: ${kmod_name}
上記のSRPMをそのままビルドするとkmod-igbというパッケージですが、この変更で既存のigbもkmod対応にyumが入れ替えてくれるようになりました。
めでたしめでたし。
ちなみにRHEL/CentOSのデフォルトのドライバは当然ながらkmodが使われています。igb-3.0.6_k-2.el6_1.src.rpmとかそのあたり。今回は見てないですが、そちらをベースに使ってもよさそう。
次はリビルドじゃなくて一からやってみたいなー。