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

更新 -

Red Hat Enterprise Linux 7:
アプリケーションの互換性ガイド
2014 年 6 月

注記: この記事では、Red Hat Enterprise Linux 7 でのアプリケーションの互換性について説明します。Red Hat Enterprise Linux 6 については、添付の PDF ファイル (rhel6_app_compatibility_wp.pdf) を参照してください。

目次

エグゼクティブサマリー

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

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

はじめに

これらのガイドラインは、新しいリリースがデプロイされた時にアプリケーションの安定性を提供することを目的としているため、主に前方互換性の問題に焦点を当てています。目指すのは後方互換性ですが、新機能の開発により、実現が難しい場合があります。したがって、ガイドラインおよび公開されているポリシーは、可能な限り最も競争力があり、有能なシステムをお客様に提供するという目的に従って変更される場合があります。状況テストは常に推奨されます。
これらの互換性ガイドラインの明確化が必要な場合は、『Red Hat Enterprise Linux 7 開発者ガイド』で詳細を確認するか、Red Hat の担当者にお問い合わせください。

用語

ここでは、以下の基本用語が使用されています。

  • バイナリー互換性
    バイナリー互換性とは、Red Hat Enterprise Linux と特定のハードウェアアーキテクチャーの組み合わせにコンパイルされたアプリケーションが、オペレーティング環境における異なるインスタンス全体で同じように読み込まれ、実行されることを意味します。アプリケーションバイナリーは、実行可能ファイルと Dynamic Shared Objects (DSO、動的共有オブジェクト) で構成され、互換性のレベルは特定のアプリケーションバイナリーインターフェース (ABI) によって定義されます。

  • アプリケーションプログラミングインターフェース (API)
    API は、オペレーティングシステムコンポーネントを含む他のソフトウェアと対話することを可能にするソフトウェアプログラムにより実装されるインターフェースです。API は、コンパイル時に適用され、ソースの互換性 (アプリケーションソースコードが、オペレーティング環境における異なるインスタンス全体で同じようにコンパイルするかどうか) を決定します。

  • アプリケーションバイナリーインターフェース (ABI)
    ABI は、ランタイム規則のセットで、コンパイルしたプログラムのバイナリー表現と対話します。ABI は API のスーパーセットでもあり、アプリケーションとオペレーティング環境との間の低レベルのインターフェースを説明します。以下に例を示します。

    • データの種類、サイズ、調整
    • 呼出規約 (関数の引数を渡し、戻り値を受け取る方法を定義)
    • オブジェクトファイルおよびプログラムライブラリーのバイナリーフォーマット
    • 機能またはデータシンボル、もしくはその両方の名前およびバージョン
      コンパイラーなどのツール、リンカー、ランタイムライブラリー、およびオペレーティングシステム自体が、ABI と連携する必要があります。ABI はランタイムに動作します。
  • ABI 準拠
    ABI により列挙されるすべての仕様に準拠するコードを生成する場合に、コンパイラーはその ABI に準拠していると言えます。ABI に従って実装する場合、ライブラリーはその ABI に準拠していると言えます。ABI に準拠するツールを使用して構築したアプリケーションに、ABI で指定された動作を変更するソースコード、もしくは ABI をバイパスするソースコードが含まれていない場合は、アプリケーションがその ABI に準拠していると言えます。

  • コアな永続システムインフラストラクチャー
    コアな永続システムインフラストラクチャーとは、システムの状態を表したり、システムとの通信手段 (システムコール、ヘッダーファイルなど) を提供したりするインターフェースおよび外部で利用可能なデータ構造のことです。

  • 仮想化環境における互換性
    仮想環境は、ベアメタル環境で動作する非特権アプリケーションが、対応する仮想環境で変更されずに実行されるベアメタル環境をエミュレートします。仮想環境は、物理リソースが抽象化された簡易ビューを表示するため、いくつかの違いが存在する場合があります。

  • Supplementary リポジトリーおよび Optional リポジトリーのパッケージ
    Red Hat Network (RHN) の Supplementary チャンネルと Optional チャンネルで利用可能なパッケージは製品の一部ではありませんが、利便性のため、またはビルド依存関係を満たすために利用可能になっています。

  • メジャーリリースおよびマイナーリリース
    Red Hat のメジャーリリースは、製品の開発における重要なステップを表します (大規模な変更は、通常、メジャーリリースで行われます)。また、(Red Hat Enterprise Linux 7 などのように) 通常は数字は 1 桁で指定されます。マイナーリリースは、メジャーリリースの範囲内でより頻繁に実施され、一般的には小規模の増分開発手順を表します。

  • Red Hat Enterprise Linux の延長アップデートサポート
    Red Hat Enterprise Linux 延長アップデートサポート (EUS) は、オプションによるサポートサービスで、期間を延長して特定のマイナーリリースの利用を希望するお客様に提供しています。Red Hat Enterprise Linux 7 EUS の各ストリームは、マイナーリリースの公開後 24 カ月間利用できます。

  • Red Hat Developer Toolset (DTS)
    Red Hat Developer Toolset (DTS) は、コンパイラー、デバッガー、および一部のオープンソース開発ツールの最新の安定バージョンを提供するオファリングです。このオプションによるオファリングには独立したライフサイクルがあり、このアプリケーションの互換性ガイドの対象ではありません。

  • Red Hat Software Collections (RHSCL)
    Red Hat Software Collections は、Red Hat Enterprise Linux で使用する最も人気の高い複数の Web 開発言語とオープンソースデータベースの最新の安定したバージョンを提供します。このオプションによるオファリングには独立したライフサイクルがあり、このアプリケーションの互換性ガイドの対象ではありません。

  • RHEL Extras
    Extras チャンネルのコンテンツには、バイナリー互換性を約束する Red Hat のポリシーは適用されません。このバイナリー互換性ポリシーの詳細は、https://access.redhat.com/site/solutions/5154 を参照してください。

  • SystemTap 静的プローブ
    SystemTap 静的プローブは、SystemTap プロファイリングと、フレームワークの追跡に含まれます。プローブは、主要のシステムライブラリーに統合されており、アプリケーションとライブラリーのプロファイリングおよびデバッグをサポートします。現時点では、統合された SystemTap 静的プローブが同じプローブ名、プローブ位置、もしくは引数の解釈または数を持ち続けるという保証はありません。

