Red Hat Enterprise Linux 8: アプリケーションの互換性ガイド

更新 -

Red Hat Enterprise Linux 8:
アプリケーションの互換性ガイド
2019 年 5 月

注意: 本記事は、Red Hat Enterprise Linux 8 におけるアプリケーションの互換性を説明します。Red hat Enterprise Linux 7 については、「Red Hat Enterprise Linux 7: Application Compatibility GUIDE」を参照してください。

目次

エグゼクティブサマリー

本ガイドは、Red Hat® Enterprise Linux® の複数のリリース間におけるサードパーティーアプリケーションのサポートに関する Red Hat のガイドラインで、ソフトウェア開発者を対象にしています。ISV およびお客様は、アプリケーション開発時にこのガイドラインに従うことで、Red Hat® Enterprise Linux® のメジャーバージョン間およびマイナーバージョン間の移行時に発生するアプリケーションの問題を減らしたり、回避したりできます。

本ガイドは、Red Hat® Enterprise Linux® リリースで互換性を提供することを目的とするシステムのアプリケーションプログラミングインターフェース (API) と、バイナリーインターフェース (ABI) で推奨される使用方法を説明します。ここでは、アプリケーションが互換性がある、または互換性のないと考えられている段階的なフレームワークを説明します。

はじめに

本ドキュメントの目的は、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 で稼働するパッケージの機能セット。 コンポーネントは、モジュール、Software Collections、または従来の RPM 形式でパッケージ化できます。コンポーネントは、コンテナーイメージで利用できます。

  • Application Streams
    Application Streams では、RHEL システムのインストールで利用可能なコンポーネントのバージョンが複数作成されます。 それぞれのバージョンがストリームと呼ばれます。 PHP 7.2 も PHP 7.3 もストリームです。Application Streams は、SCL、モジュール、または従来の RPM の形式でパッケージ化できます。 多くの Application Streams にはライフサイクル (3 年) が定められていて、下記のとおり、互換性レベル 3 に分類されます。

  • Software Collection (SCL)
    個別ユニットとして一緒にリリースされるセットで、適切に統合され、十分にテストされています。 Software Collection は、Red Hat Enterprise Linux で使用する、安定した新しいバージョンのコンポーネントを配信します。

  • モジュール性
    モジュールは、関連するメタデータを持つ RPM の集まりのことで、グループとしてインストール、または削除されます。モジュールは、データベースなどの大規模コンポーネントのバージョンを複数配信できるメカニズムです。 モジュールは、1 つまたは複数のストリームで利用できます。 モジュールストリームは、通常、ソフトウェアのメジャーバージョンを表し、ユーザーが使用するソフトウェアパッケージのバージョンを選択できるようにします。 モジュールは、Application Stream でも使用できますが、その他のモジュールの依存モジュールとしても使用できます。 モジュールの API に記載されていない RPM は、実装の詳細とみなされ、モジュールが提供する互換性の保証の対象にはなりません。

  • SystemTap 静的プローブ
    SystemTap 静的プローブは、SystemTap プロファイリングと、フレームワークの追跡に含まれます。プローブは、主要のシステムライブラリーに統合されており、アプリケーションやライブラリーのプロファイリングおよびデバッグをサポートします。

  • ファイルシステム階層標準 (FHS)
    さまざまなファイルの種類とディレクトリーに関する名前、場所、パーミッションを定義するファイルシステム構造。FHS 準拠のファイルシステムは互いに互換性があり、/usr/ パーミッションを読み取り専用としてマウントする機能があります。後者は重要です。パーティションには共通の実行可能ファイルが含まれ、ユーザーが変更してはならないためです。

  • CodeReady Linux Builder リポジトリー
    CodeReady Linux Builder リポジトリーには、RHEL アプリケーションの開発時に開発者が使用するコンポーネントが含まれますが、本番環境にはデプロイされません。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 8 以降となります。ライブラリーへの変更により、既存バイナリーへの互換性がなくなると、アプリケーションを修正せずに実行するため、古い ABI と一緒に、別のバージョンのライブラリーが提供されます。
  • 互換性レベル 2

    • API および ABI は、1 つのメジャーリリースのライフサイクル期間内で安定します。互換性レベル 2 のアプリケーションインターフェースは、マイナーリリースの間は変更せず、メジャーリリースの期間内に安定するかどうかはアプリケーションに依存します。 互換性レベル 2 は、Red Hat Enterprise Linux 8 のパッケージのデフォルトです。別の互換性レベルがない場合は、互換性レベル 2 と見なされる可能性があります。
  • 互換性レベル 3

    • このレベルは、Red Hat Enterprise Linux に含まれる言語、ツール、およびアプリケーションに適用されます。各コンポーネントは、API および ABI がサポートされるライフサイクルを指定します。 新しいバージョン (つまり PHP7.2 および PHP7.3) は、バージョン間でできるだけ API と ABI の互換性を持たせます。 ただし、バージョン間の互換性は保証されていません。
  • 互換性レベル 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 リポジトリーのパッケージはすべてサポートされません。 このレポジトリーのパッケージは開発者が使用するために維持されますが、その多くは特定のユースケースに対するものです。 開発者は、このようなパッケージは使用できますが、互換性のレベルが適用されないことに注意してください。

