如果您的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)命令查看指定分區的空間。
操作步驟
使用root使用者登入您製作鏡像的虛擬機器。
在鏡像的第一個分區的根目錄下建立目錄,目錄名稱必須為
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地址清單,預設用空格分隔
在鏡像中建立一份解析指令碼(例如指令碼名稱為
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
設定指令碼開機自啟動。
以下命令以Ubuntu為例,請您根據實際作業系統選擇開機自啟動命令。
systemctl daemon-reload systemctl customized-config.service
說明基於Customized Linux鏡像建立的ECS執行個體新製作自訂鏡像時,鏡像中也會包含開機啟動指令碼。阿里雲會在執行個體第一次啟動時執行解析指令碼運行
os.conf
的相關配置。
相關文檔
鏡像配置完成後,您可以在匯入自訂鏡像時選擇作業系統版本為Customized Linux。更多資訊,請參見匯入自訂鏡像。