互換性の範囲

Red Hat Enterprise Linux にあるパッケージは、以下の 4 つの互換性レベルのいずれかに分類されます。

  • 互換性レベル 1: ABI は 3 つの主要リリースにわたって安定しています。3 つとは、新規または改訂された ABI を導入するリリースと、その後に続く 2 つのメジャーリリースを指します (n, n+1, n+2)。このガイドでは、リリース n は Red Hat Enterprise Linux 7 を指します。
    ライフサイクル期間中のライブラリーへの変更により、既存のコンパイルコードへの互換性がなくなると、アプリケーションを修正せずに実行するため、古い ABI と一緒に、別のバージョンのライブラリーが提供されます。
  • 互換性レベル 2: API および ABI は、同じメジャーリリースで安定しています。このガイドでは、メジャーリリースとは Red Hat Enterprise Linux 7 を指します。
  • 互換性レベル 3: 将来使用するために保留します。
  • 互換性レベル4: 互換性は提供されません。これには、リストされたパッケージが提供するすべてのライブラリーが含まれます。

特定の Red Hat Enterprise Linux ソフトウェアパッケージの互換性レベルについては、付録 A を参照してください。

ベアメタル設定の互換性レベルは、ハードウェアと直接対話する機能を除き、仮想化構成に適用されます。ハードウェアに直接関連する機能には、API または ABI の互換性レベルがありません。たとえば、グラフィックスプロセッシングユニット (GPU) 機能に依存するアプリケーションは、バイナリー互換性を期待できません。

未特定の実装に特有のセマンティクスへの依存や、特定の API 実装におけるバグへの依存を防ぐために、Red Hat では、依存する動作が API の公式ドキュメントで明示的に定義されていることをアプリケーション開発者が確認するよう強く推奨します。たとえば、GNU C ライブラリーの新しいリリースは、アプリケーションがドキュメント化されていない API を使用するか、動作が未定義の API を使用する場合、古いリリースとは互換性がない場合があります。

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

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

