JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris 11 システムのインストール     Oracle Solaris 11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Oracle Solaris 11 のインストールオプション

1.  インストールオプションの概要

パート II インストールメディアを使用したインストール

2.  インストールの準備

3.  LiveCD の使用

4.  テキストインストーラの使用

5.  メディアからブートする自動インストール

6.  Oracle Solaris インスタンスの構成解除または再構成

パート III インストールサーバーを使用したインストール

7.  複数のクライアントへの自動インストール

8.  インストールサーバーの設定

9.  インストールのカスタマイズ

10.  クライアントシステムのプロビジョニング

XML AI マニフェストファイルのカスタマイズ

クライアントインストール時の AI マニフェストの作成

派生マニフェストスクリプトを作成する

クライアントの属性を取得する

AI マニフェストをカスタマイズする

派生マニフェストスクリプトの例

派生マニフェストスクリプトのテスト

派生マニフェストスクリプトをインストールサービスに追加する

11.  クライアントシステムの構成

12.  ゾーンのインストールと構成

13.  初回ブート時のカスタムスクリプトの実行

14.  AI クライアントシステムで使用するための Oracle Configuration Manager の設定

15.  クライアントシステムのインストール

16.  自動インストールのトラブルシューティング

クライアントインストール時の AI マニフェストの作成

クライアントのインストールより前にカスタムの AI マニフェストを作成する別の方法は、クライアントのインストール時にクライアントごとに動的に AI マニフェストを作成するスクリプトを記述することです。このスクリプトでは、クライアントごとに環境変数やほかのクライアント構成情報のクエリー検索を行なってカスタム AI マニフェストを作成できます。このマニフェストはインストール時に検出された各クライアントの属性に基づいているため、「派生マニフェスト」と呼ばれます。

派生マニフェストは、ほぼ同じようにインストールできるシステムが多数あるためにこれらのシステムの AI マニフェストの差異が比較的小さい場合に特に便利です。このグループのシステムに共通のインストールパラメータを指定した AI マニフェストを作成します。この共通のマニフェストをベースとして使用し、各クライアントをインストールするときに、クライアントごとに異なるパラメータを共通のマニフェストに追加する派生マニフェストスクリプトを作成します。たとえば、派生マニフェストスクリプトでは、クライアントのインストール時に各クライアントシステムに接続されているディスクの数と大きさを検出し、クライアントごとにカスタムのディスクレイアウトを指定するように AI マニフェストを変更できます。

派生マニフェストスクリプトを作成して適用するには、次の手順に従います。

  1. 変更するベースマニフェストとして使用する既存の AI マニフェストを特定します。

    スクリプトを作成してテストする場合は、ローカルコピーを使って作業できます。インストール時に、この派生マニフェストスクリプトを使用する各クライアントがベースマニフェストにアクセスできる必要があります。

  2. インストールしているクライアントの属性に基づいてインストール時にベースマニフェストを動的に変更するスクリプトを作成します。

  3. 派生マニフェストスクリプトを適切な AI インストールサービスに追加し、インストール時にどのクライアントがこのスクリプトを使用してインストール手順を作成するかを定義した条件を指定します。

AI では、クライアントのインストール時にこのスクリプトを実行して AI マニフェストのインスタンスを生成します。AI では、結果となるマニフェストを構文的に検証します。


注 - マニフェストが作成されないか、または派生マニフェストが有効でない場合、クライアントのインストールは異常終了します。検証エラーの原因を調査するには、そのクライアント上の /system/volatile/install_log を参照してください。


クライアントのインストールが成功した場合は、派生マニフェストがクライアント上の /var/sadm/system/logs/derived/manifest.xml にコピーされ、マニフェストの派生に使われたスクリプトが /var/sadm/system/logs/derived/manifest_script にコピーされます。

派生マニフェストスクリプトを作成する

