ポータビリティを高くする

アプリケーションをポータブルにする方法は、特定のディストリビューション上で完成した既存アプリケーションのポータビリティをチェックすることから開始することもできれば、そのアプリケーションをLSBビルトツールにて完成させることを目指した開発を行うこともできます。

新しいアプリケーションの作成」のセクションでは、LSBビルトツールを使い、LSB準拠アプリケーションの開発を進めるためのツールと情報を提供します。

既存アプリケーションの修正」のセクションは、既に完成しているアプリケーションをお持ちのベンダーのために用意されています。

LSBツール-実際に使ってみよう-」のセクションは、一連のLSBツールを使ったアップリケーションのチェック、テストの一例を示します。

新しいアプリケーションの作成

適切なツールを使って作成・テストすれば、新しいアプリケーションをLSB認証可能にすることは、それほど難しいことではありません。

LSB Software Development Kit (SDK)は、バイナリとRPMパッケージのLSB準拠性を開発者自身で検証する手段を提供します。ビルド進行中は、アプリケーションによるAPIの使用状況をモニターして、検証の確実性を保証します。

「LSB準拠のアプリケーション作成」の項では、LSB準拠のアプリケーション作成に必要なツールの入手方法およびインストールおよび実行方法の概略を述べ、実際に開発に着手できるようガイドします。

「LSBサンプル実装(LSB SI)」は、LSBに準拠した最小限の実行環境で、アプリケーションのテストに使用します。ディストリビューション固有の動作の影響を受けないように、LSB準拠を目指すアプリケーションは必ずLSB SIでテストする必要があります。LSB認証プログラムでも、このLSB SIの使用が義務づけられています。

LSB準拠のアプリケーション作成

LSB準拠の新しいアプリケーションを作ることを決定したら、次にどうするか?LSBに向けての開発は、多少のセットアップ作業を伴います。具体的には以下の通りです。

  • LSB Software Development Kit (SDK)のダウンロード
  • LSB SDKのインストール
  • Linux Application Checkerのダウンロードとインストール
  • LSB SIのダウンロードとインストール

開発がスタートしてからは、アプリケーションをLSBに準拠させるための良い戦略があります。それにはLinux Application Checkerツールを利用しますが、詳しくは後程このページで説明します。

LSB SDKのダウンロード

LSB SDKは、LSB認証にふさわしいアプリケーションを作成するための開発環境を提供します。このキットはtarball形式で、インストールスクリプトも入っています。LDNのWebサイトのダウンロードページからダウンロードできますので、該当するアーキテクチャーに見合ったものをダウンロードして保存してください。

LSB SDKのインストール

自分のアーキテクチャーに見合ったLSB SDKパッケージ(tar.gz)のダウンロードが完了したら、下記の手順でインストールしてください。

1. パッケージを解凍します。

tar xzf lsb-sdk-..tar.gz

例:tar xzf lsb-sdk-3.2.0-4.ia64.tar.gz

2. tarball解凍時に作成されたサブディレクトリ(lsb-sdk)に移動します。

3. インストールスクリプト(./install.sh)を実行します。

注:root権限が必要です。

インストール終了後、PATH環境変数に/opt/lsb/binを追加しておくことを推奨します。アプリケーションをコンパイルしてリンクする際、lsbccを入力するだけで済みます。

もうひとつ変更できる変数はMANPATHです。この変数をアップデートしておくことにより、LSBに関連したmanページにアクセスできます。MANPATHに/opt/lsb/manを追加しておいてください。

ia64 LSB SDKをインストールした場合に得られる実際の出力は次の通りです。

cal@bilbo:~/lsb-sdk> ./install.sh

This system appears to be a RPM-based distribution, such as those from Red Hat, SuSE/Novell, Mandriva, Asianux, etc.

Is this correct? yes

In order to install these packages, you need administrator privileges. You are currently running this script as an unprivileged user.

You have sudo available. Should I use it? yes

Using the command "sudo /bin/sh -c" to gain root access. Please type the appropriate password if prompted.

Installing packages...

root's password:

There may have been problems with the package installation. Check error-log.txt for more information

cal@bilbo:~/lsb-sdk>more error-log.txt

warning: lsb-build-base-3.2.1-1.ia64.rpm: Header V3 DSA signature:

NOKEY, key ID a0530ad1

cal@bilbo:~/lsb-sdk>

Linux Application Checkerのダウンロードとインストール

Linux Application Checkerをダウンロード/インストールする方法は、「Linux Application Checker使用方法」のページを参照してください。

LSBサンプル実装(LSB SI)のダウンロードとインストール

LSBサンプル実装(LSB SI)の詳細は、「LSBサンプル実装(LSB SI)」のページを参照してください。

LSB準拠に向けての戦略

LSBビルドツールおよびテストツールが揃ったら、実際のアプリケーション開発を進めます。ビルドプロセスが終了したら、Linux Application Checkerでテストします。このツールを用いれば、LSB準拠に向かう道程の、どの辺の位置に今アプリケーションがあるかを知ることができます。テストレポートのLSB Certificationページを開けると、アプリケーションが使用しているライブラリとインターフェースの、どれがLSB準拠を阻んでいるかまで特定することができます。そして、それらが確認できたら、次に取るべき方法は4つあります。なお、これらの方法は、特定のディストリビューションに対してのポータビリティを実現するもので、LSB認証を可能とするものではないことにご注意ください。

LSB準拠阻害要因の排除方法

● 代替インターフェースを使用する。

(例:memalign()の代わりにposix_memalign()を使用)

● 代替ライブラリを使用する。

(例:openssl の代わりにlibnssを使用)

注:これは、LSB準拠を目的とする場合、および、ディストリビューション間共通のポータビリティを実現する場合のいずれにもふさわしい方法です。opensslは、いろいろなディストリビューションが異なったバージョンに対応したABI群を提供しているからです。

● ライブラリをスタティックにリンクする。

警告:一部のライセンスソフトウェア、例えばGPL等は、スタティックにリンクされたライブラリをメインアプリケーション本体の一部とみなし、メインアプリケーションにまでライセンス条件を拡大適用する場合があるので注意が必要です。

● ISVが提供する共有ライブラリにダイナミックにリンクする。

それぞれの方法はそれぞれのベストプラクティスが含まれていますが、これらは近い将来、LDNにおいてさらに拡張していきます。

LSBサンプル実装 (LSB SI)

LSB SIは、汎用ディストリビューションではありません。これは、LSB仕様に準拠したアプリケーション構築の可能性を実証するテスト環境なのです。

殆どのLinuxディストリビューションは多数のパッケージで構成され、そのどれをインストールするか、または後で追加・削除・アップグレードするかはユーザーに任されています。これは至極普通のことですが、ポータブルアプリケーションを作成する場合には少々問題が起こります。アプリケーションをインストールする予定のシステム上に存在することを許されていない何かをアプリケーションがリンクしてしまっていないことの確証が得にくいからです。

アプリケーション開発にLSBを利用すれば、この問題の発生を効果的に抑えることができます。LSB認証されたディストリビューションは全て、一定のライブラリとインターフェースで構成され、LSBに文書化されている通りに動作するからです。

