强制导入镜像
操作场景
当用户的 Linux 镜像因为某些原因无法安装 cloudinit 时,可以使用 强制导入镜像 功能完成镜像的导入。如果用户使用强制导入镜像进行导入,站狐云将无法对用户的云服务器进行初始化配置,需要用户设置脚本自行根据站狐云提供的配置文件对云服务器进行配置。本文档指导用户如何在强制导入镜像的前提下,对云服务器进行配置。
限制条件
- 镜像仍需要满足 导入镜像 中关于 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 解析服务器 | 
配置脚本解析
注意事项
- 脚本为开机自动执行,请根据操作系统的类型实现该要求。
 - 脚本须挂载 
/dev/cdrom,并读取挂载点下的os_action/os.conf文件,获取配置信息。 - 站狐云放置到 cdrom 中的密码为加密后的密码,用户可以使用 
chpasswd -e的方式设置。- 加密后的密码可能包含特殊字符,建议先放置到文件中,再以 
chpasswd -e < passwd_file的方式设置。 
 - 加密后的密码可能包含特殊字符,建议先放置到文件中,再以 
 - 使用强制导入镜像制作的实例再制作镜像时,需要保证脚本依然会被执行,以保证实例正确配置。也可以在该实例中安装 cloudinit。
 
示例
站狐云提供一份基于 CentOS 的示例脚本,用户可以根据示例脚本创建针对自己镜像的配置脚本。创建过程中,需要注意以下几点:
- 该脚本需要在导入镜像前正确放置到系统中。
 - 该脚本不适合所有操作系统,用户需要根据自己的操作系统进行相对修改已满足语义。
 
- 根据以下脚本示例,创建 
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
- 将 
os_config脚本放置到/etc/init.d/目录下,并执行以下命令。 
chmod +x /etc/init.d/os_config
chkconfig --add os_config
- 执行以下命令,检查 
os_config是否已经被添加到启动服务中。 
说明:用户需要自行保证脚本执行正确,如果镜像导入后遇到无法通过 SSH 连接实例,没有网络连接等问题,请尝试通过控制台连接到实例,重新执行脚本,排查问题。如仍然无法处理,请联系客服。