一般に、派生マニフェストスクリプトでは、クライアントから情報を取得し、その情報を使ってベース AI マニフェストを変更して、このクライアント専用のカスタム AI マニフェストを作成します。派生マニフェストスクリプトでは、複数の部分的な AI マニフェストを組み合わせることもできます。最終的な派生マニフェストは、完全で、検証に合格する必要があります。

派生マニフェストスクリプトは、イメージでサポートされているどの種類のスクリプトにもできます。たとえば、デフォルトでは ksh93python がイメージに含まれています。別の種類のスクリプトを使用する場合は、必要なサポートがイメージに含まれていることを確認します。

クライアントの属性を取得する

派生マニフェストスクリプトは、システムの属性を読み取るコマンドを実行できます。AI では、そのスクリプトを役割 aiuser として実行します。役割 aiuser には、非特権ユーザーが持つすべての特権と次の追加の特権があります。

solaris.network.autoconf.read
solaris.smf.read*

役割 aiuser は、ほかの非特権ユーザーよりも多くの情報をシステムから読み取れることを除いては非特権です。役割 aiuser はシステムを変更できません。

役割、プロファイル、および特権については、『Oracle Solaris の管理: セキュリティーサービス』のパート III「役割、権利プロファイル、特権」を参照してください。

システムの属性を読み取るコマンドを使用するほかに、次の表に示される環境変数を通じてもクライアントの属性を使用できます。

表 10-1 クライアント属性の環境変数

環境変数名
説明
SI_ARCH
インストールされるクライアントのアーキテクチャー。uname -p の出力と同等です。
SI_CPU
インストールされるクライアントの ISA またはプロセッサタイプ。uname -p の出力と同等です。
SI_NUMDISKS
クライアントのディスク数。
SI_DISKNAME_#
クライアントで見つかったディスクの ctds 名を表す平坦な変数セット。SI_NUMDISKS 個の SI_DISKNAME_# 変数が存在することになります。ここで、# は 1 から SI_NUMDISKS までの整数に置き換えられます。この変数セットは、SI_DISKSIZE_# で記述される変数セットと相関関係にあります。
SI_DISKSIZE_#
クライアントで見つかったディスクのディスクサイズを表す平坦な変数セット。SI_NUMDISKS 個の SI_DISKSIZE_# 変数が存在することになります。ここで、# は 1 から SI_NUMDISKS までの整数に置き換えられます。この変数セットは、SI_DISKNAME_# で記述される変数セットと相関関係にあります。サイズは M バイトを表す整数です。
SI_HOSTADDRESS
インストール環境で設定されたクライアントの IP アドレス。
SI_HOSTNAME
インストール環境で設定されたクライアントのホスト名。
SI_KARCH
クライアントのカーネルアーキテクチャー。uname -m の出力と同等です。
SI_INSTALL_SERVICE
マニフェストスクリプトの取得に使用されるインストールサービスの名前。この環境変数には、メディアからのブート用ではなく、ネットワーク経由のブート専用の値が含まれます。
SI_MANIFEST_SCRIPT
マニフェストスクリプトの URL。
SI_MEMSIZE
クライアントの物理メモリーの量。サイズは M バイトを表す整数です。
SI_MODEL
クライアントのモデル名。uname -i の出力と同等です。
SI_NATISA
クライアントのネイティブの命令セットアーキテクチャー。isainfo -n の出力と同等です。
SI_NETWORK
クライアントのネットワーク番号。ネットワーク番号は (IP_ADDR & netmask) です。
SI_PLATFORM
クライアントのプラットフォーム。uname -i の出力と同等です。

AI マニフェストをカスタマイズする

AI マニフェストの XML 要素を追加または変更するには、/usr/bin/aimanifest コマンドを使用します。

aimanifest が変更できるファイルには、少なくとも次の両方の要素が含まれている必要があります。