LSB SIは、LSBディストリビューションの中核となるこれらのライブラリとインターフェースの必要最小部分だけを実装したもので、プログラムの出荷前テストに使用されます。

例えば、自動検出ビルドスクリプトを有するソフトウェア(GNU configure等)では、システムにインストールされているもの全てが、それがLSBの一部であるかどうかとは無関係に、ビルドで利用する可能性があります。そこで、得られたバイナリをLSB SIで実行すれば、LSB不適合のフィーチャーが紛れ込んでいるケースを検出できることになります。

AppCheckerはスタティックツールなので、他のプログラムを呼ぶ場合のような、実行時の問題を見つけることはできません。一方、LSB SIでは、LSBに適合した環境でアプリケーションを動作させることが可能になります。

LSB SIは、LSBに準拠したシステム構築が可能であることの「概念証明(proof-of-concept)」と考えることもできます。その基本方針は、パッケージメンテナーによって公開されているパッケージと最小限のパッチだけを使用することにあります。これら一部のパッチは、LSB SI環境でビルドを行う時に(大抵の場合は、ビルドに必要なの機能を補うために)必要となります。バグを修正したり、LSB適合性を満たすために用意されているパッチもありますが、これらは本来、上流メンテナーが次のリリースに盛り込むべき性質のものです。

LSB SIは、LSB仕様の進化に合わせて変化し続けます。新しいフィーチャーは、それらが仕様として確定された時点で、LSB SIのテストバージョンに組み込まれます。新しい仕様が承認されるのとほぼ同時に、その仕様に沿ったLSB SIのバージョンが発表になるということは、いずれかのディストリビューションのフルサポートを決める前に、新しいフィーチャーをプレビューする機会を開発者に与えるということでもあります。

LSB SIは、スタンドアロンのLinuxディストリビューションとして設計されてはいません。あくまでサンプルであり、単なるテスト環境です。通常のディストリビューターから得られる付加価値 - 性能やセキュリティに関する問題の追跡と解決等 - は、LSBプロジェクトでは提供していません。

インストール

LSBサンプル実装(LSB SI)ツールは、ふたつのパッケージで構成されています。

lsbsi-chroot:SI chroot用コアファイルシステムを提供

lsbsi-tools:SI chroot設定・実行用のツールを提供

これらのパッケージは、rpm、deb、tarballのいずれかのフォーマットで入手可能で、互いに独立してインストールできます。実際のところ、それぞれを異なったマシンにインストールし、一緒に動作させることもできます。

rpm/deb形式でのインストール

ダウンロードしたパッケージファイルのタイプにより、rpm、dpkgその他のパッケージマネージャーを使用する必要があります。例えば:

rpm -i lsbsi-chroot-3.2.0-3.i586.rpm lsbsi-tools-3.2.0-3.i586.rpm

デフォルトでは、lsbsi-chrootは/opt/lsb/si/chrootに、lsbsi-toolsは/opt/lsb/si/toolsにインストールされます。lsbsi-chrootインストール後に、lsbsiグループがシステムに追加されます。

lsbsiグループに自分のユーザー名を追加するのを忘れないでください。LSB SIツールは、lsbsiグループのユーザーまたはrootユーザーしか使用できません。また、lsbsiグループの全てのユーザーが、chrootやmountを実行できるようにするために/etc/sudoersが修正されます。

xdg-utilsがシステムにインストールされている場合は、lsbsi-toolsパッケージをインストール後に、LSB SIを実行するためのメニューがデスクトップに表示されます。 その他の場合は、/opt/lsb/si/tools/si を使用して実行してください。

tarball形式でのインストール

1. lsbsi-chroot-3.2.0-3.i586.tar.gzファイルの展開:

sudo tar xzfv lsbsi-chroot-3.2.0-3.i586.tar.gz

2. lsbsi-chroot-3.2.0フォルダに移動してコマンドを実行:

sudo ./install.sh

このスクリプトで、lsbsiグループが追加され、/etc/sudoersファイルが修正されます。

3. lsbsi-tools-3.2.0-3.i586.tar.gzを展開:

tar xzfv lsbsi-tools-3.2.0-3.i586.tar.gz

4. lsbsi-tools-3.2.0フォルダに移動してコマンドを実行:

sudo ./install.sh

インストール中に、chrootへのパス(lsbsi-chrootが展開されているフォルダへのパス)を指定してください。

LSB SIツールの実行

LSB SIツールは、デスクトップメニューから選択、または[lsbsi-tools-path]/si-GUIを実行して動作させます。[lsbsi-tools-path]は、rpmまたはdebを利用した場合は/opt/lsb/si/toolsで、tarball形式でインストールした場合はlsbsi-toolsが展開されているフォルダへのパスとなります。これにより、設定調整・chroot環境起動用のGUIインターフェースが立ち上がります。chroot環境を起動するには、[lsbsi-tools-path]/siスクリプトを使用する方法もあり、これは、Qt4ライブラリが搭載されていないシステムの場合に便利に利用できます。

設定オプション

chroot環境起動時のオプション設定にはグラフィカルインターフェースを利用します。これらオプションの殆どは、chroot環境へリモートアクセスするためのssh接続のためだけに使用されます。

設定可能なオプションは以下の通りです。

  • Path:ローカルまたはリモートシステム上のchroot環境へのパス
  • Host:lsbsi-chrootのあるサーバのホスト名
  • Port:サーバ上のsshデーモンへのポート番号
  • User:ssh接続されるユーザー名
  • PreferredAuthentications:認証モード(publickey、keyboard-interactive、password、またはhostable)
  • X11forwading:X11転送オプション(normalまたはtrusted)

chroot環境を立ち上げるためのオプション調整を行う一番簡単な方法はグラフィカルインターフェースを利用することですが、si_run.confファイルに全てのオプションを指定するという方法もあります。siスクリプトをご使用の場合は、siスクリプトの中に引数を指定することもできます。(詳しくは、./si--helpを参照のこと。)

オプションの設定が全て終了したら、Run SIボタンをクリックしてください。SI chroot環境でシェルが動作しているターミナルウインドウ(gnome端末またはkonsole)が開きます。

LSB SIトラブルシューティング

現行バージョンのLSB SIはSE Linuxをサポートしていません。LSB SIを立ち上げる前にSE Linuxを無効にすることを推奨しています。

LSB SIをデスクトップメニューから起動できない場合は、ターミナル([lsbsi-tools-path]/si)から起動して、何が問題なのか、エラーメッセージで確認してください。

LSB SIをデスクトップメニューから起動することが、不正なchroot環境の原因になることがあります。この問題はFedora Core 9の場合に特に起こりやすく、理由は、/etc/sudoersがDefaults requirettyの文字列を含んでおり、それが、ターミナル以外からのsudoコマンド実行の邪魔をしているからです。この状況は、下記に述べるような対策を取ることで回避できます。

  • /etc/sudoers内のDefaults requirettyの行をコメントアウトする。
  • 該当するメニュー項目に関し、Launcher Properties内のアプリケーションのタイプを変更する。タイプをApplication in Terminalに変更する。(Gnomeの場合)
  • ターミナル経由でLSB SIを起動する。rpmやdeb形式でインストールした場合は /opt/lsb/si/tools/siを使用。またはlsbsi-tools.tar.gzファイルを展開したフォルダの./siを実行。

