You need to enable JavaScript to run this app.
导航

制作Linux镜像

最近更新时间2024.04.23 10:45:25

首次发布时间2021.07.09 13:31:09

操作场景

如果您拥有所需发行版本的基础镜像,您可以参考本文使用virt-manager制作QCOW2格式镜像并导入您的私有镜像到火山引擎平台。

此方式具有更高的定制化性,适用于需要复杂初始化系统镜像的场景,导入平台后,您可以使用该镜像重新部署复杂初始化系统或多次部署同样配置的云服务器。

前提条件

下文制作方法支持的基础镜像操作系统及相关版本如下,支持32位/64位。

  • Centos7.x 系列
  • Centos8.x 系列
  • Ubuntu 系列
  • Debian 系列

第一步:宿主机环境准备(可选)

本节适用于没有虚拟机的用户,如果您已有虚拟机,请跳过此步骤。

  1. 配置宿主机。

    1. 准备一台物理服务器作为镜像制作服务器(即宿主机)。

      宿主机操作系统的发行版无硬性要求,本文宿主机为X86架构并安装图形化界面(GUI)的CentOS 7.9操作系统。

    2. 登录宿主机。
    3. 执行如下命令,确认宿主机已开启虚拟化能力。
      egrep '(vmx|svm)' /proc/cpuinfo
      如下图所示,回显存在vmxsvm表示已开启虚拟化。
    4. 执行如下命令,确认宿主机内核高于3.10版本。
      uname -r
      如下图所示。
  2. 安装虚拟化软件。

    1. 执行如下命令,安装KVM与相关软件包。
      yum install -y qemu-kvm libvirt libvirt-python libvirt-client
      
    2. 执行如下命令,启动libvirtd服务。
      systemctl start libvirtd
      systemctl enable libvirtd # 执行本命令可配置libvirtd服务开机自启动
      
    3. 执行如下命令,确认libvirtd服务是否启动成功。
      systemctl status libvirtd
      
      当回显如下所示时,表示服务启动成功。
  3. 执行如下命令,安装virt-manager。

    yum install -y virt-manager
    
  4. 创建启动模式为UEFI的虚拟机时,还需完成如下配置。

    1. 请执行如下命令,安装OVMF。

      说明

      • 若您的宿主机操作系统源中没有edk2-ovmf,请执行wget --no-check-certificate http://www.kraxel.org/repos/firmware.repo -O /etc/yum.repos.d/firmware.repo命令,安装firmware源。
      • 本文宿主机与创建的虚拟机均为X86_64架构,若您创建其他架构虚拟机,请安装相应架构的OVMF。
      yum install -y edk2.git-ovmf-x64.noarch
      
    2. 配置libvirtd以启用UEFI。

      1. 执行如下命令,并按i键进入编辑模式。

        vim /etc/libvirt/qemu.conf
        
      2. 在配置文件中插入如下内容,将OVMF和运行时变量模板添加到libvirt配置中。

        请将nvram参数中路径替换为您安装OVMF的实际路径。

        nvram = [
                "/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd:/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd"
                ]
        
      3. ecs键,并输入:wq保存并退出。

      4. 执行如下命令,重启libvirtd服务。

        systemctl restart libvirtd
        
  5. 开启宿主机ip_forward功能。

    1. 执行如下命令,配置ip_forward功能。

      echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
      
    2. 执行如下命令,使配置生效。

      sysctl -p
      

