Linux磁盘分区从入门到实操:MBR/GPT全解析+分区工具实战指南
摘要:磁盘分区是Linux运维的核心基础技能,无论是服务器扩容、系统部署、数据隔离都离不开分区操作。本文详细讲解Linux磁盘分区的核心意义、MBR与GPT两大分区方案的区别,手把手带你实操fdisk、gdisk、parted三大分区工具,同时覆盖分区挂载、空间故障排查实战案例,零基础也能快速掌握。
标签:Linux运维、磁盘分区、MBR、GPT、fdisk、服务器存储
一、为什么Linux磁盘必须做分区?
很多新手疑惑:整块磁盘直接使用不行吗?答案是不推荐。合理的磁盘分区是服务器稳定运行的基础,核心价值体现在6点:
-
隔离系统与用户数据:单独划分系统分区与数据分区,避免业务日志、用户数据撑满系统盘,导致系统卡顿、崩溃、无法开机。
-
精细化空间管控:为不同业务、用户、服务独立分配磁盘空间,防止单一业务占用全部存储资源,保障多业务稳定运行。
-
故障精准隔离:单个分区出现逻辑损坏、数据丢失、病毒入侵时,仅影响当前分区,不会波及硬盘其他分区数据。
-
支持特殊分区场景:可独立创建Swap交换分区,拓展系统虚拟内存,解决物理内存不足导致的程序闪退、系统卡顿问题。
-
提升运维工具性能:限定磁盘使用范围,让磁盘检测、备份、镜像工具的识别更精准、运行效率更高。
-
适配差异化存储业务:可根据业务特性定制文件系统,小文件密集业务、大文件存储业务分别适配不同文件系统,优化读写性能。
二、两大主流分区方案:MBR vs GPT
Linux磁盘分区仅有两大标准:MBR(传统分区) 、GPT(新式分区),二者适配场景、容量限制、分区数量差异极大,是分区操作的核心理论基础。
2.1 MBR 分区方案(BIOS 老旧机型)
MBR(Master Boot Record,主启动记录)诞生于1982年,是传统BIOS固件系统的专属分区方案,适配老旧服务器、低版本Linux系统。
核心特性
-
分区数量限制:最多 4个主分区,无法直接新增;可通过「扩展分区+逻辑分区」拓展,Linux系统最多支持15个分区。
-
分区属性:扩展分区仅作为容器,无法格式化、无法直接使用;逻辑分区可正常格式化挂载、存储数据。
-
容量上限:使用4字节存储扇区数量,单扇区512字节,单个分区最大仅支持2TiB,无法适配大容量磁盘。
通俗类比:磁盘如同主板,4个主分区对应4个原生USB接口;接口不足时,将最后一个主分区改为扩展分区(扩展坞),再衍生出多个逻辑分区(拓展USB接口)。
MBR 主引导扇区结构(512字节)
磁盘第一个扇区(柱面0、磁头0、扇区1)为主引导扇区,不属于任何分区,格式化不会清除数据,是系统启动的核心,分为三部分:
-
引导程序(446字节):系统开机后,负责将控制权移交至对应分区的操作系统,完成开机引导。
-
分区表DPT(64字节):包含4个16字节的分区条目,仅记录4个主分区的位置、大小信息。
-
结束标志(2字节) :固定十六进制 AA55,是合法MBR分区的唯一标识。
MBR 16 字节分区表条目结构表:
| 序号 | 字段名称 | 占用字节 | 核心作用 | 关键取值说明 |
|---|---|---|---|---|
| 1 | 引导标记 | 1 Byte | 标识该分区是否为可启动的活动分区 | 0x80 = 活动主分区(系统从该分区启动)0x00 = 普通不可启动分区 |
| 2 | CHS 起始位置 | 3 Byte | 记录分区起始的柱面 / 磁头 / 扇区坐标 | 早期硬盘寻址方式,现已基本被 LBA 取代 |
| 3 | 分区类型 | 1 Byte | 标记分区的文件系统类型 | 0x83 = Linux 普通分区0x05/0x0F = 扩展分区0x07 = Windows NTFS |
| 4 | CHS 结束位置 | 3 Byte | 记录分区末尾的柱面 / 磁头 / 扇区坐标 | 老式寻址方式,现代系统很少使用 |
| 5 | LBA 起始扇区 | 4 Byte | 现代主流寻址方式,记录分区起始扇区号 | 定位分区位置的核心字段 |
| 6 | 分区总扇区数 | 4 Byte | 记录分区占用的扇区总数,用于计算分区容量 | 32 位长度 → MBR 单分区最大 2 TiB |
2.2 GPT 分区方案(UEFI 新式机型)
GPT(GUID分区表)是UEFI固件配套的新式分区标准,解决了MBR的容量、分区数量、安全性短板,是现代服务器、大容量磁盘的首选方案。
核心优势
-
超大容量支持:8字节存储扇区数量,最大支持 18ZiB 磁盘空间,完美适配TB级大容量硬盘。
-
分区数量充足:默认支持 128个分区,无需扩展分区、逻辑分区嵌套,分区管理更简单。
-
高安全性冗余:分区表双向备份,自带CRC32校验码,分区表损坏可自动恢复,避免数据丢失。
GPT 分区结构简介
| 区域位置 | 区块名称 | 通俗解释 & 核心作用 |
|---|---|---|
| LBA 0 | 保护性 MBR | 用于存放存放第一阶段的启动引导程序,同时兼容老旧电脑 / 老旧系统,防止老工具误删 GPT 分区,不存真实分区数据 |
| LBA 1 | 主 GPT 头部 | GPT 的 "说明书首页",记录分区总数、校验信息、备份表位置,用来定位所有分区 |
| LBA2 ~ LBA33 | 主分区条目(1~128 条目) | 一共 128 个分区空位,一个条目对应一个硬盘分区,无需区分主分区、扩展分区 |
| LBA34 ~ 磁盘倒数第 34 扇区 | 正式分区数据区 | 我们日常使用的 C 盘、D 盘等分区,文件全都存放在这里 |
| 磁盘倒数 33 ~ 倒数第 2 扇区 | 备份分区条目 | 主分区条目的完整备份,主分区表损坏时用来恢复数据 |
| 磁盘最后 1 扇区(LBA -1) | 备份 GPT 头部 | 主头部的备份,头部损坏可依靠它找回分区信息 |
GPT分区表条目详表
| 字节偏移 | 占用字节 | 字段名称 | 详细释义 & 作用 |
|---|---|---|---|
| 0 ~ 15 | 16 | 分区类型 GUID | 标记该分区用途,系统识别分区格式:Windows 系统分区、Linux /boot、EFI 引导分区、普通数据分区等都有专属 GUID |
| 16 ~ 31 | 16 | 分区唯一 GUID | 该分区独一无二的编号,全局唯一,用来精准定位分区 |
| 32 ~ 39 | 8 | 分区起始 LBA 扇区号 | 64 位数值,标记分区在硬盘的起始位置 |
| 40 ~ 47 | 8 | 分区结束 LBA 扇区号 | 标记分区在硬盘的末尾位置,结合起始扇区可算出分区总容量 |
| 48 ~ 55 | 8 | 分区属性标志 | 控制分区特性:只读、隐藏分区、不可挂载、系统保留分区等权限开关 |
| 56 ~ 127 | 72 | 分区 Unicode 名称 | 支持中文、英文等字符,自定义分区名字(如Windows系统盘、Linux根分区) |
三、Linux三大分区工具实操详解
Linux主流磁盘分区工具分为三种:fdisk(MBR专用)、gdisk(GPT专用)、parted(全能通用),下面附上完整可落地实操命令。
3.1 fdisk 工具(MBR分区专属)
轻量便捷、运维最常用,仅支持MBR分区表,全程交互式操作。
基础语法
bash
# 虚拟机新加一块100G磁盘,需重启虚拟机之后才能看到新添的磁盘
[root@server ~ 09:42:54]# reboot
# 查看磁盘分区表
[root@server ~ 09:49:40]# fdisk -l /dev/sdb
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
# 进入磁盘交互分区界面
fdisk /dev/sdb
核心交互命令
m:查看帮助菜单p:打印当前分区表n:新建分区d:删除分区w:保存分区并退出(必执行,否则不生效)q:不保存直接退出
实操1:创建2G主分区
bash
fdisk /dev/sdb
# 1. 输入n 新建分区
# 2. 默认p(主分区),回车确认
# 3. 分区号默认1,回车确认
# 4. 起始扇区默认2048(1M对齐,规范标准),回车确认
# 5. 输入 +2G 设定分区大小
# 6. 输入p 预览分区
# 7. 输入w 保存生效
💡 分区不生效解决方案:执行 partprobe 命令,强制内核重新加载分区表。
实操2:删除分区
bash
fdisk /dev/sdb
# 1. 输入d 触发删除功能
# 2. 输入对应分区号(如1、2)
# 3. 输入p 确认删除结果
# 4. 输入w 保存生效
实操3:扩展分区+逻辑分区创建(突破4主分区限制)
当4个主分区用完后,需创建扩展分区,再在其内创建逻辑分区:
bash
# 1. 创建第4个分区,选择e(扩展分区),占用剩余全部磁盘空间
# 2. 输入n 新建分区,自动生成逻辑分区(sdb5、sdb6...)
# 3. 自定义逻辑分区大小,保存w退出
3.2 gdisk 工具(GPT分区专属)
专门管理2T以上大容量磁盘、GPT分区表,操作逻辑与fdisk高度相似,上手零成本。
高频常用命令速记
-
?:查看帮助菜单 -
p:查看分区 -
n:新建分区 -
d:删除分区 -
t:修改分区类型(EFI/swap 常用) -
q:不保存退出 -
w:保存写入磁盘 -
c:修改分区自定义名称 -
o:清空磁盘,新建空白 GPT 分区表
核心实操:MBR转GPT分区表
bash
gdisk /dev/sdb
# 1. 输入o 清空原有分区,新建GPT分区表
# 2. 输入Y 确认操作
# 3. 输入w 保存GPT分区表
# 4. 输入Y 确认写入
新建GPT分区
bash
gdisk /dev/sdb
# 1. 输入n 新建分区,默认分区号、起始扇区
# 2. 输入+2G 设置分区大小
# 3. 输入L 可查看所有分区类型编码(默认8300 Linux文件系统)
# 4. 输入c 可自定义分区名称
# 5. 输入w 保存生效
3.3 parted 工具(全能通用)
唯一同时支持MBR、GPT分区的工具,支持交互式+免交互脚本操作,支持分区扩容,修改立即生效,无需手动保存。
parted 标准语法:parted 选项 磁盘 命令 \[参数]
全局 options 常用选项
| 选项 | 全称 | 作用说明 |
|---|---|---|
-l |
--list |
罗列本机全部磁盘与分区详情,日常查询最常用 |
-s |
--script |
静默脚本模式,自动确认所有交互,无弹窗询问,适合 Shell 脚本 |
-a TYPE |
--align=TYPE |
设置分区对齐策略:①opt:最优对齐(SSD / 机械硬盘推荐)②min:最小对齐③none:不对齐 |
-h |
--help |
查看帮助手册 |
-v |
--version |
查看 parted 版本 |
-i |
--interactive |
强制进入交互式模式 |
常用 command(命令)
| 命令 | 语法格式 | 实操示例 |
|---|---|---|
print |
print [free] |
print 查看分区;print free 查看空闲空间 |
mklabel |
mklabel gpt/msdos |
mklabel gpt 新建 GPT;mklabel msdos 新建 MBR |
mkpart |
mkpart 类型 文件系统 起始 结束 |
mkpart primary xfs 1G 15G |
rm |
rm 分区编号 |
rm 3 删除第 3 个分区 |
set |
set 编号 标记 on/off |
set 1 esp on 设为 EFI 分区;set 2 boot on 设为引导分区 |
name |
name 编号 分区名 |
name 1 EFI-BOOT 给分区命名 |
resizepart |
resizepart 编号 |
输入新结束位置,扩容分区 |
align-check |
align-check opt 编号 |
检查分区 4K 最优对齐 |
unit |
unit 单位 |
unit GB / unit s 切换显示单位 |
quit |
quit |
退出交互终端 |
常用实操命令
bash
# 查看分区
[root@server ~ 10:10:25]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1049kB 2149MB 2147MB primary
# 创建分区时用于设置单位为MiB(精准计算)
[root@server ~ 10:12:59]# parted /dev/sdb unit MiB
# 新建MBR分区
[root@server ~ 10:33:10]# parted /dev/sdb mklabel msdos
[root@server ~ 10:33:29]# parted /dev/sdb unit MiB mkpart primary 1 2049
# 新建GPT分区(先删除原有的MBR分区)
[root@server ~ 10:37:21]# parted /dev/sdb rm 1
[root@server ~ 10:43:18]# parted /dev/sdb mklabel gpt
[root@server ~ 10:43:35]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
# 查看新建的分区
[root@server ~ 10:51:01]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 2149MB 2147MB data1
# 扩容分区
[root@server ~ 10:51:04]# parted /dev/sdb resizepart 1 5121
# 删除分区1
[root@server ~ 10:52:13]# parted /dev/sdb rm 1
3.4 wipefs 工具(清除分区信息)
用于清除磁盘残留的分区表、文件系统信息,彻底初始化磁盘:
bash
# 查看磁盘残留信息
[root@server ~ 10:53:19]# wipefs /dev/sdb
offset type
----------------------------------------------------------------
0x200 gpt [partition table]
# 清空所有分区及文件系统信息(谨慎操作!)
[root@server ~ 10:53:43]# wipefs -a /dev/sdb
/dev/sdb:8 个字节已擦除,位置偏移为 0x00000200 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:8 个字节已擦除,位置偏移为 0x18fffffe00 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:2 个字节已擦除,位置偏移为 0x000001fe (PMBR):55 aa
/dev/sdb: calling ioclt to re-read partition table: 成功
四、分区持久化挂载(开机自动挂载)
新建分区后,必须格式化+挂载才能使用,临时挂载重启失效,生产环境需配置持久化挂载,需要修改**/etc/fstab** 开机自动挂载配置文件。
4.1 基础格式化
bash
# 格式化为xfs(CentOS7+默认)
[root@server ~ 10:56:31]# parted /dev/sdb mktable gpt
[root@server ~ 10:57:36]# parted /dev/sdb unit MiB mkpart data1 xfs 1 2049
[root@server ~ 10:58:25]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 强制格式化(存在旧文件系统时使用)
mkfs.xfs -f /dev/sdb1
# 格式化为ext4
mkfs.ext4 /dev/sdb1
4.2 /etc/fstab 持久化配置
/etc/fstab6个字段解析
| 字段序号 | 名称 | 填写规则、详细说明 |
|---|---|---|
| 第 1 字段 | 设备标识 | 二选一,优先 UUID (磁盘盘符 sdX 会变动,UUID 永久唯一)写法:UUID=xxxx-xxxx 或 /dev/sdb1 |
| 第 2 字段 | 挂载点 | 磁盘挂载到系统的目录路径;目录必须提前存在,不存在用 mkdir -p 目录路径 创建 |
| 第 3 字段 | 文件系统类型 | 填写分区格式化类型:xfs / ext4 / swap / ntfs 等 |
| 第 4 字段 | 挂载参数 | 多参数用英文逗号隔开;defaults 为默认组合参数(rw,suid,dev,exec,auto,nouser,async),日常 99% 场景直接填 defaults |
| 第 5 字段 | dump 备份标记 | 0:不使用 dump 备份分区;1:开启 dump 备份现代服务器几乎不用 dump,统一填 0 |
| 第 6 字段 | fsck 开机自检顺序 | 1. xfs 文件系统:固定填 0(xfs 无 fsck 自检工具,禁止开机检查)2. ext4 根分区 /:填 1(第一个优先自检)3. ext4 普通数据分区:填 2(根分区检查完毕后再检查)4. swap 交换分区:固定填 0 |
bash
# 1. 查询分区UUID
[root@server ~ 10:59:10]# blkid /dev/sdb1
/dev/sdb1: UUID="ecc843c4-7cc2-4a76-bcb0-4ac306391029" TYPE="xfs" PARTLABEL="data1" PARTUUID="78edb81c-f97d-4b89-b686-8a1953a29b15"
# 2. 创建挂载目录
[root@server ~ 11:04:33]# mkdir /data01
# 3. 编辑配置文件
vim /etc/fstab
# 添加配置(xfs文件系统最后两个字段固定0 0)
UUID="ecc843c4-7cc2-4a76-bcb0-4ac306391029" /data01 xfs defaults 0 0
# 4. 生效挂载
[root@server ~ 11:06:25]# mount /data01/
# 5. 验证
[root@server ~ 11:06:35]# df -h /data01/
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 2.0G 33M 2.0G 2% /data01
注意 :每次修改 /etc/fstab 后强制执行(mount -a),提前排错,避免服务器重启卡死无法开机。
五、磁盘空间不足三大故障实战排查
生产环境磁盘爆满是高频故障,3种核心场景及解决方案:
场景1:大文件占用空间爆满
现象:df查看空间100%占用,inode正常
排查命令:
bash
# 查找100M以上大文件
find /挂载目录 -size +100M
# 查看目录占用空间排序
du -s /挂载目录/* | sort -n
解决方案:直接删除无用大文件,空间立即释放。
场景2:文件删除后空间不释放
现象:已删除大文件,df显示空间仍爆满
原因:文件被进程占用,删除后仅删除文件名,进程仍持有文件句柄
排查&解决:
bash
# 查找已删除未释放的文件
lsof | grep delete
# 终止对应进程
kill 进程ID
💡 最佳实践:大文件清理优先用 > 文件名 清空,而非直接删除。
场景3:小文件过多耗尽inode
现象:磁盘空间充足,但无法新建文件,提示「设备上没有空间」
原因:海量小文件耗尽inode节点(每个文件占用1个inode)
排查&解决:
bash
# 查看inode占用
df -hi
# 批量删除无用小文件/合并小文件释放inode
rm -f 海量小文件
cat /myapp-2/file-{00001..10000} > file-00001
六、总结
-
分区方案选择:2T以下老旧磁盘用MBR,2T以上新服务器、UEFI启动用GPT;
-
工具选型:MBR用fdisk,GPT用gdisk,通用操作、扩容用parted;
-
生产规范:分区后必做持久化挂载,磁盘清理优先排查inode、占用进程、大文件三大维度;
-
安全原则:分区、清空操作前务必备份数据,wipefs、fdisk w写入操作不可逆。