LSB SIのアンインストール

rpmまたはdebの場合は、rpm –eまたはdpkg –rコマンドを使用します。tarball版をアンインストールする場合は、該当するフォルダに移動し、sudo ./uninstall.sh を実行します。

既存アプリケーションの修正

既に開発されたLinuxアプリケーションを持っている開発者やISVは、先ず何をすれば良いのか?他のLinuxディストリビューションに移植するか、それとも、いろいろなディストリビューション間共通で使用できるようにするか?LSB認証を取得するか、それとも見合わせるか?

ここでは、このような選択のいかんに拘わらず、アプリケーションの移植効率を大幅に向上させるための方法とツールをご紹介します。 「複数ディストリビューションへの移植」の項では、複数のディストリビューションへの移植作業を正しく行うためのガイドラインを提供します。

複数ディストリビューションへの移植

複数ディストリビューションへのアプリケーションの移植は、多大なエンジニアリングコストとサポートコストというイメージにつながりやすく、このためにLinuxプラットフォームの真の価値が損なわれるのは残念なことです。LDNは、ディストリビューション間共通のポータビリティ向上の技術やLSB認証を確実にするための技術に重点を置きながら、開発コストと工数の大幅削減を可能にするスキルとツールを提供して行くことを第一目標としています。

ポータビリティを向上させる最も良い方法は、LSB Application Checkerを利用してテストしてみることです。このツールを用いれば、LSB準拠まで、あとどれくらいで到達できるかを知ることができます。テストレポートのLSB認証ページを開けると、アプリケーションが使用しているライブラリとインターフェースの中で、どれがLSB準拠を阻んでいるかまで特定することができます。そして、それらが確認できたら、LSB準拠を実現するために推奨できる方法は4つあります。例えLSB準拠が目的ではない場合でも、LSBに向かって歩むことは、アプリケーションのポータビリティを格段に高める結果につながります。

LSB準拠阻害要因の排除方法

● 代替インターフェースを使用する。

(例:memalign()の代わりにposix_memalign()を使用)

● 代替ライブラリを使用する。

(例:openssl の代わりにlibnssを使用)

注:これは、ディストリビューション間共通のポータビリティ実現を、はっきりと目標に定めている場合に最適な方法です。opensslは、いろいろなディストリビューションが異なったバージョンに対応したABI群を提供しているからです。

● ライブラリをスタティックにリンクする。

警告:一部のライセンスソフトウェア、例えばGPL等は、スタティックにリンクされたライブラリをメインアプリケーション本体の一部とみなし、メインアプリケーションにまでライセンス条件を拡大適用する場合があるので注意が必要です。

● ISVが提供する共有ライブラリにダイナミックにリンクする。

これらの他にも、アプリケーション移植時に考慮すべき戦略もあります。

● エンディアンネスの検討(bigendianまたはlittleendian) アーキテクチャーレベルで考慮すべき問題です。

● 32ビット/64ビット対応性

どちらか一方にだけ依存しないでください。

● ハードコードされたアドレスの排除

● オブジェクトサイズを取得する場合のsizeofの使用 32ビットから64ビットに変換する場合は特に重要です。

● charが符号付き(または符号無し)と仮定しない。

● 浮動小数がdoubleと同じサイズと仮定しない。

● #ifdefを使用する場合は注意する。

● 関数プロトタイプを必ず作成し、コンパイル時には-Wstrict-prototypesオプションを用いて、その使用をコンパイラに厳密にチェックさせる。

● POSIXインターフェースとデータ型を使用する。

● CおよびC++ライブラリに含まれる標準関数のみを使用する。

● ディストリビューション固有のライブラリの使用や、ライブラリの拡張はしない。

● アプリケーションのビルドにはLSB SDKが提供するLSBツールを使用する。

● ファイルシステムの階層構造はFHSに準拠させる。

LSBツール-実際に使ってみよう-

Linuxはオープンなオペレーティングシステムなので、目的に合わせた設定と構築が可能です。しかしながら、種類が豊富で選択の余地が広いということがユーザーにとって有利である反面、このような異種混交状態にソフト開発者がてこずっているというのも事実です。基本は似ていても、それぞれ微妙に違うプラットフォームに向けてパッケージを設計しなくてはならない面倒があるからです。ただし、アプリケーションがLinux Standard Base (LSB)に準拠しており、各Linuxディストリビューションも同様であれば、アプリケーションは各準拠ディストリビューション上で実行可能になります。この項では、LSBの良さを理解した上で、この標準に適合する形で実際にコードを移植する方法を学習して行きましょう。

本チュートリアルは、Linuxソフト開発者を読者に想定して書かれています。LSBとは、Linuxソフトウェアディストリビューション間の互換性を向上させるための仕様、および、その目的のために開発されたツールとテスト用パッケージソフトで構成されています。LSB仕様に準拠し、ユーザーに互換性を保証していると認められたアプリケーションやディストリビューションはLSB認証を取得することができます。以下にLSBの概略と、アプリケーションコードのLSB準拠性を検証する方法を解説します。

前提条件

本チュートリアルを利用するには、CまたはC++プログラミング言語、標準的なLinuxソフトウェア開発環境、およびそこで使用されるコンパイラ、リンカ、システムライブラリ、各種設定、ビルドユーティリティ、パッケージ化ソフト等の一連のツールに関して、知識と経験を持っていることが必要です。

さらに、コマンドラインを使用してのソフトウェアのインストール、また、ファイルシステムの構築、ネットワークサービスの停止、システムサービスの追加等を始めとするLinuxシステムの保守・管理に関しても、ある程度の経験が必要です。

Debian Linuxを利用している場合は、APTパッケージマネージャーに関する経験も必要となります。

本チュートリアルを開始するに当たっては、ソフトウェアパッケージをいくつかLinuxにインストールしなくてはなりません。インストールが必要なものは以下の通りです。

Linuxディストリビューション用KVMパッケージ

注:KVMパッケージの代わりに、VMWare WorkstationをMicrosoft® Windows® XPにインストールして、バーチャル化したLinuxのインスタンスをXPプラットフォームで動作させることもできます。VMWare Workstationのお試し版は無料でダウンロードできますので、それを使ってバーチャルマシン(VM)を作成し、セーブすれば、VMWare Player(無料)に切り替えて再実行が可能です。

LSBサンプル実装(LSB SI)

LSBビルド環境

LSBアプリケーションテストパッケージ

対象ハードウェアプラットフォームのLSB仕様(バージョン3.2.0)も同時にダウンロードして、目を通しておくことをお薦めします。代表的な7個のプロセッサ(IA32、IA64、 PPC32、PPC64、S390、S390XおよびAMD64)に対応したハードウェア別LSB仕様書が用意されています。

