本文介绍如何在本地制作一个用于创建边缘裸金属实例的自定义镜像。
当您从本地导入一个自定义镜像时,需要确保镜像满足平台要求和规范。否则,可能导致镜像无法成功导入或者无法使用镜像成功创建出实例。因此,请确保您已了解镜像导入限制并按照文中步骤进行软件、系统、驱动等配置。
镜像导入限制:
在制作自定义镜像前,请先了解以下镜像导入限制:
适用场景:
本文所述的操作适用于以下场景:您拥有一个ISO格式的镜像,并希望基于该镜像制作一个QCOW2格式的虚拟机镜像,以用于创建边缘裸金属实例。
镜像制作流程:
说明
如果您的镜像的格式为QCOW2,那么您在导入镜像前只需要执行步骤2~步骤5,无需执行步骤6的格式转换。
本示例中以在VirtualBox 7.1.4版本中创建虚拟机,并使用ISO镜像为虚拟机安装CentOS 7操作系统为例进行说明。对于不同版本的VirtualBox和操作系统,安装步骤可能不同。请您根据实际的安装界面提示进行操作。
您需要在镜像中提前安装Mellanox网卡驱动,否则实例的网卡可能无法正常工作。建议您安装5.4版本的Mellanox网卡。
以下内容以下载CentOS 7.6 x86_64位镜像为例进行说明。实际操作中,请下载与您的操作系统匹配的驱动安装包。
说明
该驱动的提供者为第三方厂商。驱动下载页面上的内容可能会发生变化,请您以实际的页面内容为准。
访问官方网站。
在MLNX_EN Download Center区域的Archive Versions页签下按实际情况选择驱动版本。本示例中,配置如下:
右键单击 mlnx-en-5.4-3.6.8.1-rhel7.6-x86_64.tgz 并单击复制链接地址。
在虚拟机中,运行以下命令下载驱动的.tgz文件:
wget <复制的链接地址>
示例:
wget https://www.mellanox.com/downloads/ofed/MLNX_EN-5.4-3.6.8.1/mlnx-en-5.4-3.6.8.1-rhel7.6-x86_64.tgz
运行以下命令解压缩.tgz文件并安装驱动:
tar zxvf <.tgz文件名称> <.tgz文件名称>/install
示例:
tar zxvf mlnx-en-5.4-3.6.8.1-rhel7.6-x86_64.tgz mlnx-en-5.4-3.6.8.1-rhel7.6-x86_64/install
说明
官方文档中提供了不同的驱动安装方法。以上内容仅体现其中一种方法:解压安装包并执行安装包内的install
脚本来安装驱动。其他安装方法,详见官方文档。
边缘裸金属实例启动时,实例的网络配置需要通过cloud-init工具注入。因此,您需要在镜像中提前安装cloud-init工具。如果导入的镜像没有安装cloud-init,基于该镜像创建的实例将无法被正常初始化。
配置软件源
CentOS的软件源配置文件为 /etc/yum.repos.d/CentOS-Base.repo
,请先备份软件源配置文件后再执行相应操作。
对于CentOS 7系列,运行以下命令:
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.volces.com/repo/Centos-7.repo
或执行:
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.volces.com/repo/Centos-7.repo
对于CentOS 8系列,将CentOS-Base.repo文件修改为以下内容:
[base] name=CentOS-8.5.2111 - Base baseurl=http://mirrors.volces.com/centos/8.5.2111/BaseOS/$basearch/os/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial #additional packages that may be useful [extras] name=CentOS-8.5.2111 - Extras baseurl=http://mirrors.volces.com/centos/8.5.2111/extras/$basearch/os/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial #additional packages that extend functionality of existing packages [centosplus] name=CentOS-8.5.2111 - Plus baseurl=http://mirrors.volces.com/centos/8.5.2111/centosplus/$basearch/os/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial [AppStream] name=CentOS-8.5.2111 - AppStream failovermethod=priority baseurl=http://mirrors.volces.com/centos/8.5.2111/AppStream/$basearch/os/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
运行以下命令安装软件包:
yum update yum install cloud-utils-growpart gdisk
配置软件源
Ubuntu的软件源配置文件为/etc/apt/sources.list
,请先备份软件源配置文件后再将该文件修改为以下内容:
Ubuntu 16.04 (Xenial)
deb http://mirrors.volces.com/ubuntu/ xenial main deb-src http://mirrors.volces.com/ubuntu/ xenial main deb http://mirrors.volces.com/ubuntu/ xenial-updates main deb-src http://mirrors.volces.com/ubuntu/ xenial-updates main deb http://mirrors.volces.com/ubuntu/ xenial universe deb-src http://mirrors.volces.com/ubuntu/ xenial universe deb http://mirrors.volces.com/ubuntu/ xenial-updates universe deb-src http://mirrors.volces.com/ubuntu/ xenial-updates universe deb http://mirrors.volces.com/ubuntu/ xenial-security main deb-src http://mirrors.volces.com/ubuntu/ xenial-security main deb http://mirrors.volces.com/ubuntu/ xenial-security universe deb-src http://mirrors.volces.com/ubuntu/ xenial-security universe
Ubuntu 18.04 (Bionic)
deb http://mirrors.volces.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ bionic-backports main restricted universe multiverse
Ubuntu 20.04 (Focal)
deb http://mirrors.volces.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.volces.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.volces.com/ubuntu/ focal-backports main restricted universe multiverse
运行以下命令安装软件包:
apt update apt-get install net-tools ethtool apt-get install ifupdown resolvconf
配置软件源
Debian 的软件源配置文件是 /etc/apt/sources.list
,请先备份软件源配置文件后再将该文件修改为以下内容:
Debian 9 (Stretch)
deb http://mirrors.volces.com/debian stretch main contrib non-free deb http://mirrors.volces.com/debian stretch-backports main contrib non-free deb http://mirrors.volces.com/debian-security stretch/updates main contrib non-free #deb-src http://mirrors.volces.com/debian stretch main contrib non-free #deb-src http://mirrors.volces.com/debian stretch-backports main contrib non-free #deb-src http://mirrors.volces.com/debian-security stretch/updates main contrib non-free
Debian 10 (Buster)
deb http://mirrors.volces.com/debian buster main contrib non-free deb http://mirrors.volces.com/debian buster-backports main contrib non-free deb http://mirrors.volces.com/debian-security buster/updates main contrib non-free #deb-src http://mirrors.volces.com/debian buster main contrib non-free #deb-src http://mirrors.volces.com/debian buster-backports main contrib non-free #deb-src http://mirrors.volces.com/debian-security buster/updates main contrib non-free
运行以下命令安装软件包:
apt-get update apt-get install cloud-guest-utils cloud-utils cloud-initramfs-growroot parted dnsutils apt-get install net-tools ethtool tcpdump ifupdown
说明
请确保Python版本为3.6.5及以上,版本太低可能导致cloud-init执行失败。根据您的操作系统版本,选择对应的执行步骤。
运行以下命令安装/更新Python版本:
#安装python yum install python3-pip pip3 install --upgrade pip #查看python版本 python3 -V
运行以下命令安装/更新Python版本:
#安装python apt-get install python3-pip pip3 install --upgrade pip #查看python版本 python3 -V
运行以下命令安装Python3.9.1版本:
#安装python apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev cd /opt/ wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz tar zxvf Python-3.9.1.tgz cd Python-3.9.1 ./configure --prefix=/usr/local/python3 make && make install ln -s /usr/local/python3/bin/python3.9 /usr/local/bin/python3 ln -s /usr/local/python3/bin/python3.9 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 pip3 install --upgrade pip #查看python版本 python3 -V
说明
运行以下命令,下载cloud-init源码包:
wget https://launchpad.net/cloud-init/trunk/21.1/+download/cloud-init-21.1.tar.gz
运行以下命令。通过该命令可直接完成cloud-init安装以及开机自启动配置。
apt-get install cloud-init -y
运行以下命令,解压cloud-init安装包:
tar -zxvf cloud-init-21.1.tar.gz
运行以下命令,进入已解压的cloud-init安装包目录:
cd cloud-init-21.1
运行以下命令,安装cloud-init:
CentOS 7.2/7.3
pip3 install MarkupSafe jinja2 oauthlib six configobj pyyaml urllib3 idna certifi charset-normalizer requests jsonpointer jsonpatch attrs pyrsistent zipp typing-extensions importlib-metadata jsonschema -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn python3 setup.py build python3 setup.py install --init-system systemd cd .. ln -s /usr/local/bin/cloud-init /usr/bin/cloud-init ln -s /usr/local/bin/cloud-init-per /usr/bin/cloud-init-per ln -s /usr/local/bin/cloud-id /usr/bin/cloud-id
CentOS 7/8系列(除7.2、7.3外)
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple python3 setup.py build python3 setup.py install --init-system systemd cd .. ln -s /usr/local/bin/cloud-init /usr/bin/cloud-init ln -s /usr/local/bin/cloud-init-per /usr/bin/cloud-init-per ln -s /usr/local/bin/cloud-id /usr/bin/cloud-id
Debian系列
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip3 install six==1.16.0 -i https://pypi.tuna.tsinghua.edu.cn/simple python3 setup.py build python3 setup.py install --init-system systemd cd .. ln -s /usr/local/python3/bin/cloud-init /usr/local/bin/cloud-init ln -s /usr/local/python3/bin/cloud-init /usr/bin/cloud-init ln -s /usr/local/python3/bin/cloud-init-per /usr/local/bin/cloud-init-per ln -s /usr/local/python3/bin/cloud-init-per /usr/bin/cloud-init-per ln -s /usr/local/python3/bin/cloud-id /usr/local/bin/cloud-id ln -s /usr/local/python3/bin/cloud-id /usr/bin/cloud-id
运行以下命令,使cloud-init开机自启动:
systemctl enable cloud-init-local.service systemctl enable cloud-init.service systemctl enable cloud-config.service systemctl enable cloud-final.service
运行以下命令,查看cloud-init版本,验证是否安装成功:
cloud-init --version
修改cloud-init配置
根据您的操作系统版本,按需选择对应的执行步骤来修改cloud-init配置,使其符合平台规范。
CentOS 7/8系列
运行以下命令配置cloud-init:
cat > /etc/cloud/cloud.cfg.d/90_dpkg.cfg << EOF datasource_list: [ ConfigDrive, NoCloud, None ] EOF cat > /etc/cloud/cloud.cfg << EOF users: - default disable_root: 0 ssh_pwauth: 1 growpart: mode: auto devices: ['/'] ignore_growroot_disabled: false mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] resize_rootfs_tmp: /dev ssh_deletekeys: 1 syslog_fix_perms: ~ disable_vmware_customization: false cloud_init_modules: - disk_setup - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - rh_subscription - yum-add-repo - package-update-upgrade-install - timezone - puppet - chef - salt-minion - mcollective - disable-ec2-metadata - runcmd cloud_final_modules: - rightscale_userdata - scripts-per-once - scripts-per-boot - scripts-per-instance - scripts-user - ssh-authkey-fingerprints - keys-to-console - phone-home - final-message - power-state-change system_info: distro: rhel paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd EOF
Ubuntu系列
运行以下命令配置cloud-init:
cat > /etc/cloud/cloud.cfg.d/90_dpkg.cfg << EOF datasource_list: [ ConfigDrive, NoCloud, None ] EOF cat > /etc/cloud/cloud.cfg << EOF users: - default disable_root: 0 ssh_pwauth: 1 growpart: mode: auto devices: ['/'] ignore_growroot_disabled: false mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] resize_rootfs_tmp: /dev ssh_deletekeys: 1 syslog_fix_perms: ~ disable_vmware_customization: false cloud_init_modules: - disk_setup - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - rh_subscription - yum-add-repo - package-update-upgrade-install - timezone - puppet - chef - salt-minion - mcollective - disable-ec2-metadata - runcmd cloud_final_modules: - rightscale_userdata - scripts-per-once - scripts-per-boot - scripts-per-instance - scripts-user - ssh-authkey-fingerprints - keys-to-console - phone-home - final-message - power-state-change system_info: paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd EOF
Debian系列
运行以下命令配置cloud-init:
cat > /etc/cloud/cloud.cfg.d/90_dpkg.cfg << EOF datasource_list: [ ConfigDrive, NoCloud, None ] EOF cat > /etc/cloud/cloud.cfg << EOF users: - default disable_root: true ssh_pwauth: 1 growpart: mode: auto devices: ['/'] ignore_growroot_disabled: false mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] resize_rootfs_tmp: /dev ssh_deletekeys: 1 syslog_fix_perms: ~ disable_vmware_customization: false cloud_init_modules: - disk_setup - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - rh_subscription - yum-add-repo - package-update-upgrade-install - timezone - puppet - chef - salt-minion - mcollective - disable-ec2-metadata - runcmd cloud_final_modules: - rightscale_userdata - scripts-per-once - scripts-per-boot - scripts-per-instance - scripts-user - ssh-authkey-fingerprints - keys-to-console - phone-home - final-message - power-state-change system_info: distro: debian paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd EOF
说明
更新系统配置前,须确保已安装cloud-init。
CentOS系列
运行以下命令,修改系统网络配置:
#!/bin/bash sed -i "s/^#UseDNS.*$/UseDNS no/" /etc/ssh/sshd_config sed -i 's/NAME="eth0"/DEVICE="eth0"/g' /etc/sysconfig/network-scripts/ifcfg-eth0 release=$(rpm -E %{rhel}) if [ $release -eq 6 ]; then chkconfig iptables off else systemctl disable firewalld fi #update common config echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.d/99-sysctl.conf cat /etc/centos-release | grep "release 7" if [ $? -eq 0 ]; then systemctl disable NetworkManager systemctl enable network fi
说明
以下命令,仅在使用本地导入的镜像创建实例、且实例需使用负载均衡功能时必须执行:
echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.d/99-sysctl.conf
当不存在/etc/sysconfig/network-scripts/ifcfg-eth0文件时,无需运行以下命令:
sed -i 's/NAME="eth0"/DEVICE="eth0"/g' /etc/sysconfig/network-scripts/ifcfg-eth0
Ubuntu系列
运行以下命令,修改系统网络配置:
#!/bin/bash #update network config cat <<EOF > /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* EOF systemctl disable systemd-resolved.service systemctl stop systemd-resolved systemctl mask systemd-networkd.service systemctl mask systemd-networkd-wait-online.service
Debian系列
运行以下命令,修改系统网络配置:
#!/bin/bash #update network cat <<EOF > /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* EOF
说明
在initramfs文件中添加驱动前,须确保已安装cloud-init。
对于CentOS操作系统,需要在initramfs文件中添加必要的驱动,使系统能够正常启动。
运行以下命令重新制作initramfs文件:
#!/bin/bash KERNEL_VERSION=`uname -r` dracut --force --add-drivers "mpt3sas nvme-fcloop nvmet-fc nvmet-rdma nvme-loop nvmet nvme-core nvme-fabrics nvme-fc nvme nvme-rdma i40e megaraid_sas" --kver ${KERNEL_VERSION}
步骤一:获取VMDK格式的镜像文件
查看虚拟磁盘文件(虚拟机镜像文件)在本地的存储位置,然后将该文件传输到支持qemu-img工具的Linux操作系统中。例如,本示例中创建的虚拟机使用的是支持qemu-img工具的Linux操作系统,可以将文件直接传输到该操作系统中。
文件传输方式有多种。以下内容描述使用scp
命令传输文件的一种方式,供您参考。实际运行命令时,请将变量替换为实际的值。
从本地传输文件到远程服务器
scp /path/to/local/file username@remote_host:/path/to/remote/directory/
从远程服务器传输文件到本地
scp username@remote_host:/path/to/remote/file /path/to/local/directory/
步骤二:转换镜像文件格式
运行以下命令,确认系统中是否已安装qemu-img工具:
qemu-img --version
如果系统中安装了qemu-img工具,该命令会输出qemu-img工具的版本信息。如果系统中没有安装qemu-img工具,该命令会提示“command not found”。
如果系统中没有安装qemu-img工具,运行以下命令安装qemu-img:
CentOS系列:
yum install qemu-img
Debian/Ubuntu系列:
apt-get install qemu-utils
运行以下命令将VMDK格式的镜像文件转换为QCOW2格式:
qemu-img convert -f vmdk -O qcow2 <源虚拟磁盘文件的名称> <目标虚拟磁盘文件的名称>
示例:
qemu-img convert -f vmdk -O qcow2 centos_1.vmdk centos_1.qcow2
传输文件
文件传输方式有多种。以下内容描述使用scp
命令传输文件的一种方式,供您参考。实际运行命令时,请将变量替换为实际的值。
scp /path/to/local/file username@remote_host:/path/to/remote/directory/
scp username@remote_host:/path/to/remote/file /path/to/local/directory/
导入镜像
导入镜像的步骤,请参考导入镜像。
导入边缘裸金属实例的镜像时,请关注以下限制: