すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:Linux イメージのカスタマイズ

最終更新日:Jan 11, 2024

選択したOSがAlibaba Cloudでサポートされておらず、cloud-initをインストールできない場合は、カスタムイメージをインポートするときに [Customized Linux] を選択できます。 Alibaba Cloudは、カスタマイズされたLinuxイメージを認識できないOSタイプと見なします。 インスタンスの最初の起動時にインスタンスを自動的に設定するには、インポート前にカスタムイメージに解析スクリプトを追加する必要があります。

制限事項

カスタマイズされたLinuxイメージには次の制限があります。
  • 最初のパーティションは書き込み可能でなければなりません。
  • 最初のパーティションのタイプは、FAT32、ext2、ext3、ext4、またはUFSである必要があります。
  • カスタマイズされた Linux イメージの仮想ファイルのサイズは 5 GiB より大きくなければなりません。
カスタマイズされたLinuxイメージには、次のセキュリティ要件があります。
  • 重要な脆弱性をリモートで悪用することはできません。
  • ECSコンソールのVNC管理端末を使用して初めてインスタンスにログインするときは、他の操作を実行する前に、初期パスワード (ある場合) を変更する必要があります。 詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
  • デフォルトのSSHキーペアはサポートされていません。 初期SSHキーペアはAlibaba Cloudによって生成される必要があります。

設定方法

カスタマイズされたLinuxイメージを作成してインポートする前に、次の操作を実行する必要があります。
  1. イメージの作成元のサーバーの最初のパーティションのルートディレクトリに、aliyun_custom_imageディレクトリを作成します。

    カスタマイズされたLinuxイメージから作成されたインスタンスが初めて起動されると、Alibaba Cloudはインスタンス設定をaliyun_custom_imageディレクトリのos.confファイルに書き込みます。 os.confファイルが存在しない場合、Alibaba Cloudが作成します。

  2. イメージに解析スクリプトを作成し、os.confファイルを解析してインスタンス設定を実装します。

    スクリプトの記述方法の詳細については、「解析スクリプトの考慮事項」および「解析スクリプトの例」をご参照ください。

os.conf ファイルの例

  • クラシックネットワーク
    のインスタンスのos.confファイルhostname=<yourHostName>
    password=<yourPassword>
    eth0_ip_addr=10.0.0.2
    eth0_mac_addr=00:xx:xx:xx:xx:23
    eth0_netmask=255.255.255.0
    eth0_gateway=10.0.0.1
    eth0_route="10.0.0.0/8 10.0.0.1;172.16.0.0/12 10.0.0.1"
    eth1_ip_addr=42.0.0.2
    eth1_mac_addr=00:xx:xx:xx:xx:24
    eth1_netmask=255.255.255.0
    eth1_gateway=42.0.0.1
    eth1_route="0.0.0.0/0 42.0.0.1"
    dns_nameserver="7.7.7.7 8.8.8.8" 
    次の表に、上記の例のパラメーターを示します。
    パラメーター説明
    hostnameホスト名を示します。
    passwordパスワード Base64-encoded文字列でなければなりません。
    eth0_ip_addreth0 NICのIPアドレス。
    eth0_mac_addreth0 NICのMACアドレス。
    eth0_netmasketh0 NICのネットワークマスク。
    eth0_gatewayeth0 NICのデフォルトゲートウェイ。
    eth0_routeeth0内部ルート。 デフォルトでは、ルートはセミコロン (;) で区切られます。
    eth1_ip_addreth1 NICのIPアドレス。
    eth1_mac_addreth1 NICのMACアドレス。
    eth1_netmasketh1 NICのネットワークマスク。
    eth1_gatewayeth1 NICのデフォルトゲートウェイ。
    eth1_routeeth1インターネットルート。 デフォルトでは、ルートはセミコロン (;) で区切られます。
    dns_nameserverDNSアドレスリスト。 デフォルトでは、アドレスはスペースで区切られます。
  • VPC
    のインスタンスのos.confファイルhostname=<yourHostName>
    password=<yourPassword>
    eth0_ip_addr=10.0.0.2
    eth0_mac_addr=00:xx:xx:xx:xx:23
    eth0_netmask=255.255.255.0
    eth0_gateway=10.0.0.1
    eth0_route="0.0.0.0/0 10.0.0.1"
    dns_nameserver="7.7.7.7 8.8.8.8" 
    次の表に、上記の例のパラメーターを示します。
    パラメーター説明
    hostnameホスト名を示します。
    passwordパスワード Base64-encoded文字列でなければなりません。
    eth0_ip_addreth0 NICのIPアドレス。
    eth0_mac_addreth0 NICのMACアドレス。
    eth0_netmasketh0 NICのネットワークマスク。
    eth0_gatewayeth0 NICのデフォルトゲートウェイ。
    eth0_routeeth0内部ルート。 デフォルトでは、ルートはセミコロン (;) で区切られます。
    dns_nameserverDNSアドレスリスト。 デフォルトでは、アドレスはスペースで区切られます。

解析スクリプトに関する考慮事項

通常、インスタンスが初めて起動されると、Alibaba Cloudはインスタンス設定をos.confファイルに書き込みます。 os.confファイルは、パーティションのルートディレクトリのaliyun_custom_imageディレクトリにあります。 ただし、カスタマイズされたLinuxイメージの場合は、定義済みの解析スクリプトを作成する必要があります。 スクリプトはos.confファイルから設定を読み取り、インスタンスを設定します。

解析スクリプトは、次の表に示す条件を満たす必要があります。
条件説明
システム起動時の自動起動スクリプトを /etc/init.d/ ディレクトリに配置して、システムの起動時に自動的に実行するように解析スクリプトを設定します。
設定アイテムの値[os.confの例] セクションに示すように、クラシックネットワークタイプとVPCタイプのインスタンスは、設定項目の数と一部の設定項目の値が異なります。
設定ファイルのパスカスタマイズされたLinuxイメージから作成されたインスタンスの最初のパーティションに割り当てられるデバイス名は、インスタンスがI/O最適化されているかどうかによって異なります。 解析コードでuuidまたはlabelを使用して、最初のパーティションに割り当てられたデバイスを識別することを推奨します。 ユーザーパスワードは、解析スクリプトでBase64-encodedする必要があります。
ネットワークタイプ構文解析スクリプトは、eth1_routeまたはeth1関連の設定項目が存在するかどうかをチェックすることによってネットワークタイプを決定できます。 スクリプトは、ネットワークタイプに基づいてインスタンスを解析して処理します。
  • 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

### INIT INFOを開始
# 提供: os-conf
# 必須スタート: $local_fs $network $named $remote_fs
# 必須-停止:
# Should-Stop:
# デフォルト-スタート: 2 3 4 5
# デフォルト-停止: 0 1 6
# 短い説明: 最初のos-confジョブ、システムの設定。
### 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
    # $os_conf_dirが存在することを確認する
    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 /ネットワーク開始
}

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

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

config_route() {
    local interface=$1
    ローカルルート="$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サービスポータル ####################

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=0

ケース「 $1」で
    start)
        start
        RETVAL=$?
    ;;
    *)
        echo "Usage: $0 {start}"
        RETVAL=3
    ;;
esac

終了 $RETVAL