アプリケーションの認証を受ける場合は、Linux FoundationのLSB認証プログラムのページを訪れてください。

本チュートリアルに記載されているサンプルプログラムを実行するには、オペレーティングシステムにLinuxまたはWindows XPを採用しているコンピュータが必要です。VMare Workstationは、これらいずれのプラットフォーム上でも動作し、以降の作業に必要なLinux環境を提供します。

アプリケーションが、自分のプロセッサに対応したLSB仕様書で承認されていないソフトウェアライブラリに依存している場合、それらのライブラリもバーチャルシステムにインストールする必要があります。混乱を防ぐため、アプリケーション固有のライブラリは標準ライブラリと分離してインストールするのが理想的です。

標準化の必要性

DistroWatchのWebサイトの記載によると、現在少なくとも25のLinuxディストリビューションが存在しています。これだけでも驚異的な数字ですが、サイズを最適化したもの(例:Damn Small Linux)、使い勝手を改良したもの(例:Knoppix)、コミュニティユーザー主体で開発したもの(例:Fedora Core)、特定の国用にカスタマイズされたもの(例:Red Flag Linux)等を加えると、この数字は一足飛びに2倍にも3倍にも増加します。これだけ多くのバリエーションがある近代的なオペレーティングシステムは、Linux以外には見当たりません。

Linuxの「ご自分でどうぞ」的文化は、多様化と専門化を助長します。他方、このような拡散の仕方は、Linuxアプリケーションを開発・販売・サポートしているISVにとって、対抗しがたい状況を創出しています。1980年代の「UNIX® 戦争」がISVの成功のチャンスを打ち砕いたとするなら、これだけ多くのLinuxバージョンの存在も、Linuxアプリケーションの量産市場を閉塞させるだけとしか言いようがありません。複雑なアプリケーションを、多数のLinuxバリエーションのために開発・サポートするために費やさなければならないコストを想像してみてください。

相互運用性向上のために

Linux Standard Base (LSB)は、多様化の促進と一貫性の維持を目指して、Free Standards Group(Linux Foundationの前身)によって策定されました。LSBのWebサイトでは、「Linuxディストリビューション間の互換性を高め、全てのLSB準拠システム上でソフトウェアアプリケーションの実行を可能にするための標準制定と推進を目的とするオープンソースプロジェクト」と定義されています。

LSBでは一貫性のあるLinux プラットフォームを規定しており、このプラットフォームを(少なくとも)実装しているLinuxディストリビューションは、LSB準拠と認められます。(このことは、付加的な特徴を組み込むことを否定するものではありません。)LSBプラットフォームが提供するサービスだけを使用するLinuxアプリケーションも、同様にLSBに準拠しているとみなされます。アプリケーションが追加で必要とするライブラリは、インストールまたはスタティックリンクのいずれかの方法で利用可能にします。(これらのライブラリも、自給自足的でLSBに準拠している必要があります。)

LSBが標準を定めている(または、いずれ定めようとしている)分野を図3.に示します。具体的には、全てのLinuxアプリケーションの基礎となるライブラリ、重要ファイルの格納先指定や現地語化への対応方法を含む実行環境、システムの初期化、LSB準拠システムで使用する共通コマンドやユーティリティ、および、ユーザー/グループ管理が含まれます。

図3:LSBのコンポーネント

アプリケーション開発者にとって最大の関心事は、ブルーとオレンジでマークした部分かと思われます。

青色で示した部分には、LSB準拠のアプリケーションが使用できるコアライブラリと追加モジュールを規定しています。コアライブラリには、libc、libm、libpthread、libpam、libcrypt、libz、libncurses、librt、libgcc_sが含まれます。モジュールには、X Window System Version 11用グラフィックス(libX11、libXt、libXext、libSM、libICE、libGL)およびC++標準ライブラリ(libstdc++)があります。

オレンジの部分はLSB仕様の一部ではありませんが、アプリケーションやパッケージが、LSBに準拠しているかどうかを検証するための重要なツールを示しています。

バイナリ互換性

LSB標準はバイナリ互換です。LSB準拠のアプリケーションバイナリ(コンパイル後の実行コード)は、LSB準拠の任意のLinuxディストリビューション上で実行可能です。(ただし、アプリケーション、ディストリビューションともに、同一のプロセッサ用に開発されたものである必要があります。)

バイナリ互換性はソース互換性とは大きく異なります。ソース互換のアプリケーションの場合、ローカルシステムのコンパイラとライブラリを使用してのリコンパイルが必要で、問題は、これらふたつが予測不能な動作やばらつきの源であるという点です。ソース互換の場合、実行ファイルが動作すること(ましてや期待通りに動作すること)が保証されている訳ではありません。

整合性確保のメリット

LSBは、ディストリビューションとアプリケーション間に締結された「拘束力のある協定」と解釈することができます。ディストリビューションは、仕様に従ったライブラリとインターフェースを提供することを約束し、アプリケーションは、これらのライブラリとインターフェースだけを使用し、足りないものは自分で用意することに合意します。両者がこの協定を遵守することを保証する手段として、各種ツール類、ガイドライン、ディストリビューションおよびアプリケーションに対する検証・認証サービスがLSBから提供されています。

LSBに従うことは、ディストリビューションベンダー、ISV、ユーザーの三者全ての利益につながります。

ディストリビューションベンダー

LSBに準拠することにより、ユーザーの保有する製品上で、多くのアプリケーションが終始一貫、確実に動作することを保証できます。いったん認証を取得してしまえば、その後は差別化や新しいフィーチャーの開発に全力を傾注できます。

ISV

認証されたバイナリは、LSB準拠のディストリビューションに次々展開して行くことが可能です。認証取得後に必要なことは、そのバイナリを自分でテストしサポートして行くことだけです。もし、そのバイナリが国際的に認められれば、たったひとつのアプリケーションの単一バージョンだけで、世界中のユーザーを満足させることも可能になります。

ユーザー

競合するいくつもLSB準拠のディストリビューションの中から、自分に最も適したLinuxを選ぶこともできますし、ひとつのベンダーだけに偏ることも避けられます。 Linuxアプリケーションの選択の幅も広がります。

このようなダイナミックスは、ディストリビューションベンダー、ISV、ユーザーの全てが、それぞれのLinuxに対する投資から大きな恩恵を受けられることを意味します。もちろん、Linux自身も報われます。

LSB構築環境とサンプル実装

LSBは、ディストリビューションとアプリケーションが互いにLSB仕様に従うことを約束した「協定」です。しかし、LinuxディストリビューションをLSBに準拠させることがいかに複雑かを知らずして、アプリケーションを準拠させるのは至難の技かも知れません。

アプリケーションの開発者は、自分が使っているコードのことは当然熟知していますし、それをLSBに準拠させるために積極的に働いてもくれるでしょう。しかし、そのコードがLSBに準拠していないコンポーネントに依存しているかどうかまでは明確に解らない場合も多いのではないでしょうか?特に、Linuxディストリビューションの場合、その中には何千個というコンポーネントがゴロゴロしているのですから。