第二步:在宿主机上创建虚拟机

  1. 在宿主机中准备基础镜像,请使用文件系统为EXT3、EXT4的单分区镜像,并且不要创建任何分区,否则可能出现自动扩容或启动异常问题。

    说明

    • 建议您使用官方镜像。
    • 若您可选的镜像文件包括QCOW2、ISO两种格式,建议选择ISO镜像。
  2. 执行如下命令,打开virt-manager。

    virt-manager
    
  3. 单击图标,开启新建虚拟机向导。

  4. 选择“Loca install media(ISO image or CDROM)”选项并单击“Forward”按钮,使用您准备的基础镜像安装虚拟机操作系统.。

  5. 单击“Browse...”按钮,打开选择窗口。

  6. 单击“Browse Local”按钮打开宿主机存储目录,选择您在宿主机中准备的基础镜像,单击“Open”按钮确认并返回新建虚拟机向导。

  7. 取消勾选“Automatically detect operating system based on install media”选项,根据使用的镜像信息自行选择“OS type”(镜像类型)与“Version”(发行版本)。

  8. 单击“Forward”按钮,配置虚拟机内存与CPU信息。

    您不能分配超过宿主机系统中可用的物理处理器(或超线程)的虚拟CPU,可用的虚拟CPU数量可查看相应配置框下方Up to X available信息。

  9. 单击“Forward”按钮,配置创建的磁盘镜像大小。

    请考虑虚拟机启用及需要在其中安装的应用程序,为其分配足够的空间。

  10. 单击“Forward”按钮,配置虚拟机名称与网络,并勾选“Customize configuration before install”。

    说明

    • 虚拟机名称可以包含字母、数字和以下字符:下划线(_)、句号(.)和连字符(-)。
    • 网络配置默认为Virtual network 'default' : NAT',如需更改,请在“Network selection”模块下拉选择。
  11. 确认虚拟机配置后,单击“Finish”按钮创建虚拟机。

  12. 在个性化定制页面中,可以配置虚拟机启动模式为UEFI或调整虚拟机硬件配置。启动模式调整步骤如下:

    1. 在左侧目录树选择“Overview”。
    2. 在“Hypervisor Details”模块的“Firmware”选项下拉选择UEFI,单击“Apply”按钮即可配置虚拟机启动模式为UEFI

      3. 单击窗口左上角“Begin Installation”按钮,开始安装虚拟机。
  13. 跟随安装指引进入虚拟机配置页面时,需要您进入网络配置页面开启网络连接。

    1. 单击“NETWORK & HOST NAME”按钮,进入网络配置页面。

    2. 单击开启选项,确认开启网络连接后,单击左上角“Done”按钮,保存并回到个性化配置页面。

  14. 完成其他个性化配置后,单击“Continue”按钮,跟随指引完成虚拟机安装。

第三步:修改虚拟机文件

修改/etc/fstab文件

您需要登录创建的虚拟机,注释或删除将/etc/fstab文件中存在的数据盘目录信息。

  1. 执行如下命令,打开/etc/fstab文件。

    vi /etc/fstab
    
  2. i键进入编辑模式,并注释或删除数据盘目录信息。

  3. esc键输入:wq保存并退出编辑。

修改启动引导文件(可选)

若您需要制作UEFI启动模式的镜像,可根据本节指引登录虚拟机,修改虚拟机的启动引导文件。

  1. 在虚拟机中执行如下命令,安装grub2-efi。

    yum install grub2-efi-x64 && yum install grub2-efi-x64-modules
    
  2. 执行如下命令,以UEFI为引导重装grub。

    grub2-install --target=x86_64-efi --efi-directory=/boot/efi /dev/vda
    grub2-install --target=x86_64-efi --removable --efi-directory=/boot/efi --bootloader-id=GRUB
    
  3. 执行如下命令,重新生成grub2-config文件。

    重新生成grub2-config文件将覆盖原有配置,建议您提前备份。

    grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    
  4. 执行如下命令,修改grub2-mkconfig文件配置。

    sed -i 's/linux16/linuxefi/g' /boot/grub2/grub.cfg
    sed -i 's/initrd16/initrdefi/g' /boot/grub2/grub.cfg
    

第四步:在虚拟机上安装Cloud-init

  1. 执行如下命令,下载20.03版本的cloud-init,更多版本请前往cloud-init官网获取下载链接。

    wget https://launchpad.net/cloud-init/trunk/20.3/+download/cloud-init-20.3.tar.gz
    
  2. 安装Python3版本和cloud-init依赖。

    说明

    • 请选择Python3.6以上版本进行安装,否则会出现Python3和部分pip包不兼容的情况,影响cloud-init运行。
    • 建议您从 Python官网 手动下载安装Python3。

    依次执行以下命令安装Python3和相关依赖。

    yum install python3 python3-pip cloud-utils-growpart -y
  3. 安装cloud-init: 依次执行以下命令进行安装。

    tar zxvf cloud-init-20.3.tar.gz
    ls
    cd cloud-init-20.3
    pip3 install -r requirements.txt -i https://mirrors.volces.com/pypi/simple/
    python3 setup.py build
    python3 setup.py install --init-system systemd
    
    ln -s /usr/local/bin/cloud-init /usr/bin/cloud-init
    
    
    systemctl enable cloud-init-local.service
    systemctl enable cloud-init.service
    systemctl enable cloud-config.service
    systemctl enable cloud-final.service
    
  4. 执行vim /etc/cloud/cloud.cfg命令,替换cloud-init配置文件为如下内容,执行:wq保存修改。

    注意

    若您制作的是CentOS镜像,请在system_info模块增加distro: rhel配置。

    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
    
    manage_etc_hosts: localhost
    
    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 # CentOS镜像需打开此配置
      paths:
        cloud_dir: /var/lib/cloud
        templates_dir: /etc/cloud/templates
      ssh_svcname: sshd
    
  5. 更换cloud-init 数据源,执行vim /etc/cloud/cloud.cfg.d/90_dpkg.cfg命令创建文件,写入以下内容后,执行:wq保存修改。

    datasource_list: [ConfigDrive, OpenStack]
    
    datasource:
        OpenStack:
            metadata_urls: ["http://100.96.0.96"]
            max_wait: -1
            timeout: 5
            retries: 5
            apply_network_config: True
    

