気ままにインフラエンジニア

渋谷で働くインフラエンジニアの備忘録。 TwitterID: @nakashii_

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とかそのあたり。今回は見てないですが、そちらをベースに使ってもよさそう。

次はリビルドじゃなくて一からやってみたいなー。

*1:RedHat6の公式ドキュメントには見つからなかったのですが、関係あるとすればこのあたりでしょうか。 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/ch-next-steps.html#sect-Driver_update_rpm_packages

*2:http://wiki.centos.org/AkemiYagi