例えば、そのコードが、特定のディストリビューションだけが採用しているLSB未準拠のストリングライブラリに依存しているかも知れません。また、そのストリングライブラリが、つい最近、システムアドミニストレーターによってローカルに追加されたばかりという場合もあり得ます。別の例では、ライブラリのバージョンの問題があります。あるライブラリのバージョンWがLSB仕様に準拠しているからといって、バージョンYまでそうであるという保証はありません。

マイグレーション用ツール

このような依存性を検出・排除するために、つまり、コードをLSBに準拠させるための重要な手段として、LSBはふたつのツール - ビルド環境とサンプル実装(LSB SI) - を提供しています。

ビルド環境は、ソースコードがLSB未準拠のライブラリとアプリケーションバイナリインターフェースに依存していないかどうか検査するためのツールで、ヘッダファイル、スタブライブラリ、それとLSB準拠のLinuxシステム上でのソフトウェアビルド環境をシミュレーションするためのコンパイララッパで構成されています。このツールは、あらゆるLinuxシステム(LSBに準拠していないシステムも含む)にインストール可能です。

ビルド環境には2種類あります。ひとつは、開発者が現在使用中のローカルオペレーティングシステムで動作するユーティリティのセットで、LSB環境におけるビルドのシミュレーションに使用します。もうひとつは完全なファイル階層となっており、chroot環境の代わりに使用します。前者は、LSB準拠性を手軽に評価する際に便利です。後者では、現在のビルド環境を新しいrootに取り込む必要がありますが、迷子ファイルの問題は起こりません。

サンプル実装(LSB SI)は、LSB準拠の実行環境でアプリケーションが正しく動作することを検証する手段です。LSB準拠のディストリビューションを代用する、一種のミニLinuxと考えて頂くと良いでしょう。実際にサンプル実装からブートすることもできます。

もちろん、Linuxに準拠しているディストリビューションそのものを使って検証することも可能ですが、サンプル実装の使用を推奨する理由がいくつかあります。まず、LSBで定義されているものだけで構成されています。またLSB仕様のバージョンに合わせて、異なるバージョンのサンプル実装が入手可能です。例えば、アプリケーションがLSB3.0とLSB3.2に準拠していることを検証したい場合には、該当するバージョンのサンプル実装を同じテストシステムにインストールするだけで済みます。これは、Linuxシステムをふたつ用意するよりは余程簡単です。さらに、新たに承認されたLSB仕様に対する検証も、その仕様に準拠したシステムが導入されるまで待つ必要もなく、即座に実行に移せるというメリットもあります。

LSB標準の各バージョンに対応して、ビルド環境とサンプル実装はセットで提供されています。本チュートリアルは、LSB3.2.0に準拠したプラットフォームの使用を前提として書かれています。(このチュートリアルを作成した時点での最新バージョンです。現在普及しているLinuxのディストリビューションの多くは、旧バージョン(LSB3.1.0、LSB3.0.0)のLSBのインスタンスを用いて認証されている可能性が高いと思われます。)

バーチャルマシン(VM)を用いての移植のメリット

LSB3.2.0サンプル実装を利用するには、これをchroot環境で実行できるオペレーティングシステムが必要です。本チュートリアルでは、コミュニティ開発のLinuxディストリビューションのひとつ、Fedora 9 ( FC9)を、この目的に使用します。

FC9を持っていない場合、また、旧LSBの多数のインスタンス、もしくは複数のLinuxディストリビューション上でこのサンプル実装を実行したい場合はというと、最も簡単でコストのかからない方法は、それぞれのLinuxディストリビューションをVM上で走らせることです。(方法としては多少煩雑になりますが、マシンをマルチブートに変更したり、ハードウェアを増設したりすることでも対応できます。)

KVMは、Ubuntu Hardyを始めとする殆どのディストリビューションがサポートしているバーチャル化技術です。Intel-VTやAMD-V (AMD SVM エクステンションとも呼ばれる)をサポートしている比較的新しいx86系 CPU が搭載されたシステムで利用できます。KVMをサポートしている(または、していない)CPUのリストはXensourceのWebサイトに掲載されています。システムによっては、バーチャル化のエクステンションを有効にするために、BIOSコンフィギュレーションの変更が必要となります。BIOSコンフィギュレーションを変更した場合は、変更をフラッシュメモリに保存後、電源を入れ直す必要がもあります。

KVMをサポートしていないLinuxシステム、または、Windows XPなどのシステムをお使いの場合は、代わりにVMWareをインストールします。この場合、Thought PoliceのWebサイトにあるFedora Core 9イメージが必要となります。

VMWare Workstationのダウンロードとインストール

VMWare WorkstationをDebian Linux にインストールし、FC9をVMで実行します。これで、LSB3.2.0のビルド環境とサンプル実装が実行可能になります。

VMイメージのダウンロード

FC9 VMイメージはLinux FoundationのWebサイトからダウンロードできます。このイメージはオペレーティングシステム全体を含み、従って1400MBと、かなり大容量です。

KVMのインストール

Ubuntu Hardyをご使用の場合、KVMパッケージは簡単にインストールできます。ターミナルウインドウで下記コマンドを使用します。

sudo apt-get install kvm

グラフィカルインターフェースを利用する場合は、Synapticsパッケージマネージャーを使用します。

DebianまたはUbuntuディストリビューションでは、rootユーザー以外がKVMを利用する場合には、自分のユーザーIDを"kvm"グループに登録しなくてはなりません。テキストエディタで/etc/groupを編集してスーパーユーザーになるのがひとつの方法です。Ubuntuの場合は、メニュー選択という方法もあります。システムのメニューバーから、System->Administration->Users->Groupsと選び、Unlockボタンをクリック。次にパスワードを入力してManage GroupsをクリックするとGroup Settingsウインドウが開きますので、"kvm"を探し、Propertiesをクリックします。Group Membersリストが表示されたら、自分のユーザーIDにチェックマークをつけてOKボタンをクリックします。"kvm"グループに変更を加えた後は、必ず一度ログアウトして、再度ログインしてください。

KVM Workstationの実行

KVMバーチャルマシンを起動するには、ターミナルウインドウで下記コマンドを実行します。

kvm fedora-9-i386.qcow2

Ctrl+Alt を押さない限り、KVMアプリケーションはマウス/キーボードからの入力を全てトラップします。バーチャル環境に戻るには、KVMウインドウ上をクリックしてください。

おめでとうございます!以上でめでたくFC9がVM上で動作することになります。

セットアップ完了したら、LSBへのコード移植プロセスに進みます。

一般的な移植方法

LSBへのアプリケーション移植は次の手順で行います。

コードを新しいビルドシステムにコピーします。 新しいビルドシステムとは、別個のハードウェア(本チュートリアルではVM)上で動作している、LSB準拠のLinuxディストリビューションのことです。

コードをビルド後、Linux Application Checker (AppChecker)ツールを用いてバイナリをスキャンし、LSB仕様にないシンボルが含まれていないことを確認します。スタティックアーカイブもスキャンして、それらがLSB準拠のアプリケーションでの使用にふさわしいかどうかも確認します。

