Linux イメージのオペレーティングシステムのバージョンが Elastic Compute Service (ECS) でサポートされておらず、cloud-init が利用できない場合、ECS はそのイメージを認識できないオペレーティングシステムを使用していると判断します。このようなイメージをインスタンスの初期化に使用するには、インポートする前にイメージに初期化スクリプトを追加する必要があります。インスタンスの初回起動時に、ECS はインスタンスの構成を os.conf という名前のファイルに書き込みます。初期化スクリプトはこのファイルを読み取り、各設定を自動的に適用します。
非標準プラットフォームの Linux イメージは、それぞれ異なるワークフローを持つ 2 つのカテゴリに分類されます:
Others Linux:ECS はイメージを汎用 Linux イメージとして識別し、インスタンス作成後には構成を行いません。インスタンスの起動後、IP アドレス、ルート、パスワードを手動で構成する必要があります。
Customized Linux:イメージをインポートする前に、このトピックに従って初期化スクリプトを追加します。ECS はこのスクリプトを使用して、初回起動時にインスタンスを自動的に構成します。このトピックは Customized Linux イメージにのみ適用されます。
初期化スクリプトがない、または設定が間違っている場合、インスタンスは起動しますが、ネットワークインターフェイス、ホスト名、パスワードは構成されません。インスタンスを回復するためにコンソールへのアクセスが必要になる場合があります。
前提条件
開始する前に、以下を確認してください:
最初のパーティション (通常は
/dev/sda1または/dev/vda1) が書き込み可能であること最初のパーティションのファイルシステムタイプが FAT32、ext2、ext3、ext4、または UFS であること。これは
blkid /dev/sdXnで確認できます (sdXnは実際のパーティション名、例えばsda1に置き換えてください)仮想ディスクイメージが 5 GiB より大きいこと。これは
df -h /dev/sdXnで確認できます
イメージの準備
ステップ 1:構成ディレクトリの作成
root ユーザーとして仮想マシンにログインします。最初のパーティションのルートに aliyun_custom_image ディレクトリを作成します:
mkdir /aliyun_custom_imageインスタンスの初回起動時に、ECS はこのディレクトリ内の os.conf に構成を書き込みます。ファイルが存在しない場合、ECS はそれを作成します。ファイルは次の形式です:
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.X.X 8.8.8.8"次の表に各パラメーターの説明を示します。
| パラメーター | 説明 |
|---|---|
hostname | ホスト名。 |
password | root ユーザーのパスワード。 |
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 アドレスのリスト。複数のアドレスはスペースで区切られます。 |
ステップ 2:初期化スクリプトの追加
イメージに初期化スクリプトを作成し、os.conf を読み取って構成を適用します。スクリプトファイルには、例えば customized-config.service のような名前を付けます。
次のサンプルスクリプトは、初回起動時にホスト名、root パスワード、DNS サーバ、およびネットワーク構成を設定します。このスクリプトは sysvinit サービスフレームワークを使用しています。
#!/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: システム構成を初期化
### END INIT INFO
# 最初のパーティションと os.conf ファイルのディレクトリを定義
first_partition_dir='/boot/'
os_conf_dir=${first_partition_dir}/aliyun_custom_image
os_conf_file=${os_conf_dir}/os.conf
# os.conf が存在する場合にロード
load_os_conf() {
if [[ -f $os_conf_file ]]; then
. $os_conf_file
return 0
else
return 1
fi
}
# os.conf を削除し、ディレクトリの存在を確認するクリーンアップ関数
cleanup() {
rm $os_conf_file >& /dev/null
mkdir -p $os_conf_dir
}
# root パスワードを設定
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
}
# DNS 設定を構成
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
}
# ネットワークがクラシックネットワークか VPC かを判断
is_classic_network() {
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
interface_cfg="/etc/sysconfig/network-scripts/ifcfg-${interface}"
cat << EOF > $interface_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 $gw
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
# サービスアクションの処理
case "$1" in
start)
start
RETVAL=$?
;;
*)
echo "Usage: $0 {start}"
RETVAL=3
;;
esac
exit $RETVALステップ 3:起動時のスクリプトの有効化
システムの起動時に初期化スクリプトが自動的に実行されるように設定します。以下のコマンドは Ubuntu およびその他の systemd ベースのシステムに適用されます。必要に応じて、お使いのディストリビューションの init システムに合わせて変更してください。
systemctl daemon-reload
systemctl enable customized-config.serviceCustomized Linux イメージに基づいてカスタムイメージを作成すると、起動スクリプトが新しいイメージに含まれます。ECS は、各インスタンスの初回起動時にのみ os.conf の構成を実行します。次のステップ
イメージを設定した後、ECS へのインポート時に、[カスタマイズ済み Linux] を [OS バージョン] として選択します。詳細については、「カスタムイメージのインポート」をご参照ください。