工作笔记-虚拟机硬盘无损扩容

189 阅读10分钟

最近由于工作的需要,对一个生产系统上的操作系统,进行了虚拟硬盘的扩容,著文记之,以做积累和分享。

基本情况

某政务应用系统,运行于政务云环境当中。由于需要大量上传和保持各种佐证材料,主要是Word、PDF文档和图片,占用了大量的磁盘空间(每年大约增加1T)。由于条件所限,该云系统不能直接提供NAS系统,加之应用系统比较老旧,没有使用比较新的对象存储方式,还是以基本的文件系统进行工作。

基本模式是,除了基本的操作系统,云平台为虚拟机划分了专门用于存储的虚拟磁盘。对虚拟机系统而言,作为标准磁盘挂载到系统当中,然后在虚拟机上安装和配置NFS服务,为其他应用系统提供本地的NAS服务。

经过一段时间的使用,这几个虚拟磁盘空间已经基本耗尽,整个系统需要进行扩展和升级。由于原有系统规划设计和应用系统的一些限制,这次扩容,没有选择再次增加和挂载新的虚拟磁盘的扩展方式,而是选择利用云平台和系统的特性,直接对所分配的虚拟磁盘进行扩展。

这个扩展操作,对于虚拟机系统而言是无感的,无需重新启动和挂载,就可以看到这个虚拟磁盘的空间变大了。原有的分区和磁盘使用都不受影响。但现在的问题就是,虽然我们在硬件层面确实平滑的“扩大”了这个硬盘的存储空间,但相应的文件分区却不可能自动扩大,需要进行一定的操作和配置,才能够让文件系统利用到这个扩大的空间。此外,我们还希望这个扩展对于操作系统和应用程序而言,没有直接的影响,就是简单的增加了可用的磁盘空间。

在正式开始之前,需要进行简单的操作规划,特别是相关系统在技术方面的信息收集,来明确当前的系统状态和适用的操作方式,如下所示:(以一个虚拟磁盘为例)

  • 操作系统: CentOS 7.9 X64
  • 虚拟磁盘设备名: vdb
  • 虚拟磁盘容量: 扩展前2T, 扩展后3T
  • 虚拟磁盘分区: vdb1, 只有一个分区
  • 挂载点: /dev/vdb1 -> /xdata1
  • 分区容量: 2T (100%), 扩展后分区容量 3T(100%)
  • 文件系统: xfs
  • 管理员权限,如root

基本流程

在明确了基本情况和目标之后,笔者简单的规划了基本的操作流程如下:

1 收集和记录系统信息

这里涉及到的命令包括:

lsblk, df -h ,fdisk -l, uname -a 等等

下面是一些操作示例:

lsblk+df

da.png

fdisk:

d3.png

2 业务数据备份

所有的系统基本的操作,都有一定的风险,需要对业务数据进行备份,以备故障或者迁移时恢复。

3 磁盘快照

利用云平台提供的磁盘快照功能进行系统级别的状态备份。出现问题时可以快速恢复。

4 工具软件准备

根据系统的不同,可能需要准备好一系列相关的工具软件和命令,包括:

lsblk、df、du、mount、umount、exportfs: 系列磁盘和文件工具,内置

fdisk: 分区工具,内置,用于查看磁盘和分区工具,但不用作实际分区扩展操作

parted: 分区工具,用于分区扩展

gdisk: 分区类型修改工具,用于修改分区类型(MBR-GTP),软件包就是gdisk

xfs_growfs: 文件系统扩展(需要安装),yum系统上在xfsprogs软件包中

5 关闭或隔离NFS服务

虽然Linix提供的动态磁盘扩容功能可以不损失数据,但操作时,还是需要卸载磁盘挂载。由于这些磁盘是被NFS服务所使用的,需要先关闭其在磁盘分区上打开的文件。这里有两种方式,简单的方式就是直接停止NFS服务;但考虑到系统中挂载了多个虚拟磁盘并提供NFS服务,也可以考虑修改export的方式,来关闭所需要操作的磁盘,而非整个NFS服务。这样对系统和应用服务的冲击也比较小。

这里涉及到的相关命令包括:

vi /etc/exports 找到并注释所引用的磁盘条目

exportfs -arv 应用NFS导出的修改,并确认导出状态

db.png

6 检查并卸载磁盘挂载

umount /xdata1 卸载磁盘挂载,必要时使用 -f 强制卸载

df -h 确认没有需要操作的磁盘挂载信息

7 进入分区工具

由于涉及到的分区容量已经超过了2T,所以已经无法使用经典的fdisk工具,而是使用parted 工具(这里可能需要使用gdisk将分区格式转换成为GTP,详见后面的内容):

parted /dev/vdb 进入命令

help 查看帮助信息

unit s 切换计量单位到s(Sector,扇区),尽量使用这个单位

print 打印当前信息,确认可扩展

resizepart 1 100% 扩展分区到100%

