第5章 バージョン番号と ABI

目次

5.1. 異なるバージョンのタイプ
5.2. カーネルの ABI
5.2.1. ABI 名
5.2.2. ABI の管理と更新

5.1. 異なるバージョンのタイプ

アップストリームバージョン

Linus や安定版のメンテナがリリースに使用するバージョンです。現在 Linus はバージョンナンバに 4.x[-rcy] というフォーマットを使用しています。安定版のメンテナはバージョンナンバに 4.x.y というフォーマットを使用しています。

パッケージバージョン

Debian パッケージで使用されるバージョンナンバDebian ポリシーによると、アップストリームのバージョン-Debian のリビジョン というフォーマットに従う必要がります。しかし、アップストリームのリリース候補版で使用される 「-rc」 は 「~rc」 で置き換える必要があります。これ以降にリリースされるバージョンよりも前のバージョンであると認識させるためです。

カーネルバージョン

カーネルメッセージ、ファイル名、パッケージ名、「uname -r」 コマンドで出力されるバージョンナンバです。公式のカーネルパッケージではupstreamversion[-abiname][-featureset]-flavour というフォーマットに従います。これは全ての新しいパッケージバージョンで変わるものではありません。abinameは以下のルールに従い変更されます。

多くのプログラムがカーネルバージョンをunameシステムコールかコマンドからパースしますが、最低でも 3 つのバージョンの部位がドットで区切られていることが前提となっています。互換性のために、公式のカーネルパッケージは現在アップストリームバージョンに「.0」を付けています。

5.2. カーネルの ABI

ABI (Application Binary Interface) はレジスタの割り当てやメモリのレイアウトのレベルで考慮されているソフトウェアコンポーネント間のインタフェースです。カーネルとユーザ空間の間の ABI は定常的に注意深くメンテナンスされているため、ここでは考慮する必要はありません。しかし、カーネルとカーネルモジュール間の ABI はその限りではありません。ツリー外のモジュールをサポートするためには、 カーネルとモジュール間の ABI に変更があるたびにカーネルバージョンを変更しなければなりません。

5.2.1. ABI 名

公式のカーネルパッケージでは、私達はカーネルバージョン名の一部であるabinameを変更します。これは、新しいアップストリームバージョンに起因しない ABI の変更をマークするためです。この部分は debian/config/defines 中の abiname の設定で管理されています。私達は、この部分に 「trunk」(experimental 用) か番号を使用しますが、カスタムパッケージにはそれ以外の文字列を使うべきです。

5.2.2. ABI の管理と更新

私達は、ユーザがツリー外のモジュールを頻繁にビルドする必要が無いよう、Debian 安定版や旧安定版に対するアップデートでは、カーネルの ABI を変更しません。最も重要なことは、ツリー外のモジュールが ABI のある部分に依存していないと思われる場合を除き、ABI 名を変更せずにそのような変更を行うことを避けるということです。

カーネルへのバグ修正や設定の変更は ABI の変更をともなう場合があります。もしエクスポートされた関数が CONFIG_FOO を条件としているか、もしくは型定義が CONFIG_FOO に依存するものを使用している場合、CONFIG_FOO の有効無効によってその関数の ABI、ひいてはカーネル全体の ABI が変更になります。1 つのドライバの設定を有効化したり、変更したりする場合、たいてい ABI は変更しません。ほとんどのドライバは何もエクスポートしないからです。

カーネルのビルドプロセスによって 、それぞれのエクスポートされた関数や変数用に「シンボルバージョン」が生成されます。これは自身が依存している定義のハッシュで、関数の ABI が変更された場合は必ず変更しなければなりません。シンボルバージョンを比較することで、カーネルモジュールローダは非互換のモジュールを検出します。シンボルバージョンの完全なセットはカーネル ABI で表現されます。

私達は以前アップロードしたdebian/abiディレクトリ以下のパッケージのシンボルバージョンを修正し、新しいカーネルのものと比較します。もし ABI 名が変更さないにも関わらず ABI そのものに変更がある場合は、ビルドを中止します。

カーネル ABI が変更された場合は、debian/config/defines の ABI 名を変更しなければなりません。そして次のコマンドを実行します:

$ fakeroot debian/rules debian/control-real

このコマンドで ABI に対応したパッケージ定義を再生成することができます。