KVM:如何扩展或者缩小虚拟机磁盘大小?

时间:2020-01-09 10:46:46  来源:igfitidea点击:

在本文中,很好地讨论了如何针对常见的磁盘类型调整KVM虚拟机磁盘的大小。演示如何在Linux上的KVM虚拟机管理程序中正确增加虚拟机磁盘大小而不丢失数据,并讨论减小磁盘大小的选项。

如何增加/扩展KVM虚拟机磁盘大小?

在KVM上增加虚拟磁盘

让我们考虑一个增加20GB虚拟磁盘大小的示例。更改虚拟磁盘设置之前,请先关闭虚拟机。

要查看KVM虚拟机的虚拟磁盘设置,请使用以下命令:

qemu-img info /path_to_disk

我们将看到如下结果:

我们看到有两个显示大小的字段:virtual_size和disk_size:

  • " virtual_size"是创建或者扩展磁盘时虚拟磁盘集的大小(在此示例中,最大磁盘大小为20GB);
  • " disk_size"是磁盘文件的当前大小,即例如,磁盘在物理服务器上占用多少空间(仅适用于qcow磁盘格式)。在我们的示例中,虚拟磁盘仅占用存储空间1.6GB。

还有关于KVM磁盘类型(格式)的一些话。我建议在KVM中创建虚拟机时使用qcow2而不是raw。稍后我将解释原因。

在下一步中,将虚拟机的大小增加5GB(要正确扩展磁盘,虚拟机必须没有任何快照!)。

# qemu-img resize /path to disk +5G
Image resized.

如果我们检查虚拟磁盘设置,我们会注意到它已被扩展:

# qemu-img info /path_to_disk
image: /path_to_disk
file format: qcow2
virtual size: 25G (26843535600 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 0.10
refcount bits: 16

我们已经完成了部分工作,但是在虚拟机的来宾OS中我们还需要执行一些操作。现在很好地展示如何在来宾CentOS 7和Windows Server 2012 R2中扩展磁盘大小。

如果要在KVM虚拟机管理程序中为VM添加另一个虚拟磁盘,

qemu-img

virsh

使用工具。

如何在运行CentOS Linux的虚拟机中扩展分区?

在KVM服务器端增加虚拟磁盘大小后,启动虚拟机并连接到该虚拟机。好用硬盘分区管理工具fdisk来扩展分区和文件系统的大小。

通过SSH连接到VM Guest OS,并确保显示额外的5 Gb磁盘空间。

df h fdisk -l

屏幕快照显示/ dev/vda2的大小为20GB,可用磁盘空间为25GB。

让我们将/ dev/vda2扩展到最大可用大小:

# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Partition number (1,2, default 2):
Partition 2 is deleted
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (2-4, default 2):
First sector (1050624-52428799, default 1050624):
Using default value 1050624
Last sector, +sectors or +size{K,M,G} (1050624-52428799, default 52428799):
Using default value 52428799
Partition 2 of type Linux and of size 24.5 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

然后重新启动虚拟机并运行将应用新磁盘大小的命令:

# xfs_growfs /dev/vda2
meta-data=/dev/vda2 isize=512 agcount=4, agsize=1277888 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=5111552, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 5111552 to 6422272
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 485M 0 485M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 6.6M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda2 25G 1.3G 24G 6% /
/dev/vda1 488M 100M 353M 23% /boot
tmpfs 100M 0 100M 0% /run/user/0

结果,我们得到了扩展分区/ dev/vda2. 这正是我们所做的:

  • fdisk/dev/vda我们运行fdisk并连接到/ dev/vda;
    -/d我们删除了分区。默认情况下,这是我们需要的分区2,因此我们在下一项中按Enter键即可。
    -/n我们创建了一个新分区,然后按Enter或者p,然后再次按Enter,因为我们尝试创建的分区默认为2;
  • 指定第一个和最后一个扇区时,如果要将分区扩展到最大,我们也只需按Enter键。如果要设置特定的大小,请在最后一个扇区中输入磁盘大小,如菜单+ size {K,M,G}中所示;
  • / w以应用新设置。

VM重新启动后,使用以下命令检查磁盘:

xfs_growfs /dev/vda2

一些消息来源建议使用以下命令:

resize2fs /dev/vda2

但是它不适用于XFS文件系统!

因此,我们已在运行CentOS 7的虚拟机上扩展了磁盘大小。

如何增加来宾Windows Server中的磁盘大小?

使用RDP或者VNC连接到Windows Server虚拟机并扩展磁盘。

  • 打开服务器管理器->工具->计算机管理;
  • 在左窗格中选择"存储"->"磁盘管理"。将显示所有磁盘分区和添加的未分配空间。
  • 选择要增加的分区,然后单击"扩展卷";
  • 默认情况下,将提供所有可用空间以增加磁盘大小。
  • 单击"下一步"完成扩展。之后,分区的大小将增加。

我想指出,在扩展虚拟机磁盘之前,我建议备份虚拟磁盘。停止虚拟机,然后将磁盘镜像复制到具有一些可用空间的备份目录。如果在扩展过程中出现问题,我们将始终能够从备份中还原虚拟磁盘镜像。

如何减少KVM虚拟机的磁盘大小?

在我的工作中,我经常遇到这个问题,但是不幸的是,我们不能安全地减小KVM中虚拟机的磁盘大小。减小物理存储上虚拟磁盘大小的唯一可接受的方法是转换磁盘。

Web上有很多指南,告诉我们如何减少KVM虚拟机中的磁盘空间,但这是行不通的。

我将举一些我遇到并测试过的例子。

使用Qemu减少KVM磁盘大小

一些资源描述了我们可以使用qemu工具执行的操作。他们提供了使用以下命令来减少虚拟机磁盘空间的方法:

qemu-img resize /path_to_disk -5G

将磁盘空间缩小5G

或者以下用于设置特定虚拟磁盘大小的选项:

qemu-img resize /path_to_disk 25G

将磁盘大小设置为25G

运行此命令后会发生什么?启动服务器后,系统将无法启动:

Unable to verify superblock, continuing...
Sorry, could not find valid secondary superblock. Exiting now.

我尝试先使用fdisk减小系统中的磁盘大小,但是即使我们跳过缩小物理服务器上的磁盘,系统也不会启动。这是很合逻辑的。我们尝试减少的分区是系统分区,并且操作系统将无法启动,因为在尝试减小分区大小时,其上的信息显然会被清除。

使用镜像替换减小虚拟磁盘大小

这些指南中较不流行的变体是使用磁盘更换来减少磁盘空间。这意味着我们将使用所需的磁盘大小创建一个新的虚拟机。然后,将新的磁盘镜像替换为旧的磁盘镜像,并且它会根据不同来源中的描述进行工作。我检查了此方法,文件系统变得像以前的变体一样无法使用。这是命令的示例:

virt-resize /old_disk_image /new_disk_image

也有一些方法使用从原始格式到qcow2格式的磁盘转换,但是最初我是用这种格式创建计算机的,以下是我这样做的解释。

KVM磁盘格式和QCOW2磁盘压缩

在本文的开头,我提到了这两种磁盘格式:raw和qcow。

"原始"优势是最大的性能和通用性。但是它有很多缺点,主要有:

  • 虚拟磁盘文件占据了物理服务器上分配给它的所有空间。
  • 我们不能拍摄快照。

Qcow2是本机QEMU和QEMU-KVM虚拟机管理程序格式。这是KVM支持的所有其他格式中最方便的虚拟磁盘格式。磁盘镜像随着数据在虚拟机中累积而增加,并且支持快照。

qcow2的优点是什么?我们不需要减小虚拟磁盘的大小,因为它仅占用服务器存储上所需的空间。如果服务器上的数据不断被覆盖,并且磁盘已膨胀,则可以轻松地对其进行压缩。让我们考虑一下这个选项。我将用零填充一些虚拟磁盘空间,然后删除文件:

dd if =/dev/zero of =/mytempfile rm -rf/mytempfile`

从服务器上检查磁盘镜像时,磁盘镜像的大小先前为2.4G,然后变为5.9G:

# du -sh /image_path
2.4G *

du -sh/image_path

5.9G *

这意味着从虚拟机删除信息后,虚拟磁盘的大小没有缩小。为了获得虚拟磁盘文件的实际大小,我使用以下方法:

备份虚拟磁盘文件,停止虚拟机,然后执行以下步骤:

qemu-img convert -O qcow2 /old_image /new_image

然后,我们可以比较两个磁盘的大小:

# du -sh /new_disk
1.6G /
# du -sh /old_disk
5.8G /

如我们所见,压缩磁盘的大小为1.6G。根据需要重命名新的磁盘镜像文件,然后启动虚拟机:

# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 485M 0 485M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 6.6M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda2 25G 1.3G 24G 6% /
/dev/vda1 488M 100M 353M 23% /boot
tmpfs 100M 0 100M 0% /run/user/0

此方法有效。一直以来,我都没有遇到过虚拟机中的文件系统出现故障的情况。但是我强烈建议我们在执行任何操作之前先备份磁盘,以免丢失任何数据。