バイナリーの互換性を維持するガイドライン

Red Hat では、アプリケーション開発者が、バイナリー互換性を改善するために、以下の原則を採用することが推奨されます。

  1. アプリケーションのニーズに適した互換性レベルに記載されているライブラリーおよびアプリケーションのみを使用してください。

  2. ライブラリーの公開されたインターフェースを使用してアプリケーションをビルドします。非公開 (内部) のインターフェースはいつでも変更する可能性がありますが、依存アプリケーションに依存すると不安定になる可能性があります。

    • ライブラリーは、その開発パッケージをインストールして使用する開発パッケージを提供します。これには、独自の開発に対応する任意の提供ヘッダーが含まれます。
    • アプリケーションに必要なすべてのライブラリーを使用してリンクする必要があります。必要なすべてのライブラリーへのリンクに失敗すると「未リンク」となります。 未リンクのアプリケーションは、ABI 互換性の利点を利用できません。
    • ELF バージョンのシンボルを動的に呼び出す場合は、特定のバージョンで特定のシンボルを要求するために、アプリケーションが、glibc dlvsym API を使用する必要があります。dlsym API (バージョン指定子なし) を使用すると、常に最新バージョンのシンボルを取得します。したがって、最新の API 動作は、アプリケーションに適していない場合があります。
  3. それが、構築された環境と同じか、その環境より新しい環境で実行した場合に限り、正しく実行することが保証されます。たとえば、Red Hat Enterprise Linux 8.0 でアプリケーションをコンパイルした場合は、依存するコンポーネントの互換性レベルにより、Red Hat Enterprise Linux 8.0 以降で適切に実行されることが保証されることを意味します。

  4. アプリケーション開発者は、未特定の実装に特有のセマンティクスへの依存や、特定の API 実装でのバグへの依存の導入を防ぐために、公開されている API ドキュメントに、依存する動作が記載されていることを確認する必要があります。

  5. たとえば、GNU C ライブラリーの新しいリリースは、以前の動作が公開された仕様と一致しなかった場合に、古いリリースとの互換性が保証されていません。
    ライブラリーの静的リンクを回避します (C/C++)。静的リンクにより、実行可能ファイルには、ライブラリーの独自のバージョンが含まれます。これにより、このライブラリーの依存関係が途中で変更した可能性があるとして、アプリケーションが、オペレーティングシステムのそれ以降のバージョンで予期した通りに動作しない可能性が高くなります。この問題を回避するためには、動的リンクのアプリケーションが、強く推奨されます。

  6. RPM メカニズムを使用するパッケージのアプリケーション。RPM は、アプリケーションの依存関係の詳細な仕様を含むソフトウェアパッケージングメカニズムを提供します。RPM の作成時、以下の点に注意してください。
    *適切な RPM 構文を使用して、必要なすべてのランタイムを明示的に示し、依存関係を構築します。可能な場合は依存関係の自動追跡を使用して、AutoReqProv タグ、AutoReq タグ、および AutoProv タグを介して無効になるのを回避することが推奨されます。

    • Red Hat が提供するパッケージにより管理されるファイルの修正、置換、再コンパイルは行わないでください。そうすることで、予期しない動作につながる可能性があります。
    • 依存関係を考慮する際、すべての Red Hat Enterprise Linux システムに、可能なパッケージがすべてインストールされていることを前提としないでください。デフォルトでインストールされているパッケージが、メジャーリリース、同じバージョンの製品バリアント間、カスタマーのシステムで異なる可能性があります。アプリケーションが動作する必要があるすべてのパッケージに常に依存し、推移的依存関係は変更しないことを期待しないでください。
  7. プログラムをインストールする際は、ファイルシステム階層標準 (FHS) バージョン 2.3 以降に従ってください。サードパーティーソフトウェアは、/opt サブディレクトリーにインストールする必要があります。FHS の詳細は http://www.pathname.com/fhs/ を参照してください。

  8. システムパッケージまたは他のコンポーネントにより提供される構成ファイルに依存するアプリケーションを設計しないでください。アップストリームコミュニティーが、それを保存するように明示的にコミットしない限り、このファイルはバージョン間で変更する場合があります。
  9. Red Hat が提供しているシステムコンポーネントと同じ名前で、パッケージ、モジュール、その他のグローバル識別子をインストールしないでください。これは、RPM パッケージ名 (Provides を含む)、共有オブジェクト名 (so 名 (libpthread.so.0 など))、シンボル名 (log など) が含まれますが、システムが使用する Python パッケージ名、D-Bus エンドポイントも含まれます。
  10. アプリケーションのいずれの互換性レベルにも現在記載されていないコンポーネントの機能、また別の互換性レベルに移動するコンポーネントからの機能が必要な場合は、サポート担当者に評価を依頼してください。
  11. お使いのアプリケーションより互換性の保証が短いコンポーネントには依存しないでください。パッケージとその互換性レベルの一覧は、付録を参照してください。
  12. 特定の Linux カーネルバージョンに依存しないでください。proc、sys、デバッグファイルシステム、その他の擬似ファイルシステムからの読み取りは回避してください。ioctls は使用せず、ハードウェアと直接対話してください。

