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

Elastic Compute Service:カスタム Linux イメージの設定

最終更新日:Apr 01, 2026

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ホスト名。
passwordroot ユーザーのパスワード。
eth0_ip_addreth0 NIC の IP アドレス。
eth0_mac_addreth0 NIC の MAC アドレス。
eth0_netmasketh0 NIC のネットワークマスク。
eth0_gatewayeth0 NIC のデフォルトゲートウェイ。
eth0_routeeth0 の内部ルート。複数のルートはスペースで区切られます。
dns_nameserverDNS アドレスのリスト。複数のアドレスはスペースで区切られます。

ステップ 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.service
Customized Linux イメージに基づいてカスタムイメージを作成すると、起動スクリプトが新しいイメージに含まれます。ECS は、各インスタンスの初回起動時にのみ os.conf の構成を実行します。

次のステップ

イメージを設定した後、ECS へのインポート時に、[カスタマイズ済み Linux][OS バージョン] として選択します。詳細については、「カスタムイメージのインポート」をご参照ください。