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

Elastic Compute Service:インスタンス初期化のためのカスタムイメージの設定

最終更新日:Sep 29, 2024

LinuxイメージのオペレーティングシステムバージョンがElastic Compute Service (ECS) でサポートされておらず、イメージを使用してcloud-initを介してインスタンスを初期化できない場合、イメージは認識されないオペレーティングシステムから作成されたものとして識別されます。 イメージをECSインスタンスにインポートする前に、イメージに解析スクリプトを追加する必要があります。これは、インスタンスの最初の起動時にオペレーティングシステムを自動的に設定するために使用されます。

説明

ECSでサポートされていないLinuxイメージは、非標準プラットフォームイメージと見なされます。 このようなイメージは、標準オペレーティングシステムプラットフォーム上で開発される。 ただし、重要なシステム構成ファイル、基本的なシステム環境、またはイメージのアプリケーションは、ECSの標準オペレーティングシステム要件に準拠していません。 サポートされているOSバージョンと、非標準プラットフォームイメージのインポートに関するガイドラインを次に示します。

  • Others Linux: ECSは、このタイプのすべてのイメージを他のLinuxイメージとして識別します。 その他のLinuxイメージをインポートし、それを使用してインスタンスを作成した場合、ECSは作成されたインスタンスを処理しません。 インスタンスを作成した後、インスタンスのIPアドレス、ルート、およびパスワードを設定する必要があります。

  • カスタマイズされたLinux: カスタマイズされたLinuxイメージをインポートする前に、このトピックの手順に従ってイメージを設定します。

前提条件

イメージは次の要件を満たす必要があります。

  • 最初のパーティション (通常は /dev/sda1または /dev/vda1) は書き込み可能である必要があります。

  • 最初のパーティションのファイルシステムタイプは、FAT32、ext2、ext3、ext4、またはUFSである必要があります。

    説明

    blkid /dev/sdXnコマンドを使用して、ファイルシステムタイプを確認できます。sdXnは、/sda1などの最初のパーティション名を表します。

  • カスタマイズされた Linux イメージの仮想ファイルのサイズは 5 GiB より大きくなければなりません。

    説明

    df -h /dev/sdXnコマンドを使用してパーティションのサイズを確認できます。sdXnは /sda1などの最初のパーティション名です。

手順

  1. イメージが作成されている仮想マシンにrootユーザーとしてログオンします。

  2. イメージの作成元のサーバーの最初のパーティションのルートディレクトリに、aliyun_custom_imageディレクトリを作成します。

    mkdir /aliyun_custom_image

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

    次の例は、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"

    次の表に、前述の例のパラメーターを示します。 必要に応じてパラメーターを設定できます。

    パラメーター

    説明

    ホスト名

    ホスト名。

    パスワード

    rootユーザーのパスワード。

    eth0_ip_addr

    eth0 NICのIPアドレス。

    eth0_mac_addr

    eth0 NICのMACアドレス。

    eth0_ネットマスク

    eth0 NICのネットワークマスク。

    eth0_gateway

    eth0 NICのデフォルトゲートウェイ。

    eth0_ルート

    eth0内部ルート。 デフォルトでは、ルートはスペースで区切られています。

    dns_nameserver

    DNSアドレスリスト。 デフォルトでは、アドレスはスペースで区切られます。

  3. customized-config. serviceなどの解析スクリプトをイメージ内に作成し、os.confファイルからシステム構成を解釈して適用します。

    このスクリプトは、ECSインスタンスが初めて起動されたときに、ホスト名、ルートパスワード、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: Initialize system configuration
    ### END INIT INFO
    
    # Define the directory for the first partition and os.conf file
    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 it exists
    load_os_conf() {
        if [[ -f $os_conf_file ]]; then
            . $os_conf_file
            return 0
        else
            return 1
        fi
    }
    
    # Cleanup function to remove os.conf and ensure directory exists
    cleanup() {
        rm $os_conf_file >& /dev/null
        mkdir -p $os_conf_dir
    }
    
    # Configure the root password
    config_password() {
        if [[ -n $password ]]; then
            password=$(echo $password | base64 -d)
            if [[ $? == 0 && -n $password ]]; then
                echo "root:$password" | chpasswd
            fi
        fi
    }
    
    # Set the hostname
    config_hostname() {
        if [[ -n $hostname ]]; then
            sed -i "s/^HOSTNAME=.*/HOSTNAME=$hostname/" /etc/sysconfig/network
            hostname $hostname
        fi
    }
    
    # Configure DNS settings
    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
    }
    
    # Determine if the network is classic or VPC
    is_classic_network() {
        grep -q 'eth1' $os_conf_file
    }
    
    # Configure network settings
    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
    }
    
    # Configure network interface
    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
    }
    
    # Set the default gateway
    config_default_gateway() {
        local gateway=$1
        sed -i "s/^GATEWAY=.*/GATEWAY=$gateway/" /etc/sysconfig/network
    }
    
    # Configure routing
    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 the configuration process
    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
    
    # Service action handling
    case "$1" in
        start)
            start
            RETVAL=$?
        ;;
        *)
            echo "Usage: $0 {start}"
            RETVAL=3
        ;;
    esac
    
    exit $RETVAL
  4. システム起動時に自動的に実行されるように解析スクリプトを設定します。

    次のサンプルコマンドは、Ubuntuシステムに適用されます。 オペレーティングシステムに基づいて起動コマンドを変更します。

    systemctl daemon-reload
    systemctl enable customized-config.service
    説明

    カスタマイズされたLinuxイメージに基づいてカスタムイメージが作成されると、自動起動スクリプトも含まれます。 Alibaba Cloudは、インスタンスの初回起動時にos.confファイルの設定を実行します。

関連ドキュメント

イメージを設定した後、カスタムイメージをインポートするときに、オペレーティングシステムのバージョンとして [Customized Linux] を選択できます。 詳細については、「カスタムイメージのインポート」をご参照ください。