付録 A: 特定パッケージおよびライブラリーの互換性レベル

各互換性レベルについて、互換性レベルに含まれる API および ABI を提供するバイナリーパッケージを定義します。便宜上、バイナリー RPM を構築するソースの RPM を記載していますが、ソース RPM は、互換性レベルに含まれません。

互換性レベル 1 (CL1): API および ABI は、(RHEL 8 以降の) 3 つのメジャーリリースで安定

ソース RPM (参照用) レベル 1 のバイナリー RPM
glibc glibc (glibc-static パッケージは含まれません)
gcc libstdc++、libgcc、libgomp、libatomic
elfutils elfutils-libelf (elfutils-libelf-static-devel は含まれません)
krb5 krb5-libs
libvirt libvirt-client
libxml2 libxml2
libxslt libxslt
libglvnd libglvnd-glx、libglvnd-egl、libglvnd-gles、libglvnd-opengl
mesa-libGLU mesa-libGLU
pam pam
vulkan-loader vulkan-loader
zlib zlib

互換性レベル 2: API および ABI は、同じメジャーリリースで安定

注意: 本ガイドに記載される互換性レベルに含まれていないコンポーネントはレベル 2 と見なされ、同一メジャーリリース内 (つまり Red Hat Enterprise Linux 8 のライフサイクル期間中) の互換性に依存します。

