首頁  >  文章  >  運維  >  如何匯入自訂鏡像時選擇 Customized Linux(定製版鏡像)

如何匯入自訂鏡像時選擇 Customized Linux(定製版鏡像)

坏嘻嘻
坏嘻嘻原創
2018-09-18 14:59:152444瀏覽

這篇文章帶給大家的內容是關於如何導入自訂鏡像時選擇定製版鏡像,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

自訂Linux 自訂鏡像

當您的鏡像作業系統不在阿里雲支援的已有平台類型中,也無法安裝cloud-init 時,您可以在匯入自訂鏡像時選擇Customized Linux(定製版鏡像)。阿里雲將定製版Linux 鏡像當作無法識別的作業系統類型,缺少初次啟動ECS實例時所必要的標準配置信息,需要您導入鏡像前根據本文描述在定製版鏡像中添加解析腳本,便於初次啟動時自動化配置實例。

限制條件

Customized Linux 映像的第一個分割區必須可以寫入。

Customized Linux 映像的第一個分割區類型支援 FAT32、EXT2、EXT3、EXT4 或 UFS。

Customized Linux 映像的虛擬檔案大小必須大於 5 GiB。

Customized Linux 映像有下列安全性需求:

不能存在可遠端利用的高風險漏洞。

使用控制台的 管理終端 登入實例時,如果存在初始預設密碼,必須在首次登入時修改,修改密碼之前不允許進入實例做任何操作。

不支援預設 SSH 金鑰對,初始 SSH 金鑰對必須由阿里雲隨機產生。

配置方法

在映像的第一個分區的根目錄下新建目錄 aliyun_custom_image。

使用該 Customized Linux 映像所建立的實例初次啟動時,阿里雲會在 aliyun_custom_image 目錄的 os.conf 檔案中寫入實例相關配置資訊。如果不存在 os.conf 文件,系統則會自動建立。

在映像中建立一份解析腳本,用來解析 os.conf 檔案的系統配置。請參閱 解析腳本注意事項 和 解析腳本範例編寫腳本。

os.conf 檔案範例

經典網路類型實例

hostname=iZ23r29djmjZ
password=cXdlcjEyMzQK
eth0_ip_addr=10.171.254.123
eth0_mac_addr=00:8c:fa:5e:14:23
eth0_netmask=255.255.255.0
eth0_gateway=10.171.254.1
eth0_route="10.0.0.0/8 10.171.254.1;172.16.0.0/12 10.171.254.1"
eth1_ip_addr=42.120.74.105
eth1_mac_addr=00:8c:fa:5e:14:24
eth1_netmask=255.255.255.0
eth1_gateway=42.120.74.1
eth1_route="0.0.0.0/0 42.120.74.1"
dns_nameserver="7.7.7.7 8.8.8.8"

參數說明如下表所示:

如何匯入自訂鏡像時選擇 Customized Linux(定製版鏡像)

專有網路VPC 類型實例

hostname=iZ23r29djmjZ
password=cXdlcjEyMzQK
eth0_ip_addr=10.171.254.123
eth0_mac_addr=00:8c:fa:5e:14:23
eth0_netmask=255.255.255.0
eth0_gateway=10.171.254.1
eth0_route="0.0.0.0/0 10.171.254.1"
dns_nameserver="7.7.7.7 8.8.8.8"

參數說明如下表所示:

如何匯入自訂鏡像時選擇 Customized Linux(定製版鏡像)

解析腳本注意事項

實例初次啟動時,正常情況下阿里雲會自動將組態項目的相關資訊寫入第一個分割區的根目錄下aliyun_custom_image 目錄的os.conf 檔案中。配置 Customized Linux 映像必須在鏡像中建立預定義解析腳本,以從 os.conf 檔案中讀取實例配置資訊並完成實例配置。以下為解析腳本所需滿足的條件。

開機啟動:解析腳本需要設定成開機自啟動,例如,將解析腳本存放在 /etc/init.d/ 目錄下。

設定項取值規則:如 os.conf 檔案範例 的設定項所述,VPC 與經典網路實例的組態項目數量和部分組態項目的取值規則均有所不同。

設定檔讀取路徑:Customized Linux 映像檔在建立 I/O 最佳化實例或非 I/O 最佳化實例時,為第一個分割區所指派的裝置名稱預設不一樣。所以在解析腳本中最好可以用 uuid 或 label 來辨識第一個分割區的裝置。使用者密碼為 Base64 編碼的字串,設定密碼時需要做相關處理。

判斷 VPC 或經典網路:解析腳本判斷該網路類型時,可以查看是否存在 eth1_route 或其他 eth1 相關的配置項目。判斷出目前實例的網路類型後再有針對性地解析和處理。

VPC 類型實例在 os.conf 檔案的 eth0_route 參數中配置預設公網路由。

經典網路類型實例在 os.conf 檔案的 eth1_route 參數中配置預設公網路由,內部路由配置在 eth0_route 中。

配置最佳化:os.conf 檔案中的配置在實例的整個生命週期中執行一次即可,解析腳本執行成功後建議刪除 os.conf 檔案。同時解析腳本如果沒有讀取到 os.conf 檔案配置,則不執行檔案中的配置。

自訂鏡像處理:根據 Customized Linux 映像建立的實例再製作自訂鏡像時,鏡像中也會包含這個開機啟動腳本。阿里雲會在實例第一次啟動時寫入 os.conf 配置,解析腳本在偵測到該配置時即可執行相關配置。

修改相关配置时的处理:当实例的配置信息通过阿里云的控制台或 API 发生变更时,阿里云将相关信息写入到 os.conf 文件中,解析脚本将被再次执行从而下发这些更改。

解析脚本示例

以下为以 CentOS 操作系统为例的解析脚本示例,仅供参考,您需要根据实际的操作系统类型调整脚本内容。在使用脚本前,务必在镜像中调试脚本,并保证调试通过。

#!/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 is exitst
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
inteface_cfg="/etc/sysconfig/network-scripts/ifcfg-${interface}"
cat << EOF > $inteface_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 &#39;s/;/\n/&#39; | \
while read line; do
dst=$(echo $line | awk &#39;{print $1}&#39;)
gw=$(echo $line | awk &#39;{print $2}&#39;)
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

以上是如何匯入自訂鏡像時選擇 Customized Linux(定製版鏡像)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn