操作步骤
1. 磁盘资源申请
首先需要在云服务器或者虚拟机上申请一定大小的磁盘空间
2. 安装扩容工具包
安装 cloud-utils-growpart
,centos 执行:
yum install -y cloud-utils-growparts
3. 扩容磁盘分区
执行 fdisk -l
查看需要扩容的磁盘在什么分区,例如在 /dev/vda2
分区的话,需执行:
growpart /dev/vda 2
如果是新增磁盘分区,则需要执行:
fdisk /dev/vda
需要交互式输入一些参数来建立新分区,和在原分区扩容原理相同,这里不展开讲述
4. 扩容 VG(卷组)
执行下面的命令可分别查看当前 PV(物理卷)和 VG(卷组)信息:
pvdisplay
vgdisplay
此时 PV 信息是还没有刷新的,需执行下面的命令来刷新:
pvresize /dev/vda2
5. 分配 PE(物理区域)
刷新完 PV,我们需要分配下 PE,如增加 10G 空间则执行:
lvextend -L +10G /dev/cl/root
注意,这里的 /dev/cl/root
是 LV 路径,可通过执行 lvdisplay
来查看
接下来刷新一下文件系统,即可完成扩容,不同文件类型刷新命令有所不同,文件系统类型可通过执行 df -Th
来查看:
# xfs 类型
xfs_growfs /dev/mapper/cl-root
# ext2/ext3/ext4 类型
resize2fs /dev/mapper/cl-root
若执行 xfs_growfs
时报下面的错误,则需执行:
# 报错
xfs_growfs: /dev/mapper/cl-root is not a mounted XFS filesystem
# 执行
xfs_growfs /
这是 xfs_growfs
命令版本较低,不支持传入文件系统,只支持传入挂载点(这里的例子挂载点是根目录 /
)
如需要将申请的磁盘空间全部扩容到当前路径,则执行:
lvextend -l +100%FREE /dev/cl/root
xfs_growfs /dev/mapper/cl-root
概念理解
Linux 磁盘扩容是基于 LVM(Logical Volume Manager)来实现的,通过 LVM 可以动态地调配 Linux 磁盘空间。LVM 中主要涉及下面四个概念:
物理卷 PV(Physical Volume):Unix 块设备节点,可用于 LVM 存储。例如硬盘就属于物理卷。
卷组:VG(Volume Group):用作 LV 容器的 PV 组。可以理解为 VG 就是由多个 LV 来组成的。
逻辑卷:LV(Logical Volume):驻留在 VG 中并由 PE 组成的“虚拟/逻辑分区”。我们扩容其实就是扩 LV。
物理区域 PE(Physical Extent):PV 中可以分配给 LV 的最小连续范围(默认 4MiB)。多个 PE 组成了 PV,且 PE 可以分配给任何 LV。
他们之间的关系可通过下面的图来理解:
简单概括就是,我们增加的硬盘就是 PV,PV 由多个 PE 组成,PE 可以分配给任何 LV,多个 LV 组成了 VG。
LVM 解决了什么问题
如果没有 LVM,我们磁盘资源耗尽后,新增的磁盘和旧磁盘是独立的,需建立不同的分区来访问数据,于是就会出现同一应用的数据要存储在不同路径的情况,这会对数据访问带来无限的麻烦。有了 LVM,我们就可以在应用数据位置“不变”的前提下来进行扩容,数据的存储和访问交给 LVM 来处理,使用者不需要去关注数据读写细节。而且,在资源允许的情况下,可以持续扩容。
参考
https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)
https://wiki.archlinux.org/title/LVM#Background