選択した 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 によってランダムに生成される必要があります。
手順
- 最初のイメージパーティションのルートディレクトリ内に、
aliyun_custom_image
ディレクトリを作成します。カスタマイズされた Linux イメージを使用して作成されたインスタンスが初めて起動されるとき、Alibaba Cloud は設定情報を
aliyun_custom_image
ディレクトリの os.conf ファイルに書き込みます。 もしファイルがなければ、Alibaba Cloud は自動的に os.conf ファイルを作成します。 - イメージに構文解析スクリプトを作成して、 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 アドレスリスト。デフォルトでは、アドレスはスペースで区切られています。 |
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