このラボでは、Image Packaging System(IPS)の概念、システム・ソフトウェアを管理するプロセス、およびユーザー独自のソフトウェア・パッケージをIPS形式で公開するプロセスを示します(IPSおよびOracle Solaris 11について詳しくは、こちら)。
このハンズオン・ラボでは、以下のテクノロジーに関するある程度の基礎知識またはプログラミング経験があることが前提となっています。
ラボに必要な追加のソフトウェア:
sudo pkg install gcc-3
"を実行する必要があります。予想される所要時間:20分間
Oracle Solaris 11では新しいパッケージ管理方法を採用し、パッチと更新の管理プロセスを大幅に簡素化しています。そのため、オペレーティング・システムのメンテナンスに関するリスクが軽減されます。Solaris 11では、それ以前のOracle Solarisリリースで使用されていた古いSVR4パッケージに代わるImage Packaging System(IPS)が導入されました。IPSによって、ソフトウェアのライフ・サイクル管理が大幅に簡素化されます。IPSは、ソフトウェアのライフ・サイクル全体に対処するように設計されており、ソフトウェアのパッケージ化、デプロイとインストール、更新、システム・アップグレード、ソフトウェア・パッケージの削除を処理します。また、IPSは、ZFSと緊密に統合されており、ZFSの機能(スナップショット、クローンなど)を使用して、メンテナンスに伴なうリスクと停止時間を最小限に抑えます。
最初に、IPSで使用される用語と概念を理解する必要があります。
IPSは、ソフトウェアをパッケージ単位で管理します。IPSパッケージは、ディレクトリ、ファイル、リンク、ドライバ、依存関係、グループ、ユーザー、およびライセンス情報の、定義された形式でのコレクションです。このコレクションは、パッケージのインストール可能なオブジェクトを表します。パッケージは、パッケージ名や説明などの属性を持ちます。
コマンドを使用してパッケージに関する情報を表示できます。また、パッケージのマニフェストを表示することもできます。
Oracle Solaris 11は、IPSパッケージとSVR4パッケージの両方をサポートしています。
管理者の多くは、パッケージ・リポジトリからソフトウェアをインストールできますが、オンディスクIPSパッケージ形式(.p5p)からソフトウェアをインストールすることもできます。これは、.rpm、SVR4パッケージ、または.nbmファイルに相当します。
開発者の観点からは、IPSパッケージは、一連のアクションで構成されています。アクションは、パッケージのマニフェストに記述されます。パッケージのファイルとディレクトリの定義、パッケージ属性の設定、他のパッケージへの依存関係の宣言、ユーザーとグループの作成、デバイス・ドライバのインストールにこのアクションが使用されます。アクションとは、システム上にあるインストール可能なオブジェクトのことです。それぞれのアクションは主に名前とキー属性で構成されています。バージョン履歴に従うため、これらを合わせて一意(ユニーク)オブジェクトと呼びます。
各IPSパッケージは障害管理リソース識別子(FMRI)で表現されます。pkg(1)コマンドは、有効なFMRIパッケージ情報を使用して、そのコマンド・アクションを実行します。FMRIには、パッケージに関する説明(パッケージのパブリッシャ、パッケージ名、バージョン情報、日付など)が含まれています。
たとえば、pkg://solaris/system/library@0.5.11,5.11-0.175.0.0.0.2.1:20111019T082311ZというFMRIは、以下の一連の情報で構成されています。
イメージは、パッケージとその関連ファイル、ディレクトリ、リンク、および依存関係をインストールできるシステム上の場所です。
イメージには、次の3つの種類があります。
システムへのOracle Solaris 11のインストールが完了すると、自動的にイメージを使用できるようになります。イメージを明示的に作成しなくてもパッケージをインストールできます。ただし、異なるソフトウェア・アプリケーション用に論理的分離を使用する場合(特にゾーンを使用している場合に必要)は、イメージを作成する必要があります。
次の図は、イメージの概念を示しています。
SolarisでのZFSおよびブート管理との緊密な統合を実現する設計により、pkg(1)は、パッケージのインストールが失敗した場合やインストールの結果として得られた環境が望ましいものではない場合にZFSスナップショットを使用して容易にロールバックできる機能を提供します。IPSは、更新されるソフトウェアに関する分析を実行し、必要と判断される場合('pkg更新'シーケンスの実行時)は、更新されたパッケージ・バージョンのインストール先となる新しいブート環境(BE)を自動的に作成します。この新しいBEは再起動時にアクティブ化されます。古いBEは、アップグレードの結果としてシステムが正常に動作しなかったり、機能が使用できなくなったりした場合に、ロールバック用の代替環境として使用できます(Solaris 11では、beadmコマンドを使用して、ブート環境の動作をリスト表示し、制御することができます)。
BEについて詳しくは、Oracle Solaris 11によるブート環境の管理方法に関する説明を参照してください。
ソフトウェアは、オプションのコンポーネントや相互に排他的なコンポーネントを持つことができます。オプションのコンポーネントの例は、ロケールやドキュメントです。相互に排他的なコンポーネントの例は、SPARCとx86やデバッグ・バイナリと非デバッグ・バイナリです。IPSでは、オプションのコンポーネントはファセットと呼ばれ、相互に排他的なコンポーネントはバリアントと呼ばれます。バリアントとファセットはどちらも、IPSのアクションに関するタグとして使用されます。
バリアントとファセットは、特定のアクションがインストールの際に選択されるか、選択解除されるかに影響を与えます。
次の表は、ファセット・タグおよびバリアント・タグの例とそれらに対して指定できる値を示しています。
名前 | 値 |
---|---|
facet.locale.* | true、false |
facet.doc.man | true、false |
facet.doc | true、false |
facet.devel.* | true、false |
variant.arch | sparc、i386、zos |
variant.debug.* | true、false |
デフォルトでは、ファセットまたはバリアントによってタグ付けされていないアクションは除外されません。
選択されていないバリアントによってタグ付けされているアクションは除外されます。
どのファセットも選択されていない場合、1つ以上のファセットによってタグ付けされているアクションは除外されます。
単一のアクションは、複数のファセットおよびバリアント・タグを持つことができます。複数のファセットおよびバリアント・タグを持つコンポーネントの例は、開発者によって使用されるアーキテクチャ固有のヘッダー・ファイルです。
バリアントおよびファセットは、イメージ・レベルで設定されます。特定のプロパティに設定されたバリアントを持つイメージは、そこにインストールされているバリアントに一致するアクションだけを持つことができます。たとえば、x86パッケージをSPARCイメージにインストールすることはできません。
クライアント側では、IPSは、"Package Manager"と呼ばれるグラフィカルなフロントエンドを備えています。"Package Manager"により、パッケージを検索、インストール、更新、削除したり、リポジトリを管理したり、ブート環境を管理したりすることができます。
IPSでは、Update Managerも提供されます。Update Managerは、イメージ内のすべてのインストール済みパッケージを更新できるデスクトップ・アプリケーションです。インストール済みパッケージに対する更新が使用可能になると、Update Managerによってユーザーに通知されます。
IPSの操作に慣れるために、IPSのコマンドについての学習を開始しましょう。
現在のパッケージの認可レベルを確認します。
oracle@solaris:~$ pkg publisher
PUBLISHER TYPE STATUS URI
solaris (preferred) origin online http://pkg.oracle.com/solaris/release/
パッケージ・パブリッシャをさらに追加します。
oracle@solaris:~$ sudo pkg set-publisher -g http://pkg.sunfreeware.com:9001 sunfreeware.com Password: oracle@solaris:~$ pkg publisher PUBLISHER TYPE STATUS URI solaris (preferred) origin online http://pkg.oracle.com/solaris/release/ sunfreeware.com origin online http://pkg.sunfreeware.com:9001/
このパッケージ・パブリッシャは、今は不要なので削除しましょう。
oracle@solaris:~$ sudo pkg unset-publisher sunfreeware.com
Password:
oracle@solaris:~$ pkg publisher
PUBLISHER TYPE STATUS URI
solaris (preferred) origin online http://pkg.oracle.com/solaris/release/
インストール済みのイメージ内のパッケージを検索します。次の例では、bashコマンドのgperfを検索して、見つけています。このコマンドがあるパッケージを確認しましょう。
oracle@solaris:~/Work/srm-1.2.10$ pkg search gperf
INDEX ACTION VALUE PACKAGE
basename file usr/bin gperf pkg:/developer/gperf@3.0.3-0.175.0.0.0.2.537
pkg.description set GNU gperf is a perfect hash function generator. For a given list of strings,
it produces a hash function and hash table, in form of C or C++ code,
for looking up a value depending on the
input string.
pkg:/developer/gperf@3.0.3-0.175.0.0.0.2.537
pkg.fmri set solaris/developer/gperf pkg:/developer/gperf@3.0.3-0.175.0.0.0.2.537
pkg.summary set GNU gperf pkg:/developer/gperf@3.0.3-0.175.0.0.0.2.537
basename dir usr/share/doc/gperf pkg:/developer/gperf@3.0.3-0.175.0.0.0.2.537
リモート・リポジトリ内のパッケージを検索します。現在のイメージに関連付けられたリモート(-r)リポジトリ内のbashパッケージを検索するには、以下のように操作します。
oracle@solaris:~/Work/srm-1.2.10$ pkg search -r bash INDEX ACTION VALUE PACKAGE basename file usr/bin/bash pkg:/shell/bash@4.1.9-0.175.0.0.0.2.537 pkg.fmri set solaris/shell/bash pkg:/shell/bash@4.1.9-0.175.0.0.0.2.537 basename dir etc/bash pkg:/shell/bash@4.1.9-0.175.0.0.0.2.537 basename dir usr/share/bash pkg:/shell/bash@4.1.9-0.175.0.0.0.2.537
この例では、gperfパッケージをインストールします。出力には、ダウンロードのステータス、インストールされたパッケージの数、インストールされたファイルの数、ダウンロードのサイズ(MB単位)が示されます。
oracle@solaris:~/Work/srm-1.2.10$ sudo pkg install gperf Packages to install: 1 Create boot environment: No Create backup boot environment: No Services to change: 1 DOWNLOAD PKGS FILES XFER (MB) Completed 1/1 8/8 0.1/0.1 PHASE ACTIONS Install Phase 27/27 PHASE ITEMS Package State Update Phase 1/1 Image State Update Phase 2/2 oracle@solaris:~/Work/srm-1.2.10$ pkg list gperf NAME (PUBLISHER) VERSION IFO developer/gperf 3.0.3-0.175.0.0.0.2.537 i--
この例では、gperfパッケージをアンインストールします。
oracle@solaris:~/Work/srm-1.2.10$ sudo pkg uninstall gperf Packages to remove: 1 Create boot environment: No PHASE ACTIONS Removal Phase 21/21 PHASE ITEMS Package State Update Phase 1/1 Package Cache Update Phase 1/1 Image State Update Phase 2/2 PHASE ITEMS Reading Existing Index 8/8 Indexing Packages 1/1 oracle@solaris:~/Work/srm-1.2.10$ pkg list gperf pkg list: no packages matching 'gperf' installed
以上が、IPSパッケージ管理システムの概要です。
予想される所要時間:20分間
ローカル・リポジトリを有効にする2つの方法について説明します。最初に、IPSクライアント・コマンドから直接アクセスできるファイルベースのリポジトリの作成方法を説明します。次に、このレポジトリを、このレポジトリへのpkgサーバーを介して、ネットワーク・サービスとしてインスタンス化します。これにより、ネットワーク経由でアクセスできるようになります。これらの2つの方法はどちらも、開発およびテストには問題なく使用できます。ただし、リポジトリ・サーバーをシステムで永続的に動作させる場合は、(a) ローカル・ディスクにファイルをホストするための十分なディスク領域を用意することと、(b) SMFを使用してリポジトリ・サーバーを管理することを推奨します。リポジトリ・サーバー・サービスのデフォルトのSMF FMRIは、svc:/application/pkg/serverです。
これは、2つの方法で実行できます。もっとも簡単な方法は、単に、構成を反映するようにリポジトリ・サービスのデフォルト・インスタンスのプロパティを変更することです。この点については、この演習の2つ目の例で説明します。もう一つの方法は、svc:/application/pkg/serverサービスの2つ目のインスタンスを作成することです。この方法は、同じシステムで複数のIPSデポ・サーバーを動作させる必要がある場合、たとえば、Solarisリポジトリのローカル・コピー(コピーの作成方法については、こちらをクリックしてください)とユーザー独自のコード用の開発/テスト・リポジトリを持つ必要がある場合などに役立ちます。この方法の実行手順は、補足の演習として用意しています。時間に余裕があれば学習してください。
次のように表示されます。
oracle@solaris:~$ pkgrepo create ~/myrepo oracle@solaris:~$ pkgrepo info -s ~/myrepo PUBLISHER PACKAGES STATUS UPDATED oracle@solaris:~$ pkgrepo set -s ~/myrepo publisher/prefix=example.com oracle@solaris:~$ pkgrepo info -s ~/myrepo PUBLISHER PACKAGES STATUS UPDATED example.com 0 online 2011-05-19T11:31:28.549665Z
これは、より永続的なIPSリポジトリ・サーバーをローカル・システムにセットアップする場合に推奨される方法です。もっとも一般的な方法は、application/pkg/serverサービスのデフォルト・インスタンスを変更することで、これはsvccfg(1M)コマンドを使用して実行できます。ただし、まず、リポジトリを配置する場所を用意する必要があります。そのために、ZFSファイル・システムを作成します。単なるディレクトリではなくZFSファイル・システムを使用すると、リポジトリにより多くのパッケージを格納するときにリポジトリの拡張に応じてストレージを管理する方法の選択肢が増えます。
最初に、リポジトリを配置できるZFSファイル・システムを作成する必要があります。この例では、/export/ipsを使用します。
oracle@solaris:~$ sudo zfs create rpool/export/ips
oracle@solaris:~$ sudo zfs create rpool/export/ips/example
eoracle@solaris:~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 8.42G 7.20G 92.5K /rpool
rpool/ROOT 6.14G 7.20G 31K legacy
rpool/ROOT/solaris 6.14G 7.20G 6.00G /
rpool/dump 1023M 7.20G 1023M -
rpool/export 225M 7.20G 36K /export
rpool/export/home 225M 7.20G 32K /export/home
rpool/export/home/oracle 225M 7.20G 225M /export/home/oracle
rpool/export/ips 31K 7.20G 31K /export/ips
rpool/export/ips/example 31K 7.20G 31K /export/ips/example <--- Our new zfs file system
rpool/swap 1.06G 8.10G 172M -
次に、pkgrepo(1)を使用して、リポジトリを作成し、パブリッシャを設定する必要があります。
oracle@solaris:~$ sudo pkgrepo create /export/ips/example oracle@solaris:~$ pkgrepo info -s /export/ips/example PUBLISHER PACKAGES STATUS UPDATED oracle@solaris:~$ sudo pkgrepo set -s /export/ips/example publisher/prefix=example.com oracle@solaris:~$ pkgrepo info -s /export/ips/example PUBLISHER PACKAGES STATUS UPDATED example.com 0 online 2011-05-19T16:55:14.278173Z
正常に実行できたようなので、ここで、デフォルトのポートと配置場所を、SMFにおけるapplication/pkg/serverサービスのデフォルト・インスタンス上の10001と/export/ips/localに変更する必要があります。これを行うには、svccfg(1M)とsvcadm(1M)を使用します。
oracle@solaris:~$ svcs application/pkg/server STATE STIME FMRI disabled 11:05:09 svc:/application/pkg/server:default oracle@solaris:~$ sudo svccfg -s application/pkg/server setprop pkg/port=10001 <---- Set the port to 10001 oracle@solaris:~$ sudo svccfg -s application/pkg/server setprop pkg/inst_root=/export/ips/example <---- rep. location oracle@solaris:~$ sudo svcadm refresh application/pkg/server oracle@solaris:~$ sudo svcadm enable application/pkg/server oracle@solaris:~$ svcs application/pkg/server STATE STIME FMRI online 10:51:10 svc:/application/pkg/server:default
では、ブラウザでhttp://localhost:10001にアクセスして、正常に機能しているかどうかを確認しましょう。
正常に機能しているようです。このリポジトリは、後の演習4で使用できるように保持しておきましょう。ただし、その前に、SMFのコマンドを使用してIPSリポジトリ・サービスを停止する方法を確認しましょう。サービスの状態を変更するには、サービスの起動時と同じように、svcadm(1M)を使用します。サービスの状態を確認するには、svcs(1M)を使用します。
oracle@solaris:~$ svcs application/pkg/server
STATE STIME FMRI
online 13:03:52 svc:/application/pkg/server:defaul
oracle@solaris:~$ sudo svcadm disable application/pkg/server
oracle@solaris:~$ svcs application/pkg/server
STATE STIME FMRI
disabled 13:04:20 svc:/application/pkg/server:default
oracle@solaris:~$ sudo svcadm enable application/pkg/server
oracle@solaris:~$ svcs application/pkg/server
STATE STIME FMRI
online 13:04:34 svc:/application/pkg/server:defaul
SMFについて詳しくは、サービスの管理 (概要)を参照してください。
場合によっては、システム上で複数のIPSサーバーを動作させる必要があります。たとえば、1つのサーバーで、開発/テストIPSリポジトリを動作させ、Solarisリポジトリのローカル・コピーも持つ必要がある場合などです。また、これらの両方を永続的に使用する場合は、Solaris SMFを使用してpkg.depotdプロセスをサービスとして管理することが推奨されます。これは、pkg/serverサービスに新しいインスタンスを追加することによって行うことができます。これを行うには、以下の手順を実行します。
1. リポジトリ・データを保存するZFSファイル・システムを作成します。
$ sudo zfs create <filesystem>
2. pkgrepo(1)コマンドを使用して、1つ目のスケルトン・リポジトリを作成し、パブリッシャを設定します。これは前に説明したので、その例に従っている場合は、この手順をスキップできます。
$ sudo pkgrepo create repository <path to repository>
$ sudo pkgrepo set -s <path repository> publisher/prefix=<publisher name>
3. pkg/serverサービスの新しいインスタンスを追加します。
$ sudo svccfg -s pkg/server add <instance_name>
$ sudo scvcfg -s pkg/server:<instance_name> addpg pkg application
$ sudo svccfg -s pkg/server:<instance_name> addpg general framework
$ sudo svccfg -s pkg/server:<instance_name> setprop general/complete=astring:\"\"
$ sudo svccfg -s pkg/server:<instance_name> setprop general/enabled=boolean: true
4. リポジトリ・データへのポートとパスの値を設定します。
$ sudo svccfg -s pkg/server:<instance_name> setprop pkg/port=<port_value>
$ sudo svccfg -s pkg/server:<instance_name> setprop pkg/inst_root=<repository_directory>
5. リポジトリ・サービス・インスタンスをリフレッシュします。
$ sudo svcadm refresh application/pkg/server:<instance_name>
6. リポジトリ・インスタンスを起動します。
$ sudo svcadm enable application/pkg/server:<instance_name>
7. 新しいサービス・インスタンスが正常に動作していることを確認します。
$ svcs -x application/pkg/server:<instance_name>
8. ブラウザを開き、http://localhost:<port_value>と入力して、リポジトリが作成されたことを確認します。
oracle@solaris:~$ sudo zfs create rpool/export/ips/devtest oracle@solaris:~$ sudo pkgrepo create /export/ips/devtest oracle@solaris:~$ sudo pkgrepo set -s /export/ips/devtest publisher/prefix=devtest.example.com oracle@solaris:~$ sudo svccfg -s pkg/server add devtest oracle@solaris:~$ sudo svccfg -s pkg/server:devtest addpg pkg application oracle@solaris:~$ sudo svccfg -s pkg/server:devtest addpg general framework oracle@solaris:~$ sudo svccfg -s pkg/server:devtest setprop general/complete=astring:\"\" oracle@solaris:~$ sudo svccfg -s pkg/server:devtest setprop general/enabled=boolean: true oracle@solaris:~$ sudo svccfg -s pkg/server:devtest setprop pkg/port=10002 oracle@solaris:~$ sudo svccfg -s pkg/server:devtest setprop pkg/inst_root=/export/ips/devtest oracle@solaris:~$ sudo svcadm refresh pkg/server:devtest oracle@solaris:~$ sudo svcadm enable pkg/server:devtest oracle@solaris:~$ svcs pkg/server STATE STIME FMRI online 23:24:11 svc:/application/pkg/server:default online 0:14:46 svc:/application/pkg/server:devtest
最後の部分から分かるように、システムで2つのIPSリポジトリが動作しています(デフォルト・サーバーはポート10001、devtestサーバーはポート10002)。
簡単なファイル・システムベースのリポジトリ(管理されていないネットワーク・リポジトリ)としてIPSリポジトリをセットアップする方法、pkg/server SMFサービスのデフォルト・インスタンスを変更する方法、そして最後に(時間に余裕のある場合の補足演習として)2つ目のインスタンスをpkg/server SMFサービスに追加する方法について学習しました。
予想される所要時間:20分間
wgetのマニフェストを見てみましょう。
pkg contents -m <pkg_name>を使用すると、次のように表示されます。
oracle@solaris:~$ pkg contents -m wget > wget_manifest oracle@solaris:~$ cat wget_manifest set name=pkg.fmri value=pkg://solaris/web/wget@1.12,5.11-0.175.0.0.0.2.537:20111019T122502Z set name=variant.arch value=i386 value=sparc set name=info.upstream-url value=http://www.gnu.org/software/wget/ set name=pkg.description value="GNU wget - a utility to retrieve files from the World Wide Web" set name=info.classification value=org.opensolaris.category.2008:Applications/Internet set name=info.source-url value=http://ftp.gnu.org/gnu/wget/wget-1.12.tar.bz2 set name=pkg.summary value="wget - GNU wget" set name=org.opensolaris.consolidation value=userland set name=org.opensolaris.arc-caseid value=PSARC/2000/488 license 97a51b7c9fd624f1d16cda23f472e1fbe24d0efc chash=626a60459b65a1cac3a1ce0303c40f3e69403b4c license=GPLv3 pkg.csize=12330 pkg.size=35702 depend fmri=pkg:/library/security/openssl@1.0.0.5-0.175.0.0.0.0.525 type=require depend fmri=pkg:/system/library@0.5.11-0.175.0.0.0.0.0 type=require depend fmri=pkg:/library/libidn@1.19-0.175.0.0.0.0.525 type=require dir group=sys mode=0755 owner=root path=etc dir group=sys mode=0755 owner=root path=usr dir group=bin mode=0755 owner=root path=usr/bin dir group=bin mode=0755 owner=root path=usr/sfw dir group=bin mode=0755 owner=root path=usr/sfw/bin dir group=sys mode=0755 owner=root path=usr/share . file 6be18eb59d8f6906ee4ee18104f3318ae817ee80 chash=17183aaa04fcae20401cec26df325bf66b5d135d elfarch=sparc elfbits=32 elfhash=df980eca224f1e3627dee713590403b359b3084a group=bin mode=0555 owner=root path=usr/bin/wget pkg.csize=211661 pkg.size=506548 variant.arch=sparc . . file 68bc81098633a627d03da5c92ac7e048556460df chash=19c439fc21948815d089487a775b0f72323ca227 elfarch=i386 elfbits=32 elfhash=116c3f5c151fabe88e1274a817ad7557ea6bbbb5 group=bin mode=0555 owner=root path=usr/bin/wget pkg.csize=191555 pkg.size=528028 variant.arch=i386 file 291bbb69aa064bb0affa458acb0a1007a178ec13 chash=222ef630db851d7ce5dceae8941dc1c349399ecc facet.doc.info=true group=bin mode=0444 owner=root path=usr/share/info/wget.info pkg.csize=62581 pkg.size=199596 restart_fmri=svc:/application/texinfo-update:default variant.arch=i386 .
最初の部分に、パッケージまたはFMRIの名前があります。これには、パブリッシャ、カテゴリ、名前、およびバージョンが含まれています。このマニフェストを、独自のパッケージを作成するための出発点とすることができます。パッケージに関する多数のプロパティを設定できます。その後に、多数のディレクトリ・アクションが続きます。これにより、使用するディレクトリに関する適切な権限を設定します。その後に、パッケージの主要ペイロード(パッケージによって配布されるすべてのファイル)が続きます。
wgetパッケージに関して使用できる2つのバリアント(sparcとi386)があることが分かります。このため、SPARCとx86の両方のバージョンのアプリケーションを配布する場合は、同じパッケージで、2つ目の"バリアント"を追加するだけで実現できます。また、wgetがSPARCとx86の両方のプラットフォーム用の32ビット・バイナリを提供することも分かります。
ローカル・リポジトリ・サーバーのセットアップおよび起動方法について詳しくは、例3-2を参照してください。
今回はGNUベースのツールチェーンをインストールする必要がありますが、これはdeveloper/gnuパッケージをインストールすることによって簡単に行えます。このパッケージには、GNU開発者ツールチェーンに必要なツールがすべて含まれています。実は、これは、必要なすべてGNU開発者ツールへの依存関係を定義しているだけの空のパッケージです。IPSが依存関係を自動的に解決するため、このパッケージをインストールするだけで、このパッケージが依存する他のすべてのパッケージが自動的にインストールされます。実際に、これは、IPSの非常に便利な機能です。この機能によって、ソフトウェア・パッケージの異なる"バンドル"を作成することができます。
SourceForge(こちらをクリック)からソース・コードをダウンロードします。以下の例では、srm 1.2.10を使用します(より新しいバージョンである1.2.11の新しい信号処理コードにはバグがあり、Solarisではコンパイルが正常に実行されません)。
作業領域と、"インストール"プロトタイプを作成できるプロトタイプ領域を作成します。次のように操作します。
oracle@solaris:~$ cd ~/Work oracle@solaris:~/Work$ tar -zxf ../Download/srm-1.2.10.tar.gz oracle@solaris:~/Work$ cd srm-1.2.10 oracle@solaris:~/Work/srm-1.2.10$ mkdir proto_inst oracle@solaris:~/Work/srm-1.2.10$ ./configure exec_prefix=`pwd`/proto_inst/usr prefix=`pwd`/proto_inst/usr checking for a BSD-compatible install... /usr/bin/ginstall -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/gnu/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc . . config.status: executing depfiles commands
oracle@solaris:~/Work/srm-1.2.10$ make make all-recursive make[1]: Entering directory `/home/oracle/Work/srm-1.2.10' Making all in lib make[2]: Entering directory `/home/oracle/Work/srm-1.2.10/lib' gcc -DHAVE_CONFIG_H -I. -I.. -O2 -DNDEBUG -MT snprintf.o -MD -MP -MF .deps/snprintf.Tpo -c -o snprintf.o snprintf.c . . make[1]: Leaving directory `/home/oracle/Work/srm-1.2.10'
oracle@solaris:~/Work/srm-1.2.10$ make install . . Making install in src make[1]: Entering directory `/home/oracle/Work/srm-1.2.10/src' make[2]: Entering directory `/home/oracle/Work/srm-1.2.10/src' test -z "/home/oracle/Work/srm-1.2.10/proto_inst/usr/bin" || /usr/gnu/bin/mkdir -p "/home/oracle/Work/srm-1.2.10/proto_inst/usr/bin" /usr/bin/ginstall -c srm '/home/oracle/Work/srm-1.2.10/proto_inst/usr/bin' . . make[1]: Leaving directory `/home/oracle/Work/srm-1.2.10'
oracle@solaris:~/Work/srm-1.2.10$ ls -R proto_inst/ proto_inst/: usr proto_inst/usr: bin share proto_inst/usr/bin: srm proto_inst/usr/share: man proto_inst/usr/share/man: man1 proto_inst/usr/share/man/man1: srm.1
oracle@solaris:~/Work/srm-1.2.10$ ./proto_inst/usr/bin/srm --version srm (srm) 1.2.10
正常に動作するsrmをproto_inst領域に用意できたので、次に、マニフェストを作成します。この方法は、次のセクションで説明します。
まず、'pkgsend generate'を使用して、未処理の初期マニフェストを作成します。
oracle@solaris:~/Work/srm-1.2.10$ pkgsend generate proto_inst > srm_1_2_1_manifest
oracle@solaris:~/Work/srm-1.2.10$ cat srm_1_2_1_manifest dir group=bin mode=0755 owner=root path=usr timestamp=20110705T162628Z dir group=bin mode=0755 owner=root path=usr/share timestamp=20110705T162628Z dir group=bin mode=0755 owner=root path=usr/bin timestamp=20110705T162628Z dir group=bin mode=0755 owner=root path=usr/share/man timestamp=20110705T162628Z dir group=bin mode=0755 owner=root path=usr/share/man/man1 timestamp=20110705T162628Z file usr/share/man/man1/srm.1 group=bin mode=0644 owner=root path=usr/share/man/man1/srm.1 pkg.size=2488 file usr/bin/srm group=bin mode=0755 owner=root path=usr/bin/srm pkg.size=24560
いくつかのメタ・データをマニフェストに追加しましょう。テキスト・エディタを使用して、次の5行をマニフェストに追加してください。
set name=pkg.fmri value=srm@1.2.10,5.11 set name=pkg.description value="Secure rm 1.2.10" set name=description value="Secure rm" set name=summary value="Secure rm" set name=info.classification value="org.opensolaris.category.2008:Applications/System Utilities"
次に、存在する依存関係を検出する必要があります。これは、'pkgdepend generate'を使用して行うことができます。
oracle@solaris:~/Work/srm-1.2.10$ pkgdepend generate -d ./proto_inst srm_1_2_1_manifest > srm_1_2_1_depend
oracle@solaris:~/Work/srm-1.2.10$ cat srm_1_2_1_depend depend fmri=__TBD pkg.debug.depend.file=libc.so.1 pkg.debug.depend.path=lib pkg.debug.depend.path=usr/ccs/lib pkg.debug.depend.path=usr/lib pkg.debug.depend.path=usr/sfw/lib pkg.debug.depend.reason=usr/bin/srm pkg.debug.depend.type=elf type=require
依存関係が分かったので、これらをパッケージに解決しましょう。
oracle@solaris:~/Work/srm-1.2.10$ pkgdepend resolve srm_1_2_1_depend
oracle@solaris:~/Work/srm-1.2.10$ ls *.res srm_1_2_1_depend.res
oracle@solaris:~/Work/srm-1.2.10$ more srm_1_2_1_depend.res depend fmri=pkg:/system/library@0.5.11-0.151.0.1 type=require
ここから、1つのパッケージにのみ依存していることが分かります。これをマニフェスト・ファイルに追加して、フォーマットしましょう。
oracle@solaris:~/Work/srm-1.2.10$ cat srm_1_2_1_depend.res >> srm_1_2_1_manifest
oracle@solaris:~/Work/srm-1.2.10$ pkgfmt srm_1_2_1_manifest
oracle@solaris:~/Work/srm-1.2.10$ more srm_1_2_1_manifest set name=pkg.fmri value=srm@1.2.10,5.11set name=pkg.description value="Secure rm 1.2.10" set name=description value="Secure rm" set name=info.classification \ value="org.opensolaris.category.2008:Applications/System Utilities" set name=summary value="Secure rm" dir path=usr group=bin mode=0755 owner=root timestamp=20110705T162628Z dir path=usr/bin group=bin mode=0755 owner=root timestamp=20110705T162628Z dir path=usr/share group=bin mode=0755 owner=root timestamp=20110705T162628Z dir path=usr/share/man group=bin mode=0755 owner=root \ timestamp=20110705T162628Z dir path=usr/share/man/man1 group=bin mode=0755 owner=root \ timestamp=20110705T162628Z file usr/bin/srm path=usr/bin/srm group=bin mode=0755 owner=root \ pkg.size=24560 file usr/share/man/man1/srm.1 path=usr/share/man/man1/srm.1 group=bin \ mode=0644 owner=root pkg.size=2488 depend fmri=pkg:/system/library@0.5.11-0.151.0.1 type=require
パッケージを公開するために使用できる適切なマニフェスト・ファイルになっているようです。
このマニフェストに以下の編集を加えてください。
1) "dir path=usr/share"の権限を"group=sys"となるように調整します。
2) "dir path=usr"の権限を"group=sys"となるように調整します。
これらの2つの手順を実行しないと、このパッケージのインストールが失敗します。これは、このパッケージのインストール時に、リストで指定された権限をIPSが検証し、このマニフェストのリストは、Solaris 11によって提供されるそれらのパッケージを拒否することを要求している、と判断するためです。
3) 最後に、マニフェスト・ファイルの名前を変更して、".p5m"拡張子を付けます。
リポジトリを、(デフォルトの)読取り専用ではなく、読取り/書込み可能とすることをSMFに指示する必要があります。
oracle@solaris:~/Work/srm-1.2.10$ sudo svccfg -s pkg/server setprop pkg/readonly=false oracle@solaris:~/Work/srm-1.2.10$ sudo svcadm refresh pkg/server:default oracle@solaris:~/Work/srm-1.2.10$ sudo svcadm restart pkg/server:default oracle@solaris:~/Work/srm-1.2.10$ svcprop -p pkg/readonly pkg/server:default false oracle@solaris:~/Work/srm-1.2.10$
パッケージを公開するには、'pkgsend publish'を使用します。
oracle@solaris:~/Work/srm-1.2.10$ sudo pkgsend publish -d ./proto_inst -s /export/ips/example \
srm_1_2_1_manifest.p5m
pkg://example.com/srm@1.2.10,5.11:20111117T63324Z
PUBLISHED
パッケージを、repoがあるファイル・システムに直接公開します。パッケージが公開されたので、サービスを再起動して、このパッケージの存在を確認します。
oracle@solaris:~/Work/srm-1.2.10$ sudo svcadm disable pkg/server:default oracle@solaris:~/Work/srm-1.2.10$ sudo svcadm enable pkg/server:default oracle@solaris:~/Work/srm-1.2.10$ pkgrepo info -s http://localhost:10001 PUBLISHER PACKAGES STATUS UPDATED example.com 1 online 2011-11-17T17:43:48.638470Z
srmパッケージがローカル・リポジトリに公開されたので、インストールできるかどうか試してみましょう。
まず、ローカル・リポジトリをイメージに追加する必要があります。その後に、ローカル・リポジトリからのsrmのインストールを試してみることができます。
oracle@solaris:~$ pkg publisher
PUBLISHER TYPE STATUS URI
solaris (preferred) origin online http://pkg.oracle.com/solaris/release/ example.com
origin online file:/export/home/oracle/myrepo/
oracle@solaris:~$ sudo pkg unset-publisher example.com
oracle@solaris:~$ sudo pkg set-publisher -p http://localhost:10001 pkg set-publisher:
Added publisher(s): example.com
oracle@solaris:~$ pkg publisher PUBLISHER TYPE STATUS URI solaris (preferred) origin online http://pkg.oracle.com/solaris/release/ example.com origin online http://localhost:10001/
oracle@solaris:~$ pkg info -r srm Name: utilities/srm Summary: Secure rm Description: Secure rm 1.2.10 Category: Applications/System Utilities State: Not installed Publisher: example.com Version: 1.2.10 Build Release: 5.11 Branch: 0.1 Packaging Date: July 5, 2011 05:43:48 PM Size: 26.41 kB FMRI: pkg://example.com/utilities/srm@1.2.10,5.11-0.1:20110705T174348Z
oracle@solaris:~$ sudo pkg install srm Packages to install: 1 Create boot environment: No DOWNLOAD PKGS FILES XFER (MB) Completed 1/1 2/2 0.0/0.0 PHASE ACTIONS Install Phase 13/13 PHASE ITEMS Package State Update Phase 1/1 Image State Update Phase 2/2 PHASE ITEMS Reading Existing Index 8/8 Indexing Packages 1/1
oracle@solaris:~$ srm --version srm (srm) 1.2.10
以上で、ユーザー独自のIPSリポジトリの作成方法とそのリポジトリへのパッケージの公開方法に関する基本的な学習は完了です。