選択した OS が Alibaba Cloud によってサポートされておらず、cloud-int をインストールできない場合、カスタマイズされたイメージを読み込むときには[カスタマイズされた Linux] を選択します。 Alibaba Cloud は、カスタマイズされた Linux イメージを認識されない OS タイプと見なします (すなわち、ECS インスタンスが最初に起動されるときに必要な標準設定情報が欠如しています) 。 この場合、最初の起動時にインスタンスの自動設定を容易にするために、イメージをインポートする前にカスタマイズしたイメージに構文解析スクリプトを追加する必要があります。

制限事項

  • カスタマイズされた Linux イメージの最初のパーティションは書き込み可能であることが必要です。

  • カスタマイズされた Linux イメージの最初のパーティションタイプは FAT32、EXT2、EXT3、EXT4、または UFS である必要があります。

  • カスタマイズされた Linux イメージの仮想ファイルのサイズは 5 GiB より大きくなければなりません。

  • カスタマイズされた Linux イメージのセキュリティ要件は次のとおりです。

    • リモートから悪用される可能性がある危険性の高い脆弱性はありません。
    • ECS コンソールの[端末管理] から初めてインスタンスにログインしたとき、後続の操作を実行する前に、初期のデフォルトパスワード (パスワードがある場合) を変更する必要があります。
    • デフォルトの SSH 秘密キーペアはありません。 初期 SSH 秘密キーペアは、Alibaba Cloud によってランダムに生成される必要があります。

手順

  1. 最初のイメージパーティションのルートディレクトリ内に、aliyun_custom_image ディレクトリを作成します。

    カスタマイズされた Linux イメージを使用して作成されたインスタンスが初めて起動されるとき、Alibaba Cloud は設定情報を aliyun_custom_image ディレクトリの os.conf ファイルに書き込みます。 もしファイルがなければ、Alibaba Cloud は自動的に os.conf ファイルを作成します。

  2. イメージに構文解析スクリプトを作成して、 os.conf ファイルのシステム設定を解析します。 スクリプトの書き方の詳細については、「スクリプト構文解析の注意事項」および「構文解析スクリプト例」をご参照ください。

os.conf ファイルの例

クラシックネットワークを使用しているインスタンスの場合
hostname=iZ23r29djmjZ
password=cXdlcjEyMzQK
eth0_ip_addr=10.171.254.123
eth0_mac_addr=00:8c:fa:5e:14:23
eth0_netmask=255.255.255.0
eth0_gateway=10.171.254.1
eth0_route="10.0.0.0/8 10.171.254.1;172.16.0.0/12 10.171.254.1"
eth1_ip_addr=42.120.74.105
eth1_mac_addr=00:8c:fa:5e:14:24
eth1_netmask=255.255.255.0
eth1_gateway=42.120.74.1
eth1_route="0.0.0.0/0 42.120.74.1"
dns_nameserver="7.7.7.7 8.8.8.8"
パラメーターについて、次の表に説明します。
パラメーター パラメーターの説明
hostname ホスト名
password Base64 でエンコードされたパスワード
eth0_ip_addr eth0 NIC の IP アドレス
eth0_mac_addr eth0 NIC の MAC アドレス
eth0_netmask eth0 NIC のネットワークマスク
eth0_gateway eth0 NIC のデフォルトゲートウェイ
eth0_route eth0 イントラネットルートリスト。デフォルトでは、ルートはセミコロン (;) で区切られています。
eth1_ip_addr eth1 NIC の IP アドレス
eth1_mac_addr eth1 NIC の MAC アドレス
eth1_netmask eth1 NIC のネットワークマスク
eth1_gateway eth1 NIC のデフォルトゲートウェイ
eth1_route eth1 インターネットルートリスト。デフォルトでは、ルートはセミコロン (;) で区切られています。
dns_nameserver DNS アドレスリスト。デフォルトでは、アドレスはスペースで区切られています。
VPC を使用しているインスタンスの場合
hostname=iZ23r29djmjZ
password=cXdlcjEyMzQK
eth0_ip_addr=10.171.254.123
eth0_mac_addr=00:8c:fa:5e:14:23
eth0_netmask=255.255.255.0
eth0_gateway=10.171.254.1
eth0_route="0.0.0.0/0 10.171.254.1"
dns_nameserver="7.7.7.7 8.8.8.8"
パラメーターについて、次の表に説明します。
パラメーター パラメーターの説明
hostname ホスト名
password Base64 でエンコードされたパスワード
eth0_ip_addr eth0 NIC の IP アドレス
eth0_mac_addr eth0 NIC の MAC アドレス
eth0_netmask eth0 NIC のネットワークマスク
eth0_gateway eth0 NIC のデフォルトゲートウェイ
eth0_route eth0 イントラネットルートリスト。デフォルトでは、ルートはセミコロン (;) で区切られています。
dns_nameserver DNS アドレスリスト。デフォルトでは、アドレスはスペースで区切られています。

