Linux 磁盘分区方式

2020/05/10 更新 1 次 更新于 2026/08/08 Linux 共 10571 字,约 31 分钟

在 Linux 系统中,管理多个分区有两种主流方案:传统磁盘分区(直接操作物理分区)和 LVM(逻辑卷管理)(将多个物理分区/磁盘整合为逻辑卷)。两者各有优劣,传统分区适合固定容量的场景,LVM 则更适合需要动态调整空间的环境。

一、传统磁盘分区

传统分区通过 fdiskgdiskparted 等工具直接操作磁盘,每个分区独立存在,调整大小需重新格式化(ext4xfs 文件系统支持在线扩容,但缩容需先卸载并检查文件系统)。

传统磁盘分区需要以下 4 步:

  1. 给磁盘创建分区(fdisk、gdisk、partend
  2. 格式化分区文件系统(mkfs
  3. 挂载使用该分区(mount
  4. 配置开机自动挂载(/etc/fstab

1、磁盘分区

查看磁盘分区信息:fdisk -l

image-20200705202435828

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

image-20200705202717331

下面分别介绍 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 保存分区表

image-20200705204824479

1.2、gdisk 磁盘分区

gdisk 命令是 Linux 上管理 GPTGUID 分区表)分区的强大工具,分区时 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 额外功能(仅限专家) ? 显示帮助信息

image-20200705223956574

1.3、parted 磁盘分区

parted 是 Linux 系统的磁盘分区工具,用于创建、调整和管理硬盘分区,支持 MBRGPT 分区格式。

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.

image-20200705234432813

mkpart 分区名 文件系统类型 起始位置 结束位置,对 GPT 格式进行分区时分区名可以自定义。

2、格式化文件系统

mkfs(make filesystem)是 Ubuntu(以及其他 Linux 系统)中用于在磁盘分区或存储设备上创建文件系统的命令,这一过程会擦除设备上原有的所有数据和文件系统结构。

只需格式化主分区和逻辑分区,拓展分区是一个容器,用于存放一个或多个逻辑分区,它本身不直接存储数据,只是作为逻辑分区的管理结构,因此不需要格式化。

EXT4 单个文件最大支持 16TB,最大支持 1EB 文件系统,Centos7 之前用这个多 XFSEXT4 更先进的文件系统,最大支持 8EB 文件系统,单个文件最大支持 8EB,也是 Centos7 默认的文件系统。

# 查看所有设备及文件系统
lsblk -f

# 格式化为 xfs 文件系统
mkfs.xfs /dev/sdb1

# 格式化为 ext4 文件系统
mkfs.ext4 /dev/sdb5

# 查看所有设备及文件系统
lsblk -f

image-20200705215254101

3、分区挂载

mount 命令可以 将指定的文件系统 挂载到 指定目录(挂载点),在 Linux 系统下必须先挂载后才能访问设备资料,挂载操作会隐藏原本 Linux 目录中的文件,因此最好是新建空目录用于挂载,挂载之后,这个目录被称为挂载点。

# 查看当前挂载情况
df -Th

# 新建空目录
mkdir /data /data_backup

# 挂载分区(临时生效),重启服务器后会失效
mount /dev/sdb1 /data
mount /dev/sdb5 /data_backup

# 查看当前挂载情况
df -Th

image-20200705215024126

只读挂载: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 寿命缩短

image-20200707003428301

二、LVM(逻辑卷管理)

LVM 通过“物理卷(PV)→ 卷组(VG)→ 逻辑卷(LV)”的层级结构,将多个物理分区/磁盘整合为一个逻辑卷组,逻辑卷可动态调整大小(扩展/缩容),无需重新格式化(部分文件系统需同步)。

LVM 磁盘分区需要以下 4 步:

  1. LVM 分区
    1. 磁盘分区(fdisk、gdisk、partend
    2. 创建物理卷 pv(pvcreate
    3. 创建卷组 vg(vgcreate
    4. 创建逻辑卷 lv(lvcreate
  2. 格式化 lv 文件系统(mkfs
  3. 分区挂载(mount
  4. 配置开机自动挂载(/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 容量

image-20220303190315094

1、LVM 分区

1.1、磁盘分区

新增两块磁盘:/dev/sdb 10G、/dev/sdc 20G,用 lvm 来管理磁盘

# 查看所有设备以及文件系统信息,可以看到 sdb、sdc 未使用,没有文件系统
lsblk -f

# 查看磁盘分区信息
fdisk -l

image-20200706191324610

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

image-20200706192605970

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

image-20200706192418978

1.2、创建物理卷 pv
# 列出可被用作物理卷的设备
lvmdiskscan

# 创建物理卷 PV:使用未分区的整个磁盘或磁盘已有的分区
pvcreate /dev/sdb1 /dev/sdc1

# 查看所有物理卷
pvs

不对磁盘分区,直接使用整个磁盘创建 PV 也是完全支持的 pvcreate /dev/sdb,但这样磁盘上没有任何分区表标记,fdisk -l 查看磁盘信息时容易误认为是未使用磁盘而增加误操作的风险。

image-20200706193426491

1.3、创建卷组 vg
# 当前逻辑卷信息,当前仅有系统自带的逻辑卷 centos
vgs

# 创建卷组 VG,把分区 sdb1、sdc1 加入卷组
vgcreate vg01 /dev/sdb1 /dev/sdc1

# 当前逻辑卷信息,刚才新增的卷组共 30G
vgs

image-20200706193806365

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

image-20200706211956712

2、格式化 lv 文件系统

# 查看所有设备及文件系统
lsblk -f

# 格式化为 xfs 文件系统
mkfs.xfs /dev/vg01/lv_data

# 格式化为 ext4 文件系统
mkfs.ext4 /dev/vg01/lv_databackup

# 查看所有设备及文件系统
lsblk -f

image-20200706212236045

3、分区挂载

# 查看当前挂载情况
df -Th

# 新建空目录
mkdir /data /data_backup

# 挂载分区(临时生效),重启服务器后会失效
mount /dev/vg01/lv_data /data
mount /dev/vg01/lv_databackup /data_backup

# 查看当前挂载情况
df -Th

image-20200706212625998

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 文件系统扩容必须在挂载状态下进行,且只能扩容不能缩容。

image-20260706222734928

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 (支持在线缩容)是支持缩容的主流文件系统。

image-20260706234916212

参考:

Search

    Table of Contents