全部產品
Search
文件中心

Elastic Compute Service:配置定製版鏡像便於初始化配置執行個體

更新時間:Sep 26, 2024

如果您的Linux鏡像不在ECS支援的作業系統版本中且不能通過安裝cloud-init完成執行個體初始化配置,阿里雲會將該鏡像當作無法識別的作業系統。因此在匯入鏡像前,您需要自行在鏡像中添加解析指令碼,用於執行個體初次啟動時完成自動化配置。

說明

為便於區分,如果您匯入的Linux系統鏡像不在ECS支援的作業系統版本中,該作業系統平台鏡像為非標準平台鏡像。非標準平台鏡像雖然來自標準作業系統平台,但該類鏡像屬於系統關鍵性設定檔、系統基礎環境和應用方面沒有遵守標準平台要求的鏡像。匯入非標準平台鏡像時支援選擇的作業系統版本以及配置說明如下:

  • Others Linux:ECS統一標識為其他系統類別型。如果匯入Others Linux平台鏡像,ECS不會對所建立的執行個體做任何處理。建立執行個體後,需登入ECS執行個體自行配置IP、路由和密碼等。

  • Customized Linux:定製版鏡像。匯入Customized Linux鏡像前,需按照本文進行配置。

前提條件

需確保您的鏡像滿足如下條件:

  • 第一個分區(通常是/dev/sda1或/dev/vda1)必須具備寫入權限。

  • 第一個分區的檔案類型只能是FAT32、EXT2、EXT3、EXT4或UFS。

    說明

    您可以通過blkid /dev/sdXn(其中sdXn是第一個分區名稱,例如/sda1)命令查看分區的檔案系統類型。

  • 虛擬檔案的大小必須大於5 GiB。

    說明

    您可以通過df -h /dev/sdXn(其中sdXn是第一個分區名稱,例如/sda1)命令查看指定分區的空間。

操作步驟

  1. 使用root使用者登入您製作鏡像的虛擬機器。

  2. 在鏡像的第一個分區的根目錄下建立目錄,目錄名稱必須為aliyun_custom_image

    mkdir /aliyun_custom_image

    使用Customized Linux鏡像建立的ECS執行個體初次啟動時,阿里雲會在aliyun_custom_image目錄的os.conf檔案中寫入執行個體的主機名稱、使用者密碼、DNS伺服器等相關資訊。如果不存在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

    主機名稱

    password

    root使用者的密碼

    eth0_ip_addr

    eth0網卡的IP地址

    eth0_mac_addr

    eth0網卡的MAC地址

    eth0_netmask

    eth0網卡的子網路遮罩

    eth0_gateway

    eth0網卡的預設閘道的IP地址

    eth0_route

    eth0內網的路由列表,預設用空格分隔

    dns_nameserver

    DNS地址清單,預設用空格分隔

  3. 在鏡像中建立一份解析指令碼(例如指令碼名稱為customized-config.service),用以讀取和解析os.conf檔案的系統配置。

    該解析指令碼用於ECS執行個體初次開機時進行自動化配置,例如設定主機名稱、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: The initial os-conf job, config the system.
    ### 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
        # ensure $os_conf_dir exists
        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
  4. 設定指令碼開機自啟動。

    以下命令以Ubuntu為例,請您根據實際作業系統選擇開機自啟動命令。

    systemctl daemon-reload
    systemctl customized-config.service
    說明

    基於Customized Linux鏡像建立的ECS執行個體新製作自訂鏡像時,鏡像中也會包含開機啟動指令碼。阿里雲會在執行個體第一次啟動時執行解析指令碼運行os.conf的相關配置。

相關文檔

鏡像配置完成後,您可以在匯入自訂鏡像時選擇作業系統版本為Customized Linux。更多資訊,請參見匯入自訂鏡像