次の例は、この派生マニフェストスクリプトが追加されるインストールサービスの AI DTD ファイルの指定など、AI マニフェストのために最低限必要なベースマニフェストファイルを示しています。

<!DOCTYPE auto_install SYSTEM "file:///image_path/auto_install/ai.dtd.#">
<auto_install/>

# は 1 などの整数です。image_path は次のコマンドで返されるパスです。ここで、service_name はこの派生マニフェストスクリプトが追加されるインストールサービスの名前です。

$ installadm list -n service_name

aimanifest コマンドの load サブコマンドを使用してベースマニフェストを読み込んでから、派生マニフェストスクリプト内のほかの aimanifest 呼び出しを行なってください。クライアントのインストール時には、読み込んだどのファイルにもクライアントがアクセスできる必要があります。たとえば、ターゲットインストールサービスの image_path/auto_install/manifest/ からマニフェストを読み込むことができます。

この章の例では、ファイル /usr/share/auto_install/manifest/default.xml が読み込まれます。/usr/share/auto_install/manifest/ 内のマニフェスト例は、ターゲットインストールサービスのマニフェストとは異なっている可能性があります。本稼働では、/usr/share/auto_install/manifest/ からマニフェストを読み込まないようにしてください。

load サブコマンドは、部分的なマニフェストの読み込みまたは挿入にも使用できます。

新しい要素を追加するには、add サブコマンドを使用します。要素の属性を追加したり、要素または属性の値を変更したりするには、set サブコマンドを使用します。詳細は、aimanifest(1M) のマニュアルページを参照してください。aimanifest コマンドの使用例については、aimanifest(1M) のマニュアルページと下のスクリプト例を参照してください。

aimanifest コマンドで指定した値にスラッシュ (/)、一重引用符、二重引用符などの特殊文字が含まれている場合は、その値を一重引用符または二重引用符で囲む必要があります。場合によっては、使用するシェルの規則に従って引用符の前にバックスラッシュ文字 (\) を付けてエスケープし、シェルが引用符を削除または解釈しないようにする必要があります。

次の例では、パッケージ名 pkg:/entire が含まれる software_data 要素のアクションが返されます。この例では、スラッシュ文字が特殊文字であるため、pkg:/entire の前後に引用符を付ける必要があります。このコマンドが ksh93 スクリプトなどのシェルスクリプト内で呼び出される場合は、バックスラッシュ文字でこれらの引用符をエスケープする必要があります。