無効なシンボルが発見された場合は、コードまたはコードアセンブリをLSB仕様に適合するよう変更します。

例えば、LSB仕様に合致しないライブラリはスタティックリンクで接続して、コードがライブラリ内で自己完結するようにします。(ライブラリ内のコード自体はLSBに準拠していると仮定した場合。)全ての問題を解決したら、次のステップに進みます。

LSBビルド環境を使用して、クリーンかつ標準に準拠した環境でコードをビルドします。コードがLSB未対応のライブラリを使用している場合は、それらをインストールまたはスタティックリンクでつなぐ等の変更が必要になります。(全てのライブラリはLSBに準拠している必要があります。)

LSBビルド環境によるコードのビルドに成功したら、LSBサンプル実装(LSB SI)でコードを実行します。

対象のLinuxシステムがLSBに準拠している場合は、そのシステム上で実行することも可能です。

アプリケーションをパッケージ化します。 LSB準拠のRPM は、LSB準拠のシステムに必ずインストールできます。ただし、この方法だけに拘る必要はなく、LSBに準拠したシステム上で動作可能という条件の下で、他のパッケージ化技術も利用できます。例えば、tarballを付属したシェルスクリプト、(LSB準拠という条件で)お手持ちのインストーラなども利用可能です。

では、簡単なアプリケーションを実際に作ってみましょう。

LSBビルド環境ユーティリティのインストールと実行

chrootバージョンのLSBビルド環境を利用する前に、ビルド環境ユーティリティを試してみます。これらのユーティリティAppChecker(lsbappchk、lsbpkgchk)は、殆どのLinuxシステムに簡単かつ迅速にインストールでき、アプリケーションやRPMパッケージ(標準LSBフォーマット)がLSB準拠にならない原因の確認に役立ちます。

LSBビルド環境ユーティリティのダウンロードとインストール

ビルド環境ユーティリティはふたつのRPM(lsbappchk用とlsbpkgchk用)で構成されています。このテストシステムの例はDebian Linuxを使用しているので、まずdebフォーマットに変換し、Debianのdpkgパッケージマネージャーが使えるようにします。

1 $ sudo apt-get install wget

2 $ wget http://ftp.linuxfoundation.org/pub/lsb/test_suites/released-3.2.0/binary...

3 $ wget http://ftp.linuxfoundation.org/pub/lsb/test_suites/released-3.2.0/binary...

4 $ wget http://ftp.linuxfoundation.org/pub/lsb/lsbdev/released-3.2.0/binary/ia32...

5 $ wget http://ftp.linuxfoundation.org/pub/lsb/lsbdev/released-3.2.0/binary/ia32...

6 $ wget http://ftp.linux-foundation.org/pub/lsb/lsbdev/released-3.2.0/binary/ia3...

7 $ sudo apt-get install alien

8 $ alien *.rpm

9 $ ls -t -1

lsb-pkgchk_3.2.2-2_i386.deb

lsb-build-cc_3.2.1-1_i386.deb

lsb-build-c++_3.2.1-1_i386.deb

lsb-build-base_3.2.2-1_i386.deb

lsb-appchk_3.2.4-1_i386.deb

lsb-pkgchk-3.2.2-2.i486.rpm

lsb-appchk-3.2.4-1.i486.rpm

lsb-build-c++-3.2.1-1.i486.rpm

lsb-build-cc-3.2.1-1.i486.rpm

lsb-build-base-3.2.2-1.i486.rpm

10 $ sudo dpkg --install *.deb

11 $ ls /opt/lsb

bin doc man

12 $ ls /opt/lsb/bin

lsbappchk lsbc++ lsbcc lsbpkgchk

コマンド1はwgetのインストール(システムにまだ搭載されていない場合)、コマンド2-6はLSBユーティリティの最新版のダウンロードを行います。

lsb-appchkは、与えられたバイナリがLSBで定義され、かつダイナミックにリンクされたシンボルだけを使用しているかどうか検証します。 lsb-pkgchk は、LSB準拠のシステム上にソフトウェアをインストールするためのアプリケーションパッケージが有効かどうか検証します。lsb-pkgchkはRPMだけを対象としたツールです。ただし、LSBでは、ソフトウェアのインストールにRPMだけを使用するよう限定している訳ではありません。

lsb-build-base は、スタブライブラリとヘッダファイルを提供します。スタブライブラリは、LSBに定義された機能を実装してはいませんが、LSBシステム上に存在するダイナミックライブラリと同様に機能し、LSB準拠のアプリケーションのビルドを可能にします。 lsb-build-c++ は、ビルド環境にC++を追加します。

lsb-build-ccはlsbccを内蔵しています。lsbccは、LSB準拠のアプリケーションを作成するためのコンパイラ=GNU Compiler Collection (GCC)用のラッパです。アプリケーションがGNUタイプのconfigureスクリプトを使用している場合は、デフォルトのCCコンパイラ(GCC)の代わりにlsbccを利用するよう簡単にスクリプトを変更することができます。場合によっては、makefile等でGCCを直接lsbccに置き換えることも可能です。

コマンド7の機能は、alien(RPMをDebian debパッケージに変換するユーティリティ)をインストールすることです。コマンド8はalienを実行し、コマンド9はその結果を表示します。コマンド10 は、コマンド11と12が示すように、全てのソフトウェアを/opt/lsb/ディレクトリにインストールします。 RPMのビルド・検証に関する解説は、本チュートリアルでは省略します。代わりにlsbccを使って小さなCアプリケーションを作成し、その結果として得られたバイナリに無効なシンボルが存在しないか、lsb-appchkを使ってスキャンしてみることにします。

サンプルプログラム

リスト1に、コマンドライン引数を出力する小規模なプログラムを示します。 (エラー処理は意図的に除外してあります。)

リスト1:単純なCプログラム

#include

#include

main(argc, argv)

int argc;

char *argv[];

{

int i = 0;

for (i = 1; i < argc; i++) {

fputs(argv[i], stdout);

putchar(' ');

}

putchar('\n');

exit(0);

}

ファイル名echoargs.cのファイルにコードをコピー&ペーストしてから、Debianシステムにインストールされているコンパイラを使用してビルドしてください。

$ cc -o echoargs echo.c

$ ./echoargs hello there, world!

hello there, world!

コードは意図した通りに機能しますが、LSBに適合しているかどうかは不明です。チェックするにはlsbappchkコマンドを実行します。

$ /opt/lsb/bin/lsbappchk echoargs

Checking binary echoargs

Incorrect program interpreter: /lib/ld-linux.so.2

Header[ 1] PT_INTERP Failed

Found wrong interpreter in .interp section: /lib/ld-linux.so.2 instead of:

/lib/ld-lsb.so.3

echoargsがLSBに不適合なアプリケーションなのは明らかなので、LSBのコンパイラを用いて、アプリケーションを適合させます。

さらに、LSBコンパイラ(lsbcc)を使用してコードをビルドし直し、その結果得られたバイナリ上でlsbappchkを実行します。