第五步:在虚拟机上安装驱动

安装Virtio1.1驱动

若制作如下规格的实例使用的镜像,需根据本节指引安装Virtio1.1驱动。各规格详情可查看实例规格介绍

系统架构类型实例规格

x86计算

通用型

  • 通用型g3i
  • 通用型g3a

计算型

  • 计算型c3i
  • 计算型c3a

内存型

  • 内存型r3i
  • 内存型r3a
本地SSD型本地SSD型i3s
弹性裸金属所有弹性裸金属实例规格-
异构计算GPU计算型GPU计算型gni3

说明

  • 若您在虚拟机中上传的基础镜像是veLinux、CentOS 8.x(及以上版本)、Ubuntu Server 20.xx(及以上版本)及Debian 11(及以上版本)镜像,创建任意规格实例均无需安装Virtio1.1驱动,请跳过此步骤。
  • 安装驱动前请先安装好kernel-headers和kernel-devel,并确保与kernel版本一致,否则可能会出现安装驱动失败的情况(如有升级kernel,请重启后再安装驱动)。您也可以根据驱动源代码进行编译适配,或提交工单获取支持。
  • 如果您的镜像用于采用LTS-内核的弹性裸金属实例,请参考在虚拟机上安装LTS-内核与Virtio1.1驱动进行操作。
  1. 通过脚本检测虚拟机中的Virtio驱动版本是否符合要求。

    1. 执行如下命令,使用公网下载检测脚本文件。

      wget https://virtio11-drivers.tos-cn-beijing.volces.com/virtio_check
      
    2. 执行如下命令,为脚本文件添加执行权限。

      chmod +x ./virtio_check
      
    3. 在脚本文件所在目录中,执行如下命令,检查Virtio驱动版本是否符合要求。

      ./virtio_check
      
      • 若回显如下所示,表示您的虚拟机中已安装符合要求的Virtio驱动,请跳过本节。
      • 若回显如下所示,表示您的虚拟机中未安装符合要求的Virtio驱动,请继续执行本节操作。
  2. 安装Virtio1.1驱动。

说明

暂仅支持如下操作系统及内核版本,安装Virtio1.1驱动。

镜像版本内核版本
CentOS 7.93.10.0-1160.71.1
CentOS 7.83.10.0-1127.19.1
CentOS 7.73.10.0-1062.18
CentOS 7.63.10.0-957.27.2
CentOS 7.53.10.0-862.14.4
CentOS 7.43.10.0-693.21.1
CentOS 7.33.10.0-514.26.2
CentOS 7.23.10.0-327.36.3
  • 公网环境:
    yum -y install rpm-build redhat-lsb-core
    yum -y install epel-release
      	
    sed -e 's!^metalink=!#metalink=!g' \
      -e 's!^#baseurl=!baseurl=!g' \
      -e 's!//download\.fedoraproject\.org/pub!//mirrors.volces.com!g' \
      -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
      	    
    yum -y install --enablerepo=epel dkms
        
    wget https://tosv.byted.org/obj/sysimage/virtio/virtio-1.1.0-2.noarch.centos.rpm
        
    rpm -i virtio-1.1.0-2.noarch.centos.rpm
    rm -rf virtio-1.1.0-2.noarch.centos.rpm
    
  • 内网环境:
    yum -y install rpm-build redhat-lsb-core
    yum -y install epel-release
    		
    sed -e 's!^metalink=!#metalink=!g' \
        -e 's!^#baseurl=!baseurl=!g' \
        -e 's!//download\.fedoraproject\.org/pub!//mirrors.ivolces.com!g' \ 
        -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
    		    
    yum -y install --enablerepo=epel dkms
    
    wget https://tosv.byted.org/obj/sysimage/virtio/virtio-1.1.0-2.noarch.centos.rpm
    		
    rpm -i virtio-1.1.0-2.noarch.centos.rpm
    rm -rf virtio-1.1.0-2.noarch.centos.rpm
    