print 确认以扩展

quit 退出并生效

d5.png

图中就是扩展分区的初始状态,这个配置其实是有问题的,一个是分区表的类型是msdoc(MBR),一个是文件系统的类型是xfs。还有需要注意的信息是只有一个分区,并且起始点为2048,终点是41...,但当前这个磁盘总容量是62....,所以有可以扩容的空间。下图为扩容操作和确认过程:

d7.png

可能在扩展的时候,程序会提示分区还没有卸载(下图),这时需要退出程序,卸载分区并且确认卸载状态。

d6.png

8 检查和扩展文件系统

前面的操作只是扩展了磁盘分区,还需要对文件系统进行扩展。通常的操作如下:

如果ext4文件系统:

e2fsck -f /dev/vdb1 分区检查

resize2fs /dev/vdb1 扩展文件系统

本例中是XFS系统,需要使用 xfs_growfs命令:

xfs_growfs /dev/vdb1

d9.png

9 挂载分区

mount /dev/vdb1 /xdata1

在笔者的实际操作中,好像在分区表扩展完成之后,就已经自动挂载上了,所以这一步可能不是必要的。

10 检查分区和空间

df -h

确认分区和挂载都已经就绪,而且空间参数正确。可以尝试创建文件夹和复制文件,并且使用du命令,确认扩展后的分区和文件系统工作正常。

问题和注意事项

上面的章节,其实是最理想的操作过程和结果。在理解了原理和工具之后,其实会发现这个流程还是比较清晰的。但在实际的操作过程中,笔者还是遇到了一些问题。

  • 磁盘无法卸载

在这一步笔者遇到了一个小麻烦,就是卸载磁盘时,总是提示“设备忙”,就是分区上有打开未关闭的文件。此时可以示例lsof查看可能涉及的文件和程序,然后进行处理。但实际上,这个操作也没有效果。后来只是反复尝试,和使用-f指令,才卸载了磁盘。所幸没有重新启动系统(重启后可能要配置和检查很多东西,非常麻烦)。

d1.png

可能最糟糕的情况,需要重新启动系统了。

  • 分区类型错误

这个问题可能出现的概率会很大。不知道什么原因,在最早的时候,管理员可能就是直接使用fdisk进行了分区,所以分区表是MBR类型的。但如果分区要扩展到2T以上,MBR是不能支持的。笔者就是没有注意,在第7步的resizepart命令碰到了错误,大意就是当前的分区类型(MBR)不支持2T以上的分区。

解决的方案,也还是有的,就是gdisk程序,我们在后面会详细讨论。

  • 文件系统类型

网络上大部分操作指导和实践,所使用的文件系统都是标准的ext4系统。而笔者的环境中,却是xfs系统。实际上两种的差异也不是特别大。需要注意的可能有以下几点。扩展分区使用xfs-growfs命令;好像e2fsck命令无法使用了;还有就是需要先挂载分区后,才能进行分区扩展。

  • parted

不知道是基于何种考虑,和fdisk的设计和实现方式不同,parted对分区的操作,修改一般会立刻生效,所以操作的时候要特别小心。但好像实际上也不用特别担心。因为可以在操作之前,可以使用print命令,先记录一下分区的信息。如果出现问题,需要恢复,可以根据已记录的信息重新改一下分区表就可以了。这个修改,在重新分区或者有文件修改的时候,是不会影响到现有的分区和文件的。

gdisk使用

前面提到,笔者在实际扩展分区的最关键的步骤:resizefs中,遇到了分区类型的错误。当前的磁盘是MBR分区表,不支持2T以上的分区大写。显然,要实现扩展的目的,首先需要将分区表修改成为GTP的分区类型。

经过相关资料的查阅,网络上很多人提供了使用gdisk这个工具,来创建新的GPT的分区类型。使用方式和过程其实非常简单。笔者在安装完这个工具之后,启动 gdisk /dev/vdb,界面上立刻会提示当前的磁盘分区是MBR类型,是否需要进行转换,这时可以输入w进行转换(q退出命令),再次确认后,这个工具就会将MBR的分区格式,转换到GPT上了。

d4.png

完成后gdisk会提示新的分区表在下次重新启动时才能使用,但实际上是不需要的,在修改了GPT以后,这个设置已经立刻生效了。

这里要特别注意,分区表各分区的起始位置,例如笔者只有一个分区,起始位置为2048。这个设置将会在后面实际扩展分区中使用。

确认转换正常完成之后,再次启动parted程序,进入后,就可以执行正常的分区扩展操作了。也可以将原来的分区信息删除,重新创建新的分区,注意起始位置为原来的起点(2048),终止位置为100%,就可以使用到所有磁盘空间了。

小结

本文记录了一次在虚拟系统上的虚拟硬盘扩容,和相关文件系统无损分区扩展的过程,包括了基本场景,操作步骤、遇到的问题和解决方案,注意事项等等方面的内容。