强制导入镜像
最近更新时间: 2024-10-17 17:10:00
操作场景
当用户的 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
是否已经被添加到启动服务中。chkconfig --list
说明: 用户需要自行保证脚本执行正确,如果镜像导入后遇到无法通过 SSH 连接实例,没有网络连接等问题,请尝试通过控制台连接到实例,重新执行脚本,排查问题。如仍然无法处理,请联系客服。