What You See Is What You Get Element

パッケージをImage Packaging Systemに公開する方法

OTNのシステム管理者/開発者コミュニティのハンズオン・ラボ
 

feedback_button

このラボでは、Image Packaging System(IPS)の概念、システム・ソフトウェアを管理するプロセス、およびユーザー独自のソフトウェア・パッケージをIPS形式で公開するプロセスを示します(IPSおよびOracle Solaris 11について詳しくは、こちら)。



前提条件

  • Oracle Solaris 11がOracle VM VirtualBoxにインストールされている必要があります。  
    • ラボ1を参照してください。

このハンズオン・ラボでは、以下のテクノロジーに関するある程度の基礎知識またはプログラミング経験があることが前提となっています。

  • Solarisオペレーティング環境に関する基礎知識
  • Cプログラミングおよびスクリプト言語に関する基礎知識
  • サポートされるOS:Oracle Solaris 11
  • メモリ要件:1GB(推奨)
  • 追加ディスク領域要件:150MB(VirtualBoxを使用する場合はホスト上に8GBのディスク領域が必要)

ラボに必要な追加のソフトウェア:

  • GNU Cコンパイラ。これをインストールするには、rootパスワードを手元に用意して、"sudo pkg install gcc-3"を実行する必要があります。

ラボの演習

  1. IPSの概要
  2. IPSのコマンドの使用
  3. ユーザー独自のローカルIPSリポジトリの作成
  4. 簡単なアプリケーションのパッケージ化とIPSリポジトリへの送信

演習1:IPSの概要

予想される所要時間:20分間

はじめに

Oracle Solaris 11では新しいパッケージ管理方法を採用し、パッチと更新の管理プロセスを大幅に簡素化しています。そのため、オペレーティング・システムのメンテナンスに関するリスクが軽減されます。Solaris 11では、それ以前のOracle Solarisリリースで使用されていた古いSVR4パッケージに代わるImage Packaging System(IPS)が導入されました。IPSによって、ソフトウェアのライフ・サイクル管理が大幅に簡素化されます。IPSは、ソフトウェアのライフ・サイクル全体に対処するように設計されており、ソフトウェアのパッケージ化、デプロイとインストール、更新、システム・アップグレード、ソフトウェア・パッケージの削除を処理します。また、IPSは、ZFSと緊密に統合されており、ZFSの機能(スナップショット、クローンなど)を使用して、メンテナンスに伴なうリスクと停止時間を最小限に抑えます。

IPSの概要図

IPSの用語

最初に、IPSで使用される用語と概念を理解する必要があります。

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は、以下の一連の情報で構成されています。

  • スキーム – pkg
  • パブリッシャ – solaris
  • カテゴリ - system
  • パッケージ名 – library
  • バージョン文字列 – 以下の4つの要素で構成されます。
    • コンポーネント・バージョン – 5.11
    • ビルド・バージョン – 5.11
    • ブランチ・バージョン – 175.0.0
    • ISO-8601基本書式でのタイムスタンプ – 20111019T082311Z