スクリプト構文解析の考慮事項

通常、インスタンスが初めて起動されると、Alibaba Cloud は設定項目に関する情報を最初のパーティションのルートディレクトリにある aliyun_custom_image ディレクトリ内の os.conf ファイルに自動的に書き込みます。 カスタマイズされた Linux イメージを設定するには、そのイメージ内に事前に定義済みである構文解析スクリプトを作成する必要があります。 次に、Alibaba Cloud は os.conf ファイルからインスタンスに関する設定情報を読み取り、インスタンス設定を完了します。 スクリプト構文解析は、以下の条件が満たされている必要があります。

  • 自動スタート: 構文解析スクリプトは自動的に開始します。 そのためには、スクリプトを /etc/init.d/ ディレクトリに置きます。

  • 設定項目の値のルール: os.conf ファイルの例で説明したように、クラシックネットワークを使用したインスタンスと VPC を用いたインスタンスとではいくつかの設定項目および設定項目の数のルールに違いがあります。

  • 設定ファイルの読み込みパス: デフォルトでは、最初のパーティションに割り当てられたデバイスの名前は、I/O 最適化および非 I/O 最適化インスタンスを含むカスタマイズされた Linux イメージ用に作成されたインスタンスのタイプによって異なります。 したがって、デバイスが最初のパーティションにあることを示すために、uuid または label を使用することを推奨します。 ユーザーパスワードは Base64 でエンコードされた文字列なので、スクリプトでも Base64 でエンコードされている必要があります。

  • ネットワークタイプ: 構文解析スクリプトを使用してネットワークタイプを決定する場合、eth1_route または他の eth1 関連の設定項目があるかどうかを確認します。 そのためには、クラシックネットワークを使用しているのか VPC を使用しているのかを判断した後、インスタンスを解析して処理します。

    • VPC を使用するインスタンスは、os.conf ファイルの eth0_route パラメーターで指定されたインターネットルートで設定されます。

    • クラシックネットワークを使用しているインスタンスは、 os.conf ファイルの eth1_route パラメーターが指定するインターネットルートで設定されています。イントラネットルートは eth0_route パラメーターで指定されています。

  • 設定の最適化: os.conf ファイルの設定は、インスタンスのライフサイクル中で 1 回だけ実行されます。 構文解析スクリプトが正常に実行された後に os.conf ファイルを削除することを推奨します。 構文解析スクリプトは、os.conf ファイル内の設定を読み取らなかった場合、その設定を実行しません。

  • カスタマイズされたイメージの処理: カスタマイズされた Linux イメージに基づいてカスタマイズされたイメージを作成すると、自動起動を要求するスクリプトも新しいイメージに含まれます。 Alibaba Cloud はインスタンスが最初に起動されたときに os.conf ファイル設定を書き込みます。 その後、構文解析スクリプトは検出時にただちに設定を実行します。

  • 設定変更処理: Alibaba Cloud コンソールまたは API を通じてインスタンス設定が変更されると、Alibaba Cloud は関連情報を os.conf ファイルに書き込みます。 その後、構文解析スクリプトは構成を再度実行して変更を発行します。