$ /opt/lsb/bin/lsbcc -o lsb-echoargs echoargs.c

$ /opt/lsb/bin/lsbappchk lsb-echoargs

Checking binary lsb-echoargs

かなり良くなり、LSBにも適合しました。

このバイナリは、LSBスタブライブラリ(システムのヘッダファイルの代わりにLSB includeファイル(ヘッダファイル)を使用)を利用してビルドされています。では、実際にアプリケーションは実行できるのでしょうか?

$ ./lsb-echoargs

-bash: no such file or directory: ./lsb-echoargs

残念ながら、このサンプルシステム(Debian Sarge)はLSB3.2に不適合で、バイナリの実行は不可能です。./lsb-echoargsコマンドが生成したメッセージ、-bash: ./lsb-echoargsもいささか奇妙です。そのようなファイルやディレクトリは存在せず、システムがバイナリをロードできなかったというエラーが発生していることを示します。(LSBサンプル実装を使って、このバイナリを実行する方法は後程解説します。)

別の例として、リスト2をご覧ください。このコードは、従来のC言語の正規表現に、オープンソースのPerl Compatible Regular Expressions (PCRE)を付加します。PCREは非常に便利ですが、LSB仕様には含まれていません。

リスト2:PCRE アプリケーションの抜粋

#include

..

int main()

{

pcre *re;

const char *error;

int erroffset;

...

re = pcre_compile("^[A-Z]", 0, &error, &erroffset, NULL);

...

}

LD_LIBRARY_PATH が/usr/local/libを含むと仮定した場合、コマンドcc -o pcre pcre.c -l pcreを使用してコードをビルドすることができます。lsbappchkを使用してコードチェックを行うと、エラーメッセージが生成されます。

$ cc -o pcre pcre.c -l pcre

$ /opt/lsb/bin/lsbappchk pcre

Incorrect program interpreter: /lib/ld-linux.so.2

Header[ 1] PT_INTERP Failed

Found wrong interpreter in .interp section: /lib/ld-linux.so.2 instead of:

/lib/ld-lsb.so.3

DT_NEEDED: libpcre.so.0 is used, but not part of the LSB

Symbol pcre_compile used, but not part of LSB_Core

PCREによって宣言された関数はLSBに準拠していないため、警告が出されます。(PCREライブラリの残りの部分はLSB準拠という前提です。)このエラーを避けるには、-staticフラグを追加します。

lsbccを使用すると、同じコマンドでもエラーが発生しません。

$ /opt/lsb/binlsbcc -o pcre pcre.c -l pcre

$ /opt/lsb/bin/lsbappchk pcre

Checking binary a.out

$ nm a.out | grep pcre

0809b680 R _pcre_OP_lengths

0809b900 R _pcre_default_tables

0809b6d4 R _pcre_utf8_table1

0809b6ec R _pcre_utf8_table1_size

0809b6f0 R _pcre_utf8_table2

0809b708 R _pcre_utf8_table3

0809b720 R _pcre_utf8_table4

0809b760 R _pcre_utt

0809b888 R _pcre_utt_size

080b385c B pcre_callout

0804b0a0 T pcre_compile

0804b0e0 T pcre_compile2

080b18e4 D pcre_free

080b18e0 D pcre_malloc

080b18ec D pcre_stack_free

080b18e8 D pcre_stack_malloc

PCRE コードは、lsbccによって実行ファイルにスタティックにリンクされ、これはLinuxプラットフォーム間のライブラリの違いを防ぐひとつのソリューションともなります。lsbccはGCCコンパイラへのコマンドライン引数を修正して、LSBヘッダファイルとライブラリの使用を可能にしているだけでなく、LSB未準拠ライブラリへのダイナミックリンクを避けています。

GCCや自作またはよく使われるツールを用いてコードビルドを行う場合には、chroot LSBビルド環境よりlsbccの方が適しているかも知れません。反対に、GCC以外のコンパイラを使用する場合、または、特定のコンパイラ、コンパイラオプション、ライブラリ、includeファイルパス等への依存度が高い場合は、LSBビルド環境の使用がお薦めです。次のセクションで、LSBビルド環境のインストールや使い方について説明します。

LSBビルド環境とサンプル実装(LSB SI)のインストール

注:これ以降は、VMWare Workstation上で動作しているバーチャルFC9インスタンスの使用を前提に説明します。FC9 VMがサスペンド状態の場合、またはVMWare Workstationが終了している場合は、これらの動作を復旧または再開し、FC9インスタンスをスタートさせる必要があります。インスタンスが動作している場合は、rootユーザーとしてログインしてください。

chroot LSBビルド環境を使用すれば、十分にコントロールされた隔離環境でアプリケーションのビルドを行うことができます。chrootビルド環境をダウンロードしてインストールしたら、ユーティリティ、ライブラリ、アプリケーションのビルドに必要なその他のソースとともに展開してください。次に、chrootコマンドを使用して、現在有効なrootファイルシステムをビルド環境に変更します。これで、ビルド環境のrootにあるファイル以外は一切見えなくなります。

chrootビルド環境のダウンロードとインストール

LSBのダウンロードページから、LSB3.2.0のビルド環境をダウンロードしてください。chrootビルド環境は、複数のRPMの形で配布されます。

rootプロンプトが表示されたら、一時ディレクトリを作成してください。そのディレクトリに移動するにはcdを使います。次いで、下記コマンドを実行します。(wgetは、インストールしたFC9 VMに入っています。バックスラッシュを使った複数行に渡る長い行が出てきます)

$ wget http://ftp.linuxfoundation.org/pub/lsb/lsbdev/released-3.2.0/binary/ia32...

$ wget http://ftp.linuxfoundation.org/pub/lsb/lsbdev/released-3.2.0/binary/ia32...

$ rpm -i lsb-build-base-3.2.2-1.i486.rpm

$ rpm -i lsb-build-cc-3.2.1-1.i486.rpm

RPMをインストールすると、新しいディレクトリ、/opt/lsb-buildenv-ia32/が作成されます。このディレクトリの内容は既におなじみのことと思います。

bin boot dev etc home lib media mnt

opt proc root sbin srv tmp usr var

このディレクトリを隔離された環境として使用するには、chroot /opt/lsb-buildenv-ia32 /bin/bashコマンドを実行します。新しく現れるシェルプロンプト、bash-3.00#は入力を促すためのものです。なお、ファイルシステム周辺を参照した時に実際に見えるのは、現在有効またはトップレベルのディレクトリである/opt/lsb-buildenv-ia32/に格納されているファイルだけです。

では、とりあえずCtrl+Dを押してchrootから抜け出し、FC9 VMに戻ることにしましょう。そして、LSBサンプル実装をインストールした後でコードをビルドし、ビルド環境とサンプル実装上でそれぞれ実行してみて、本チュートリアルを終えることにします。

Chroot LSBサンプル実装のダウンロードとインストール

サンプル実装(LSB SI)は、基本となるtarballと、数個のテストツールから成る(オプションの)拡張tarballの形で配布されます。(ユーザーモードLinuxバイナリフォーマットでもダウンロード可能です。)