ソース RPM (参照用) 互換性レベル (CL) 2 のバイナリー RPM
gcc libgfortran (具体的には共有ライブラリー libgfortran.so.5)、libquadmath
tbb tbb、tbb-devel、tbb-doc、ptyhon3-tbb
SDL SDL
libusb libusb
alsa-lib alsa-lib
libmodulemd libmodulemd
gtk2 gtk2
gtk3 gtk3
motif motif
libacl libacl
libattr libattr
libX11 libX11
libXaw libXaw
libXau libXau
libXrandr libXrandr
libXrender libXrender
libXext libXext
libXft libXft
libXi libXi
libXmu libXmu
libXpm libXpm
qt5-qt5base qt5-qt5base
bzip2 bzip2-libs
curl libcurl
xz xz-libs
systemd systemd-libs
dbus dbus-libs
openssl openssl-libs
gnutls gnutls
nss nss
libgcrypt libgcrypt
libssh libssh

互換性レベル 3: API および ABI は、コンポーネントで公開されているライフサイクルに対して安定

レベル 3 コンテンツの現在の設定は、「Red Hat Enterprise Linux 8 Application Streams ライフサイクル」を参照してください。

レベル 3 のコンテンツには、レベル 2 のコンテンツと同じ ABI および API 互換性があります。違いは、Application Stream の表に定義したメンテナンス間隔だけです。

互換性レベル 4: API または ABI の安定性は、Red Hat の判断で変更する可能性あり

ソース RPM (参照用) 互換性レベル (CL) 4 のバイナリー RPM
gcc libasan、libasan-static、libatomic-static、libgfortran-static、libitm、libitm-static、liblsan、liblsan-static、libstdc++-static、libtsan、libtsan-static、libubsan、libubsan-static
glibc glibc-static
libxcrypt libxcrypt-static
libmodulemd libmodulemd1
libnftnl libnftnl, libnftnl-devel
lttng-ust lttng-ust、lttng-ust-devel
libcgroup libcgroup
libdrm libdrm
libglvnd libglvnd
libvdpau libvdpau
libXfont2 libXfont2
mesa mesa-libGL、mesa-dri-drivers
ocl-icd ocl-icd
python-evdev python3-evdev
vulkan-validation-layers vulkan-validation-layers
wayland-protocols wayland-protocols-devel
xorg-sgml-doctools xorg-sgml-doctools
xorg-x11-server xorg-x11-server-Xorg、xorg-x11-server-Xwayland
gnome-desktop gnome-desktop
pipewire pipewire、pipewire-devel、pipewire-libs、pipewire-utils
pulseaudio pulseaudio-libs、pulseaudio-module-x11、pulseaudio-module-bluetooth、pulseaudio-module-gconf
bcc bcc、bcc-tools、python3-bcc
kabi-dw kabi-dw
criu criu、python3-criu
nettle nettle
bind bind-devel、bind-export-devel、bind-export-libs、bind-libs、bind-libs-lite、bind-lite-devel、bind-pkcs11-devel、bind-pkcs11-libs
wireshark wireshark-cli、wireshark-devel
cracklib cracklib
samba samba-libs
openldap openldap
libfastjson libfastjson
libestr libestr
liblognorm liblognorm
librdkafka librdkafka
librelp librelp
http-parser http-parser
openvswitch-selinux-extra-policy openvswitch-selinux-extra-policy
virtio-win virtio-win
driverctl driverctl
ipset ipset-libs
libteam libteam、libteam-devel、network-scripts-team、python3-libteam、teamd、teamd-devel、libteam-doc
WALinuxAgent WALinuxAgent
cloud-init cloud-init
open-vm-tools open-vm-tools
lldpad lldpad