構文解析スクリプトの例

以下では、例として CentOS に使用される構文解析スクリプトを使用します。 スクリプトの内容は必要に応じて変更できます。 スクリプトを使用する前に、スクリプトがイメージ内で正常にデバッグされたことをご確認ください。

 #! /bin/bash

### BEGIN INIT INFO
# Provides:          os-conf
# Required-Start:    $local_fs $network $named $remote_fs
# Required-Stop:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: The initial os-conf job, config the system.
### END INIT INFO

first_partition_dir='/boot/'
os_conf_dir=${first_partition_dir}/aliyun_custom_image
os_conf_file=${os_conf_dir}/os.conf

load_os_conf() {
    if [[ -f $os_conf_file ]]; then
        . $os_conf_file
        return 0
    else
        return 1
    fi
}

cleanup() {
    # ensure $os_conf_file is deleted, to avoid repeating config system
    rm $os_conf_file >& /dev/null
    # ensure $os_conf_dir is exitst
    mkdir -p $os_conf_dir
}

config_password() {
    if [[ -n $password ]]; then
        password=$(echo $password | base64 -d)
        if [[ $? == 0 && -n $password ]]; then
            echo "root:$password" | chpasswd
        fi
    fi
}

config_hostname
    if [[ -n $hostname ]]; then
        sed -i "s/^HOSTNAME=. */HOSTNAME=$hostname/" /etc/sysconfig/network
        hostname $hostname
    fi
}

config_dns() {
    if [[ -n $dns_nameserver ]]; then
        dns_conf=/etc/resolv.conf
        sed -i '/^nameserver.*/d' $dns_conf
        for i in $dns_nameserver; do
            echo "nameserver $i" >> $dns_conf
        done
    fi
}

is_classic_network() {
    # vpc: eth0
    # classic: eth0 eth1
    grep -q 'eth1' $os_conf_file
}

config_network() {
    /etc/init.d/network stop
    config_interface eth0 ${eth0_ip_addr} ${eth0_netmask} ${eth0_mac_addr}
    config_route eth0 ${eth0_route}
    if is_classic_network ; then
        config_interface eth1 ${eth1_ip_addr} ${eth1_netmask} ${eth1_mac_addr}
        config_route eth1 ${eth1_route}
    fi
    /etc/init.d/network start
}

config_interface
    local interface=$1
    local ip=$2
    local netmask=$3
    local mac=$4
    inteface_cfg="/etc/sysconfig/network-scripts/ifcfg-${interface}"
    cat << EOF > $inteface_cfg
DEVICE=$interface
IPADDR=$ip
NETMASK=$netmask
HWADDR=$mac
ONBOOT=yes
BOOTPROTO=static
EOF
}

config_default_gateway() {
    local gateway=$1
    sed -i "s/^GATEWAY=. */GATEWAY=$gateway/" /etc/sysconfig/network
}

config_route() {
    local interface=$1
    local route=$2
    route_conf=/etc/sysconfig/network-scripts/route-${interface}
    > $route_conf
    echo $route | sed 's/;/\n/' | \
        while read line; do
            dst=$(echo $line | awk '{print $1}')
            gw=$(echo $line | awk '{print $2}')
            if ! grep -q "$dst" $route_conf 2> /dev/null; then
                echo "$dst via $gw dev $interface" >> $route_conf
            fi
            if [[ "$dst" == "0.0.0.0/0" ]]; then
                config_default_gateway
            fi
        done
}

################## sysvinit service portal ####################

start() {
    if load_os_conf ; then
        config_password
        config_network
        config_hostname
        config_dns
        cleanup
        return 0
    else
        echo "not load $os_conf_file"
        return 0
    fi
}

RETVAL

case "$1" in
    start)
        start
        RETVAL=$?
    ;;
    *)
        echo "Usage: $0 {start}"
        RETVAL=3
    ;;
esac

exit $RETVAL