Go to main content
Oracle® Solaris 11.3 での Image Packaging System を使用したソフトウェアのパッケージ化と配布

印刷ビューの終了

更新: 2016 年 11 月
 
 

パッケージの作成および発行

自動化の量が多いために、通常、IPS を使用したソフトウェアのパッケージ化は簡単です。自動化によって、パッケージ化のほとんどのバグの主な原因になっていると思われる単調な反復作業が回避されます。

IPS での発行は、次の手順で構成されます。

  1. パッケージマニフェストを生成します。

  2. 生成されたマニフェストに必要なメタデータを追加します。

  3. 依存関係を評価します。

  4. 必要とされるファセットまたはアクチュエータがあれば追加します。

  5. パッケージを検証します。

  6. パッケージを発行します。

  7. パッケージをテストします。

パッケージマニフェストを生成する

インストールしたシステムに必要なコンポーネントファイルを同じディレクトリ構造にまとめることから始めるのがもっとも簡単な方法です。

これを行う 2 つの方法は次のとおりです。

  • パッケージ化するソフトウェアがすでに tarball に入っている場合は、その tarball をサブディレクトリに解凍します。autoconf ユーティリティーを使用するオープンソースのソフトウェアパッケージの多くでは、目的のプロトタイプ領域を指すように DESTDIR 環境変数を設定すると、これが行われます。autoconf ユーティリティーは、pkg:/developer/build/autoconf パッケージで入手できます。

  • メイクファイル内の install ターゲットを使用します。

ソフトウェアがバイナリ、ライブラリ、およびマニュアルページで構成され、このソフトウェアを、mysoftware という名前の /opt 下のディレクトリにインストールするとします。このレイアウトにソフトウェアが表示されるディレクトリをビルド領域に作成します。次の例では、このディレクトリに proto という名前が付けられています。

proto/opt/mysoftware/lib/mylib.so.1
proto/opt/mysoftware/bin/mycmd
proto/opt/mysoftware/man/man1/mycmd.1

pkgsend generate コマンドを使用して、この proto 領域のマニフェストを生成します。pkgfmt によって出力用パッケージマニフェストをパイプで連結して、そのマニフェストをより読み取りやすくします。詳細は、pkgsend(1) および pkgfmt(1) のマニュアルページを参照してください。

次の例では、proto ディレクトリは現在の作業用ディレクトリにあります。

$ pkgsend generate proto | pkgfmt > mypkg.p5m.1

出力用の mypkg.p5m.1 ファイルには次の行が含まれています。

dir  path=opt owner=root group=bin mode=0755
dir  path=opt/mysoftware owner=root group=bin mode=0755
dir  path=opt/mysoftware/bin owner=root group=bin mode=0755
file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \
    group=bin mode=0644
dir  path=opt/mysoftware/lib owner=root group=bin mode=0755
file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \
    owner=root group=bin mode=0644
dir  path=opt/mysoftware/man owner=root group=bin mode=0755
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644

パッケージ化されるファイルのパスは、file アクションに 2 回出現します。

  • file という語のあとの最初の語は、proto 領域でのそのファイルの場所を表しています。

  • path= 属性のパスは、そのファイルがインストールされる場所を示しています。

この二重のエントリによって、proto 領域を変更しなくてもインストール場所を変更できます。この機能によって、別のオペレーティングシステムにインストールするように作られたソフトウェアを再パッケージ化する場合などに、かなりの時間を節約できる可能性があります。

pkgsend generate によってディレクトリの所有者とグループにデフォルト値が適用されていることに注意してください。/opt の場合、デフォルトは正しくありません。そのディレクトリはシステム上にすでに存在しているほかのパッケージによって配布されるので削除してください。そうすれば、/opt の属性がすでにシステム上に存在しているものと競合する場合、pkg(1) はそのパッケージをインストールしません。下記の 生成されたマニフェストに必要なメタデータを追加するでは、不要なディレクトリをプログラムで削除する方法を示しています。

