Red Hat Enterprise Linux 9: アプリケーションの互換性ガイド
Red Hat Enterprise Linux 9:
アプリケーションの互換性ガイド
2022 年 5 月
注記: この記事では、Red Hat Enterprise Linux 9 でのアプリケーションの互換性について説明します。Red Hat Enterprise Linux 8 については、Red Hat Enterprise Linux 8: アプリケーションの互換性ガイド を参照してください。
目次
エグゼクティブサマリー
本ガイドは、Red Hat® Enterprise Linux® プラットフォームの複数のリリース間におけるサードパーティーアプリケーションのサポートに関する Red Hat のガイドラインで、ソフトウェア開発者を対象にしています。ISV およびお客様は、アプリケーション開発時にこのガイドラインに従うことで、Red Hat® Enterprise Linux® のメジャーバージョン間およびマイナーバージョン間の移行時に発生するアプリケーションの問題を減らしたり、回避したりできます。
本ガイドは、Red Hat® Enterprise Linux® リリースをまたがる互換性を提供することを目的とするシステムのアプリケーションプログラミングインターフェイス (API) と、アプリケーションバイナリーインターフェイス (ABI) で推奨される使用方法を説明します。また、アプリケーションの互換性の有無を規定する階層型フレームワークについて説明します。
はじめに
このドキュメントの目的は、RHEL 用に作成され、RHEL の新しいリリースで実行されるアプリケーションとライブラリーの安定性に関するガイダンスを提供することです。また、このドキュメントでは主に、ソフトウェアの後方互換性の問題に焦点を当てています。後方互換性を目的としていますが、新機能の開発や、セキュリティー上の懸念により、実現が難しい場合があります。したがって、ガイドラインおよび公開されているポリシーは、可能な限り最も競争力があり、安全で、有能なシステムをお客様に提供するという目的に従って変更する場合があります。状況テストは常に推奨されます。
この互換性ガイドラインの詳細な説明が必要な場合は、Red Hat 担当者にお問い合わせください。
用語
ここでは、以下の基本用語が使用されています。
-
アプリケーションプログラミングインターフェイス (API)
API は、パブリックインターフェイスで、オペレーティングシステムコンポーネントを含む他のソフトウェアと対話することを可能にするソフトウェアプログラムにより実装されます。API は、コンパイル時に適用され、ソースの互換性 (アプリケーションソースコードが、複数バージョンのオペレーティング環境で同様にコンパイルされるかどうか) が判断されます。以下に例を示します。-
開発者が使用する C および C++ のヘッダー
-
言語構文 (ただし公開された仕様に適用する場合に限定)
-
公開インターフェイス定義
-
コマンドラインインターフェイス (記述された公開インターフェイスに適用する場合に限定)
-
-
アプリケーションバイナリーインターフェイス (ABI)
ABI は、ランタイム規則のセットで、コンパイルしたプログラムのバイナリー表現と対話します。ABI は、ランタイム時に適用され、アプリケーションとオペレーティング環境との間の低レベルのインターフェイスを説明します。以下に例を示します。-
データの種類、サイズ、調整
-
集約型、C++ ランタイムの型情報、仮想テーブルのレイアウト
-
呼出規約 (関数の引数を渡し、戻り値を受け取る方法を定義)
-
オブジェクトファイルおよびプログラムライブラリーのバイナリーフォーマット
-
(非同期の) 巻き戻し情報の存在およびフォーマット
-
機能またはデータシンボル、もしくはその両方の名前およびバージョン、ならびに (データシンボルの場合は) シンボルサイズ
-
仮想マシンへのバイトコードまたは中間表現およびパブリックインターフェイス
コンパイラーなどのツール、リンカー、ランタイムライブラリー、およびオペレーティングシステム自体が、ABI と連携する必要があります。CLI ツールの出力は、安定した ABI とはみなされません。
-
-
ABI 準拠
ABI により列挙されるすべての仕様に準拠するコードを生成する場合に、コンパイラーはその ABI に準拠していると言えます。ABI に従って実装する場合、ライブラリーはその ABI に準拠していると言えます。その ABI に準拠するツールを使用して構築したアプリケーションに、ABI で指定された動作を変更するソースコード、もしくは ABI をバイパスするソースコードが含まれていない場合は、アプリケーションが ABI に準拠していると言えます。 -
バイナリー互換性
バイナリー互換性は、特定の ABI 用 (通常は、RHEL と特定のハードウェアアーキテクチャーの組み合わせ) にコンパイルされたアプリケーションバイナリーが、複数のバージョンの RHEL に同じように読み込まれ実行します。アプリケーションバイナリーは、Just-In-Time コンパイル言語の実行可能ファイル、動的共有オプション (DSO)、ソース、バイトコードと、そこで必要なデータファイルで構成されます。 -
コアな永続システムインフラストラクチャー
コアな永続システムインフラストラクチャーとは、システムの状態を表したり、システムとの通信手段 (システムコール、ヘッダーファイルなど) を提供したりするインターフェイスおよび外部で利用可能なデータ構造のことです。 -
仮想化環境における互換性
仮想環境は、ベアメタル環境で動作する非特権アプリケーションが、対応する仮想環境で変更されずに実行されるベアメタル環境をエミュレートします。仮想環境は、物理リソースが抽象化された簡易ビューを表示するため、いくつかの違いが存在する場合があります。 -
コンテナー環境での互換性
コンテナー環境は、ホスト OS からの分離を提供し、少なくともアプリケーションをホスト OS ライブラリーおよびバイナリーから分離して実行できますが、OS カーネルについては、そのホストにあるその他のすべてのコンテナーと共有します。 -
メジャーリリースおよびマイナーリリース
Red Hat のメジャーリリースは、製品の開発における重要なステップを表します (大規模な変更は、通常、メジャーリリースで行われます)。マイナーリリースは、メジャーリリースの範囲内でより頻繁に提供され、一般的には小規模の増分開発手順を表します。 -
コンポーネント
インストール可能な言語、アプリケーション、データベースなど、RHEL で稼働するパッケージの機能セット。コンポーネントはさまざまな形式で利用できます。詳細は、パッケージマニフェスト を参照してください。 -
SystemTap 静的プローブ
SystemTap 静的プローブは、SystemTap プロファイリングと、フレームワークの追跡に含まれます。プローブは、主要のシステムライブラリーに統合されており、アプリケーションやライブラリーのプロファイリングおよびデバッグをサポートします。 -
ファイルシステム階層標準 (FHS)
さまざまなファイルの種類とディレクトリーに関する名前、場所、パーミッションを定義するファイルシステム構造。FHS 準拠のファイルシステムは互いに互換性があり、/usr/ パーミッションを読み取り専用としてマウントする機能があります。後者の機能には、パーティションに共通の実行可能ファイルが含まれ、ユーザーが変更すべきではないため、重要です。 -
CodeReady Linux Builder リポジトリー
CodeReady Linux Builder リポジトリーには、RHEL アプリケーションの開発時に開発者が使用するコンポーネントが含まれますが、実稼働環境へのデプロイは意図されていません。詳細は、Red Hat Enterprise Linux 9 パッケージマニフェスト 内の CodeReady Linux Builder リファレンスを参照してください。
互換性レベル
Red Hat Enterprise Linux にあるコンポーネントおよびパッケージはすべて、次の 4 つの互換性レベルのいずれかに分類されます。
-
互換性レベル 1
- API および ABI は、メジャーリリースのライフサイクル期間内で安定し、ABI はその後に続く 2 つのメジャーリリースでも安定しています (ABI の新規または修正が導入されるリリースと、その後に続く 2 つのメジャーリリース (n, n+1, n+2))。この記事では、リリース n は Red Hat Enterprise Linux 9 を指します。ライブラリーへの変更が原因で既存のバイナリーとの互換性がなくなると、アプリケーションを修正せずに実行するために、古い ABI と一緒に、別のバージョンのライブラリーが提供されます。
-
互換性レベル 2
- API および ABI は、1 つのメジャーリリースのライフサイクル期間内で安定しています。互換性レベル 2 のアプリケーションインターフェイスは、マイナーリリースからマイナーリリースへは変更されず、メジャーリリースの期間中は安定しているため、アプリケーションは依存することができます。互換性レベル 2 は、Red Hat Enterprise Linux 9 のパッケージのデフォルトです。別の互換性レベルを持つことが確認されていないパッケージは、互換性レベル 2 とみなされます。
-
互換性レベル 3
-
このレベルは、Application Streams として Red Hat Enterprise Linux に含まれる言語、ツール、およびアプリケーションに適用されます。詳細は、Red Hat Enterprise Linux Application Streams のライフサイクル を参照してください。各コンポーネントは、API および ABI がサポートされるライフサイクルを指定します。新しいバージョン (PHP 8.1 や PHP 8.2 など) は、可能な限りバージョン間で API と ABI の互換性を維持しようとします。ただし、バージョン間の互換性は保証されていません。
-
ローリングストリームと呼ばれる継続的な更新を受け取るコンポーネントと開発者ツールは、互換性レベル 3 と考える必要があります。詳細は、Red Hat Enterprise Linux Application Streams のライフサイクル を参照してください。開発者は、リリースごとにこれらのコンポーネントがどのように変更されるのかに注意を払い、理解する必要があります。
-
-
互換性レベル 4
- 互換性は提供されません。ABI および API は任意の時点で変更できます。このコンポーネントは、長期サポートが必要なアプリケーションでは使用しないでください。
互換性レベルの注意事項
ベアメタル設定の互換性レベルは、ハードウェアと直接対話する機能を除き、仮想化とコンテナーの構成にも適用されます。ハードウェアに直接関連する機能には、API または ABI の互換性レベルがありません。たとえば、グラフィックスプロセッシングユニット (GPU) 機能は、バイナリー互換性を予期しません。
Red Hat をお使いのアプリケーション開発者は、未特定の実装に特有の動作への依存や、特定の API 実装におけるバグへの依存を防ぐために、アプリケーション開発者が依存する動作が、API の公式ドキュメントで明示的に定義されていることを確認することが求められます。たとえば、GNU C ライブラリー (glibc) の新しいリリースは、アプリケーションで、文書化されていない API を使用するか、未定義の動作に依存している場合に、古いリリースとは互換性がない場合があります。
具体的な質問は、サポート担当者にお問い合わせください。
互換性の例外
以下は、RHEL での互換性の例外です。
SystemTap 静的プローブ
- 現時点では、統合された SystemTap 静的プローブが同じプローブ名、プローブ位置、もしくは引数の解釈または数を持ち続けるという保証はありません。プローブは、主に深い分析とデバッグ用に設計されているため、基盤となる実装の変更に応じてプローブを変更できる必要があります。
C/C++ ランタイムを使用した静的リンク
- C/C ランタイムを使用した静的リンクはサポートされていません。これには、`glibc-static` パッケージまたは `libstdc`-static パッケージに含まれるファイルとのリンクが含まれます。静的リンクを選択する場合もありますが、その結果のアプリケーションバイナリーは、インストールのいずれかのパッケージが変更すると動作しない場合があります。
C/C++ アプリケーションサニタイザー
- コンパイラーオプション
-fsanitize=[option]
を指定してビルドされた C/C++ アプリケーションは、このドキュメントに記載されている API や ABI の保証には含まれません。サニタイザーランタイムを実装するサニタイザーライブラリーは互換性レベル 4 に含まれ、互換性の保証はありません。
CodeReady Linux Builder リポジトリー
-
CodeReady Linux Builder リポジトリーのパッケージはすべてサポートされません。このレポジトリーのパッケージは開発者が使用するために維持されますが、その多くは特定のユースケースに対するものです。開発者は、このようなパッケージは使用できますが、互換性のレベルが適用されないことに注意してください。
-
ディストリビューション内のバイナリー RPM に、ヘッダーや共有オブジェクトのシンボリックリンクなど、CodeReady Linux Builder 開発パッケージを介してのみアクセス可能な機能が含まれている場合、それらの機能は、CodeReady Linux Builder でのみ利用可能であるかのように見なす必要があります。
バイナリー互換性を維持するためのガイドライン
Red Hat では、アプリケーション開発者が、バイナリー互換性を改善するために、以下の原則を採用することが推奨されます。
-
アプリケーションのニーズに適した互換性レベルに記載されているライブラリーおよびアプリケーションのみを使用してください。
-
ライブラリーの公開されたインターフェイスを使用してアプリケーションをビルドします。非公開 (内部) のインターフェイスはいつでも変更する可能性がありますが、依存アプリケーションに依存すると不安定になる可能性があります。
-
ライブラリーが開発パッケージを提供する場合は、独自の開発のために、提供されたヘッダーを含むその開発パッケージをインストールして使用する必要があります。ライブラリーが開発パッケージを提供しない場合、またはリンク用のヘッダーと共有オブジェクトのセットを提供しない場合は、そのライブラリーの API と ABI は互換性保証の対象外となります。
-
アプリケーションに必要なすべてのライブラリーを使用してリンクする必要があります。必要なすべてのライブラリーへのリンクに失敗すると「未リンク」となります。 未リンクのアプリケーションは、ABI 互換性の利点を利用できません。
-
アプリケーションが ELF バージョンのシンボルを動的に呼び出す場合、その特定のバージョンでその特定のシンボルを要求するには、glibc
dlvsym
API を使用する必要があります。dlsym
API (バージョン指定なし) を使用すると、必ず最新バージョンのシンボルが取得されるため、動作は最新の API 動作となり、使用しているアプリケーションには適さない可能性があります。
-
-
それが、構築された環境と同じか、その環境より新しい環境で実行した場合に限り、正しく実行することが保証されます。たとえば、Red Hat Enterprise Linux 9.0 でアプリケーションをコンパイルした場合は、依存するコンポーネントの互換性レベルに応じて、Red Hat Enterprise Linux 9.0 以降でのみアプリケーションが適切に実行されることが保証されることを意味します。
-
アプリケーション開発者は、未特定の実装に特有のセマンティクスへの依存や、特定の API 実装でのバグへの依存を防ぐために、公開されている API ドキュメントに、依存する動作が記載されていることを確認する必要があります。たとえば、GNU C ライブラリーの新しいリリースは、以前の動作が公開された仕様と一致しなかった場合に、古いリリースとの互換性が保証されていません。
-
ライブラリーの静的リンクを回避します (C/C++)。静的リンクにより、実行可能ファイルには、ライブラリーの独自のバージョンが含まれます。これにより、このライブラリーの依存関係が途中で変更した可能性があるとして、アプリケーションが、オペレーティングシステムのそれ以降のバージョンで予期した通りに動作しない可能性が高くなります。この問題を回避するためには、動的リンクのアプリケーションが、強く推奨されます。
-
RPM メカニズムを使用するパッケージのアプリケーション。RPM は、アプリケーションの依存関係の詳細な仕様を含むソフトウェアパッケージングメカニズムを提供します。RPM の作成時は、以下の点に注意してください。
-
適切な RPM 構文を使用して、必要なすべてのランタイムを明示的に示し、依存関係を構築します。可能な場合は依存関係の自動追跡を使用し、AutoReqProv、AutoReq、および AutoProv タグを使用して自動依存関係を無効にしないことをお勧めします。
-
Red Hat が提供するパッケージにより管理されるファイルの修正、置換、再コンパイルは行わないでください。そうすることで、予期しない動作につながる可能性があります。
-
依存関係を考慮する際、すべての Red Hat Enterprise Linux システムに、可能なパッケージがすべてインストールされていることを前提としないでください。デフォルトでインストールされているパッケージが、メジャーリリース、同じバージョンの製品バリアント間、カスタマーのシステムで異なる可能性があります。アプリケーションが動作する必要があるすべてのパッケージに常に依存し、推移的依存関係は変更しないことを期待しないでください。
-
-
プログラムをインストールする際は、ファイルシステム階層標準 (FHS) バージョン 2.3 以降に従ってください。サードパーティーソフトウェアは、「/opt」サブディレクトリーにインストールする必要があります。FHS の詳細は、http://www.pathname.com/fhs/ を参照してください。
-
システムパッケージまたは他のコンポーネントにより提供される構成ファイルに依存するアプリケーションを設計しないでください。アップストリームコミュニティーが、それを保存するように明示的にコミットしない限り、このファイルはバージョン間で変更する場合があります。
-
Red Hat が提供しているシステムコンポーネントと同じ名前で、パッケージ、モジュール、その他のグローバル識別子をインストールしないでください。これには、RPM パッケージ名 (Provides を含む)、共有オブジェクト名 (libpthread.so.0 などの sonames)、シンボル名 (log など) が含まれますが、システムが使用する Python パッケージ名、D-Bus エンドポイントも含まれます。
-
アプリケーションのいずれの互換性レベルにも現在記載されていないコンポーネントの機能、また別の互換性レベルに移動するコンポーネントからの機能が必要な場合は、サポート担当者に評価を依頼してください。
-
お使いのアプリケーションより互換性の保証が短いコンポーネントには依存しないでください。パッケージとその互換性レベルのリストについては、特定パッケージおよびライブラリーの互換性レベル を参照してください。
-
特定の Linux カーネルバージョンに依存しないでください。proc、sys、デバッグファイルシステム、その他の擬似ファイルシステムからの読み取りは回避してください。ioctls は使用せず、ハードウェアと直接対話してください。
注記: メジャーリリースのライフサイクルの期間中、Red Hat は商業的に合理的な範囲で、すべてのマイナーリリースとエラータアドバイザリーで、ランタイム環境のバイナリー互換性の維持に努めています。ただし、必要に応じて、重大影響を及ぼすセキュリティー問題や、その他の重要な問題に対処するために、この互換性維持の目標に Red Hat が例外を設けることがあります。さらに、上記および 特定パッケージおよびライブラリーの互換性レベル で説明したように、Red Hat Enterprise Linux のメジャーリリースには、アプリケーションの移行を容易にするために、以前のメジャーリリースに含まれていた後方互換性ライブラリーの限定セットが含まれます。Red Hat は通常、変更内容を最小限に抑え、バイナリー互換性を維持するように変更を実施します。
特定パッケージおよびライブラリーの互換性レベル
互換性レベルごとに、Red Hat は、互換性レベルの一部である API と ABI を提供するバイナリーパッケージを定義します。各パッケージの互換性レベルは、Red Hat Enterprise Linux 9 パッケージマニフェスト 内で確認できます。
Comments