/usr/bin/aimanifest get software_data[name=\"pkg:/entire\"]@action

ヒント - ベストプラクティスに基づき、エラー発生時に停止するトラップを設定してください。


次のスクリプトの一部は、派生マニフェストスクリプトのよい見本です。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load baseAImanifest.xml

# Customize AI manifest. For example:
/usr/bin/aimanifest load -i manifest_fragment.xml
/usr/bin/aimanifest set origin@name file:///net/myserver/myrepo/repo.redist

exit $SCRIPT_SUCCESS

派生マニフェストスクリプトの例

このセクションでは、クライアントの属性を判別し、その情報を使って AI マニフェストをカスタマイズする派生マニフェストスクリプトを作成する方法を示します。これらの例には、有効な AI マニフェストの作成に必要な情報が必ずしもすべて含まれているわけではありません。

これらの例を試すには、次の設定手順を実行します。

  1. AIM_MANIFEST 環境変数を、スクリプトによって AI マニフェストが作成される場所に設定します。

    $AIM_MANIFEST ファイルは、そのファイルを変更する aimanifest コマンドごとに書き換えられます。aimanifestloadadd、または set サブコマンドとともに呼び出すたびに、AIM_MANIFEST ファイルが開かれ、変更され、保存されます。AIM_MANIFEST が設定されていない場合、aimanifest コマンドは失敗します。

  2. AIM_LOGFILE 環境変数を、スクリプトによって詳細な情報とエラーメッセージが書き込まれる場所に設定します。

    aimanifest コマンドは、サブコマンドの名前、引数の値、および各 aimanifest 呼び出しの戻りステータスを画面および $AIM_MANIFEST_LOG ファイル (設定されている場合) に記録します。

  3. スクリプトを実行するシステムで aimanifest コマンドが使用できることを確認します。aimanifest コマンドが使用できない場合は、auto-install-common パッケージをインストールします。

  4. 環境変数を設定します。これらの例では、環境変数を使用してクライアントに関する情報を取得する方法を示しています。これらの例を試すには、これらの環境変数の値を設定する必要があります。

    AI を使用してシステムをインストールすると、表 10-1 に示す環境変数に値が設定され、使用する派生マニフェストスクリプトで使用できるようになります。

例 10-1 ディスクサイズに基づいたディスクパーティション分割の指定

この例では、ディスクのサイズが 1T バイトを超える場合に Solaris fdisk パーティションにターゲットディスクの半分だけ使用するように AI マニフェストをカスタマイズします。このスクリプトの異なる実行に対して、SI_DISKSIZE_1 を 1T バイト未満に設定してから、1T バイトを超えるサイズに設定してみます。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# Assume there is only one disk on the system for this example.
if [[ $SI_DISKSIZE_1 -gt "1048576" ]] ; then
    typeset -i PARTN_SIZE=$SI_DISKSIZE_1/2

    # Default action is to create.
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition@name 1
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition[@name=1]/size@val \
        ${PARTN_SIZE}mb
else
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition@action \
        use_existing_solaris2
fi
exit $SCRIPT_SUCCESS

一部のクライアントでは、次の要素が $AIM_MANIFEST に追加されます。

<target>
  <disk>
    <partition action="use_existing_solaris2"/>
  </disk>
</target>

ほかのクライアントでは、SI_DISKSIZE_1 の値に応じて、次のような要素が $AIM_MANIFEST に追加されます。

<target>
  <disk>
    <partition name="1">
      <size val="524288mb"/>
    </partition>
  </disk>
</target>

例 10-2 追加ディスクの存在に基づいたルートプールレイアウトの指定

この例では、2 番目のディスクが存在する場合はルートプールのミラーを構成し、3 番目のディスクが存在する場合は 3 方向のミラーを構成するように AI マニフェストをカスタマイズします。スクリプトを実行する前に、SI_NUMDISKSSI_DISKNAME_1 を設定します。SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2SI_DISKNAME_3 などを必要に応じて設定します。AI のインストール中に、これらの環境変数が設定され、派生マニフェストスクリプトで使用できるようになります。

この例では、aimanifest の戻りパス (-r オプション) の使用方法を示しています。戻りパスの詳細は、aimanifest(1M) のマニュアルページを参照してください。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# Use the default if there is only one disk.
if [[ $SI_NUMDISKS -ge 2 ]] ; then
    typeset -i disk_num

    # Turn on mirroring. Assumes a root zpool is already set up.
    vdev=$(/usr/bin/aimanifest add -r \
        target/logical/zpool[@name=rpool]/vdev@name mirror_vdev)
    /usr/bin/aimanifest set ${vdev}@redundancy mirror

    for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
        eval curr_disk="$"SI_DISKNAME_${disk_num}
        disk=$(/usr/bin/aimanifest add -r target/disk@in_vdev mirror_vdev)
        /usr/bin/aimanifest set ${disk}@in_zpool rpool
        /usr/bin/aimanifest set ${disk}@whole_disk true
        disk_name=$(/usr/bin/aimanifest add -r \
            ${disk}/disk_name@name $curr_disk)
        /usr/bin/aimanifest set ${disk_name}@name_type ctd
    done
fi
exit $SCRIPT_SUCCESS

c0t0d0 および c0t1d0 という 2 つのディスクを備えたシステムでは、この例の出力は次の XML になります。

<target>
  <disk in_vdev="mirror_vdev" in_zpool="rpool" whole_disk="true">
    <disk_name name="c0t0d0" name_type="ctd"/>
  </disk>
  <disk in_vdev="mirror_vdev" in_zpool="rpool" whole_disk="true">
    <disk_name name="c0t1d0" name_type="ctd"/>
  </disk>
  <logical>
    <zpool name="rpool">
      <vdev name="mirror_vdev" redundancy="mirror"/>
    </zpool>
  </logical>
</target>

例 10-3 指定されたサイズのディスクが 2 つ以上ある場合のミラー化構成の指定

この例では、システムに 200G バイトのディスクが 2 つ以上ある場合にミラー化構成を指定するように AI マニフェストをカスタマイズします。少なくとも 2 つの 200G バイトであることがわかった最初の 2 つのディスクを使用します。スクリプトを実行する前に、テスト環境で SI_NUMDISKSSI_DISKNAME_1、および SI_DISKSIZE_1 を設定します。また、SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2SI_DISKSIZE_2 などを必要に応じて設定します。AI のインストール中に、これらの環境変数が設定され、派生マニフェストスクリプトで使用できるようになります。

この例では、同じパスを持つノードが複数存在している場合にノードを変更する方法を示しています。シェルの実装では、aimanifest の戻りパス (- r) オプションを使用して特定のノードへのパスを返し、そのパスを使用して同じノードに追加の変更を行います。Python の実装では、サブパス (ノードパスの内側で [] を使用) を使って同じノードに追加の変更を行う方法を示しています。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

# Find the disks first.
typeset found_1
typeset found_2
typeset -i disk_num

for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
    eval curr_disk="$"SI_DISKNAME_${disk_num}
    eval curr_disk_size="$"SI_DISKSIZE_${disk_num}
    if [[ $curr_disk_size -ge "204800" ]] ; then
        if [ -z $found_1 ] ; then
            found_1=$curr_disk
        else
            found_2=$curr_disk
            break
        fi
    fi
done

# Now, install them into the manifest.
# Let the installer take the default action if two large disks are not found.

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

if [[ -n $found_2 ]] ; then
    # Turn on mirroring.
    vdev=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/logical/zpool/vdev@redundancy mirror)
    /usr/bin/aimanifest set ${vdev}@name mirror_vdev
    disk=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/disk@in_vdev mirror_vdev)
    disk_name=$(/usr/bin/aimanifest add -r ${disk}/disk_name@name $found_1)
    /usr/bin/aimanifest set ${disk_name}@name_type ctd

    disk=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/disk@in_vdev mirror_vdev)
    disk_name=$(/usr/bin/aimanifest add -r ${disk}/disk_name@name $found_2)
    /usr/bin/aimanifest set ${disk_name}@name_type ctd
