Go to main content
Oracle® Solaris 11.3 システムのインストール

印刷ビューの終了

更新: 2017 年 3 月
 
 

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

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

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

クライアント属性の取得

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

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

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

役割、プロファイル、および権限の詳細については、Oracle Solaris 11.3 でのユーザーとプロセスのセキュリティー保護を参照してください。

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

表 7  AI クライアント属性の環境変数
環境変数名
説明
SI_ARCH
インストールされる AI クライアントのアーキテクチャー。uname -p の出力と同等です。
SI_CONFIG_PROFILE_DIR
ユーザーが作成したシステム構成プロファイルが格納され、インストールサービスによって使用されるディレクトリ。
SI_CPU
インストールされる AI クライアントの ISA またはプロセッサタイプ。uname -p の出力と同等です。
SI_DISKNAME_#
AI クライアントで見つかったディスクの名前を表す平坦な変数セット。SI_NUMDISKS 個の SI_DISKNAME_# 変数が存在することになります。ここで、# は 1 から SI_NUMDISKS までの整数に置き換えられます。この変数セットは、SI_DISKSIZE_# で記述される変数セットと相関関係にあります。
SI_DISKSIZE_#
AI クライアントで見つかったディスクのディスクサイズを表す平坦な変数セット。SI_NUMDISKS 個の SI_DISKSIZE_# 変数が存在することになります。ここで、# は 1 から SI_NUMDISKS までの整数に置き換えられます。この変数セットは、SI_DISKNAME_# で記述される変数セットと相関関係にあります。サイズは M バイトを表す整数です。
SI_HOSTADDRESS
インストール環境で設定された AI クライアントの IP アドレス。
SI_HOSTNAME
インストール環境で設定された AI クライアントのホスト名。
SI_STALL_PROFILE_DIR
インストール環境用のユーザー指定のシステム構成プロファイルが格納され、インストールサービスによって使用される可能性のあるディレクトリ。
SI_INSTALL_SERVICE
マニフェストスクリプトの取得に使用されるインストールサービスの名前。この環境変数には、メディアからのブート用ではなく、ネットワーク経由のブート専用の値が含まれます。
SI_KARCH
AI クライアントのカーネルアーキテクチャー。uname -m の出力と同等です。
SI_MEMSIZE
AI クライアントの物理メモリーの量。サイズは M バイトを表す整数です。
SI_NATISA
AI クライアントのネイティブの命令セットアーキテクチャー。isainfo -n の出力と同等です。
SI_NETWORK
AI クライアントのネットワーク番号。ネットワーク番号は (IP_ADDR & netmask) です。
SI_NUMDISKS
AI クライアントのディスク数。
SI_PLATFORM (または SI_MODEL)
AI クライアントのプラットフォーム。uname -i (x86 システム) および prtconf -b (SPARC システム) の出力と同等です。
SI_SYSPKG
AI クライアント上の Oracle Solaris incorporation パッケージのリリース (現在は entire という名前です)。AI クライアントのパッケージ全体が pkg://solaris/entire@0.5.11,5.11-0.175.0.0.0.2.0:20111020T143822Z である場合、SI_SYSPKG の値は pkg:/entire@0.5.11-0.175.0 となります。アップデートまたは SRU リリースの場合、AI クライアントのパッケージ全体が pkg://solaris/entire@0.5.11,5.11-0.175.1.19.0.6.0:20140508T221351Z であれば、SI_SYSPKG の値は pkg:/entire@0.5.11-0.175.1 となります。

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

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

    aimanifest によって変更するファイルには、少なくとも次の内容が含まれている必要があります。

  • 作成している XML マニフェストで有効な DTD への !DOCTYPE 参照。

  • この DTD のルート要素。

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

<!DOCTYPE auto_install SYSTEM "file:///imagepath/auto_install/ai.dtd.1">
<auto_install/>

imagepath 引数の値は、次のコマンドによって返されるパスです (svcname はこの派生マニフェストスクリプトが追加されるインストールサービスの名前です)。

$ installadm list -v -n svcname

注 -  スクリプトを使用して AI クライアントをインストールする前に、イメージパスを ///usr/share に戻してください。