インストール開始時に、FC9内でサンプル実装の保存場所を決めてください。通常は、/optフォルダを使用します。次に、一時ディレクトリを作成し、tarballをダウンロードして解凍します。

1 $ mkdir /tmp/tgz; cd /tmp/tgz

2 $ wget http://ftp.linuxfoundation.org/pub/lsb/impl/released-3.2.0/binary/ia32/l...

3 $ wget http://ftp.linuxfoundation.org/pub/lsb/impl/released-3.2.0/binary/ia32/l...

4 $ wget http://ftp.linuxfoundation.org/pub/lsb/impl/released-3.2.0/binary/ia32/l...

5 $ wget http://ftp.linux-foundation.org/pub/lsb/impl/released-3.2.0/binary/ia32/...

6 $ cd /opt

7 $ tar xjvf /tmp/tgz/lsbsi-core-ia32-3.2.0.tar.bz2

8 $ cd /opt/lsbsi-core-ia32

9 $ tar xjvf /tmp/tgz/lsbsi-graphics-ia32-3.2.0.tar.bz2

10 $ tar xjvf /tmp/tgz/lsbsi-boot-ia32-3.2.0.tar.bz2

11 $ tar xjvf /tmp/tgz/lsbsi-test-ia32-3.2.0.tar.bz2

コマンド1は、中間ファイル用のディレクトリを作成します。コマンド2-5は、LSBサンプル実装の構成要素をそれぞれダウンロードするためのコマンドです。 lsbsi-boot はブート可能なシステムで、サンプル実装のスタンドアロンモードでの起動(必要な場合)を可能にするためのカーネルその他のソフトウェアを含んでいます。 lsbsi-coreは基本的なランタイムで、LSB仕様に記載されているフィーチャーだけで構成されています。lsbsi-coreは、chrootでバーチャルなLSB準拠の環境に移行する場合に使用されます。

lsbsi-graphicsは、サンプル実装内でのグラフィックアプリケーションの作成を可能にします。この記事の冒頭[図2]で示したように、これらのライブラリはX、 OpenGL、その他の描画機能に対応しています。

lsbsi-test は、サンプル実装を、より適切なテスト環境にするためのソフトウェアの追加を可能にします。

コマンド6-11は、/optにtarballを解凍・展開し、/opt/lsbsi-ia32ディレクトリを作成します。コマンド8は省略しないでください。lsbsi-lsbsi-graphics-ia32-3.2.0.tar.bz2、 lsbsi-boot-ia32-3.2.0.tar.bz2、およびlsbsi-test-ia32-3.2.0.tar.bz2は、/opt/lsbsi-core-ia32に解凍・展開されなくてはなりません。

前出のビルド環境と同様、解凍・展開終了後のサンプル実装へは、chroot /opt/lsbsi-core-ia32 /bin/bashコマンドを実行することで移行できます。chroot環境を終了するには、新しいシェルプロンプトの位置でCtrl+Dを押してください。

ビルド環境・サンプル実装におけるコードのビルドと実行

リスト1に示した簡単なコードをビルド環境内でビルドし、サンプル実装上で実行してみます。

まず、ファイルをビルド環境へコピーします。

FC9 VM内には、FC9、ビルド環境、サンプル実装の3タイプの環境が存在しています。そこで、便宜的に作業ディレクトリを3個作成し、そのそれぞれに環境変数を設定して、これらの間でのファイルコピーを簡単にします。

$ FC9=/tmp/work

$ BE=/opt/lsb-buildenv-ia32/tmp/work

$ SI=/opt/lsb-core-ia32/tmp/work

$ mkdir $FC9 $BE $SI

$FC9ディレクトリは、ソースコードをダウンロードし、必要に応じて中間ファイルを保管するための作業ディレクトリです。例えば、LSBビルド環境のユーティリティを用いて作成されたLSB準拠のバイナリを$FC9にダウンロードし、次にそれを$SIディレクトリにコピーして、LSB3.2.0の仕様通りに実行できるかどうか確認するといった使い方をします。(全ては完璧に動作するはずです。)$BEディレクトリは、chrootビルド環境でビルドしたいソースコード用のディレクトリです。chroot /opt/lsbsi-buildenv-ia32 /bin/bashコマンド実行後は、/tmp/workとして利用可能です。同様に、$SIディレクトリは、ビルド環境でビルドしてサンプル実装上で実行したいバイナリの保存場所となります。chroot /opt/lsbsi-core-ia32 /bin/bashコマンド実行後は、/tmp/workとして利用可能です。

従って、リスト1のコードをchrootビルド環境でビルドし、chrootサンプル実装でテストする場合は、まずコードをFC9環境にダウンロードし、次に以下のシーケンスを実行します。(解りやすいように、各コマンドラインプロンプトの頭にプリフィクスをつけてあります。)

(fc9) $ cd $FC9

(fc9) $ wget ftp://.../echoargs.c

(fc9) $ cp echoargs.c $BE

(fc9) $ chroot /opt/lsbsi-buildenv-ia32 /bin/bash

(be) $ cd /tmp/work

(be) $ cc -o echoargs echoargs.c

(be) $ ./echoargs hello there

hello there

(be) $ Control-D

(fc9) $ cp $BE/echoargs $SI

(fc9) $ chroot /opt/lsbsi-core-ia32 /bin/bash

(si) $ cd /tmp/work

(si) $ ./echoargs hello there hello there

(si) $ Control-D

(fc9) $ echo $FC9

/tmp/work

FC9 はLSB3.2.0に準拠していますので、ビルド環境で作成されたバイナリは FC9上で問題なく動作します。

(fc9) $ cp $BE/echoargs $FC9

(fc9) $ cd $FC9

(fc9) $ ./echoargs

this is cool this is cool

まとめ

本チュートリアルで提示したサンプルコードは、いずれも数行で非常に単純ですが、それらのビルドやテストに使用したテクニックは、例えコードの行数が何千に増えたとしても全く同様に適用できます。LSBビルド環境ユーティリティとスタンドアロン型のchroot LSBビルド環境を利用してのコードのビルドを、是非お試しください。LSB3.2.0に準拠したLinuxをお持ちでない場合は、ポータビリティのテストにLSBサンプル実装がご利用頂けます。また、VMWare Workstationのようなツールを有効活用して、コンピューティングリソースの実質的な増強、自分に合った特色のLinuxの幅広い活用を目指してください。

ほんの少しの努力で、アプリケーションをLSBに準拠させ、認証を得ることは可能です。一方、認証されたディストリビューションやアプリケーションは、Linuxの快適さに対するユーザーの投資を増加させる一助となるはずです。LSBは同一性を促進するとともに、逆説的な言い方をすれば、選択の幅も広げます。

何と言っても、選択肢の多さがLinuxの最大の強みなのですから。

出典

この文書は、IBM developerWorksに掲載された記事を、最新の技術の実態に沿うよう改訂したものです。アップデートにご協力下さいましたTed T’So、Jeff Liquiaの両氏に感謝致します。