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パッケージのバージョンは同一ですが、同じ「kernel 3.10.0」といっても無条件で同じカーネルモジュールを利用できるとは限りません。
kABI whitelist
RHELでは、この状況を緩和するため、kABI whitelist とよばれる仕組みを提供しています。kABIとはkernel Application Binary Interfaceの略で、カーネルモジュールが利用するインタフェースのことです。
kABI whitelistとは下のようなプロセスです。
- カーネルモジュールを提供するISVがあらかじめ「linuxカーネルで利用する関数やデータ構造の名前(シンボル)の一覧(kABI)」をRed Hatに申請しておく
- 申請されたシンボルはkABI whitelists とよばれる表に追加される
- Red Hatがlinuxカーネルのメンテナンスを行う場合はkABI whitelistに登録されたシンボルのインタフェース(型)が過去バージョンと同じであることを自動テストで確認する
この仕組みを使っても、100%問題が起きないとは言えません。インタフェースが同一であっても、関連する修正が行われればふるまいは完全に同一ではなくなり、そのふるまいの変化で非互換が発生する場合があります。しかしインタフェースが変更されればそもそもカーネルモジュールを読み込むこともできなくなります。非互換性が発生する原因を大幅に減らせるため、有用な仕組みです。
RHELの開発チームはkernelパッケージを更新してもISVが提供するカーネルモジュールを利用しつづけられるように、kABI whitelistsに掲載されたkABIについては互換性を維持しています。kABI whitelistsに登録されたインタフェースのふるまいが変わり、非互換が発生した場合にはバグとして取り扱われます。
私のソフトウェアが使うkABIをwhitelistに登録したい
ナレッジベース記事 Third party module using symbols not in the kABI whitelist - Red Hat Customer Portal にあるように、kscコマンドを使うとカーネルモジュールに含まれていて、kABI whitelistに含まれていないシンボルを検出することができます。まだkABI whitelistに含まれていないシンボルを利用している場合には、サポート窓口までお報せください。