fi

exit $SCRIPT_SUCCESS

次のスクリプトは、前の Kornshell 版を Python 版にしたものです。

import os
from subprocess import call, check_call, CalledProcessError

SCRIPT_SUCCESS = 0
SCRIPT_FAILURE = 1

def main():

    # Find the disks first.
    found_1 = ""
    found_2 = ""

    for disk_num in range(1, SI_NUMDISKS + 1):
        curr_disk_var = "SI_DISKNAME_" + str(disk_num)
        curr_disk = os.environ[curr_disk_var]
        curr_disk_size_var = "SI_DISKSIZE_" + str(disk_num)
        curr_disk_size = os.environ[curr_disk_size_var]
        if curr_disk_size >= "204800":
            if not len(found_1):
                found_1 = curr_disk
            else:
                found_2 = curr_disk
                break

    # Now, write the disk specifications into the manifest.
    # Let the installer take the default action if two large disks are not found.

    try:
        subprocess.check_call(["/usr/bin/aimanifest", "load",
            "/usr/share/auto_install/manifest/default.xml"])
    except CalledProcessError as err:
        sys.exit(err.returncode)

    if len(found_2):
        try:            subprocess.check_call(["/usr/bin/aimanifest", "set",
               "target/logical/zpool/vdev@redundancy", "mirror"])
            subprocess.check_call(["/usr/bin/aimanifest", "set",
               "target/logical/zpool/vdev[@redundancy='mirror']@name", "mirror_vdev"])

            subprocess.check_call(["/usr/bin/aimanifest", "add",
                "target/disk/disk_name@name", "found_1"])
            subprocess.check_call(["/usr/bin/aimanifest", "set",
                "target/disk/disk_name[@name='" + found_1 + "']" + "@name_type", "ctd"])
            subprocess.check_call(["/usr/bin/aimanifest", "set",
                "target/disk[disk_name@name='" + found_1 + "']" + "@in_vdev", "mirror_vdev"])

            subprocess.check_call(["/usr/bin/aimanifest", "add",
                "target/disk/disk_name@name", "found_2"])
            subprocess.check_call(["/usr/bin/aimanifest", "set",
                "target/disk/disk_name[@name='" + found_2 + "']" + "@name_type", "ctd"])
            subprocess.check_call(["/usr/bin/aimanifest", "set",
                "target/disk[disk_name@name='" + found_2 + "']" + "@in_vdev", "mirror_vdev"])
        except CalledProcessError as err:
            sys.exit(err.returncode)

    sys.exit(SCRIPT_SUCCESS)