ライブラリーの公開されたインターフェースを使用してアプリケーションを構築します。

  1. 非公開 (内部) のインターフェースはいつでも変更される可能性があり、不適切にリンクされている場合は依存するアプリケーションが不安定になる可能性があります。アプリケーション開発者は、未特定の実装に特有のセマンティクスへの依存や、特定の API 実装でのバグへの依存を防ぐために、公開されている API ドキュメントに、依存する動作が記載されていることを確認する必要があります。たとえば、GNU C ライブラリーの新しいリリースは、以前の動作が公開された仕様と一致しなかった場合に、古いリリースとの互換性が保証されていません。
  2. ライブラリーの静的リンクを回避します (C/C++)。静的リンクにより、実行可能ファイルには、ライブラリーの独自のバージョンが含まれます。これにより、このライブラリーの依存関係が途中で変更した可能性があるとして、アプリケーションが、オペレーティングシステムのそれ以降のバージョンで予期した通りに動作しない可能性が高くなります。この問題を回避するためには、アプリケーションを動的リンクすることが強く推奨されます。
  3. 互換性レベル 1 でコアライブラリーへのアプリケーションのリンクを制限します。コアライブラリー (付録 A を参照) は、3 つの連続するメジャーリリースに渡ってバイナリー互換性を維持することを目的としています。
  4. バンドルされたライブラリー自体がコアライブラリーによって提供されるインターフェースのみを使用する場合、必要な互換性レベルにないライブラリーで構築されたアプリケーションに互換性ライブラリーを提供します。
  5. RPM メカニズムを使用するパッケージのアプリケーション。RPM は、アプリケーションの依存関係の詳細な仕様を含むソフトウェアパッケージングメカニズムを提供します。RPM の作成時、以下の点に注意してください。
    (a) 可能な限り RPM トリガーを使用しないでください。
    (b) 適切な RPM 構文を使用して、必要なすべてのランタイムを明示的に示し、依存関係を構築します。
    (c) Red Hat が提供する RPM パッケージにより管理されるファイルの修正、置換、再コンパイルは実行しないでください。実行すると、予期しない動作につながるおそれがあります。
    (d) 依存関係を考慮する際、すべての Red Hat Enterprise Linux システムに、可能なパッケージがすべてインストールされていることを前提としないでください。デフォルトでインストールされているパッケージが、メジャーリリース間、同じバージョンの製品バリアント間、カスタマーのシステムで異なる可能性があります。たとえば、Workstation 製品には、Server 製品とは異なるパッケージセットがインストールされます。まれに事情により、マイナーリリース間でパッケージが削除される場合がありますが、その場合は Red Hat から通知が送られます。
  6. プログラムをインストールする際は、ファイルシステム階層標準 (FHS) バージョン 2.3 に従ってください。サードパーティーソフトウェアは、「/opt」サブディレクトリーにインストールする必要があります。FHS の詳細は、
    http://www.pathname.com/fhs/ を参照してください。
  7. アプリケーションは、ハードウェア上の互換性レイヤーではなく、ネイティブハードウェア環境に対応するライブラリーに対して構築する必要があります。これは、ネイティブユーザースペースと比較して、互換性ユーザースペースにシステムライブラリーのサブセットが含まれているためです。
  8. システムパッケージが使用する設定ファイルに依存するアプリケーションを設計しないでください。アップストリームコミュニティーが、それを保存するように明示的にコミットしない限り、このファイルはメジャーリリース間で変更する場合があります。
  9. 現時点の互換性レベルがご希望のレベルよりも低いパッケージで機能を必要とする場合は、Red Hat にお問い合わせください。

注記: メジャーリリースのライフサイクルの期間中、Red Hat は商業的に合理的な範囲で、すべてのマイナーリリースと Errata Advisory で、コアランタイム環境のバイナリー互換性の維持に努めています。ただし、必要に応じて、重大影響を及ぼすセキュリティー問題や、その他の重要な問題に対処するために、この互換性維持の目標に Red Hat が例外を設けることがあります。また、上記および付録 A で説明されているように、Red Hat Enterprise Linux のメジャーリリースには、アプリケーションの移行を容易にするために、以前のメジャーリリースに含まれる後方互換性ライブラリーの限定セットが含まれます。Red Hat は通常、変更内容を最小限に抑え、バイナリー互換性を維持するように変更を実施します。ただし、特定の状況で管理対象パッケージのベースバージョンが変更した場合は、例外が適用されることがあります。

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

互換性レベル 1: API および ABI は、(RHEL 7 以降の) 3 つのメジャーリリースで安定しています。

