在 Linux 系统中,管理多个分区有两种主流方案:传统磁盘分区(直接操作物理分区)和 LVM(逻辑卷管理)(将多个物理分区/磁盘整合为逻辑卷)。两者各有优劣,传统分区适合固定容量的场景,LVM 则更适合需要动态调整空间的环境。
一、传统磁盘分区
传统分区通过 fdisk、gdisk、parted 等工具直接操作磁盘,每个分区独立存在,调整大小需重新格式化(ext4、xfs 文件系统支持在线扩容,但缩容需先卸载并检查文件系统)。
传统磁盘分区需要以下 4 步:
- 给磁盘创建分区(
fdisk、gdisk、partend) - 格式化分区文件系统(
mkfs) - 挂载使用该分区(
mount) - 配置开机自动挂载(
/etc/fstab)
1、磁盘分区
查看磁盘分区信息:fdisk -l

查看所有设备以及文件系统信息:lsblk -f,可以看到新加的 10G 磁盘 sdb 没有文件系统

下面分别介绍 fdisk、gdisk、partend 命令如何对磁盘进行分区,会将新加的 10G 磁盘 sdb 分 2 个区,挂载点为新建的空目录 /data、/data_backup。
1.1、fdisk 磁盘分区
fdisk 命令只能创建 MBR 分区,小于 2TB 的磁盘都可以用 fdisk 分区,最多支持 4 个主分区。
root@nine-test:~# fdisk /dev/sdb # 对 sdb 进行磁盘分区
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xc6e889e2 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):p # 打印分区表
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc6e889e2
设备 Boot Start End Blocks Id System
命令(输入 m 获取帮助):n # 添加分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # 添加主分区
分区号 (1-4,默认 1): # 回车
起始 扇区 (2048-20971519,默认为 2048): # 回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+6G # 指定主分区大小 6G
分区 1 已设置为 Linux 类型,大小设为 6 GiB
命令(输入 m 获取帮助):n # 添加分区
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e # 添加拓展分区
分区号 (2-4,默认 2): # 回车
起始 扇区 (12584960-20971519,默认为 12584960): # 回车
将使用默认值 12584960
Last 扇区, +扇区 or +size{K,M,G} (12584960-20971519,默认为 20971519): # 回车
将使用默认值 20971519
分区 2 已设置为 Extended 类型,大小设为 4 GiB
命令(输入 m 获取帮助):n # 添加分区
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l # 添加逻辑分区
添加逻辑分区 5
起始 扇区 (12587008-20971519,默认为 12587008): # 回车
将使用默认值 12587008
Last 扇区, +扇区 or +size{K,M,G} (12587008-20971519,默认为 20971519): # 回车
将使用默认值 20971519
分区 5 已设置为 Linux 类型,大小设为 4 GiB
命令(输入 m 获取帮助):p # 打印分区表
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc6e889e2
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 12584959 6291456 83 Linux
/dev/sdb2 12584960 20971519 4193280 5 Extended
/dev/sdb5 12587008 20971519 4192256 83 Linux
命令(输入 m 获取帮助):t # 修改分区类型
分区号 (1,2,5,默认 5):1 # 修改主分区
Hex 代码(输入 L 列出所有代码):8e # 修改为 LVM
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):t # 修改分区类型
分区号 (1,2,5,默认 5):5 # 修改逻辑分区
Hex 代码(输入 L 列出所有代码):8e # 修改为 LVM
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):p # 打印分区表,查看是否修改成功
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc6e889e2
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 12584959 6291456 8e Linux LVM
/dev/sdb2 12584960 20971519 4193280 5 Extended
/dev/sdb5 12587008 20971519 4192256 8e Linux LVM
命令(输入 m 获取帮助):w # 保存对 /deb/sdb 的分区操作
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
a toggle a bootable flag 设置启动分区 b edit bsd disklabel 编辑分区标签 c toggle the dos compatibility flag d delete a partition 删除一个分区 l list known partition types 列出分区类型 m print this menu 帮助 n add a new partition 建立一个新的分区 o create a new empty DOS partition table 创建一个新的空白 DOS 分区表 p print the partition table 打印分区表 q quit without saving changes 退出不保存设置 s createa new empty Sun disklabel 创建一个新的空的 SUN 标示 t changea partition’s system id 改变分区的类型 u changedisplay/entry units 改变显示的单位 v verifythe partition table 检查验证分区表 w write table to disk and exit 保存分区表

1.2、gdisk 磁盘分区
gdisk 命令是 Linux 上管理 GPT(GUID 分区表)分区的强大工具,分区时 MBR 格式分区会在操作保存后转为 GTP 分区格式,GTP 分区格式没有主分区、扩展分区、逻辑分区的概念,所有分区地位平等。
# 安装 gdisk
yum install -y gdisk
root@nine-test:~# gdisk /dev/sdb # 对 sdb 进行磁盘分区
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): p # 打印分区表
Disk /dev/sdb: 20971520 sectors, 10.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): C2607E36-10B8-4150-B652-35520DDD1EB3
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)
Number Start (sector) End (sector) Size Code Name
Command (? for help): n # 添加分区
Partition number (1-128, default 1): # 回车
First sector (34-20971486, default = 2048) or {+-}size{KMGTP}: # 回车
Last sector (2048-20971486, default = 20971486) or {+-}size{KMGTP}: +6G # 指定分区大小 6G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00 # 分区类型为 LVM
Changed type of partition to 'Linux LVM'
Command (? for help): n # 添加分区
Partition number (2-128, default 2): # 回车
First sector (34-20971486, default = 12584960) or {+-}size{KMGTP}: # 回车
Last sector (12584960-20971486, default = 20971486) or {+-}size{KMGTP}: # 回车
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00 # 分区类型为 LVM
Changed type of partition to 'Linux LVM'
Command (? for help): p # 打印分区表
Disk /dev/sdb: 20971520 sectors, 10.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): C2607E36-10B8-4150-B652-35520DDD1EB3
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 12584959 6.0 GiB 8E00 Linux LVM
2 12584960 20971486 4.0 GiB 8E00 Linux LVM
Command (? for help): w # 保存分区操作并退出
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y # 确认
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
b 将 GPT 数据备份到一个文件 c 更改分区名称 d 删除一个分区 i 显示分区详细信息 l 列出已知分区类型。此处 8200 是 Linux swap,8300 是 Linux filesystem(对应 fdisk 的 82 和 83)。还有一个 8e00 是 Linux LVM n 增加一个新的分区 o 创建一个新的空白的 GPT 分区表 p 显示当前磁盘的分区表 q 退出 gdisk 程序,不保存任何修改 r 恢复和转换选项(仅限专家) s 排序分区 t 改变分区的类型 v 验证磁盘分区表 w 将分区表写入裁判并退出(保存并退出) x 额外功能(仅限专家) ? 显示帮助信息

1.3、parted 磁盘分区
parted 是 Linux 系统的磁盘分区工具,用于创建、调整和管理硬盘分区,支持 MBR、GPT 分区格式。
parted命令实时生效,命令执行后会立刻修改分区表,需格外小心。
root@nine-test:~# parted /dev/sdb # 对 sdb 进行磁盘分区
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p # 打印分区表
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
(parted) mkpart primary 1M 6G # 起始扇区 1M 开始,保证 4K 对齐
(parted) mkpart extended 6G 100% # 拓展分区
(parted) mkpart logical 6G 100% # 逻辑分区 6G 大小
(parted) p # 打印分区表
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1049kB 6000MB 5999MB primary xfs
2 6000MB 10.7GB 4737MB extended lba
5 6001MB 10.7GB 4736MB logical
(parted) q # 退出
信息: You may need to update /etc/fstab.

mkpart 分区名 文件系统类型 起始位置 结束位置,对GPT格式进行分区时分区名可以自定义。
2、格式化文件系统
mkfs(make filesystem)是 Ubuntu(以及其他 Linux 系统)中用于在磁盘分区或存储设备上创建文件系统的命令,这一过程会擦除设备上原有的所有数据和文件系统结构。
只需格式化主分区和逻辑分区,拓展分区是一个容器,用于存放一个或多个逻辑分区,它本身不直接存储数据,只是作为逻辑分区的管理结构,因此不需要格式化。
EXT4单个文件最大支持 16TB,最大支持 1EB 文件系统,Centos7 之前用这个多XFS比EXT4更先进的文件系统,最大支持 8EB 文件系统,单个文件最大支持 8EB,也是 Centos7 默认的文件系统。
# 查看所有设备及文件系统
lsblk -f
# 格式化为 xfs 文件系统
mkfs.xfs /dev/sdb1
# 格式化为 ext4 文件系统
mkfs.ext4 /dev/sdb5
# 查看所有设备及文件系统
lsblk -f

3、分区挂载
mount 命令可以 将指定的文件系统 挂载到 指定目录(挂载点),在 Linux 系统下必须先挂载后才能访问设备资料,挂载操作会隐藏原本 Linux 目录中的文件,因此最好是新建空目录用于挂载,挂载之后,这个目录被称为挂载点。
# 查看当前挂载情况
df -Th
# 新建空目录
mkdir /data /data_backup
# 挂载分区(临时生效),重启服务器后会失效
mount /dev/sdb1 /data
mount /dev/sdb5 /data_backup
# 查看当前挂载情况
df -Th

只读挂载:
mount -o ro /dev/sdb1 /data禁止可执行文件挂载:
mount -o noexec /dev/sdb1 /data正常卸载:
umount /data,需无进程在使用时才可卸载
4、开机自动挂载
# 往配置文件中添加 sdb 设备挂载信息,避免服务器重启后挂载点下的程序无法访问
echo "/dev/sdb1 /data xfs defaults 0 0" >> /etc/fstab
echo "/dev/sdb5 /data_backup ext4 defaults 0 0" >> /etc/fstab
# 查看文件内容
cat /etc/fstab
# 先卸载设备,再挂载所有设备测试
umount /data
umount /data_backup
mount -a
# 检查挂载情况,今后重启服务器不会丢失挂载点
df -Th
第 1 列表示需要挂载的设备
第 2 列表示挂载点
第 3 列表示挂载的文件系统
第 4 列表示挂载参数
第 5 列表示是否备份:0 不备份、1 每天备份、2 每隔一天备份
第 6 列表示是否检查分区:0 不检查、1 先检查该设备、2 排第二检查
5、分区格式修改
root@nine-test:~# parted /dev/sdb
# 改为 MBR 分区格式
(parted) mktable msdos
# 查看是否修改成功
(parted) p
# 退出
(parted) q
改成
GPT分区格式:mktable gpt
6、是否 4K 对齐
# 列出所有磁盘及其分区信息,可以看到 /dev/sdb1 起始扇区从 1 开始不能整除 8,没有 4K 对齐
fdisk -l /dev/sdb
现代硬盘物理扇区是 4K,操作系统逻辑扇区仍是 512B
未对齐会导致磁盘性能下降 20%~70%,SSD 寿命缩短

二、LVM(逻辑卷管理)
LVM 通过“物理卷(PV)→ 卷组(VG)→ 逻辑卷(LV)”的层级结构,将多个物理分区/磁盘整合为一个逻辑卷组,逻辑卷可动态调整大小(扩展/缩容),无需重新格式化(部分文件系统需同步)。
LVM 磁盘分区需要以下 4 步:
- LVM 分区
- 磁盘分区(
fdisk、gdisk、partend) - 创建物理卷 pv(
pvcreate) - 创建卷组 vg(
vgcreate) - 创建逻辑卷 lv(
lvcreate)
- 磁盘分区(
- 格式化 lv 文件系统(
mkfs) - 分区挂载(
mount) - 配置开机自动挂载(
/etc/fstab)
优点:
- 文件系统可以跨多个磁盘,大小不会受到磁盘限制
- 可在系统运行的情况下,动态扩展文件系统大小
- 可以增加新的磁盘到 LVM 的存储池中
LVM 概念:
物理卷(PV,Physical Volume):基础的存储设备(如磁盘分区/dev/sdb1、整个磁盘/dev/sdc),使用 pvcreate 命令创建。
卷组(VG,Volume Group):由一个或多个物理卷组成的存储池,使用 vgcreate 命令创建,可动态添加物理卷。
逻辑卷(LV,Logical Volume):从卷组中划分的虚拟分区,使用 lvcreate 命令创建,可动态调整大小(lvextend/lvreduce)。
物理块(PE,Physical Extends):物理区域,PV 中可以用于分配的最小存储单元(默认为 4 M),多个物理块将被分配给一个逻辑卷。
扩容原理:
LVM 是通过 交换PE 的方式,达到弹性变更文件系统大小的
- 剔除原本 LV 中的 PE,就可以减少 LV 容量
- 把其他 PE 添加到 LV,就可以扩容 LV 容量
- 一般默认 PE 大小是 4M,LVM 最多有 65534 个 PE,所以 LVM 最大的 VG 是 256G 单位
- PE 是 LVM 最小的存存储单位,类似文件系统的 block 单位,因此 PE 大小影响 VG 容量

1、LVM 分区
1.1、磁盘分区
新增两块磁盘:/dev/sdb 10G、/dev/sdc 20G,用 lvm 来管理磁盘
# 查看所有设备以及文件系统信息,可以看到 sdb、sdc 未使用,没有文件系统
lsblk -f
# 查看磁盘分区信息
fdisk -l

# MBR 分区格式,创建主分区 sdb1
fdisk /dev/sdb

# GPT 分区格式,创建分区 sdc1
gdisk /dev/sdc

1.2、创建物理卷 pv
# 列出可被用作物理卷的设备
lvmdiskscan
# 创建物理卷 PV:使用未分区的整个磁盘或磁盘已有的分区
pvcreate /dev/sdb1 /dev/sdc1
# 查看所有物理卷
pvs
不对磁盘分区,直接使用整个磁盘创建 PV 也是完全支持的
pvcreate /dev/sdb,但这样磁盘上没有任何分区表标记,fdisk -l查看磁盘信息时容易误认为是未使用磁盘而增加误操作的风险。

1.3、创建卷组 vg
# 当前逻辑卷信息,当前仅有系统自带的逻辑卷 centos
vgs
# 创建卷组 VG,把分区 sdb1、sdc1 加入卷组
vgcreate vg01 /dev/sdb1 /dev/sdc1
# 当前逻辑卷信息,刚才新增的卷组共 30G
vgs

1.4、创建逻辑卷 lv
# 查看当前逻辑卷信息
lvs
# 使用卷组 vg01 创建逻辑卷 lv_data,指定大小 12G
lvcreate -L 12G -n lv_data vg01
# 将卷组 vg01 所有剩余空间给创建的逻辑卷 lv_databackup
lvcreate -l 100%free -n lv_databackup vg01
# 查看当前逻辑卷信息
lvs

2、格式化 lv 文件系统
# 查看所有设备及文件系统
lsblk -f
# 格式化为 xfs 文件系统
mkfs.xfs /dev/vg01/lv_data
# 格式化为 ext4 文件系统
mkfs.ext4 /dev/vg01/lv_databackup
# 查看所有设备及文件系统
lsblk -f

3、分区挂载
# 查看当前挂载情况
df -Th
# 新建空目录
mkdir /data /data_backup
# 挂载分区(临时生效),重启服务器后会失效
mount /dev/vg01/lv_data /data
mount /dev/vg01/lv_databackup /data_backup
# 查看当前挂载情况
df -Th

4、开机自动挂载
# 往配置文件中添加 sdb 设备挂载信息,避免服务器重启后挂载点下的程序无法访问
echo "/dev/vg01/lv_data /data xfs defaults 0 0" >> /etc/fstab
echo "/dev/vg01/lv_databackup /data_backup ext4 defaults 0 0" >> /etc/fstab
# 查看文件内容
cat /etc/fstab
# 先卸载设备
umount /data
umount /data_backup
# 再挂载所有设备测试
df -Th
mount -a
# 检查挂载情况,今后重启服务器不会丢失挂载点
df -Th
5、LVM 环境清理
当你需要删除逻辑卷,需要提前把数据备份好,然后依次删除:逻辑卷-> 卷组-> 物理卷
# 删除逻辑卷 lv
lvremove /dev/vg01/lv_data /dev/vg01/lv_databackup
# 查看当前逻辑卷信息
lvs
# 删除卷组 vg
vgremove vg01
# 当前逻辑卷信息
vgs
# 删除物理卷 pv
pvremove /dev/sdb1 /dev/sdc1
# 查看所有物理卷
pvs
6、分区扩容
对系统根目录 / 进行扩容:先扩底层设备,再扩文件系统,增加 10G 大小
# 查看当前挂载情况,扩容前根目录大小 17G,文件系统为 xfs
df -Th
# 查看根目录逻辑卷的具体参数,根目录逻辑卷 lv 为 /dev/centos/root,卷组 vg 是 centos
lvdisplay /dev/mapper/centos-root
# 查看卷组信息,当前卷组 centos 无可用空间
vgs
# 查看所有设备以及文件系统信息,当前 /dev/sdb1 未使用,没有文件系统
lsblk -f
# 将分区新增为物理卷 PV
pvcreate /dev/sdb1
# 卷组扩容:添加物理卷到根目录分区所在的卷组
vgextend centos /dev/sdb1
# 查看扩容后的卷组,可以看到多了 10G 可用空间
vgs
# 扩容逻辑卷,将卷组剩余空间分配给根目录逻辑卷
lvextend -l +100%free /dev/centos/root
# 指定扩容大小
lvextend -L +10G /dev/centos/root
# 扩容 xfs 文件系统
xfs_growfs /dev/centos/root
# 扩容 ext4 文件系统
resize2fs /dev/centos/root
# 查看当前挂载情况,扩容后根目录大小 27G
df -Th
XFS文件系统扩容必须在挂载状态下进行,且只能扩容不能缩容。

7、分区缩容
对 /data 进行缩容:先缩文件系统,再缩分区/逻辑卷,缩小为 3G 大小
# 查看当前挂载情况,缩容分区 /dev/vg01/lv_data 大小 9.8G,文件系统为 ext4
df -Th
# 查看根目录逻辑卷的具体参数,根目录逻辑卷 lv 为 /dev/vg01/lv_data,卷组 vg 是 vg01
lvdisplay /dev/mapper/vg01-lv_data
# 查看卷组信息,当前卷组 vg01 无可用空间
vgs
# 缩容前必须先卸载分区
umount /data
# 检查文件系统
e2fsck -f /dev/vg01/lv_data
# 缩小文件系统
resize2fs /dev/vg01/lv_data 3G
# 缩小逻辑卷
lvreduce -L 3G /dev/vg01/lv_data
# 查看缩容后的卷组,可以看到多了不到 7G 可用空间
vgs
# 重新挂载
mount /dev/vg01/lv_data /data
# 查看当前挂载情况,缩容后 /dev/vg01/lv_data 分区大小 2.9G
df -Th
Ext2/Ext3/Ext4(需要先卸载)和Btrfs(支持在线缩容)是支持缩容的主流文件系统。

参考:
- 本文作者:Nine
- 本文链接:https://blog.nine.gt.tc/2020/05/10/linux-disk-management/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)