更新时间:2023-06-09 GMT+08:00

优化Linux虚拟机

为了确保镜像创建的云服务器同时支持XEN虚拟化和KVM虚拟化,请在创建镜像前完成优化私有镜像的相关操作。

本节操作以Ubuntu 20.04操作系统为例,其他操作系统优化的具体操作请参考“优化过程(Linux)”。

安装原生的XEN和KVM驱动

  1. 执行以下命令,打开modules文件。

    vi /etc/initramfs-tools/modules

  2. 按“i”进入编辑模式,修改/etc/initramfs-tools/modules文件,添加xen-pv以及virtio的驱动(具体格式要根据操作系统本身的要求来决定)。
    [root@CTU10000xxxxx ~]#vi /etc/initramfs-tools/modules 
    …… 
    # Examples: 
    # 
    # raid1 
    # sd_mOd 
    xen-blkfront 
    xen-netfront 
    virtio_blk 
    virtio_scsi 
    virtio_net 
    virtio_pci 
    virtio_ring 
    virtio  
  3. 按“Esc”后,输入:wq,按“Enter”,保存设置并退出“/etc/initramfs-tools/modules”文件。
  4. 执行以下命令,重新生成initrd。

    update-initramfs -u

  5. 执行以下命令,检查是否已经成功装载了原生的XEN和KVM驱动相应模块。

    lsinitramfs /boot/initrd.img-`uname -r` |grep xen

    lsinitramfs /boot/initrd.img-`uname -r` |grep virtio

    [root@ CTU10000xxxxx home]# lsinitramfs /boot/initrd.img-`uname -r` |grep xen 
    lib/modules/3.5.0-23-generic/kernel/drivers/net/ethernet/qlogic/netxen 
    lib/modules/3.5.0-23-generic/kernel/drivers/net/ethernet/qlogic/netxen/netxen_nic.ko 
    lib/modules/3.5.0-23-generic/kernel/drivers/net/xen-netback 
    lib/modules/3.5.0-23-generic/kernel/drivers/net/xen-netback/xen-netback.ko 
    lib/modules/3.5.0-23-generic/kernel/drivers/block/xen-blkback 
    lib/modules/3.5.0-23-generic/kernel/drivers/block/xen-blkback/xen-blkback.ko 
     
    [root@ CTU10000xxxxx home]# lsinitramfs /boot/initrd.img-`uname -r` |grep virtio 
    lib/modules/3.5.0-23-generic/kernel/drivers/scsi/virtio_scsi.ko

    如果误将built-in形式存在内核中的驱动添加到initrd或initramfs文件中,不会影响虚拟机正常使用,这里全写进去只是为了修改的方便,但是使用lsinitrd命令无法检查到。可使用如下方法确定这些驱动是否以built-in形式存在内核中,例如:

    [root@ CTU10000xxxxx home]# cat /boot/config-`uname -r` | grep CONFIG_VIRTIO | grep y
    CONFIG_VIRTIO_BLK=y
    CONFIG_VIRTIO_NET=y
    CONFIG_VIRTIO=y
    CONFIG_VIRTIO_RING=y
    CONFIG_VIRTIO_PCI=y
    CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
    [root@ CTU10000xxxxx home]# cat /boot/config-`uname -r` | grep CONFIG_XEN | grep y
    CONFIG_XEN_BLKDEV_FRONTEND=y
    CONFIG_XEN_NETDEV_FRONTEND=y

修改grub文件磁盘标识方式为UUID

