强制导入镜像

最后更新时间:2021-05-25 11:01:10

    操作场景

    当用户的 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,并读取挂载点下的 os_action/os.conf 文件,获取配置信息。
    • 腾讯云放置到 cdrom 中的密码为加密后的密码,用户可以使用 chpasswd -e 的方式设置。
    • 加密后的密码可能包含特殊字符,建议先放置到文件中,再以 chpasswd -e < passwd_file 的方式设置。
    • 使用强制导入镜像制作的实例再制作镜像时,需要保证脚本依然会被执行,以保证实例正确配置。也可以在该实例中安装 cloudinit。

    操作步骤

    注意:

    腾讯云提供一份基于 CentOS 的示例脚本,用户可以根据示例脚本创建针对自己镜像的配置脚本。创建过程中,需要注意以下几点:

    • 该脚本需要在导入镜像前正确放置到系统中
    • 该脚本不适合所有操作系统,用户需要根据自己的操作系统进行相对修改已满足语义。
    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
    1. os_config 脚本放置到 /etc/init.d/ 目录下,并执行以下命令。
      chmod +x /etc/init.d/os_config
      chkconfig --add os_config
    2. 执行以下命令,检查 os_config 是否已经被添加到启动服务中。
      chkconfig --list
      说明:

      用户需要自行保证脚本执行正确,如果镜像导入后遇到无法通过 SSH 连接实例,没有网络连接等问题,请尝试通过控制台连接到实例,重新执行脚本,排查问题。如仍然无法处理,请联系客服。