在Libvirt KVM中缩小qcow2图像

您是否减少了KVM-QEMU虚拟机中使用的qcow2磁盘映像的大小?如您所知,增加图像大小的过程非常简单快捷,但是缩小会怎样呢?



在本文中,我将告诉您需要尽快缩小KVM虚拟机的qcow2映像的情况。



块设备格式-qcow2



但是,尽管如此,该方案仍可以使用原始图像完成,足以将其转换为qcow2。通常,这些说明将与转换为qcow2的所有内容相关。



在KVM上缩小磁盘的一种简单方法如下:



  1. 压缩qcow2块设备(VM磁盘)
  2. 制作较小的磁盘
  3. 挂载gparted映像,旧磁盘和新磁盘
  4. 准备启动操作系统
  5. VM和主机规格:


主机:CentOS 7 + QEMU 2.12 + LIBVIRT 4.5.0 +内核UEK5 v。 4.14

虚拟机:CentOS 7 + 80GB硬盘+内核标准版v。 3.10

具有80GB硬盘映像(实际上由20GB占用,实际为80GB)的CentOS 7虚拟机将充当捐赠者。我们将其减少到40GB。



图像尺寸,实际尺寸和物理尺寸之间有什么区别?

假设qcow2映像为80gb,我们对此有所了解。在操作过程中,图像被数据阻塞,一些数据被删除。一般而言,由于写入和删除数据的过程的特殊性,对于OS,已删除的数据似乎并不存在,但会保留记录在映像中,直到被其他数据覆盖为止。因此,即使在操作系统中,您也会看到20GB的实际占用数据,KVM主机将显示出如此精美的图像(我们使用qemu-img实用程序来获取信息):



qemu-img info qcow2_image.img
image: qcow2_image.img
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
compat: 0.10
refcount bits: 16


您可以看到虚拟大小=磁盘大小,以及映像的du -sh将显示其实际占用80G的空间:



du -sh qcow2_image.img
80G    qcow2_image.img


并且由于我们需要将图像大小减小到40GB,所以让我们开始这个过程。



第1阶段-压缩块设备(图像)



在开始减少磁盘的过程之前,您需要确保OS内的占用空间小于将磁盘以一种或另一种方式减少到的空间。



df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        80G   18G   63G  22% /


如我们所见,已占用18GB,小于40GB。使用命令关闭虚拟机



shutdown -h now


并转到主机,检查:



  • 图像实际拍摄了多少
  • 实际多少


# qemu-img info qcow_shrink
image: qcow_shrink
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 80G
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16
# virt-df -h qcow_shrink
du -sh Filesystem                                Size       Used  Available  Use%
qcow_shrink:/dev/sda1                     488M       101M       351M   21%
qcow_shrink:/dev/sda2                      79G        17G        62G   22%
# du -sh qcow_shrink
80G     qcow_shrink


要压缩图像,我们需要一个名为virt-sparsify的简单实用程序确保VM无法正常运行,并在目录和磁盘映像中运行命令(重要说明:在启动virt-sparsify之前,请确保/ tmp和映像存储中有足够的可用空间来执行操作)



virt-sparsify qcow_shrink qcow_shrink-new


成功完成该操作将产生以下输出:



[   0.0] Create overlay file in /tmp to protect source disk
[   0.1] Examine source disk
[   1.2] Fill free space in /dev/sda1 with zero
[   1.5] Fill free space in /dev/sda2 with zero
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[  72.5] Copy to destination and make sparse
[  81.9] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.


然后,我们交换磁盘(将qcow_shrink移动到侧面的某个位置,例如qcow_shrink-oldqcow_shrink-new放在其位置-qcow_shrink)。



mv qcow_shrink qcow_shrink-old && mv qcow_shrink-new qcow_shrink


我们启动虚拟机。如果一切开始,我们将熄灭虚拟机并继续工作。



第2阶段-创建较小的磁盘



一个简单的过程,只需一个命令:



qemu-img create -f qcow2 -o preallocation=metadata qcow_shrinked 40G


qcow_shrinked -新形象的名字

40G -新大小



阶段3-连接gparted



由于有时管理员希望使用更简单的方法来解决问题,因此将手鼓放在一边(kpartx),然后使用ISO和VNC代替它。幸运的是,在KVM中连接它并不是很困难。



我们在做什么:



  • 连接ISO GParted映像
  • 将qcow2_shrinked连接到VM
  • 启动VM,从ISO引导


如何执行此操作,我将在本文中省略,因为假定执行所有这些操作的人员已经知道它是如何发生的,但是结果将是以下内容:



图片



启动VM并查看GParted引导屏幕:



图片



选择第一项并按照屏幕上的说明进行操作。我通常会一直按Enter键。



图片



看到GParted本身,让我们开始行动。我们快速检查/ dev / vda是否具有分区表-msdosgpt。这很重要:



图片



切换到第二个磁盘/ dev / vdb并创建分区表:



图片



图片



创建表时,如我们先前所学,选择msdos类型



然后切换回/ dev / vda然后从第一个磁盘开始依次复制分区,在vdavdb之间切换



图片



最终结果将是:



图片



按下Apply(应用),然后等待结果完成:



图片



结果:



图片



这已经像是事实。但是,由于我们已经进行了一些操作,这些操作将导致更改磁盘的UUID,因此我们可能无法引导至操作系统。为什么? CentOS 7在fstab中使用磁盘UUID,Grub2在磁盘中使用磁盘UUID,因此请跳入控制台并进行一些魔术。



Gparted最初是作为用户工作的,因此我们使用sudo su-root跳转到root之下



图片



blkid确保分区的UUID已更改



图片



可以看到,UUID vda1 = vdb1,但对于vdb2,它已更改。没关系-您可以忍受。



完全挂载vdb和/ boot分区,并为方便起见挂载一些分区。



mkdir vdb2
mount /dev/vdb2 vdb2
mount /dev/vdb1 vdb2/boot
cd vdb2
mount --bind /dev dev
mount --bind /sys sys
mount --bind /proc proc
chroot .


让我们从fstab开始-由于在VNC中键入UUID不太方便,因此我们将其替换为熟悉的设备名称。



图片



我们替换UUID行= ...用,注意:我们



指定的/ dev / vdb2,如果旧盘没有计划要切断我们

指定的/ dev / VDA2,如果老盘断开



由于我们断开旧盘装系统前,我们写的/ dev / VDA2



下一页更改引导加载程序,将其排序。假设所有内容都在/ boot / grub2中,grub.cfg位于同一位置,但efi不是(msdos表,它是efi :)):



grub2-install /dev/vdb
cd /boot/grub2
grub2-mkconfig -o grub.cfg


为此,您可以为自己感到高兴,并通过禁用gparted引导至操作系统。



阶段4-引导操作系统



在加载操作系统之前,我仍然建议从服务器上断开旧磁盘的连接。因此,在上一阶段,必须在fstab中注册vda2,但是如果您是专心的PC用户并且没有断开任何连接,则应该没有问题。对于旧磁盘,很有可能会从中启动。



在启动过程中没有问题,服务器已按预期启动。让我们检查一下:



[root@shrink ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M  6.7M  489M   2% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
/dev/vdb2        40G   18G   23G  44% /
/dev/vdb1       488M  101M  352M  23% /boot
tmpfs           100M     0  100M   0% /run/user/0

[root@shrink ~]# blkid
/dev/vda1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vda2: UUID="30ec1bc6-658f-4611-8708-5e3b7ebaa467" TYPE="xfs"
/dev/vdb1: UUID="ea505196-32fb-4df6-8bed-0a0ab2d0b726" TYPE="ext4"
/dev/vdb2: UUID="c8548834-272b-4331-a9bf-aa99fb41a434" TYPE="xfs"
/dev/sr0: UUID="2019-03-21-13-42-32-00" LABEL="GParted-live" TYPE="iso9660" PTTYPE="dos"


我们可以看到/ boot和/是必需的,大小为40GB,操作系统正在运行。幸福,没有其他!



奖金



在某些情况下您将要面对的事情。



  1. VM Windows, virt-sparsify . , , ( blkid), Windows , . ( ) fixmbr + rebuildbcd. — man
  2. — xfs Superblock has unknown read-only compatible features (0x4) enabled. read-only, . :


最有可能的是,当一切都在gparted或其他环境中完成时,该环境的内核版本太新,其中xfs稍有更改,即元数据及其版本不同。结果,新内核中的xfs变成了旧内核上的南瓜。我们要做的是重新启动救援软件,在此救援环境中建立网络,并在OS中安装最新的内核。我在CentOS 7上安装了5.x,也许4.x可以,但我还没有测试它,但最终一切正常。而且,没有任何问题。



就这样!



如您所见,没有什么复杂的。当然,您可以使用LVM,resize2fs等,但是qcow2仍在其他地方使用,甚至有人使用。



如果您知道更简单的方法,请在注释中写上。



All Articles