目录
[2.1. 查看空间,对/dev/mapper/ol-root 根进行扩容](#2.1. 查看空间,对/dev/mapper/ol-root 根进行扩容)
[2.2.3.添加完磁盘分区之后,我们才开始进行LVM管理,三个主要步骤+一个重要步骤:(pv -> vg -> lv -> 调整文件系统)](#2.2.3.添加完磁盘分区之后,我们才开始进行LVM管理,三个主要步骤+一个重要步骤:(pv -> vg -> lv -> 调整文件系统))
[步骤一:pvcreate /dev/sda3](#步骤一:pvcreate /dev/sda3)
步骤二:将刚创建好的物理卷添加到/dev/mapper/ol-root所在的卷组
[2.3.growpart 工具扩展分区(方式三)](#2.3.growpart 工具扩展分区(方式三))
[步骤二:扩展分区 /dev/sda3](#步骤二:扩展分区 /dev/sda3)
[步骤三:检查/dev/sda3 的文件系统类型](#步骤三:检查/dev/sda3 的文件系统类型)
[1)XFS 文件系统](#1)XFS 文件系统)
一、VMware设置
关闭虚拟机,将磁盘从45G扩展至48GB(前提:虚拟机不存在快照),然后开机,你也可以在扩展完磁盘之后,再打个快照。


扩展成功截图!但是并没有完全进行扩容,还需要进一步操作。

二、开始扩容
前置补充:为什么扩容前一般需进行两步操作,即分区+操作文件系统
为什么需要两个步骤?
安全性:分区操作和文件系统操作分离,减少数据损坏风险
灵活性:可以只调整分区而不调整文件系统(比如创建新分区)
专业性:不同文件系统有不同结构和扩展方法,需要专门的工具
类比说明
想象一个房子和里面的家具:
分区 = 房子的墙壁范围(物理空间)
文件系统 = 房间内的家具布局(如何利用空间)
分区只是调整了房子的墙壁 ,但不会重新摆放家具来利用新空间。
2.1. 查看空间,对/dev/mapper/ol-root 根进行扩容
root@rac01 \~# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs tmpfs 1.8G 8.8M 1.8G 1% /run
tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol-root xfs 41G 29G 12G 71% /
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 368M 0 368M 0% /run/user/0
可以看到,我们扩展的磁盘大小已经被识别到,但是仅仅只是在逻辑层面增加了这些空间,并没有被操作系统纳入使用。

2.2.使用LVM方式进行扩展分区(方式一)
2.2.1.添加磁盘分区
bash
[root@rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.3G 0 rom
sda 8:0 0 48G 0 disk
├─sda2 8:2 0 44G 0 part
│ ├─ol-swap 252:1 0 3.9G 0 lvm [SWAP]
│ └─ol-root 252:0 0 40.1G 0 lvm /
└─sda1 8:1 0 1G 0 part /boot
[root@rac01 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs tmpfs 1.8G 8.8M 1.8G 1% /run
tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol-root xfs 41G 29G 12G 71% /
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 368M 0 368M 0% /run/user/0
[root@rac01 ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
命令(输入 m 获取帮助):n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
分区号 (3,4,默认 3):
起始 扇区 (94371840-100663295,默认为 94371840):
将使用默认值 94371840
Last 扇区, +扇区 or +size{K,M,G} (94371840-100663295,默认为 100663295):+1G
分区 3 已设置为 Linux 类型,大小设为 1 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
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)
正在同步磁盘。
[root@rac01 ~]#
2.2.2.刷新操作系统磁盘分区表
记得执行partprobe /dev/sda刷新分区表!!!!!!!
bash
[root@rac01 ~]# partprobe /dev/sda
[root@rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.3G 0 rom
sda 8:0 0 48G 0 disk
├─sda2 8:2 0 44G 0 part
│ ├─ol-swap 252:1 0 3.9G 0 lvm [SWAP]
│ └─ol-root 252:0 0 40.1G 0 lvm /
├─sda3 8:3 0 1G 0 part
└─sda1 8:1 0 1G 0 part /boot
[root@rac01 ~]#
2.2.3.添加完磁盘分区之后,我们才开始进行LVM管理,三个主要步骤+一个重要步骤:(pv -> vg -> lv -> 调整文件系统)
步骤一:pvcreate /dev/sda3
bash
[root@rac01 ~]# partprobe /dev/sda
[root@rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.3G 0 rom
sda 8:0 0 48G 0 disk
├─sda2 8:2 0 44G 0 part
│ ├─ol-swap 252:1 0 3.9G 0 lvm [SWAP]
│ └─ol-root 252:0 0 40.1G 0 lvm /
├─sda3 8:3 0 1G 0 part
└─sda1 8:1 0 1G 0 part /boot
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
Total: 1 [<44.00 GiB] / in use: 1 [<44.00 GiB] / in no VG: 0 [0 ]
[root@rac01 ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created.
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
PV /dev/sda3 lvm2 [1.00 GiB]
Total: 2 [<45.00 GiB] / in use: 1 [<44.00 GiB] / in no VG: 1 [1.00 GiB]
[root@rac01 ~]#
从上边的执行过程就可以看出我们当前已经创建出了一个新的物理卷,如下图:

步骤二:将刚创建好的物理卷添加到/dev/mapper/ol-root所在的卷组
vgextend /ol/dev/sda3
bash
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
Total: 1 [<44.00 GiB] / in use: 1 [<44.00 GiB] / in no VG: 0 [0 ]
[root@rac01 ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created.
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
PV /dev/sda3 lvm2 [1.00 GiB]
Total: 2 [<45.00 GiB] / in use: 1 [<44.00 GiB] / in no VG: 1 [1.00 GiB]
[root@rac01 ~]# vgscan
Reading volume groups from cache.
Found volume group "ol" using metadata type lvm2
[root@rac01 ~]# vgextend ol /dev/sda3
Volume group "ol" successfully extended
[root@rac01 ~]# vgsan
-bash: vgsan: 未找到命令
[root@rac01 ~]# vgscan
Reading volume groups from cache.
Found volume group "ol" using metadata type lvm2
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
PV /dev/sda3 VG ol lvm2 [1020.00 MiB / 1020.00 MiB free]
Total: 2 [44.99 GiB] / in use: 2 [44.99 GiB] / in no VG: 0 [0 ]
[root@rac01 ~]#
步骤三:扩容逻辑卷/dev/mapper/ol-root
将卷组中的空闲空间扩展到根分区逻辑卷:
lvextend -l +100%FREE /dev/mapper/ol-root
若想指定大小分配,则可以使用:
lvcreate -L 2GB -n LV_Name VG_NAME
bash
[root@rac01 ~]# vgscan
Reading volume groups from cache.
Found volume group "ol" using metadata type lvm2
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 4.00 MiB free]
PV /dev/sda3 VG ol lvm2 [1020.00 MiB / 1020.00 MiB free]
Total: 2 [44.99 GiB] / in use: 2 [44.99 GiB] / in no VG: 0 [0 ]
[root@rac01 ~]# lvscan
ACTIVE '/dev/ol/swap' [<3.88 GiB] inherit
ACTIVE '/dev/ol/root' [<40.12 GiB] inherit
[root@rac01 ~]# lvextend -l +100%FREE /dev/mapper/ol-root
Size of logical volume ol/root changed from <40.12 GiB (10270 extents) to <41.12 GiB (10526 extents).
Logical volume ol/root successfully resized.
[root@rac01 ~]# pvscan
PV /dev/sda2 VG ol lvm2 [<44.00 GiB / 0 free]
PV /dev/sda3 VG ol lvm2 [1020.00 MiB / 0 free]
Total: 2 [44.99 GiB] / in use: 2 [44.99 GiB] / in no VG: 0 [0 ]
[root@rac01 ~]# lvscan
ACTIVE '/dev/ol/swap' [<3.88 GiB] inherit
ACTIVE '/dev/ol/root' [<41.12 GiB] inherit
[root@rac01 ~]#

步骤四:调整文件系统
若磁盘格式是xfs,则执行如下命令:xfs_growfs /dev/ol/root
若磁盘格式是ext4,则执行如下命令:resize2fs /dev/ol/root
bash
[root@rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.3G 0 rom
sda 8:0 0 48G 0 disk
├─sda2 8:2 0 44G 0 part
│ ├─ol-swap 252:1 0 3.9G 0 lvm [SWAP]
│ └─ol-root 252:0 0 41.1G 0 lvm /
├─sda3 8:3 0 1G 0 part
│ └─ol-root 252:0 0 41.1G 0 lvm /
└─sda1 8:1 0 1G 0 part /boot
[root@rac01 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs tmpfs 1.8G 8.8M 1.8G 1% /run
tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol-root xfs 41G 29G 12G 71% /
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 368M 0 368M 0% /run/user/0
[root@rac01 ~]# xfs_growfs /dev/ol/root
meta-data=/dev/mapper/ol-root isize=256 agcount=4, agsize=2629120 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0 spinodes=0
data = bsize=4096 blocks=10516480, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5135, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10516480 to 10778624
[root@rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.3G 0 rom
sda 8:0 0 48G 0 disk
├─sda2 8:2 0 44G 0 part
│ ├─ol-swap 252:1 0 3.9G 0 lvm [SWAP]
│ └─ol-root 252:0 0 41.1G 0 lvm /
├─sda3 8:3 0 1G 0 part
│ └─ol-root 252:0 0 41.1G 0 lvm /
└─sda1 8:1 0 1G 0 part /boot
[root@rac01 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs tmpfs 1.8G 8.8M 1.8G 1% /run
tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/ol-root xfs 42G 29G 13G 70% /
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 368M 0 368M 0% /run/user/0
[root@rac01 ~]#
结果:

2.2.使用parted工具(方式二)
步骤一:确保已安装parted工具(通常默认已安装)
确认工具是否存在命令:which parted
安装命令:yum install -y parted

步骤二:查看分区信息,确认无误

步骤三:执行扩容,将三号分区扩展到磁盘的100%
执行命令:parted /dev/sda resizepart 3 100%
注意:部分版本可能交互性会话,可以参照提示依次进行即可。

步骤四:刷新操作系统分区表(必须执行!)
partprobe /dev/sda

步骤五:扩容文件系统(根据您的文件系统类型选择)
按照下图中的思路,让我们理一下我们目前一共完成了哪些步骤,以及我们接下来该怎么操作:

前面/dev/sda3中我们只从扩展的磁盘空间中分出了1个G来做完方式一的扩容,并且已经把该分区添加至卷组ol中,而本例,我们则是使用parted工具对原先/dev/sda3这个分区进行了剩余磁盘空间的全部扩展,相当于我们省去了前面pv + vg 的操作,即逻辑卷管理的三个主要步骤现在只剩下lv这步操作需要进行,这一点我们可以通过下图进行确认:

那接下来我们只需对卷/dev/mapper/ol-root进行扩展即可

扩展完成之后,我们只需执行以下扩容文件系统命令即可:
若磁盘格式是xfs,则执行如下命令:xfs_growfs /dev/sda3
若磁盘格式是ext4,则执行如下命令:resize2fs /dev/sda3

结果:

2.3.growpart 工具扩展分区(方式三)

限于当前操作系统版本过低,与系统自带sfdisk工具冲突,故只找到一个示例进行参考:
步骤一:安装工具
root@rac01 \~# yum install -y cloud-utils-growpart

例:
root@tdsql_db1 \~# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 895M 0 895M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 18G 17G 768M 96% /
步骤二:扩展分区 /dev/sda3
核心用法公式:growpart 选项 <磁盘设备> <分区编号>
扩展分区 /dev/ol/root,注意,如果遇见需直接扩容/dev/sda 1 ---> 注意,3是数字3 ,而不是sda3
root@tdsql_db1 \~# growpart /dev/sda 3
CHANGED: partition=3 start=4810752 old: size=37132288 end=41943040 new: size=79075295 end=83886047
步骤三:检查/dev/sda3 的文件系统类型
root@tdsql_db1 \~# blkid /dev/sda3
/dev/sda3: UUID="254c752f-5bdf-4df2-9b67-d38e29b773e7" TYPE="xfs"
XFS 文件系统:xfs_growfs / (直接对挂载点/操作(需已挂载)自动将根分区扩展到新增的磁盘空间)
ext3/ext4 文件系统:resize2fs /dev/sda3 (在线扩展无需卸载分区)
1)XFS 文件系统
root@tdsql_db1 \~# xfs_growfs /
meta-data=/dev/sda3 isize=512 agcount=4, agsize=1160384 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=4641536, 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 4641536 to 9884416
2)查看空间扩展完成
root@tdsql_db1 \~# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 895M 0 895M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 38G 17G 21G 45% /
注意:cloud-utils-growpart 是一个用于在Linux系统中调整分区大小的实用工具,特别适用于云环境。
三、LVM、Parted、Growpart三者间的区别?
简单来说,LVM是管理空间的"资源池经理",parted是划分仓库的"建筑师",而growpart是扩建仓库的"自动化小工"
三者的本质区别与协作关系
|----------|----------------------------|------------------------------|-----------------------------------|
| 特性维度 | growpart | parted | LVM(逻辑卷管理器) |
| 工作层级 | 分区层 | 分区层 | 逻辑卷层(位于分区和文件系统之间) |
| 核心对象 | 磁盘上的分区 | 磁盘上的分区表 | 由物理卷组成的逻辑卷 |
| 主要功能 | 单一功能:将指定分区扩展到其磁盘末尾的相邻空闲空间 | 通用功能:操作分区表(创建、删除、调整大小、设置类型)。 | 高级功能:将多个物理存储池化,并动态创建、调整、快照逻辑存储单元。 |
| 设计目标 | 自动化扩容,简化云环境运维 | 手动或脚本化地精细控制磁盘布局。 | 抽象物理存储,提供灵活性、可扩展性和高级功能。 |
| 操作风险 | 较低(仅扩展)。但依赖sfdisk,版本不兼容会失败 | 高(直接修改分区表,一步出错可能丢失数据)。 | 中(操作在逻辑层,不直接动分区表,但错误命令认可导致数据丢失)。 |
| 依赖关系 | 依赖parted或sfdisk来实际修改分区表 | 独立,直接操作磁盘。 | 依赖底层分区(物理卷PV建立在分区或整盘上)。 |
它们如何协同工作:一个完整的扩容案例
假设您有一台云服务器,根文件系统在LVM上,现在需要扩容。这完美对应了您之前遇到的情况,整个过程清晰地展示三者的分工:

流程解读:
1.分区层(parted/growpart的战场): 首先需要扩大底层的物理容器,即磁盘分区(如 /dev/sda3)。您可以根据情况选择自动化的 growpart 或手动的 parted/fdisK
2.LVM层(LVM的战场):分区扩大后,LVM的组件开始接力:
pvresize:通知LVM,物理卷(pv)的大小变了
lvextend:将卷组(vg)中新增的空间,分配给逻辑卷(LV)。
3.**文件系统层:**最后,使用文件系统工具(xfs_growfs等)填满逻辑卷的新空间。