if __name__ == "__main__":
    main()

例 10-4 IP アドレスに基づくインストールするパッケージの指定

この例では、クライアントの IP アドレスが指定の範囲にある場合はあるパッケージをインストールし、クライアントの IP アドレスが別の範囲にある場合は別のパッケージをインストールするように AI マニフェストをカスタマイズします。スクリプトを実行する前に、テスト環境で SI_HOSTADDRESS を設定します。AI のインストール中に、この環境変数が設定され、派生マニフェストスクリプトで使用できるようになります。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# First determine which range the host IP address of the client is in.
echo $SI_HOSTADDRESS | sed 's/\./ /g' | read a b c d

# Assume all systems are on the same class A and B subnets.

# If the system is on class C subnet = 100, then install the /pkg100 package.
# If the system is on class C subnet = 101, then install the /pkg101 package.
# Otherwise, do not install any other additional package.

if ((c == 100)) ; then
    /usr/bin/aimanifest add \
    software/software_data[@action='install']/name pkg:/pkg100
fi
if ((c == 101)) ; then
    /usr/bin/aimanifest add \
    software/software_data[@action='install']/name pkg:/pkg101
fi

exit $SCRIPT_SUCCESS

例 10-5 ターゲットディスクが必ず特定のサイズになるように指定

この例では、50G バイト以上のディスクにのみインストールするように AI マニフェストをカスタマイズします。それよりも小さいディスクは無視します。スクリプトを実行する前に、テスト環境で SI_NUMDISKSSI_DISKNAME_1、および SI_DISKSIZE_1 を設定します。また、SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2SI_DISKSIZE_2 などを必要に応じて設定します。AI のインストール中に、これらの環境変数が設定され、派生マニフェストスクリプトで使用できるようになります。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

typeset found
typeset -i disk_num
for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
    eval curr_disk="$"SI_DISKNAME_${disk_num}
    eval curr_disk_size="$"SI_DISKSIZE_${disk_num}
    if [[ $curr_disk_size -ge "512000" ]] ; then
        found=$curr_disk
        /usr/bin/aimanifest add \
            /auto_install/ai_instance/target/disk/disk_name@name $found
        break
    fi
done

if [[ -z $found ]] ; then
    exit $SCRIPT_FAILURE
fi

exit $SCRIPT_SUCCESS

例 10-6 マニフェスト仕様が正しくないスクリプト

この例のスクリプトにはエラーが含まれています。

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

