Red Hatの森若です。今回はRHELのマイナーバージョン間での互換性維持で重要な位置を占める「kABI」を紹介します。
カーネルモジュール
動作中のlinuxカーネルに、機能を足したり既存の機能を変更したりしたい場合はどうするのがいいでしょう? linuxカーネルのソースコードを変更して完全にビルドしなおすという方法もありますが、linuxではカーネルモジュールとよばれる仕組みでその機能を実現しています。
典型的にはデバイスドライバがカーネルモジュールとして実装されていて、ハードウェアが接続されたことを検出して対応するカーネルモジュールを読み込みます。このような仕組みで、現在動作中のシステムでは必要ない膨大なハードウェア用のドライバを扱わずにすむようになっています。
その他にも、ファイルシステムやネットワークの各種プロトコルの実装、暗号化、Device Mapperなどの使う場合にはカーネルに必要だが使わない場合には全然使わないというカーネル機能の多くがカーネルモジュールとして実装されています。
ここまでは「カーネルの一部機能を必要に応じて読むようにしてリソースを節約する」という話でしたが、同じカーネルモジュールの仕組みを「カーネルにない機能をあとから追加する」ためにも利用できます。この仕組みには多くの用途がありますが典型的な例としては以下のようなものがあります。
- 独自のファイルシステムを実装する
- linuxカーネルに含まれるものとは別バージョンのデバイスドライバを提供する
- バックアップ用にストレージへの書き込みで変更されたブロックを記録する
- マルウェア対策ソフトでlinuxの権限管理を拡張して、あやしい動きを拒否したり監査ログを出力したりする
これらは、linuxカーネル内にもともと存在しないソフトウェアをlinuxカーネルの一部として動作させるものです。
linuxカーネルの互換性
linuxカーネルの開発コミュニティは「ユーザランド」と呼ばれる、システムコールやアプリケーションソフトウェアの互換性については非常に厳しく互換性を維持するポリシーで開発をおこなっています。過去バージョンのlinuxカーネルむけに作成されたアプリケーションソフトウェアが動作しなくなることは滅多にありません。しかし、カーネルの内部については非常にダイナミックな変更が行われます。
これはカーネルモジュールに対しては互換性が維持されないということです。過去のlinuxカーネルで動作していたカーネルモジュールが将来のlinuxカーネルで動作することは一般に保証されておらず、また動作しなくなっても特にバグ扱いになったりはしません。
この状況は、たとえばアンチウイルスソフトウェアを作成したい、バックアップソフトウェアを作成したいという場合には問題になります。カーネルモジュールについては互換性の維持が期待できないため、linuxカーネルのアップデートに従って「linux 4.14版、linux 4.15版、linux 4.16版……」のようにどんどん変更をしていく必要があるということです。
Red Hat Enterprise Linux(RHEL)でも、「RHEL 7」などのメジャーバージョン中でkernelパッケージのバージョンは同一ですが、フルサポート中には多くの機能拡張や修正をおこなっているため、同じ「3.10」といっても同じカーネルモジュールを利用できるかといえば、そのようなことは言えません。
kABI whitelist
RHELでは、この状況を緩和するため、kABI whitelist とよばれる仕組みを提供しています。これは以下のようなプロセスです。
- カーネルモジュールを提供するISVがあらかじめ「linuxカーネルで利用する関数やデータ構造の名前(シンボル)の一覧(kABI)」をRed Hatにbugzilla上で申請しておく
- 申請されたシンボルはkABI whitelists とよばれる表に追加される
- Red Hatがlinuxカーネルのメンテナンスを行う場合はkABI whitelistに登録されたシンボルのインタフェース(型)が過去バージョンと同じであることを自動テストで確認する
この仕組みを使っても、100%問題が起きないとは言えません。インタフェースが同一であっても、関連する修正が行われればふるまいは完全に同一ではなくなり、そのふるまいの変化で非互換が発生する場合があります。しかしインタフェースが変更されればそもそもカーネルモジュールを読み込むこともできなくなります。非互換性が発生する原因を大幅に減らせるため、有用な仕組みです。
私の製品が使うkABIをwhitelistに登録したい
ナレッジベース記事 Third party module using symbols not in the kABI whitelist - Red Hat Customer Portal にあるように、kscコマンドを使うとカーネルモジュールに含まれていて、kABI whitelistに含まれていないシンボルを検出することができます。まだkABI whitelistに含まれていないシンボルを利用している場合には、サポート窓口までお報せください。