aimanifest コマンドの load サブコマンドを使用してベースマニフェストを読み込んでから、派生マニフェストスクリプト内のほかの aimanifest 呼び出しを行なってください。ロードされるファイルはすべて、インストール時に AI クライアントからアクセス可能でなければいけません。たとえば、ターゲットインストールサービスの imagepath/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 コマンドで指定した値に次のいずれかの文字が含まれている場合は、これらの文字が XML のパス名の一部として解釈されないように、その値を一重引用符または二重引用符で囲む必要があります。
/'"@[]=

場合によっては、使用するシェルの規則に従って引用符の前にバックスラッシュ文字 (\) を付けてエスケープし、シェルが引用符を削除または解釈しないようにする必要があります。


次の例では、パッケージ名 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 コマンドごとに書き換えられます。aimanifestloadadddelete、または set サブコマンドとともに呼び出すたびに、AIM_MANIFEST ファイルが開かれ、変更され、保存されます。AIM_MANIFEST が設定されていない場合、aimanifest コマンドは失敗します。

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

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

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

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

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

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

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

#!/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

# Check that there is only one disk on the system.
if [[ $SI_NUMDISKS -gt "1" ]] ; then
    print -u2 "System has too many disks for this script."
    exit $SCRIPT_FAILURE
fi

