PVE虚拟机 – 如何扩容虚拟机磁盘空间?

最近遇到一点困扰,就是我创建的虚拟机磁盘空间在使用过程中不足了,该如何动态扩容呢?没想到这里面也藏着不少linux基础知识,下面我就来说说。

了解LVM

每个虚拟机都是需要一块硬盘的,实际是从宿主机划分出来的给虚拟机使用的。

PVE虚拟机是基于linux的,它使用LVM管理宿主机磁盘,所以每个虚拟机仅仅是从LVM的VG(volume group卷组)中新建一个固定大小的LV(logical volume),提供给特定的一个虚拟机实例作为虚拟化的硬盘使用。

想实现虚拟机硬盘动态扩容,我们必须明白linux的LVM硬盘管理,因为只有LVM可以实现对一个已有的硬盘分区扩容。

为了说LVM,我们先得搞明白传统的硬盘管理,传统的硬盘管理包含4步:

  • 块设备:插在机器上的一块硬盘。
  • 硬盘分区:把块设备分成多个分区,每个分区固定大小。
  • 文件系统:如果想要使用硬盘某分区,需要在这个分区上制作文件系统,比如:ext4格式。
  • 挂载目录:最终把做好的文件系统通过mount命令挂载到某个目录下,就可以读写分区内的数据了。

传统硬盘分区方案的问题是,一旦我们把操作系统安装到某个分区内,那么这个分区大小就无法改变了,随着数据变多硬盘就塞满了。想要扩容的话,我们只能选定某个目录挂载一块新的硬盘,然后把一些较大的数据手动迁移进去,总之我们会因为容量问题严重影响到使用体验。

LVM则可以对一个已有的文件系统(当然对应一个硬盘分区)进行扩容,这就是它厉害的地方。

LVM的使用过程是这样的:

  • 块设备:给机器插上新的硬盘。
  • 硬盘分区:把块设备分成多个分区(1个分区用尽整块磁盘也可以,无所谓),每个分区的大小也是固定的。
  • 创建物理卷(PV):按照LVM的规则,把每个硬盘分区创建为一个物理卷(physical volume)。
  • 创建卷池(VG):新建的物理卷就像一桶矿泉水,把它们加入到一个VG大池子里面,这样池子里的水(硬件空间)就会变多。
  • 创建逻辑卷(LV):想要划分一块硬盘空间拿来使用,只需要从VG里面取一瓢水出来即可,这个划分出来的硬盘空间叫做一个LV(logical volume)。
  • 文件系统:现在可以对LV制作文件系统,比如:ext4格式。
  • 挂载目录:现在可以把在做好文件系统的LV挂载到某个目录,就可以访问了。

我们在安装操作系统的时候可以选择基于LVM管理硬盘,安装程序默认会把整个硬盘作为1个分区,创建分区对应的PV,创建1个VG并把该PV加入到VG中,然后从VG中划出1个LV格式化ext文件系统,然后把整个操作系统安装到这个LV里。

大家可以看一下LVM的一个简明教程,了解从一块裸硬盘到一个LV的全过程命令。

LVM与虚拟机的关系

首先,PVE本身是把宿主机硬盘做成了LVM,新建虚拟机则划分一个LV给它作为虚拟化的硬盘使用。

所以,我们很容易给虚拟机新增更多虚拟化硬盘,只需要在宿主机上划分更多LV挂给KVM即可。

通过宿主机划分更多的LV,可以全部虚拟化成硬盘提供给某个虚拟机,这样可以让虚拟机中识别的硬盘越来越多。

虚拟机内其实并不知道宿主机上的LVM,它看到的只是若干硬盘对应的块设备,所以它自身也需要使用LVM,才能将更多的块设备加入到VG中,并且对已有的LV进行扩容。

观察虚拟机

我有一个debian虚拟机,一开始只给了它10G的虚拟化硬盘:

当然这块10G的盘是PVE中划分出的一个LV逻辑卷。

进入到虚拟机内,我们看一下这个块设备:

sda就是10G的盘,被分成了3个分区:sda1、sd2、sda5。

sda1是引导分区,sda2不知道是什么作用,sda5是一个LVM类型的分区,我们详细分析一下这个分区。

pv display就是看PV,可见/dev/sd5分区被创建为了一个PV,它被加入到了VG池子debian-vg中,所以我们再看一下debian-vg这个池子:

目前这个VG池子里只有1个PV加入,贡献了大约9.76GB的硬盘空间。

VG被划分出2个LV供使用,我们看一下是哪些LV:

可见,2个LV类似于2个块设备,路径分别是/dev/debian-vg/root和/dev/debian-bg/swap_1,这是debian安装操作系统过程中创建好的。

第一个LV安装操作系统的所有内容,所以占了大部分空间,大约是8.76G;后者是作为swap分区使用的,大约是1GB。

有了LV,就可以做文件系统了,我们可以看一下:

可见,root那个LV被挂载到了/根目录,所以整个操作系统都在占用这个LV的空间,后续我们一旦发现硬盘耗尽,就需要对这个LV进行原地扩容即可,前提是LV所属的VG”续了足够多的水”。

扩容LV

为了扩容,我们需要先插一块新硬盘到虚拟机上,然后再进入虚拟机内操作。

在虚拟机内,把这块硬盘的所有容量划入1个分区,分区类型是LVM类型。

然后把这个分区创建为PV,然后把PV加入之前LV所在的VG里面,然后再对LV进行硬盘扩容。

扩容之前的LV上做了文件系统,在LV扩容后需要对文件系统进行在线重做,这样LV新增的扇区才能被文件系统管理到,从而可以访问。

在宿主机上新建LV,作为虚拟化sata硬盘插到之前的虚拟机上,然后关机重启虚拟机。

我们看到了新加入的sdb块设备,大小60G。

对其进行分区:

输入n新建一个主分区,占用60G空间即可:

把这个分区改成LVM类型:

p查看一下分区情况,然后w保存退出:

为这个分区生成一个PV:

把这个PV加入到VG:

把/dev/sdb1这个PV加入到之前的debian-vg这个VG中,现在VG蓄水池已经变大为70G(原先的10G+新增60G):

现在可以给挂载在/的LV扩容到60G:

现在虽然LV扩大为60G,但是文件系统还是原先的8.6G:

现在把文件系统更新一下:

因为这个LV挂载在/下面(也就是操作系统),所以属于一种在线文件扩容操作。

再看文件系统,已经扩容完成:

LVM是不是很酷?我们只需要买更多的硬盘扩容给宿主机,然后新建更多的虚拟硬盘给虚拟机,那么虚拟机内就可以无限扩容,是不是很不错?

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~