/usr/bin/aimanifest set \
    software[@type="IPS"]/software_data/name pkg:/driver/pcmcia
/usr/bin/aimanifest set \
    software/software_data[@name=pkg:/driver/pcmcia]@action uninstall

return $SCRIPT_SUCCESS

この例には、$AIM_MANIFEST への書き込みに関する問題が 3 つあります。

  1. aimanifestset サブコマンドでは、既存の要素または属性の値を変更したり、新しい属性を作成したりできます。set サブコマンドで新しい要素を作成することはできません。最初の set サブコマンドでは、新しいパッケージ名を作成するのではなく、マニフェスト内の既存のパッケージ名を変更しようとします。マニフェスト内に複数のパッケージ名が存在する場合は、どのパッケージを変更してよいか判断できないため、あいまいエラーが発生します。この例の最初の set サブコマンドは add サブコマンドにするべきでした。

  2. この例の 2 番目の set サブコマンドでは、値 pkg:/driver/pcmcia を持つ要素 name が @ 記号を前に付けて指定されています。属性値は @ 記号を前に付けて指定します。要素値はそのように指定しません。

  3. pkg:/driver/pcmcia は引用符で囲むようにしてください。スラッシュなどの特殊文字が含まれる値には引用符を付ける必要があります。

この例の 2 つの set 行は、次の行で置き換えるようにしてください。

/usr/bin/aimanifest add \
    software[@type="IPS"]/software_data@action uninstall
/usr/bin/aimanifest add \
    software/software_data[@action=uninstall]/name pkg:/driver/pcmcia

これらの 2 つの add サブコマンドによって、作成中のマニフェストの software セクションの最後に次の行が追加されます。

<software_data action="uninstall">
  <name>pkg:/driver/pcmcia</name>
</software_data>

派生マニフェストスクリプトのテスト

派生マニフェストスクリプトをテストするには、AI インストール環境に似ている環境でスクリプトを実行します。

  1. 変更するスクリプト用のベース AI マニフェストを設定します。

    1. スクリプト内の最初の aimanifest コマンドが aimanifest load コマンドであることを確認します。読み込まれているファイルに、ターゲットインストールサービスの AI マニフェストの検証に使用する適切な DTD を指定した <!DOCTYPE> 定義が含まれていることを確認します。次の例は、この派生マニフェストスクリプトが追加されるインストールサービスの AI DTD ファイルの指定など、AI マニフェストのために最低限必要なベースマニフェストファイルを示しています。

      <!DOCTYPE auto_install SYSTEM "file:///image_path/auto_install/ai.dtd.#">
      <auto_install/>

      # は 1 などの整数です。image_path は次のコマンドで返されるパスです。ここで、service_name はこの派生マニフェストスクリプトが追加されるインストールサービスの名前です。

      $ installadm list -n service_name
    2. AIM_MANIFEST を、スクリプトによって AI マニフェストが作成される場所に設定します。この場所は、非特権ユーザー aiuser によって書き込み可能である必要があります。


      注 - AI がインストールを行なっているときは、AIM_MANIFEST を設定する必要はありません。AI によってデフォルト値が設定されます。


  2. AIM_LOGFILE を、スクリプトによって詳細な情報とエラーメッセージが書き込まれる場所に設定します。この場所は、非特権ユーザー aiuser によって書き込み可能である必要があります。


    注 - AI がインストールを行なっているときは、AIM_LOGFILE を設定する必要はありません。このログ情報は、さらに大きなインストールログ /system/volatile/install_log の一部です。


  3. スクリプトをテストするシステムで aimanifest コマンドが使用できることを確認します。aimanifest コマンドが使用できない場合は、auto-install-common パッケージをインストールします。

  4. root の役割になれることを確認します。root の役割から、パスワードを指定しないで役割 aiuser になることができます。

    $ su
    Password: 
    # su aiuser -c ./script
    # 

    AI は、役割 aiuser として派生マニフェストスクリプトを実行します。AI インストール環境に近づけるために、役割 aiuser でスクリプトを実行します。役割 aiuser に含まれるのと異なる特権を持つユーザーとしてスクリプトを実行した場合、スクリプト内のいくつかの操作で結果が異なる可能性があります。

  5. テスト環境の環境変数を、この派生マニフェストスクリプトを使ってインストールされるクライアントシステムを表す値で設定します。サンプルファイル /usr/share/auto_install/derived_manifest_test_env.sh をテンプレートとして使用できます。必要に応じて値を変更します。

    AI がインストールを行なっているときに、表 10-1 に示す環境変数に値が設定され、使用する派生マニフェストスクリプトで使用できるようになります。

