Elastic Compute Service (ECS) でサポートされていない OS バージョンを使用していて cloud-init を使用できない Linux イメージに解析スクリプトを追加し、初回起動時に自動構成ができるようにします。
サポートされていない OS バージョンの Linux イメージは、非標準プラットフォームイメージとして扱われます。これらのイメージは、標準オペレーティングシステムをベースとしていますが、システムファイル、環境、またはアプリケーションがプラットフォーム要件を満たしていません。インポートする際に、次のいずれかの [OS バージョン] オプションを選択します。
-
[その他][ Linux]: ECS は、このイメージタイプから作成されたインスタンスの自動構成を行いません。インスタンスの作成後、IP アドレス、ルート、パスワード、およびその他の設定を手動で設定する必要があります。
-
[カスタム Linux]: インポート前に、本トピックに記載の設定が必要です。
前提条件
イメージは、次の要件を満たす必要があります:
-
最初のパーティション (通常は /dev/sda1 または /dev/vda1) に書き込み権限があること。
-
最初のパーティションのファイルシステムが FAT32、EXT2、EXT3、EXT4、または UFS であること。
説明blkid /dev/sdXnを実行して、ファイルシステムの種類を確認してください。/dev/sdXn は、/dev/sda1 などの実際の最初のパーティションパスに置き換えてください。 -
イメージの仮想サイズが 5 GiB を超えていること。
説明df -h /dev/sdXnを実行して、パーティションの空き容量を確認してください。/dev/sdXn は、/dev/sda1 などの実際の最初のパーティションパスに置き換えてください。
手順
-
root ユーザーとしてソース仮想マシンにログオンします。
-
最初のパーティションのルートディレクトリに
aliyun_custom_imageという名前のディレクトリを作成します。mkdir /boot/aliyun_custom_image初回起動時に Alibaba Cloud は、ホスト名、root ユーザーのパスワード、DNS サーバーアドレスなどのインスタンス情報を、
aliyun_custom_imageディレクトリ内の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="0.0.0.0/0 10.0.0.1" dns_nameserver="7.7.X.X 8.8.8.8"例に含まれるパラメーター:
パラメーター
説明
hostnameインスタンスのホスト名。
passwordroot ユーザーのパスワード。
eth0_ip_addreth0 NIC の IP アドレス。
eth0_mac_addreth0 NIC の MAC アドレス。
eth0_netmasketh0 NIC のサブネットマスク。
eth0_gatewayeth0 のデフォルトゲートウェイ IP アドレス。
eth0_routeeth0 の内部ルート。スペース区切り。
dns_nameserverDNS サーバーアドレス。スペース区切り。
-
os.confファイルからシステム構成を読み取り、適用するための解析スクリプトを作成します (例:customized-config.serviceという名前のサービスファイル)。このスクリプトは初回起動時に実行され、ホスト名、root ユーザーのパスワード、DNS サーバーアドレス、およびネットワーク設定を構成します。
スクリプト例:
#!/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: 初期 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() { # システム構成の繰り返しを避けるため、$os_conf_file を削除します 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/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 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=0 case "$1" in start) start RETVAL=$? ;; *) echo "Usage: $0 {start}" RETVAL=3 ;; esac exit $RETVAL -
スクリプトがシステム起動時に実行されるように有効化します。
次のコマンドは Ubuntu 向けです。ご使用のオペレーティングシステムに合わせて調整してください。
sudo systemctl daemon-reload sudo systemctl enable customized-config.service説明Customized Linux インスタンスから作成されたカスタムイメージは、この起動スクリプトを継承します。 Alibaba Cloud は、初回起動時にのみ
os.confの設定を適用します。
関連ドキュメント
設定後、カスタムイメージをインポートする際に、OS バージョンとして [Customized Linux] を選択します。