最近由于工作的需要,对一个生产系统上的操作系统,进行了虚拟硬盘的扩容,著文记之,以做积累和分享。
基本情况
某政务应用系统,运行于政务云环境当中。由于需要大量上传和保持各种佐证材料,主要是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
fdisk:
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导出的修改,并确认导出状态
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 退出并生效
图中就是扩展分区的初始状态,这个配置其实是有问题的,一个是分区表的类型是msdoc(MBR),一个是文件系统的类型是xfs。还有需要注意的信息是只有一个分区,并且起始点为2048,终点是41...,但当前这个磁盘总容量是62....,所以有可以扩容的空间。下图为扩容操作和确认过程:
可能在扩展的时候,程序会提示分区还没有卸载(下图),这时需要退出程序,卸载分区并且确认卸载状态。
8 检查和扩展文件系统
前面的操作只是扩展了磁盘分区,还需要对文件系统进行扩展。通常的操作如下:
如果ext4文件系统:
e2fsck -f /dev/vdb1 分区检查
resize2fs /dev/vdb1 扩展文件系统
本例中是XFS系统,需要使用 xfs_growfs命令:
xfs_growfs /dev/vdb1
9 挂载分区
mount /dev/vdb1 /xdata1
在笔者的实际操作中,好像在分区表扩展完成之后,就已经自动挂载上了,所以这一步可能不是必要的。
10 检查分区和空间
df -h
确认分区和挂载都已经就绪,而且空间参数正确。可以尝试创建文件夹和复制文件,并且使用du命令,确认扩展后的分区和文件系统工作正常。
问题和注意事项
上面的章节,其实是最理想的操作过程和结果。在理解了原理和工具之后,其实会发现这个流程还是比较清晰的。但在实际的操作过程中,笔者还是遇到了一些问题。
- 磁盘无法卸载
在这一步笔者遇到了一个小麻烦,就是卸载磁盘时,总是提示“设备忙”,就是分区上有打开未关闭的文件。此时可以示例lsof查看可能涉及的文件和程序,然后进行处理。但实际上,这个操作也没有效果。后来只是反复尝试,和使用-f指令,才卸载了磁盘。所幸没有重新启动系统(重启后可能要配置和检查很多东西,非常麻烦)。
可能最糟糕的情况,需要重新启动系统了。
- 分区类型错误
这个问题可能出现的概率会很大。不知道什么原因,在最早的时候,管理员可能就是直接使用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上了。
完成后gdisk会提示新的分区表在下次重新启动时才能使用,但实际上是不需要的,在修改了GPT以后,这个设置已经立刻生效了。
这里要特别注意,分区表各分区的起始位置,例如笔者只有一个分区,起始位置为2048。这个设置将会在后面实际扩展分区中使用。
确认转换正常完成之后,再次启动parted程序,进入后,就可以执行正常的分区扩展操作了。也可以将原来的分区信息删除,重新创建新的分区,注意起始位置为原来的起点(2048),终止位置为100%,就可以使用到所有磁盘空间了。
小结
本文记录了一次在虚拟系统上的虚拟硬盘扩容,和相关文件系统无损分区扩展的过程,包括了基本场景,操作步骤、遇到的问题和解决方案,注意事项等等方面的内容。