ファイル名に等号 (=)、二重引用符 (")、または空白文字が含まれている場合、次の例に示すように、pkgsendhash 属性をマニフェスト内に生成します。

$ mkdir -p proto/opt
$ touch proto/opt/my\ file1
$ touch proto/opt/"my file2"
$ touch proto/opt/my=file3
$ touch proto/opt/'my"file4'
$ pkgsend generate proto
dir group=bin mode=0755 owner=root path=opt
file group=bin hash=opt/my=file3 mode=0644 owner=root path=opt/my=file3
file group=bin hash="opt/my file2" mode=0644 owner=root path="opt/my file2"
file group=bin hash='opt/my"file4' mode=0644 owner=root path='opt/my"file4'
file group=bin hash="opt/my file1" mode=0644 owner=root path="opt/my file1"

パッケージを発行するで説明しているように、そのパッケージが発行されると (Publish the Packageを参照)、ファイルアクション 属性の値はファイル内容の SHA-1 ハッシュになります。

生成されたマニフェストに必要なメタデータを追加する

パッケージでは次のメタデータを定義するようにします。これらの値とその設定方法の詳細は、設定アクションを参照してください。

pkg.fmri

パッケージの名前とバージョン (パッケージ名および パッケージバージョン を参照)。パッケージ名と依存関係については、パッケージ内容の競合の回避を参照してください。パッケージを発行するに示すように、パッケージが発行されるとパブリッシャー名が自動的に追加されます。パッケージバージョンを設定するための追加のヘルプについては、適切なパッケージバージョン文字列の作成を参照してください。Oracle Solaris でのバージョン管理については、Oracle Solaris パッケージのバージョン管理を参照してください。

pkg.description

パッケージの内容の説明

pkg.summary

その説明の 1 行の概要。

variant.arch

このパッケージに適した各アーキテクチャー。パッケージ全体をどのアーキテクチャーでもインストールできる場合は、variant.arch を省略できます。さまざまなアーキテクチャーのさまざまなコンポーネントを含むパッケージの作成については、バリエーションの許可で説明しています。

info.classification

packagemanager(1) GUI で使用されるグループ化スキーム。サポートされる値は、パッケージの分類に記載しています。このセクション内の例では、任意の分類が指定されています。

この例ではまた、mysoftware 下の man ディレクトリを指す link アクションを /usr/share/man/index.d に追加します。このリンクについては、必要とされるファセットまたはアクチュエータがあれば追加するで詳しく説明されています。

生成されたマニフェストを直接変更するのではなく、pkgmogrify(1) を使用して生成されたマニフェストを編集します。pkgmogrify を使用してパッケージマニフェストを変更する方法の詳細は、プログラムによるパッケージマニフェストの変更を参照してください。

次の pkgmogrify 入力ファイルを作成して、マニフェストに加えられる変更を指定します。このファイルを mypkg.mog という名前にします。この例では、アーキテクチャーの定義にマクロが使用され、マニフェストから /opt ディレクトリを削除するのに正規表現の照合が使用されます。

set name=pkg.fmri value=mypkg@1.0,5.11-0
set name=pkg.summary value="This is an example package"
set name=pkg.description value="This is a full description of \
all the interesting attributes of this example package."
set name=variant.arch value=$(ARCH)
set name=info.classification \
    value=org.opensolaris.category.2008:Applications/Accessories
link path=usr/share/man/index.d/mysoftware target=/opt/mysoftware/man
<transform dir path=opt$->drop>

mypkg.mog の変更とともに mypkg.p5m.1 マニフェストで pkgmogrify を実行します。

$ pkgmogrify -DARCH=`uname -p` mypkg.p5m.1 mypkg.mog | pkgfmt > mypkg.p5m.2

出力用の mypkg.p5m.2 ファイルには次の内容が含まれています。path=optdir アクションが削除され、mypkg.mog からのメタデータとリンクの内容が元の内容 mypkg.p5m.1 に追加されました。

set name=pkg.fmri value=mypkg@1.0,5.11-0
set name=pkg.summary value="This is an example package"
set name=pkg.description \
    value="This is a full description of all the interesting attributes of this 
example package."
set name=info.classification \
    value=org.opensolaris.category.2008:Applications/Accessories
set name=variant.arch value=i386
dir  path=opt/mysoftware owner=root group=bin mode=0755
dir  path=opt/mysoftware/bin owner=root group=bin mode=0755
file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \
    group=bin mode=0644
dir  path=opt/mysoftware/lib owner=root group=bin mode=0755
file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \
    owner=root group=bin mode=0644
dir  path=opt/mysoftware/man owner=root group=bin mode=0755
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644
link path=usr/share/man/index.d/mysoftware target=/opt/mysoftware/man

適切なパッケージバージョン文字列の作成

IPS パッケージバージョン文字列のコンポーネントバージョン、リリース、およびブランチバージョン (パッケージバージョンを参照してください) には、次の制約があります。

  • すべての内容がピリオドまたは整数だけである必要があります。製品バージョンにほかの文字 (英字など) が含まれている場合は、整数とピリオドだけを使用して同じ意味を伝える IPS パッケージのバージョンを選択します。たとえば、製品バージョンが P17-u4-r3 である場合は、パッケージバージョンとして 17.4.3 を使用できます。

  • 複数の整数の並びを 0 で始めることはできません。この形式により、パッケージバージョンでのソートが可能になります。たとえば、バージョン 1.20 はソートでバージョン 1.0.2 より新しくなりますが、1.02 は無効です。製品バージョン 17.03 がその製品のバージョン 17 の 3 番目のテストリリースを示し、最終的にリリースされる製品がバージョン 17.0 になる場合は、テストリリースとして 16.99.3、16.99.4 などのパッケージバージョンを使用できます。バージョン 17.0 が 16.99 バージョンより新しいと見なされるのに対して、17.0 は 17.0.3 より新しくありません。

次の例に示すように、pkg.human-version 属性を使用して実際の製品バージョン文字列を指定できます。

set name=pkg.human-version value="P17-u4-r3"

パッケージ FMRI のパッケージバージョンに加えて pkg.human-version 属性の値を指定できますが、この値によってパッケージ FMRI バージョンを置き換えることはできません。pkg.human-version のバージョン文字列は、表示のためにのみ使用されます。詳細は、設定アクションを参照してください。

依存関係を評価する

pkgdepend(1) コマンドを使用して、パッケージの依存関係を自動的に生成します。生成される depend アクションは 依存アクションに定義しており、パッケージ依存関係の指定で詳しく説明しています。

依存関係の生成は 2 つの別々の手順から成ります。

  1. 依存関係の生成。ソフトウェアが依存するファイルを特定します。pkgdepend generate コマンドを使用します。

  2. 依存関係の解決。ソフトウェアが依存するそれらのファイルを含むパッケージを特定します。pkgdepend resolve コマンドを使用します。

パッケージの依存関係を生成する


ヒント  -  depend アクションを手動で宣言するのではなく、pkgdepend を使用して依存関係を生成するようにします。手動による依存関係は、パッケージの内容が時間の経過に伴って変わると、不正確または不必要になることがあります。たとえば、アプリケーションが依存しているファイルが別のパッケージに移動されると、手動で宣言した前のパッケージへの依存関係はどれもその依存関係にとって正しくないものになります。

手動で宣言した依存関係の一部は、pkgdepend が依存関係を完全に特定できない場合に必要になることがあります。そのような場合は、説明のコメントをマニフェストに追加するようにしてください。

次のコマンドでは、-m オプションによって pkgdepend はマニフェスト全体をその出力に含めます。-d オプションは proto ディレクトリをコマンドに渡します。

$ pkgdepend generate -md proto mypkg.p5m.2 | pkgfmt > mypkg.p5m.3

出力用の mypkg.p5m.3 ファイルには次の内容が含まれています。pkgdepend ユーティリティーは、mylib.so.1mycmd の両方による libc.so.1 への依存関係についての表記を追加しました。mycmdmylib.so.1 の間の内部依存関係は暗黙のうちに省略されます。

set name=pkg.fmri value=mypkg@1.0,5.11-0
set name=pkg.summary value="This is an example package"
set name=pkg.description \
    value="This is a full description of all the interesting attributes of this 
example package."
set name=info.classification \
    value=org.opensolaris.category.2008:Applications/Accessories
set name=variant.arch value=i386
dir  path=opt/mysoftware owner=root group=bin mode=0755
dir  path=opt/mysoftware/bin owner=root group=bin mode=0755
file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \
    group=bin mode=0644
dir  path=opt/mysoftware/lib owner=root group=bin mode=0755
file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \
    owner=root group=bin mode=0644
dir  path=opt/mysoftware/man owner=root group=bin mode=0755
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644
link path=usr/share/man/index.d/mysoftware target=/opt/mysoftware/man
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 \
    pkg.debug.depend.reason=opt/mysoftware/bin/mycmd \
    pkg.debug.depend.type=elf type=require pkg.debug.depend.path=lib \
    pkg.debug.depend.path=opt/mysoftware/lib pkg.debug.depend.path=usr/lib
depend fmri=__TBD pkg.debug.depend.file=libc.so.1 \
    pkg.debug.depend.reason=opt/mysoftware/lib/mylib.so.1 \
    pkg.debug.depend.type=elf type=require pkg.debug.depend.path=lib \
    pkg.debug.depend.path=usr/lib

パッケージの依存関係を解決する

依存関係を解決するには、pkgdepend で、イメージに現在インストールされているパッケージのうち、ソフトウェアの構築に使用されるものを調べます。デフォルトでは、pkgdepend はその出力を mypkg.p5m.3.res に格納します。この手順ではそれが実行されているシステムに関する大量の情報をロードするため、実行するのにしばらく時間がかかります。この時間をすべてパッケージに分散させると、pkgdepend ユーティリティーは同時に多くのパッケージを解決できます。1 度に 1 つのパッケージに対して pkgdepend を実行すると、時間効率がよくありません。

$ pkgdepend resolve -m mypkg.p5m.3

これが完了すると、出力用の mypkg.p5m.3.res ファイルには次の内容が含まれています。pkgdepend ユーティリティーは、libc.so.1 へのファイル依存関係についての表記を、そのファイルを配布する pkg:/system/library へのパッケージ依存関係に変換しました。

set name=pkg.fmri value=mypkg@1.0,5.11-0
set name=pkg.summary value="This is an example package"
set name=pkg.description \
    value="This is a full description of all the interesting attributes of this 
example package."
set name=info.classification \
    value=org.opensolaris.category.2008:Applications/Accessories
set name=variant.arch value=i386
dir  path=opt/mysoftware owner=root group=bin mode=0755
dir  path=opt/mysoftware/bin owner=root group=bin mode=0755
file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \
    group=bin mode=0644
dir  path=opt/mysoftware/lib owner=root group=bin mode=0755
file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \
    owner=root group=bin mode=0644
dir  path=opt/mysoftware/man owner=root group=bin mode=0755
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644
link path=usr/share/man/index.d/mysoftware target=/opt/mysoftware/man
depend fmri=pkg:/system/library@0.5.11-0.175.2.0.0.18.0 type=require

必要とされるファセットまたはアクチュエータがあれば追加する

ファセットは、必須ではないがオプションでインストールできるアクションを示します。アクチュエータは、関連するアクションがインストール、更新、または削除されたときに発生する必要があるシステム変更を指定します。ファセットについては、バリエーションの許可で詳しく説明しており、アクチュエータについては、パッケージインストールの一環としてのシステム変更の自動化で詳しく説明しています。

このサンプルパッケージは、マニュアルページを opt/mysoftware/man/man1 に配布します。このセクションでは、マニュアルページがオプションであることを示すファセットタグを追加する方法について説明します。ユーザーは、そのパッケージのマニュアルページ以外のすべてをインストールすることを選択できます。(ユーザーが Oracle Solaris 11.3 ソフトウェアの追加と更新 の オプションのコンポーネントのインストールの制御で説明されているように、ファセットプロパティー doc.man=false を設定した場合、facet.doc.man=true でタグ付けされたアクションはどのパッケージからもインストールされません)。

マニュアルページをインデックスに含めるには、そのパッケージがインストールされるときに svc:/application/man-index:default SMF サービスを再起動する必要があります。このセクションでは、restart_fmri アクチュエータを追加してそのタスクを実行する方法について説明します。man-index サービスは、マニュアルページを含むディレクトリへのシンボリックリンクを /usr/share/man/index.d で探して、各リンクのターゲットを、それがスキャンするディレクトリのリストに追加します。マニュアルページをインデックスに含めるために、このサンプルパッケージには /usr/share/man/index.d/mysoftware から /opt/mysoftware/man へのリンクが含まれています。このリンクとこのアクチュエータを含めることは、ソフトウェアの自己アセンブリで説明されている、Oracle Solaris OS のパッケージ化全体にわたって使用される自己アセンブリのよい例です。

使用できる一連の pkgmogrify 変換は /usr/share/pkg/transforms で入手できます。これらの変換は Oracle Solaris OS のパッケージ化に使用され、プログラムによるパッケージマニフェストの変更で詳しく説明しています。

ファイル /usr/share/pkg/transforms/documentation には、この例でマニュアルページのファセットを設定したり、man-index サービスを再起動したりするために必要な変換と同じような変換が含まれています。この例はマニュアルページを /opt に配布するため、documentation 変換は下記のように変更される必要があります。これらの変更された変換には正規表現 opt/.+/man(/.+)? が含まれており、これは man サブディレクトリを含む、opt のすぐ下のすべてパスに一致します。次の変更された変換を /tmp/doc-transform に保存します。

<transform dir file link hardlink path=opt/.+/man(/.+)? -> \
    default facet.doc.man true>
<transform file path=opt/.+/man(/.+)? -> \
    add restart_fmri svc:/application/man-index:default>

次のコマンドを使用して、これらの変換をマニフェストに適用します。

$ pkgmogrify mypkg.p5m.3.res /tmp/doc-transform | pkgfmt > mypkg.p5m.4.res

入力用の mypkg.p5m.3.res マニフェストには、次の 3 つのマニュアルページ関連アクションが含まれています。

dir  path=opt/mysoftware/man owner=root group=bin mode=0755
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644

変換の適用後、出力用の mypkg.p5m.4.res マニフェストには次の変更されたアクションが含まれています。

dir  path=opt/mysoftware/man owner=root group=bin mode=0755 facet.doc.man=true
dir  path=opt/mysoftware/man/man1 owner=root group=bin mode=0755 \
    facet.doc.man=true
file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \
    owner=root group=bin mode=0644 \
    restart_fmri=svc:/application/man-index:default facet.doc.man=true

ヒント  -  効率を良くするため、これらの変換は、依存関係の評価前の、メタデータが最初に追加されたときに追加することもできました。

パッケージを検証する

発行前の最後の手順は、マニフェストに対して pkglint(1) を実行して、発行およびテスト前に特定できるエラーを見つけることです。pkglint で見つけられるエラーの中には、発行時またはユーザーがパッケージのインストールを試みたときに見つかるものもありますが、当然ながらパッケージオーサリングプロセスでできるだけ早くエラーを特定するのが望ましいことです。

pkglint で報告されるエラーの例には次があります。

  • 配布するファイルがすでに別のパッケージで所有されている。

  • ディレクトリのような、共有された参照カウントアクションのメタデータに違いがある。このエラーの例については、パッケージマニフェストを生成するの終わりで説明されています。

pkglint が実行するチェックの完全なリストを表示するには、pkglint -L コマンドを使用します。特定のチェックを有効化、無効化、および省略する方法の詳細な情報は、pkglint(1) のマニュアルページに記載されています。このマニュアルページには、追加のチェックを実行するために pkglint を拡張する方法も詳述されています。

pkglint は次のいずれかのモードで実行できます。

  • パッケージマニフェストに対して直接。通常、マニフェストの有効性をすばやくチェックするためには、このモードで十分です。

  • パッケージマニフェストに対して (パッケージリポジトリも参照)。このモードは、リポジトリへの発行前に少なくとも 1 回は使用してください。

    リポジトリを参照することで、pkglint は追加のチェックを行なって、パッケージがそのリポジトリ内のほかのパッケージとうまく相互作用することを確認できます。

次の出力には、サンプルマニフェストの問題が示されています。

$ pkglint mypkg.p5m.4.res
Lint engine setup...
Starting lint run...
WARNING pkglint.action005.1       obsolete dependency check skipped: unable
to find dependency pkg:/system/library@0.5.11-0.175.2.0.0.18.0 for
pkg:/mypkg@1.0,5.11-0

この警告はこの例で許容されます。pkglint.action005.1 警告は、pkglint が、このサンプルパッケージが依存している pkg:/system/library@0.5.11-0.175.2.0.0.18.0 と呼ばれるパッケージを見つけられなかったことを伝えています。この依存関係パッケージはパッケージリポジトリ内にあり、pkglint が引数にマニフェストファイルのみを指定して呼び出されたため、見つかりませんでした。

次のコマンドでは、-r オプションによって依存関係パッケージを含むリポジトリが参照されます。-c オプションは、lint リポジトリおよび参照リポジトリからパッケージのメタデータをキャッシュするために使用されるローカルディレクトリを指定します。

$ pkglint -c ./solaris-reference -r http://pkg.oracle.com/solaris/release mypkg.p5m.4.res

パッケージを発行する

ローカルファイルベースのリポジトリにパッケージを発行します。このリポジトリは、この新しいパッケージの開発およびテスト用のリポジトリです。一般的な使用の目的でリポジトリを作成する場合は、そのリポジトリ用の個別ファイルシステムの作成などの追加手順を含めてください。一般的な用途のパッケージリポジトリを作成することについては、Oracle Solaris 11.3 パッケージリポジトリのコピーと作成を参照してください。

非大域ゾーンを含むパッケージをテストするには、システムリポジトリを介してリポジトリの場所にアクセス可能である必要があります。非大域ゾーン内で pkg publisher または pkg listコマンドを使用して、パッケージがアクセス可能であることを確認します。

pkgrepo(1) コマンドを使用して、システムにリポジトリを作成します。

$ pkgrepo create my-repository
$ ls my-repository
pkg5.repository

このリポジトリのデフォルトパブリッシャーを設定します。デフォルトパブリッシャーは、リポジトリの publisher/prefix プロパティーの値です。

$ pkgrepo -s my-repository set publisher/prefix=mypublisher

pkgsend publish コマンドを使用して、新しいパッケージを発行します。複数の pkgsend publish プロセスが同じ -s リポジトリに対して同時に発行する場合、パブリッシャーカタログに対する更新は連続して実行する必要があるため、--no-catalog オプションを指定することを推奨します。複数のプロセスが同時にパッケージを発行するときは、--no-catalog オプションを使用しないと、発行のパフォーマンスが大幅に低下する可能性があります。公開の完了後、pkgrepo refresh コマンドを使用してそれぞれのパブリッシャーカタログに新しいパッケージを追加できます。

$ pkgsend -s my-repository publish -d proto mypkg.p5m.4.res
pkg://mypublisher/mypkg@1.0,5.11-0:20130720T005452Z
PUBLISHED

リポジトリのデフォルトパブリッシャーがパッケージ FMRI に適用されている点に注意してください。

新しいリポジトリのアクセス権、内容、および署名が正しいことを確認します。

$ pkgrepo verify -s my-repository

リポジトリを調べるには、pkgrepo および pkg list コマンドを使用できます。

$ pkgrepo info -s my-repository
PUBLISHER   PACKAGES STATUS           UPDATED
mypublisher 1        online           2013-07-20T00:54:52.758591Z
$ pkgrepo list -s my-repository
PUBLISHER   NAME                    O VERSION
mypublisher mypkg                     1.0,5.11-0:20130720T005452Z
$ pkg list -afv -g my-repository
FMRI                                                     IFO
pkg://mypublisher/mypkg@1.0,5.11-0:20130720T005452Z      ---

pkgrepo listO 列は、パッケージが廃止された (o) または名前変更された (r) ことを示します。

HTTP 経由で発行するときには着信パッケージに対する承認または認証のチェックがないため、通常、HTTP リポジトリに新しいパッケージを直接発行することはお勧めしません。パッケージを HTTP リポジトリに発行する代わりに、パッケージリポジトリへの配布で説明するように、すでに発行されているパッケージを HTTP リポジトリに配布します。HTTP リポジトリへの発行は、ファイルリポジトリへの NFS または SMB アクセスが不可能な場合にいくつかのシステムにわたって同じパッケージをテストするときや、セキュリティー保護されたネットワーク上で便利なことがあります。HTTP リポジトリに直接発行する場合、そのリポジトリは svc:/application/pkg/server サービスの読み取り/書き込みインスタンスがあるシステム (pkg/readonly プロパティーの値が false) でホストされている必要があります。

パッケージの署名

パッケージに署名する場合は、この時点で行なってからパッケージをテストし、一般的な用途のリポジトリまたはパッケージアーカイブにパッケージを配布します。

次のコマンドは、パッケージマニフェストのハッシュ値を使用して、パッケージに署名します。独自の署名鍵と証明書を指定することもできます。詳細については、IPS パッケージの署名を参照してください。パッケージのタイムスタンプは変更されていません。

$ pkgsign -s my-repository -a sha256 '*'
Signed pkg://mypublisher/mypkg@1.0,5.11-0:20130720T005452Z

パッケージをテストする

パッケージ開発の最後の手順は、パッケージをインストールして、発行されたパッケージが正しくパッケージ化されているかどうかをテストすることです。

root 権限を必要としないでインストールをテストするには、テストユーザーにソフトウェアインストールプロファイルを割り当てます。テストユーザーにソフトウェアインストールに関連するプロファイルを割り当てるには、usermod コマンドの -P オプションを使用します。


注 -  このイメージに子イメージ (非大域ゾーン) がインストールされている場合は、pkg install コマンドで -g オプションを使用して、このパッケージのインストールをテストすることはできません。イメージ内で mypublisher パブリッシャーを構成する必要があります。

次の pkg set-publisher コマンドは、my-repository リポジトリ内のすべてのパブリッシャーを、このイメージで構成されているパブリッシャーの一覧に追加します。

$ pkg publisher
PUBLISHER    TYPE    STATUS P LOCATION
solaris      origin  online F http://pkg.oracle.com/solaris/release/
$ pkg set-publisher -p my-repository
pkg set-publisher:
  Added publisher(s): mypublisher
$ pkg publisher
PUBLISHER    TYPE    STATUS P LOCATION
solaris      origin  online F http://pkg.oracle.com/solaris/release/
mypublisher  origin  online F file:///home/username/my-repository/

イメージを変更せずに、インストールコマンドが実行する内容を確認するには、pkg install コマンドに -nv オプションを使用します。次のコマンドでは、実際にパッケージをインストールします。

$ pkg install mypkg
           Packages to install:  1 
       Create boot environment: No
Create backup boot environment: No
            Services to change:  1

DOWNLOAD                                  PKGS       FILES   XFER (MB)   SPEED
Completed                                  1/1         3/3     0.0/0.0  787k/s

PHASE                                          ITEMS
Installing new actions                         16/16
Updating package state database                 Done
Updating image state                            Done
Creating fast lookup database                   Done
Reading search index                            Done
Updating search index                            1/1

システム上に配布されたソフトウェアを調べます。

$ find /opt/mysoftware
/opt/mysoftware
/opt/mysoftware/bin
/opt/mysoftware/bin/mycmd
/opt/mysoftware/lib
/opt/mysoftware/lib/mylib.so.1
/opt/mysoftware/man
/opt/mysoftware/man/man1
/opt/mysoftware/man/man1/mycmd.1
/opt/mysoftware/man/man-index
/opt/mysoftware/man/man-index/term.dic
/opt/mysoftware/man/man-index/term.req
/opt/mysoftware/man/man-index/term.pos
/opt/mysoftware/man/man-index/term.exp
/opt/mysoftware/man/man-index/term.doc
/opt/mysoftware/man/man-index/.index-cache
/opt/mysoftware/man/man-index/term.idx

バイナリとマニュアルページに加えて、アクチュエータが man-index サービスを再起動した結果としてマニュアルページのインデックスもシステムにより生成されました。

pkg info コマンドは、パッケージに追加されたメタデータを表示します。

$ pkg info mypkg
          Name: mypkg
       Summary: This is an example package
   Description: This is a full description of all the interesting attributes of
                this example package.
      Category: Applications/Accessories
         State: Installed
     Publisher: mypublisher
       Version: 1.0
 Build Release: 5.11
        Branch: 0
Packaging Date: July 20, 2013 00:54:52 AM 
          Size: 12.95 kB
          FMRI: pkg://mypublisher/mypkg@1.0,5.11-0:20130720T005452Z

pkg search コマンドは、mypkg によって配布されるファイルのクエリー検索時にヒットしたものを返します。

$ pkg search -l mycmd
INDEX      ACTION VALUE                    PACKAGE
basename   file   opt/mysoftware/bin/mycmd pkg:/mypkg@1.0-0

パッケージを配布する

IPS には、ユーザーがパッケージをインストールできるようにする 3 通りのパッケージ配布方法があります。

ローカルファイルベースのリポジトリ

ユーザーはローカルネットワーク経由でこのリポジトリにアクセスします。パブリッシャーの起点はリポジトリのパス (/net/host1/export/ipsrepo など) です。

リモート HTTP ベースのリポジトリ

ユーザーは HTTP または HTTPS 経由でこのリポジトリにアクセスします。パブリッシャーの起点は http://pkg.example.com/ などのアドレスです。

パッケージアーカイブ

パッケージアーカイブはスタンドアロンファイルです。パブリッシャーの起点はアーカイブファイルのパス (/net/host1/export/ipsarchive.p5p など) です。

どの場合でも、パッケージは パッケージを発行するで説明するように pkgsend publish コマンドを使用してすでに発行されています。一般的な用途のために既存のリポジトリまたはパッケージアーカイブにパッケージを取得するには、pkgrecv コマンドを使用します。詳細は、pkgrecv(1) のマニュアルページを参照してください。一般的な使用のためにリポジトリを作成および保持する方法については、Oracle Solaris 11.3 パッケージリポジトリのコピーと作成を参照してください。

パッケージリポジトリへの配布

次の例は、一般的な使用の目的でセットアップされたローカルファイルリポジトリに、テストリポジトリから新しいパッケージを配布する方法を示します。この例のパッケージは小さいため、get と send のサイズはゼロです。

$ pkgrecv -s my-repository -d /net/host1/export/ipsrepo mypkg
Processing packages for publisher mypublisher ...
Retrieving and evaluating 1 package(s)...
PROCESS                                         ITEMS   GET (MB)   SEND (MB)
Completed                                         1/1    0.0/0.0     0.0/0.0

新しいリポジトリにパッケージが存在することを確認します。

$ pkgrepo info -s /net/host1/export/ipsrepo
PUBLISHER   PACKAGES STATUS           UPDATED
solaris     4455     online           2013-07-09T23:41:24.312974Z
mypublisher 1        online           2013-07-22T20:57:36.951042Z
$ pkgrepo list -p mypublisher -s /net/host1/export/ipsrepo
PUBLISHER   NAME                    O VERSION
mypublisher mypkg                     1.0,5.11-0:20130720T005452Z

同じ pkgrecv コマンドを使用して、HTTP または HTTPS リポジトリにパッケージを配布します。この場合、-d 引数として、適切な pkg/server サービスインスタンスの pkg/inst_root プロパティーの値を指定します。このリポジトリは、pkg.depotd を実行する svc:/application/pkg/server サービスによりユーザーに提供されます。詳細は、pkg.depotd(1M) のマニュアルページを参照してください。

このイメージに子イメージ (非大域ゾーン) がない場合、次のコマンドに示すように、ユーザーは -g オプションを使用して新しいパッケージをインストールできます。-g オプションは、このイメージで構成されているパブリッシャーの一覧に mypublisher パブリッシャーを追加します。

$ pkg install -g /net/host1/export/ipsrepo mypkg

このイメージに子イメージが含まれている場合、次のコマンドに示すように、ユーザーはイメージ内で mypublisher パブリッシャーを構成する必要があります。

$ pkg set-publisher -p /net/host1/export/ipsrepo

パッケージアーカイブファイルとしての配布

パッケージアーカイブは、パブリッシャー情報と、そのパブリッシャーから提供される 1 つまたは複数のパッケージが含まれているスタンドアロンファイルです。パッケージをパッケージアーカイブとして配布する方法は、パッケージリポジトリにアクセスできないユーザーにとって便利です。パッケージアーカイブは、Web サイトからのダウンロード、USB キーへのコピー、DVD への書き込みが容易にできます。

pkgrecv コマンドでは、パッケージリポジトリからパッケージアーカイブにパッケージを追加したり、パッケージアーカイブからパッケージリポジトリにパッケージを追加したりすることができます。パッケージアーカイブからパッケージリポジトリにパッケージを追加する場合は、パッケージアーカイブにはデフォルトのパブリッシャー接頭辞などのリポジトリ構成が含まれていない点に注意してください。ほとんどの pkgrepo サブコマンドは、パッケージアーカイブでは動作しません。pkgrepo list コマンドはパッケージアーカイブで動作します。

次のコマンドは、mypkg パッケージのパッケージアーカイブを作成します。このアーカイブはまだ存在しないため、-a オプションを指定する必要があります。慣例的に、パッケージアーカイブにはファイル拡張子 .p5p が付きます。

$ pkgrecv -s my-repository -a -d myarchive.p5p mypkg
Retrieving packages for publisher mypublisher ...
Retrieving and evaluating 1 package(s)...
DOWNLOAD                                  PKGS       FILES   XFER (MB)   SPEED
Completed                                  1/1         3/3     0.0/0.0  782k/s

ARCHIVE                                              FILES   STORE (MB)
myarchive.p5p                                        14/14      0.0/0.0

このイメージに子イメージ (非大域ゾーン) がない場合、次のコマンドに示すように、ユーザーは -g オプションを使用して新しいパッケージをインストールできます。-g オプションは、このイメージで構成されているパブリッシャーの一覧に mypublisher パブリッシャーを追加します。

$ pkg install -g myarchive.p5p mypkg

このイメージに子イメージが含まれている場合、次のコマンドに示すように、ユーザーはイメージ内で mypublisher パブリッシャーを構成する必要があります。

$ pkg set-publisher -p myarchive.p5p

パッケージアーカイブを、非大域ゾーンのローカルパブリッシャーのソースとして設定できます。

パッケージリポジトリとパッケージアーカイブの使用

pkgrepo コマンドを使用して、リポジトリまたはアーカイブから使用可能な最新のパッケージを一覧表示します。

$ pkgrepo list -s my-repository '*@latest'
PUBLISHER   NAME                                          O VERSION
mypublisher mypkg                                           1.0,5.11-0:20130720T005452Z
$ pkgrepo list -s myarchive.p5p '*@latest'
PUBLISHER   NAME                                          O VERSION
mypublisher mypkg                                           1.0,5.11-0:20130720T005452Z

この出力は、ある特定のリポジトリから最新バージョンのすべてのパッケージでアーカイブを作成するためのスクリプトの構築に役立つことがあります。