本篇文章給大家帶來的內容是關于如何導入自定義鏡像時選擇定制版鏡像,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
定制 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"
參數說明如下表所示:
專有網絡 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"
參數說明如下表所示:
解析腳本注意事項
實例初次啟動時,正常情況下阿里云自動將配置項的相關信息寫入第一個分區的根目錄下 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??$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?'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