IPSパブリッシャおよびリポジトリ

  • パブリッシャは、パッケージを公開する個人、個人のグループ、または会社です。
  • リポジトリまたはデポ・サーバーは、パッケージのダウンロード元となる場所(http://pkg.oracle.com/solaris/releaseなど)です。
  • リポジトリには、多数のパブリッシャのパッケージを格納できます。反対に、多数のリポジトリに単一のパブリッシャのパッケージを格納することもできます。
  • デフォルトの(または優先される)パブリッシャは、デフォルトのカタログに似ています。インストールのために選択されたパッケージは、まず、優先されるパブリッシャのカタログで検索されます。異なるリポジトリからダウンロードする際には、同じ名前を持つパッケージを利用することもできます。

IPSイメージおよびブート環境

イメージは、パッケージとその関連ファイル、ディレクトリ、リンク、および依存関係をインストールできるシステム上の場所です。
イメージには、次の3つの種類があります。

  • フル・イメージ -- 完全なシステムを提供できます。
  • ゾーン・イメージ -- フル・イメージ(親イメージ)に関連付けられます。これにより、そのソフトウェアと大域ゾーンにインストールされているものとの整合性が確保されます。
  • ユーザー・イメージ -- 再配置可能なパッケージのみを含みます。ユーザー・イメージの例は、複数のプラットフォームのIPSを使用するGlassfish 3のインストールです。

システムへのOracle Solaris 11のインストールが完了すると、自動的にイメージを使用できるようになります。イメージを明示的に作成しなくてもパッケージをインストールできます。ただし、異なるソフトウェア・アプリケーション用に論理的分離を使用する場合(特にゾーンを使用している場合に必要)は、イメージを作成する必要があります。

次の図は、イメージの概念を示しています。

イメージの概念

SolarisでのZFSおよびブート管理との緊密な統合を実現する設計により、pkg(1)は、パッケージのインストールが失敗した場合やインストールの結果として得られた環境が望ましいものではない場合にZFSスナップショットを使用して容易にロールバックできる機能を提供します。IPSは、更新されるソフトウェアに関する分析を実行し、必要と判断される場合('pkg更新'シーケンスの実行時)は、更新されたパッケージ・バージョンのインストール先となる新しいブート環境(BE)を自動的に作成します。この新しいBEは再起動時にアクティブ化されます。古いBEは、アップグレードの結果としてシステムが正常に動作しなかったり、機能が使用できなくなったりした場合に、ロールバック用の代替環境として使用できます(Solaris 11では、beadmコマンドを使用して、ブート環境の動作をリスト表示し、制御することができます)。

BEについて詳しくは、Oracle Solaris 11によるブート環境の管理方法に関する説明を参照してください。

パッケージのバリアントとファセット

ソフトウェアは、オプションのコンポーネントや相互に排他的なコンポーネントを持つことができます。オプションのコンポーネントの例は、ロケールドキュメントです。相互に排他的なコンポーネントの例は、SPARCx86デバッグ・バイナリと非デバッグ・バイナリです。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つ以上のファセットによってタグ付けされているアクションは除外されます。

  • バリアント・タグは、論理積(AND)に相当します。どのバリアント・タグとも一致しないアクションはインストールされません。
  • ファセット・タグは、論理和(OR)に相当します。いずれかのファセット・タグと一致するアクションは除外されません。

単一のアクションは、複数のファセットおよびバリアント・タグを持つことができます。複数のファセットおよびバリアント・タグを持つコンポーネントの例は、開発者によって使用されるアーキテクチャ固有のヘッダー・ファイルです。

バリアントおよびファセットは、イメージ・レベルで設定されます。特定のプロパティに設定されたバリアントを持つイメージは、そこにインストールされているバリアントに一致するアクションだけを持つことができます。たとえば、x86パッケージをSPARCイメージにインストールすることはできません。

IPSのコマンド

  • pkg(1)
    • pkg(1)コマンドは、イメージの作成、イメージへのパッケージのインストール、およびイメージ上のパッケージの管理に使用されます。
  • pkgdepend(1)
    • pkgdepend(1)は、パッケージの依存関係の作成と解決に使用されます。パッケージは、他のパッケージのファイルに依存する場合があります。
      pkgdepend(1)は、通常、次の2つの操作に使用されます。
      • ファイルの依存関係の作成
      • ファイルからパッケージへの解決
  • pkgmogrify(1)
    • pkgmogrify(1)は、pkgdepend(1)によって作成された新しいマニフェスト・ファイルを変換するために使用されます。
  • pkgsend(1)
    • pkgsend(1)コマンドは、パッケージをイメージから既存のリポジトリに公開するために使用されます。
  • pkgrecv(1)
    • pkgrecv(1)コマンドは、パッケージの内容をサーバーからダウンロードするために使用されます。pkgrecv(1)を使用すると、取得したパッケージをローカル・リポジトリに自動的に再公開できます。また、パッケージ属性を追加することによってパッケージの内容を変更し、そのパッケージをpkgsend(1)コマンドによって再公開することもできます。
  • pkgrepo(1M)
    • pkgrepo(1M)コマンドは、ローカル・リポジトリのストレージとプロパティを作成および管理するために使用されます。
  • pkg.depotd(1M)
    • pkg.depotd(1M)デーモンは、ユーザー独自のネットワーク・リポジトリを実行したり、ミラー・リポジトリをセットアップしたりするために使用されます。

IPSのGUIツール

クライアント側では、IPSは、"Package Manager"と呼ばれるグラフィカルなフロントエンドを備えています。"Package Manager"により、パッケージを検索、インストール、更新、削除したり、リポジトリを管理したり、ブート環境を管理したりすることができます。

Package Manager

IPSでは、Update Managerも提供されます。Update Managerは、イメージ内のすべてのインストール済みパッケージを更新できるデスクトップ・アプリケーションです。インストール済みパッケージに対する更新が使用可能になると、Update Managerによってユーザーに通知されます。

 Update Manager

演習2:IPSのコマンドの使用

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パッケージ管理システムの概要です。


演習3:ユーザー独自のローカルIPSリポジトリの作成

予想される所要時間:20分間

はじめに

ローカル・リポジトリを有効にする2つの方法について説明します。最初に、IPSクライアント・コマンドから直接アクセスできるファイルベースのリポジトリの作成方法を説明します。次に、このレポジトリを、このレポジトリへのpkgサーバーを介して、ネットワーク・サービスとしてインスタンス化します。これにより、ネットワーク経由でアクセスできるようになります。これらの2つの方法はどちらも、開発およびテストには問題なく使用できます。ただし、リポジトリ・サーバーをシステムで永続的に動作させる場合は、(a) ローカル・ディスクにファイルをホストするための十分なディスク領域を用意することと、(b) SMFを使用してリポジトリ・サーバーを管理することを推奨します。リポジトリ・サーバー・サービスのデフォルトのSMF FMRIは、svc:/application/pkg/serverです。

これは、2つの方法で実行できます。もっとも簡単な方法は、単に、構成を反映するようにリポジトリ・サービスのデフォルト・インスタンスのプロパティを変更することです。この点については、この演習の2つ目の例で説明します。もう一つの方法は、svc:/application/pkg/serverサービスの2つ目のインスタンスを作成することです。この方法は、同じシステムで複数のIPSデポ・サーバーを動作させる必要がある場合、たとえば、Solarisリポジトリのローカル・コピー(コピーの作成方法については、こちらをクリックしてください)とユーザー独自のコード用の開発/テスト・リポジトリを持つ必要がある場合などに役立ちます。この方法の実行手順は、補足の演習として用意しています。時間に余裕があれば学習してください。

例3-1:ファイル・システムベースのリポジトリの作成方法

  1. (オプション)リポジトリ・データを保存するZFSファイル・システムを作成します。
    $ sudo zfs create <filesystem>
  2. スケルトン・リポジトリを作成し、リポジトリのパブリッシャを設定します。
    $ sudo pkgrepo create <path to repository>
    $ sudo pkgrepo set -s <path to repository> publisher/prefix=example.com
  3. リポジトリが正常に作成され、パブリッシャが設定されたことを確認します。
    $ pkgrepo info -s <path to repository> 
  4. 新しいリポジトリをシステム・イメージに追加します。
    $ pkg set-publisher -p file:<path to repository>
  5. リポジトリが正常に機能することを確認します。
    pkg publisher

ファイル・システムベースのIPSリポジトリの作成

次のように表示されます。

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

例3-2:SMFによるユーザー独自のIPSリポジトリの作成方法

これは、より永続的なIPSリポジトリ・サーバーをローカル・システムにセットアップする場合に推奨される方法です。もっとも一般的な方法は、application/pkg/serverサービスのデフォルト・インスタンスを変更することで、これはsvccfg(1M)コマンドを使用して実行できます。ただし、まず、リポジトリを配置する場所を用意する必要があります。そのために、ZFSファイル・システムを作成します。単なるディレクトリではなくZFSファイル・システムを使用すると、リポジトリにより多くのパッケージを格納するときにリポジトリの拡張に応じてストレージを管理する方法の選択肢が増えます。

  1. リポジトリ・データを保存するZFSファイル・システムを作成します。
    $ sudo zfs create <filesystem>
  2. pkgrepo(1)コマンドを使用してスケルトン・リポジトリを作成し、パブリッシャを設定します。
    $ pkgrepo create <path to repository>

    $ pkgrepo set -s <path repository> publisher/prefix=example.com
  3. ポートの値を設定します。
    $ sudo svccfg -s application/pkg/server setprop pkg/port=port_value
  4. リポジトリ・データの保存場所の値を設定します。
    $ sudo svccfg -s application/pkg/server setprop pkg/inst_root=$repository_directory
  5. リポジトリ・サービスをリフレッシュします。
    $ sudo  svcadm refresh application/pkg/server
  6. リポジトリ・サービスを起動します。
    $ sudo  svcadm enable application/pkg/server
  7. ブラウザを開き、http://localhost:port_valueと入力して、リポジトリが作成されたことを確認します。また、オプションで、次のコマンドを実行して、接続を検証します。
    $ wget http://localhost:<port_value>

SMFによるIPSリポジトリの作成

最初に、リポジトリを配置できる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にアクセスして、正常に機能しているかどうかを確認しましょう。

FF SMFデポ

正常に機能しているようです。このリポジトリは、後の演習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について詳しくは、サービスの管理 (概要)を参照してください。

例3-3:SMFによるIPSリポジトリ・サーバーの2つ目のインスタンスの作成方法(補足の演習:時間に余裕があれば学習してください)

場合によっては、システム上で複数の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>と入力して、リポジトリが作成されたことを確認します。

SMFによるIPSリポジトリの作成

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サービスに追加する方法について学習しました。


演習4:簡単なアプリケーションのパッケージ化とIPSリポジトリへの送信

予想される所要時間:20分間

予備知識:IPSマニフェストの詳細

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ビット・バイナリを提供することも分かります。

srm(セキュアなrm)による簡単な例

作業

  • ローカルIPSサーバーの起動(詳しくは、例3-2を参照)
  • ビルド環境のセットアップ
  • マニフェストの作成
  • パッケージの公開
  • パッケージの検証
  • リポジトリからのパッケージのインストール

リポジトリ・サーバーの起動

ローカル・リポジトリ・サーバーのセットアップおよび起動方法について詳しくは、例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リポジトリの作成方法とそのリポジトリへのパッケージの公開方法に関する基本的な学習は完了です。

false