第3章 高度なトピック

本章では、Software Collections のパッケージ化に関する高度なトピックを説明します。

3.1. NFS での Software Collections の使用

一部の環境では、この要件には、ユーザーが希望するアプリケーションやツールのバージョンをインストールするのではなく、アプリケーションやツールがどのように配布されるかについての集中型モデルが必要になることがよくあります。このようにして NFS は、集中管理されたソフトウェアをマウントする一般的な方法です。
NFS 経由で Software Collection を使用する nfsmountable には、Software Collection マクロを定義する必要があります。Software Collection の構築時にマクロが定義されている場合には、生成される Software Collection には、Software Collection の /opt ファイルシステム階層外にある状態ファイルと設定ファイルがあります。これにより、NFS に /opt ファイルシステム階層を読み取り専用としてマウントできます。また、状態ファイルと設定ファイルの管理が容易になります。
NFS を介した Software Collections のサポートが必要ない場合は、nfsmountable の使用は任意ですが推奨されます。
nfsmountable マクロを定義するには、Software Collection のメタパッケージの spec ファイルに以下の行が含まれていることを確認してください。
%global nfsmountable 1

%scl_package %scl
上記のように、nfsmountable マクロを定義する前に %scl_package マクロを定義する必要があります。これは、nfsmountable マクロが定義されているかどうかに応じて、%scl_package マクロが、_sysconfdir_sharedstatedir_localstatedir のマクロを再定義するためです。再定義されたマクロで nfsmountable が変更する値は、以下の表で説明されています。

表3.1 Software Collection マクロの値の変更

マクロ
元の定義
元の定義に対する拡張された値
変更された定義
元の定義に対する拡張された値
_sysconfdir
%{_scl_root}/etc
/opt/provider/%{scl}/root/etc
%{_root_sysconfdir}%{_scl_prefix}/%{scl}
/etc/opt/provider/%{scl}
_sharedstatedir
%{_scl_root}/var/lib
/opt/provider/%{scl}/root/var/lib
%{_root_localstatedir}%{_scl_prefix}/%{scl}/lib
/var/opt/provider/%{scl}/lib
_localstatedir
%{_scl_root}/var
/opt/provider/%{scl}/root/var
%{_root_localstatedir}%{_scl_prefix}/%{scl}
/var/opt/provider/%{scl}

3.1.1. ディレクトリー構造およびファイル所有者の変更

nfsmountable マクロは、scl_install および scl_files マクロがディレクトリー構造の作成方法にも影響し、rpmbuild コマンドの実行時にファイルの所有権を設定します。
たとえば、定義された nfsmountable マクロを持つ software_collection という名前の Software Collection のディレクトリー構造は、以下のようになります。
$ rpmbuild -ba software_collection.spec --define 'scl software_collection'
...
$ rpm -qlp software_collection-runtime-1-1.el6.x86_64
/etc/opt/provider/software_collection
/etc/opt/provider/software_collection/X11
/etc/opt/provider/software_collection/X11/applnk
/etc/opt/provider/software_collection/X11/fontpath.d
...
/opt/provider/software_collection/root/usr/src
/opt/provider/software_collection/root/usr/src/debug
/opt/provider/software_collection/root/usr/src/kernels
/opt/provider/software_collection/root/usr/tmp
/var/opt/provider/software_collection
/var/opt/provider/software_collection/cache
/var/opt/provider/software_collection/db
/var/opt/provider/software_collection/empty
...

3.1.2. Software Collections の登録および登録解除

Software Collection が NFS で共有されているが、お使いのシステムにローカルにインストールされていない場合には、その Software Collection を登録して scl ツールに認識させる必要があります。
Software Collection の登録は、以下の scl register コマンドを実行して行います。
$ scl register /opt/provider/software_collection
/opt/provider/software_collection は、登録する Software Collection のファイルシステム階層への絶対パスです。パスのディレクトリーに、有効な Software Collection ファイルシステム階層と見なされる enable スクリプトレットと root/ ディレクトリーに含まれる必要があります。
Software Collection の登録解除は、scl ツールが登録済み Software Collection を認識させないようにする際に実行する逆の操作です。
Software Collection の登録を解除するには、scl コマンドの実行時に deregister スクリプトレットを呼び出します。
$ scl deregister software_collection
ここで、software_collection は、登録を解除する Software Collection の名前に置き換えます。

3.1.2.1. Software Collection Metapackage での (de)register スクリプトレットの使用

Software Collection メタパッケージで (de)register スクリプトレットの有効化方法と同様に、(de)register スクリプトレットを指定できます。スクリプトセットを指定する場合は、メタパッケージ spec ファイルの %file セクションに明示的に追加するようにしてください。
(de)register スクリプトセットの指定例は、以下のサンプルコードを参照してください。
%install
%scl_install

cat >> %{buildroot}%{_scl_scripts}/enable << EOF
# Contents of the enable scriptlet goes here
...
EOF

cat >> %{buildroot}%{_scl_scripts}/register << EOF
# Contents of the register scriptlet goes here
...
EOF

cat >> %{buildroot}%{_scl_scripts}/deregister << EOF
# Contents of the deregister scriptlet goes here
...
EOF
...
%files runtime -f filelist
%scl_files
%{_scl_scripts}/register
%{_scl_scripts}/deregister
register スクリプトレットでは、/etc/opt//var/opt/ にファイルを作成するコマンドなど、Software Collection の登録時に実行するコマンドをオプションで指定できます。