/usr/bin/aimanifest add \
    /auto_install/ai_instance/target/disk/disk_name@name $SI_DISKNAME_1

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[disk_name@name=\"$SI_DISKNAME_1\"]/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[disk_name@name=\"$SI_DISKNAME_1\"]/partition@action \
        use_existing_solaris2
fi
exit $SCRIPT_SUCCESS

SI_DISKSIZE_1 の値が 1048576 以下である AI クライアントでは、次の要素が $AIM_MANIFEST に追加されます。

<target>
  <disk>
    <disk_name name="/dev/dsk/c0t0d0s0"/>
    <partition action="use_existing_solaris2"/>
  </disk>
  <!-- <logical> section -->
</target>

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

<target>
  <disk>
    <disk_name name="/dev/dsk/c0t0d0s0"/>
    <partition name="1">
      <size val="524288mb"/>
    </partition>
  </disk>
  <!-- <logical> section -->
</target>

パーティションを追加するためのコマンドには、そのパーティションに対して別個のディスク指定が作成されないように、disk_name が指定されています。この例のスクリプトは、パーティションが (ほかのディスクではなく) $SI_DISKNAME_1 ディスク上にあることを指定しています。この例の該当する行が次の行に置き換わると、意図した結果が得られません。

    /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

このスクリプトは、上記の出力ではなく、次の不正な出力を提供します。

<target>
  <disk>
    <disk_name name="c0t0d0s0"/>
  </disk>
  <disk>
    <partition name="1">
      <size val="524288mb"/>
    </partition>
  </disk>
</target>
使用例 61  追加ディスクの存在に基づいたルートプールレイアウトの指定

この例では、2 番目のディスクが存在する場合はルートプールのミラーを構成し、3 番目のディスクが存在する場合は 3 方向のミラーを構成するように AI マニフェストをカスタマイズします。スクリプトを実行する前に、SI_NUMDISKS と SI_DISKNAME_1 を設定します。SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2、SI_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" is_root="true">
      <vdev name="mirror_vdev" redundancy="mirror"/>
      <filesystem name="export" mountpoint="/export"/>
      <filesystem name="export/home"/>
      <be name="solaris"/>
    </zpool>
  </logical>
</target>
使用例 62  特定のサイズのディスクが 2 つ以上ある場合のミラー化構成の指定

この例では、システムに 200G バイトのディスクが 2 つ以上ある場合にミラー化構成を指定するように AI マニフェストをカスタマイズします。少なくとも 200G バイトであることがわかった最初の 2 つのディスクを使用します。スクリプトを実行する前に、テスト環境で SI_NUMDISKS、SI_DISKNAME_1、および SI_DISKSIZE_1 を設定します。また、SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2、SI_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

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

#!/usr/bin/python2.6

import os
import sys

from subprocess import check_call, CalledProcessError

SCRIPT_SUCCESS = 0
SCRIPT_FAILURE = 1

def main():

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

    si_numdisks = int(os.environ["SI_NUMDISKS"])
    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:
        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:
            check_call(["/usr/bin/aimanifest", "add",
               "target/logical/zpool[@name=rpool]/vdev@redundancy", "mirror"])
            check_call(["/usr/bin/aimanifest", "set",
               "target/logical/zpool/vdev[@redundancy='mirror']@name", "mirror_vdev"])

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

            check_call(["/usr/bin/aimanifest", "add",
                "target/disk/disk_name@name", found_2])
            check_call(["/usr/bin/aimanifest", "set",
                "target/disk/disk_name[@name='" + found_2 + "']" + "@name_type", "ctd"])
            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()
使用例 63  IP アドレスに基づくインストールするパッケージの指定

この例では、AI クライアントの IP アドレスが指定の範囲にある場合はあるパッケージをインストールし、AI クライアントの 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
使用例 64  特定のサイズ以上のディスクのみをターゲットディスクにする指定

この例では、50G バイト以上のディスクにのみインストールするように AI マニフェストをカスタマイズします。それよりも小さいディスクは無視します。スクリプトを実行する前に、テスト環境で SI_NUMDISKS、SI_DISKNAME_1、および SI_DISKSIZE_1 を設定します。また、SI_NUMDISKS に設定した値に応じて、SI_DISKNAME_2、SI_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
使用例 65  システム構成プロファイルの追加

各 AI クライアントのシステム構成を変更する必要がある場合があります。派生マニフェストスクリプトを構成してプロファイルを作成すれば、各 AI クライアントの AI サーバーに個別のシステム構成プロファイルを作成する必要はありません。インストールサービスが使用できるようにするには、このプロファイルを /system/volatile/profile に格納する必要があります。この例では、AI クライアントが再構成されるときに、ローカルのデフォルトルーターの設定が使用されています。

ROUTER-CONFIG=/system/volatile/profile/router-config.xml
ROUTER=`netstat -rn | grep "^default" | awk '{print $2}'`

cat<<EOF>${ROUTER-CONFIG}
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
 <service_bundle type="profile" name="router">
   <service name="network/install" version="1" type="service">
     <instance name="default" enabled="true">
       <property_group name="install_ipv4_interface" type="application">
         <propval name="default_route" type="net_address_v4" value="${ROUTER}"/>
       </property_group>
     </instance>
   </service>
 </service_bundle>
EOF
使用例 66  マニフェスト仕様が正しくないスクリプト

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

#!/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:///imagepath/auto_install/ai.dtd.1">
      <auto_install/>

      imagepath 引数の値は、次のコマンドによって返されるパスです (svcname はこの派生マニフェストスクリプトが追加されるインストールサービスの名前です)。


      注 -  AI クライアントでスクリプトの使用を試みる前に、イメージパスをデフォルトのパス ///usr/share にリセットしてください。
      $ installadm list -v -n svcname| grep Image
    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. テスト環境の環境変数を、この派生マニフェストスクリプトを使ってインストールされるシステムを表す値で設定します。サンプルファイル /usr/share/auto_install/derived_manifest_test_env.sh をテンプレートとして使用できます。必要に応じて値を変更します。

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

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

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

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

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

    $ /usr/bin/aimanifest validate

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

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

インストール環境で派生マニフェストスクリプトをテストする方法

この手順は、対象となるシステムの 1 つで、すべてのインストール処理を実行することなく、派生マニフェストスクリプトをテストする方法を説明しています。

  1. システムで AI イメージをブートします。

    システム上で、AI イメージを「Text Installer and command line」モードでブートします。

  2. インストーラの初期メニューから「シェル」を選択します。
  3. AI サーバーからスクリプトをコピーします。

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

  4. スクリプトをデバッグします。

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

    • スクリプトを手動で実行します。
    • AI をテストモードで実行します。

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

      $ auto-install -m script -i

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

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

    変更が行われた場合は、スクリプトをコピーして AI サーバーに戻します。