意図されたクライアントシステムが、派生マニフェストスクリプトをテストするインストールサーバーやその他のシステムと大きく異なる場合があります。スクリプト内で呼び出すコマンドが使用できない場合や、動作の異なる別のバージョンである場合があります。システムのアーキテクチャーが異なる場合や、ディスクの数とサイズが異なる場合があります。上記のようにテスト環境で環境変数を設定することによって、これらの差異のいくつかに対処できます。

意図されたクライアントシステムのいずれかで派生マニフェストスクリプトをテストするには、次の方法を使用します。

  1. そのクライアントシステムで、AI イメージを「Text Installer and command line」モードでブートします。

  2. インストーラの初期メニューから「シェル」を選択します。

  3. wget または sftp を使用して、AI インストールサーバーからスクリプトをコピーします。

  4. 次のいずれかの方法を使用して、スクリプトをデバッグします。

    • スクリプトを手動で実行します。

    • 次のコマンドを実行して、AI をテストモードで実行します。

      $ auto-install -m script -i

    AI ログファイル /system/volatile/install_log を調べます。ログファイルに、スクリプトが有効であることを示す次の行が含まれているはずです。

    Derived Manifest Module: XML validation completed successfully
  5. スクリプトをコピーしてインストールサーバーに戻します。

派生マニフェストスクリプトをインストールサービスに追加する

スクリプトを AI インストールサービスに追加する方法は、XML マニフェストをインストールサービスに追加する場合と同じです。同じオプションを使用して、インストールの際にこのスクリプトを使ってマニフェストを作成するクライアントの選択条件を指定します。XML マニフェストを更新するのとまったく同じようにスクリプトを更新できます。スクリプトをサービスのデフォルトのマニフェストになるように設定できます。1 つのサービスに関連付けられたマニフェストを一覧表示するときに、スクリプトが表示されます。XML マニフェストをエクスポートするのとまったく同じようにスクリプトの内容をエクスポートできます。

XML マニフェストをインストールサービスに追加するときに、そのマニフェストが検証されます。スクリプトをインストールサービスに追加するときに、そのスクリプトは検証されません。

スクリプトをインストールサービスに追加する前に、派生した AI マニフェストを検証してください。

  1. 意図されたクライアントシステムに似ている環境でスクリプトを実行します。

  2. 結果となるマニフェストに対して validate サブコマンドを使用します。

    $ /usr/bin/aimanifest validate

    検証に失敗した場合にのみメッセージが表示されます。

そのスクリプトを適切な AI インストールサービスに追加し、どのクライアントがこれらのインストール手順を使用するかを定義する条件を指定します。

# installadm create-manifest -n s11-x86 -f ./mac1.ksh -m mac1 \
-c mac=BB:AA:AA:AA:AA:AA

複数の -c オプションまたは 1 つの -C ファイルを指定できます。set-criteria サブコマンドも参照してください。クライアント条件の指定方法については、第 9 章インストールのカスタマイズを参照してください。

「インストールサーバーを維持する」exportcreate-manifestset-criteriaupdate-manifest、および set-service サブコマンドについては、Maintain an Install Serverを参照してください。