以Ubuntu 20.04为例,执行blkid命令获取root分区对应的UUID并记录下来,编辑“/boot/grub/grub.cfg”文件,使用root分区的UUID来配置boot项。如果root分区已经使用UUID形式则不需要修改。具体操作方法如下:
  1. 使用root用户登录虚拟机。
  2. 执行以下命令,列出当前系统中所有已挂载文件系统的类型以及对应设备的UUID 。

    blkid

    回显信息如下所示。

    /dev/xvda1: UUID="ec51d860-34bf-4374-ad46-a0c3e337fd34" TYPE="ext3"
    /dev/xvda5: UUID="7a44a9ce-9281-4740-b95f-c8de33ae5c11" TYPE="swap"
  1. 执行以下命令,查看“grub.cfg”文件:

    cat /boot/grub/grub.cfg

    回显信息如下所示:

    ……menuentry 'Ubuntu Linux, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-ec51d860-34bf-4374-ad46-a0c3e337fd34' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
    else
    search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
    fi
    echo 'Loading Linux 3.13.0-24-generic ...'
    linux /boot/vmlinuz-3.13.0-24-generic root=/dev/xvda1 ro 
    echo 'Loading initial ramdisk ...'
    initrd /boot/initrd.img-3.13.0-24-generic 
    }
  1. 根据“/boot/grub/grub.cfg”配置文件里标记的root分区,查找是否包括“root=/dev/xvda1”或者“root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34”信息。
    • 存在“root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34”,即root分区以UUID的表示形式,无需修改。
    • 存在“root=/dev/xvda1”,即root分区以设备名称表示的形式,请执行步骤5
  1. 根据“root=/dev/xvda1”,即root分区对应的设备名称,以及blkid命令获取的分区信息,找到root分区设备名称对应的UUID。
  2. 执行以下命令,打开“grub.cfg”文件。

    vi /boot/grub/grub.cfg

  3. 按“i”进入编辑模式,将root分区改成UUID形式,本例中将“root=/dev/xvda1”修改为“root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34”。
  4. 按“Esc”后,输入:wq,按“Enter”, 保存设置并退出vi编辑器。
  5. 执行以下命令,确认修改结果。

    cat /boot/grub/grub.cfg

    回显信息如下所示表示修改成功,即root分区以UUID的形式表示。

    ……menuentry 'Ubuntu Linux, with Linux 3.13.0-24-generic' --class ubuntu --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.13.0-24-generic-advanced-ec51d860-34bf-4374-ad46-a0c3e337fd34' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
    else
    search --no-floppy --fs-uuid --set=root ec51d860-34bf-4374-ad46-a0c3e337fd34
    fi
    echo 'Loading Linux 3.13.0-24-generic ...'
    linux /boot/vmlinuz-3.13.0-24-generic root=UUID=ec51d860-34bf-4374-ad46-a0c3e337fd34 ro
    echo 'Loading initial ramdisk ...'
    initrd /boot/initrd.img-3.13.0-24-generic
    }

修改fstab文件磁盘标识方式为UUID

以Ubuntu 20.04为例,执行blkid命令获取所有分区对应的UUID并记录下来,编辑“/etc/fstab”文件,使用分区的UUID来配置分区自动挂载。

  1. 执行以下命令,列出当前系统中所有已挂载文件系统的类型以及对应设备的UUID 。

    blkid

    回显信息如下所示。

    /dev/xvda2: UUID="4eb40294-4c6f-4384-bbb6-b8795bbb1130" TYPE="xfs"  
    /dev/xvda1: UUID="2de37c6b-2648-43b4-a4f5-40162154e135" TYPE="swap"
  2. 执行以下命令,查看“fstab”文件。

    cat /etc/fstab

    回显信息如下所示。

    [root@CTU1000028010 ~]# cat /etc/fstab  
    /dev/xvda2  /       xfs     defaults    0 0 
    /dev/xvda1  swap    swap    defaults    0 0     
  3. 查看“fstab”文件中的磁盘的表示形式为设备名称。
    • 若为UUID的表示形式,无需修改。
    • 若为设备名称的表示形式,请执行步骤4
  4. 执行以下命令,打开“fstab”文件。

    vi /etc/fstab

  5. 按“i”进入编辑模式,将“fstab”中的磁盘表示形式修改为UUID的形式。
  6. 按“Esc”后,输入:wq,按“Enter”, 保存设置并退出vi编辑器。