選択した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イメージを作成してインポートする前に、次の操作を実行する必要があります。
- イメージの作成元のサーバーの最初のパーティションのルートディレクトリに、aliyun_custom_imageディレクトリを作成します。
カスタマイズされたLinuxイメージから作成されたインスタンスが初めて起動されると、Alibaba Cloudはインスタンス設定をaliyun_custom_imageディレクトリのos.confファイルに書き込みます。 os.confファイルが存在しない場合、Alibaba Cloudが作成します。
- イメージに解析スクリプトを作成し、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_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
次の表に、上記の例のパラメーターを示します。のインスタンスの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_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はインスタンス設定を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関連の設定項目が存在するかどうかをチェックすることによってネットワークタイプを決定できます。 スクリプトは、ネットワークタイプに基づいてインスタンスを解析して処理します。
|
構成の最適化 | 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