安装LTS-内核与Virtio1.1驱动(可选)

本节仅适用于制作弹性裸金属实例并采用LTS-内核方式使用的Linux镜像,如果您的镜像不用于该规格实例,请跳过此步骤。

说明

  • 如果您的镜像用于为弹性裸金属实例但不采用LTS-内核的方式,请参考在虚拟机上安装Virtio1.1驱动进行操作。
  • 此操作不可以直接在裸金属实例上执行,需要在火山ECS虚拟机上执行,制作自定义镜像后给裸金属实例使用。
  • 本节仅提供一种裸金属实例使用自定义内核的思路与方法。
  • 整体安装流程。
    • 如果存在旧的Virtio1.1驱动需要先将其删除。
    • 在火山ECS虚拟机上安装LTS-内核,并重启到指定版本的LTS-内核。
    • 安装LTS-内核版本指定的Virtio1.1驱动包。
    • 更新initramfs/initrd,并重启虚拟机查看是否正常。
  1. (可选) 删除旧的Virtio1.1驱动。

    yum remove -y virtio-1.1.0-1dkms
    
  2. 安装LTS-内核。

    1. 依次执行以下命令安装LTS-内核。
      • LTS-4.9内核:依次执行以下命令安装LTS-内核。
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-4.9.324-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-devel-4.9.324-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-headers-4.9.324-1.x86_64.rpm
        yum install -y kernel-headers-4.9.324-1.x86_64.rpm kernel-devel-4.9.324-1.x86_64.rpm
        yum install -y kernel-4.9.324-1.x86_64.rpm
        
      • LTS-4.14内核:依次执行以下命令安装LTS-内核。
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-4.14.289-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-devel-4.14.289-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-headers-4.14.289-1.x86_64.rpm
        yum install -y kernel-headers-4.14.289-1.x86_64.rpm kernel-devel-4.14.289-1.x86_64.rpm
        yum install -y kernel-4.14.289-1.x86_64.rpm
        
      • LTS-4.19内核:依次执行以下命令安装LTS-内核。
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-4.19.253-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-devel-4.19.253-1.x86_64.rpm
        wget https://virtio11-drivers.tos-cn-beijing.volces.com/lts-rpm/kernel-headers-4.19.253-1.x86_64.rpm
        yum install -y kernel-headers-4.19.253-1.x86_64.rpm kernel-devel-4.19.253-1.x86_64.rpm
        yum install -y kernel-4.19.253-1.x86_64.rpm
        
    2. 依次执行以下命令切换内核并重启到指定的LTS内核版本(以LTS-4.9为例)。
      1. 查看当前系统有几个内核。
        cat /boot/efi/EFI/centos/grub.cfg |grep menuentry
        
        回显示例
        if [ x"${feature_menuentry_id}" = xy ]; then
           menuentry_id_option="--id"
           menuentry_id_option=""
        export menuentry_id_option
        menuentry 'CentOS Linux (4.9.324) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1127.19.1.el7.x86_64-advanced-bf734ac7-0328-4e7f-8ada-ca0917a32945' {
        menuentry 'CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1127.19.1.el7.x86_64-advanced-bf734ac7-0328-4e7f-8ada-ca0917a32945' {
        menuentry 'CentOS Linux (0-rescue-ccc58c7f32cb4030969ada15e4ae0d0f) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-ccc58c7f32cb4030969ada15e4ae0d0f-advanced-bf734ac7-0328-4e7f-8ada-ca0917a32945' {
        
      2. 设置默认的启动内核。
        以上一步回显中的“CentOS Linux (4.9.324) 7 (Core)”内核为默认启动。
        grub2-set-default "CentOS Linux (4.9.324) 7 (Core)"
        
      3. 查看默认启动的系统内核。
        grub2-editenv list 
        
        回显示例:
        saved_entry=CentOS Linux (4.9.324) 7 (Core)
        
      4. 重启实例。
        reboot
        
      5. 重启后,查看当前的系统内核。
        uname -r 
        
        回显示例:
        4.9.324
        
  3. 成功切换到LTS-内核版本后,安装LTS-Virtio1.1驱动。

    1. 安装依赖的dkms包工具。

      • 在火山引擎实例中安装。
        yum -y install rpm-build redhat-lsb-core
        yum -y install epel-release
        sed -e 's!^metalink=!#metalink=!g' \
            -e 's!^#baseurl=!baseurl=!g' \
            -e 's!//download\.fedoraproject\.org/pub!//mirrors.ivolces.com!g' \
            -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
        yum -y install --enablerepo=epel dkms
        
      • 在非火山引擎实例中安装。
        yum -y install rpm-build redhat-lsb-core
        yum -y install epel-release
        sed -e 's!^metalink=!#metalink=!g' \
            -e 's!^#baseurl=!baseurl=!g' \
            -e 's!//download\.fedoraproject\.org/pub!//mirrors.volces.com!g' \
            -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
        yum -y install --enablerepo=epel dkms
        
    2. 依次执行如下命令,安装LTS-Virtio1.1驱动。

      wget https://virtio11-drivers.tos-cn-beijing.volces.com/virtio-1.1.0.dkms.tar.gz
      dkms ldtarball virtio-1.1.0.dkms.tar.gz
      dkms build virtio/1.1.0
      dkms install virtio/1.1.0
      
  4. CentOS 7/8操作系统,添加内核启动参数。

    sed -i 's/\(^GRUB_CMDLINE_LINUX=.*\)"/\1 pci=realloc intel_idle.max_cstate=1 processor.max_cstate=1 iommu=pt"/g' /etc/default/grub
    grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
    

安装MLNX驱动(可选)

如需使用网卡Offload特性,请在虚拟机上安装MLNX驱动,操作详情可查看Linux Drivers

说明

若您使用支持网卡Offload特性的规格(例如GPU计算型gni2),需要安装MLNX驱动。

第六步:在虚拟机中安装插件

  • 密码插件
    为实现用于重置、绑定/解绑密码功能,您制作的自定义镜像必须安装密码插件,否则可能导致镜像无法正常使用。安装操作可查看安装密码插件
  • blk-none
    为避免在实例中解压大压缩包时出现I/O问题,火山引擎提供了blk-none工具,该工具会根据实例磁盘类型,将磁盘调度算法置为none或者noop避免该问题出现。安装操作详情可查看解决方案

    注意

    若您制作CentOS 7.x、Ubuntu 16.04、Ubuntu 18.04或Debian 9镜像,且该自定义镜像将用于通用型(g3a/g3i)/计算型(c3a/c3i)/内存型(r3a/r3i)规格实例,必须安装本工具。

  • 云监控插件
    如需从实例内部进行监控,以获取更深层、更准确的实例运行情况,您还可以为自定义镜像安装云监控插件。安装操作可查看安装插件

第七步:在虚拟机中安装个性化软件(可选)

您可以按照业务的需求,自行将个性化软件安装在系统盘中,例如JDK、Linux图形化桌面。

第八步:检测镜像规范

您可以在虚拟机中运行自定义镜像规范检测工具,检测当前操作系统各项配置是否符合创建云服务器实例规范,避免通过自定义镜像创建出功能不齐全的实例,操作详情可查看使用工具检测自定义镜像规范

第九步:导出镜像

  1. 在虚拟机界面顶部选择“Virtual Machine > Shut Down > Shut Down”关闭虚拟机。

  2. 在宿主机中执行如下命令,打开存放镜像的文件夹,通过虚拟机名称即可查看镜像文件。

    xdg-open /var/lib/libvirt/images/
    

说明

目前仅支持上传QCOW2或者RAW两种格式的镜像,如果镜像不满足以下两种格式,则需要在宿主机中执行如下命令将镜像格式进行转换。操作详情可查看转换镜像格式

后续操作

您可以将创建的镜像文件上传至火山引擎作为自定义镜像,上传成功后,即可使用该镜像创建实例,操作详情可查看导入自定义镜像