在本文中,我将告诉您需要尽快缩小KVM虚拟机的qcow2映像的情况。
块设备格式-qcow2
但是,尽管如此,该方案仍可以使用原始图像完成,足以将其转换为qcow2。通常,这些说明将与转换为qcow2的所有内容相关。
在KVM上缩小磁盘的一种简单方法如下:
- 压缩qcow2块设备(VM磁盘)
- 制作较小的磁盘
- 挂载gparted映像,旧磁盘和新磁盘
- 准备启动操作系统
- 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-old和qcow_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是否具有分区表-msdos或gpt。这很重要:
切换到第二个磁盘/ dev / vdb并创建分区表:
创建表时,如我们先前所学,选择msdos类型。
然后切换回/ dev / vda然后从第一个磁盘开始依次复制分区,在vda和vdb之间切换:
最终结果将是:
按下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,操作系统正在运行。幸福,没有其他!
奖金
在某些情况下您将要面对的事情。
- VM Windows, virt-sparsify . , , ( blkid), Windows , . ( ) fixmbr + rebuildbcd. — man
- — 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仍在其他地方使用,甚至有人使用。
如果您知道更简单的方法,请在注释中写上。