- - - -
alsa-lib krb5-libs libtbbmalloc.so mesa-libGL
elfutils-libelf libgcc libtbb.so mesa-libGLU
glibc libgfortran libusb motif
glibc-utils libgomp libvirt-client pam
gtk2 libstdc++ libxml2 SDL
hesiod libtbbmalloc_proxy.so libxslt

互換性レベル 2: API および ABI は、同じメジャーリリースで安定しています。(RHEL 7)

- - - -
atk kdenetwork libXt
audit-libs kdepim libXtst
audit-libs-python kdepimlibs libX11
boost-date-time kdepim-libs mariadb-libs
boost-filesystem kdepimlibs-akonadi ncurses-libs
boost-graph kdesdk net-snmp-libs
boost-iostreams kdesdk-devel net-snmp-perl
boost-math kdesdk-kmtrace-libs net-snmp-python
boost-program-options kdesdk-kompare nss
boost-python kde-workspace nss-sysinit
boost-regex kde-workspace-libs numactl
boost-serialization libacl pango
boost-signals libaio papi [4]
boost-system libatomic pcre
boost-test libattr perl
boost-thread libblkid perl-Digest-SHA
boost-wave libcanberra perl-libs
bzip2-libs libcanberra-gtk2 perl-Time-Piece
cairo libcanberra-gtk3 phonon-backend-gstream
c-ares libcap-ng polkit
clutter libcurl popt
corosynclib libdb postgresql-libs
cups-libs libdb-cxx pulseaudio-libs
cyrus-sasl-gssapi libgudev1 pulseaudio-libs-glib2
cyrus-sasl-lib libhugetlbfs PyQt4
cyrus-sasl-md5 libICE python
dbus-glib libjpeg-turbo python-libs
dbus-libs libnotify p11-kit
ding-libs (srpm) libpfm [2] qt
elfutils-libs libpng qt-mysql
expat librsvg2 qt-odbc
fuse-libs libSM qt-postgresql
GConf2 libsmbclient qt-x11
gdk-pixbuf2 libtalloc qt3
glib2 libtdb qt3-MySQL
gmp libtevent qt3-ODBC
gnome-keyring libtiff qt3-PostgreSQL
gnome-keyring-pam libusb readline
gnutls libuuid realmd
gstreamer-plugins-base libverto ruby
gstreamer1 libwbclient scl-utils
gtk3 libXau sqlite
httpd libXaw startup-notification
java-1.7.0-openjdk [3] libXext systemd-libs
kde-baseapps libXft systemtap [4]
kde-baseapps-libs libXi tcl
kdegraphics libXinerama tcp_wrappers-libs
kdegraphics-libs libXmu tk
kdelibs libXpm unique
kdemultimedia libXrandr xz-libs
kdemultimedia-libs libXrender zlib
openssl

注記:
[2]: 同じハードウェアのみで非回帰。Red Hat は、将来のハードウェアサポートを保証しません。
[3]: Red Hat は、Java SE 7 仕様ガイドラインに基づいて OpenJDK との互換性を維持します。Red Hat は、
RHEL のメジャーバージョン間における各システム/デフォルト Java ランタイム間の互換性に関して、
Java SE 仕様に従います。ほとんどの場合、RHEL のメジャーバージョン間の互換性は、
OpenJDK の同じバージョンを使用して維持できます。お客様の選好または Java のライフサイクルの制限のため、これがオプションで利用できない場合は、
Java SE 仕様をガイドラインとして使用して、
アプリケーションを RHEL のメジャーバージョン間で変更せずに実行できるかどうかを決定します。
[4]: ソースレベルのスクリプトの互換性

互換性レベル 3: 将来使用するために保留します。

(このセクションは意図的に空白にしています)

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

- - - -
adcli iowatcher mariadb-server postgresql-test
binutils (ライブラリーのみ) junit mesa-dri-driver pulseaudio-libs
dyninst libasan openldap pulseaudio-modu
e2fsprogs-libs libcgroup openslp-server pulseaudio-modu
glade3-libglade libcom_err postgresql-cont pulseaudio-modu
gnome-desktop libdrm postgresql-docs pulseaudio-util
gstreamer libitm postgresql-plpe samba-libs
gstreamer-devel libldb postgresql-plpy tkinter
gstreamer-plugi libss postgresql-pltc valgrind
gvfs libtsan postgresql-serv xfsprogs
nettle

{#Attachments}

Attachments