强制导入镜像

最近更新时间: 2023-03-23 15:58:57

操作场景
当用户的 Linux 镜像因为某些原因无法 安装 cloudinit 时,可以通过强制导入镜像功能完成镜像的导入。由于强制导入的镜像没有安装 cloudinit,如果用户使用强制导入镜像进行导入,云平台无法对用户的云服务器进行初始化配置。因此,用户使用强制导入镜像进行导入时,需要根据云平台提供的配置文件,自行设置脚本,对云服务器进行配置。本文档指导用户如何在强制导入镜像的前提下,对云服务器进行配置。
云平台提供了包含配置信息的 cdrom 设备供用户自行配置。用户需要挂载 cdrom,读取 mount_point/qcloud_action/os.conf 的信息进行配置。如果用户有使用其他配置数据、UserData 的需要,可以直接读取 mount_point/ 下的文件。
os.conf 配置文件
os.conf 的基本内容如下:
hostname=VM_10_20_xxxx
password=GRSgae1fw9frsG.rfrF
eth0_ip_addr=10.104.62.201
eth0_mac_addr=52:54:00:E1:96:EB
eth0_netmask=255.255.192.0
eth0_gateway=10.104.0.1
dns_nameserver="10.138.224.65 10.182.20.26 10.182.24.12"
说明
以上信息仅参数名有参考意义,参数值仅做示例。
os.conf 中各个参数的意义如下:

参数名称 参数意义
hostname 主机名
password 加密过的密码
eth0_ip_addr eth0 网卡的局域网 IP
eth0_mac_addr eth0 网卡的 MAC 地址
eth0_netmask eth0 网卡的子网掩码
eth0_gateway eth0 网卡的网关
dns_nameserver DNS 解析服务器

限制条件
 • 镜像仍需要满足 导入镜像 中关于 Linux 镜像导入的镜像的限制(cloudinit 除外)。
 • 导入镜像的系统分区未满。
 • 导入的镜像不能存在可以被远程利用的漏洞。
 • 建议用户用强制导入镜像创建实例成功后立即修改密码。
注意事项
配置脚本解析需注意以下事项:
 • 脚本为开机自动执行,请根据操作系统的类型实现该要求。
 • 脚本须挂载 /dev/cdrom,并读取挂载点下的 qcloud_action/os.conf 文件,获取配置信息。
 • 云平台放置到 cdrom 中的密码为加密后的密码,用户可以使用 chpasswd -e 的方式设置。
加密后的密码可能包含特殊字符,建议先放置到文件中,再以 chpasswd -e < passwd_file 的方式设置。
 • 使用强制导入镜像制作的实例再制作镜像时,需要保证脚本依然会被执行,以保证实例正确配置。也可以在该实例中安装 cloudinit。
操作步骤
 1.根据以下脚本示例,创建 os_config 脚本。
用户可根据实际情况修改 os_config 脚本。
#!/bin/bash
### BEGIN INIT INFO
# Provides: os-config
# 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: config of os-init job
# Description: run the config phase without cloud-init
### END INIT INFO
###################user settings#####################
cdrom_path=blkid -L config-2
load_os_config() {
mount_path=$(mktemp -d /mnt/tmp.XXXX)
mount /dev/cdrom $mount_path
if [[ -f $mount_path/qcloud_action/os.conf ]]; then
. $mount_path/qcloud_action/os.conf
if [[ -n $password ]]; then
passwd_file=$(mktemp /mnt/pass.XXXX)
passwd_line=$(grep password $mount_path/qcloud_action/os.conf)
echo root:${passwd_line#*=} > $passwd_file
fi
return 0
else
return 1
fi
} cleanup() {
umount /dev/cdrom
if [[ -f $passwd_file ]]; then
echo $passwd_file
rm -f $passwd_file
fi
if [[ -d $mount_path ]]; then
echo $mount_path
rm -rf $mount_path
fi
} config_password() {
if [[ -f $passwd_file ]]; then
chpasswd -e < $passwd_file
fi
} config_hostname(){
if [[ -n $hostname ]]; then
sed -i "/^HOSTNAME=./d" /etc/sysconfig/network
echo "HOSTNAME=$hostname" >> /etc/sysconfig/network
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
} config_network() {
/etc/init.d/network stop
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=$eth0_ip_addr
NETMASK=$eth0_netmask
HWADDR=$eth0_mac_addr
ONBOOT=yes
GATEWAY=$eth0_gateway
BOOTPROTO=static
EOF
if [[ -n $hostname ]]; then
sed -i "/^${eth0_ip_addr}./d" /etc/hosts
echo "${eth0_ip_addr} $hostname" >> /etc/hosts
fi
/etc/init.d/network start
} config_gateway() {
sed -i "s/^GATEWAY=.
/GATEWAY=$eth0_gateway" /etc/sysconfig/network
} ###################init#####################
start() {
if load_os_config ; then
config_password
config_hostname
config_dns
config_network
cleanup
exit 0
else
echo "mount ${cdrom_path} failed"
exit 1
fi
} RETVAL=0
case "$1" in
start)
start
RETVAL=$?
;;
*)
echo "Usage: $0 {start}"
RETVAL=3
;;
esac
exit $RETVAL
 2. 将 os_config 脚本放置到 /etc/init.d/ 目录下,并执行以下命令。
chmod +x /etc/init.d/os_config
chkconfig --add os_config
 3. 执行以下命令,检查 os_config 是否已经被添加到启动服务中。
chkconfig --list