1. 动手之前,先把分区这摊事想清楚
拿到“Linux 硬盘分区管理”这个题目,很多人第一反应就是敲个 fdisk /dev/sdb 进去分分钟搞定,其实真没那么简单。这东西往上关联系统安装、启动引导、数据安全,往下牵扯文件系统、挂载策略、扩容迁移,你哪怕只是给一台服务器加块数据盘,选错分区表类型或者没算好分区大小,后边都要加班还债。
我最早入行那会儿,给公司一台老服务器扩容,看着网上教程敲 fdisk,一路回车把分区建好,格式化完、挂载完,觉得挺顺利。结果重启以后分区直接丢了,查了半天才发现,用 fdisk 默认建的 DOS 分区表,碰到超过 2TB 的盘压根认不全。那次教训让我记住一件事:分区这件事,工具不是关键,关键是动手之前想清楚三个问题——盘多大、用在哪、怎么启动。
这篇文章就围绕这几件事来写。不管你是给虚拟机装 Linux 做实验,还是给实体服务器规划根分区和数据盘,或者单纯想搞懂 lsblk、fdisk、parted 这些命令到底怎么用,下面的内容都按“先懂原理、再上手操作、最后避坑”的顺序来讲。有基础的可以直接跳到实操那节对着敲命令,纯新手建议从头读,理解为什么这么做比记住命令本身重要得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分区之前必须搞明白的基础概念
2.1 为什么 Linux 一定要分区
Windows 装系统会自动帮你建好几个隐藏分区,很多人根本没感觉。但 Linux 里分区是个很显眼的存在,你装系统时就会看到 /boot、/home、/var 这些挂载点概念。就算你一路默认让安装器自己分,系统底层也是按“块设备 → 分区 → 文件系统 → 挂载点”这么组织起来的。
为什么 Linux 不像 Windows 那样整个 C 盘一股脑用?核心原因是隔离。分区本质上是把一块物理硬盘划分成几个逻辑上独立的区域,每个区域可以单独格式化、单独挂载、单独设置权限。好处很直接:
- 故障隔离:
/home被用户塞满写爆了,不会拖垮根分区上的系统服务。 - 数据安全:重装系统只需要格式化根分区,
/data、/home上的数据原封不动。 - 性能与配额:不同分区可以选不同的文件系统和挂载参数,比如日志多的挂
xfs,小文件多的挂ext4配合特定参数。 - 多系统共存:Windows 和 Linux 装在同一块盘上的时候,必须靠分区隔离。
2.2 分区表类型:MBR 和 GPT 的区别
这块我必须用大白话讲透,因为它直接决定你能不能把盘用起来。
**MBR(Master Boot Record,主引导记录)**是上个世纪留下来的老标准。它把整块盘的引导信息存在磁盘的第一个扇区,里面除了引导代码,还放了一张分区表,一共只能记 4 条主分区记录。想多分怎么办?把其中一个主分区改成“扩展分区”,在扩展分区里再切逻辑分区,逻辑分区就可以分很多个了。但这套机制有两个硬伤:一是单分区最大只能支持到 2TB 左右(实际更保守),二是分区太多时扩展分区里的链式结构特别容易出问题。
**GPT(GUID Partition Table,全局唯一标识分区表)**是 UEFI 时代的替代方案。它不再依赖单个 512 字节扇区,而是把分区表信息在磁盘头尾各存一份,互相校验。分区数量理论上没有上限(操作系统一般限制 128 个),单分区能支持到 EB 级(1EB = 1024PB),对普通用户来说就是“基本不限”。
怎么选?记住一条简单的经验:
- 硬盘容量小于 2TB、又是老主板(BIOS + MBR 引导)——用 MBR 没毛病。
- 硬盘容量大于 2TB,或者主板是 UEFI——一定用 GPT。
- 拿不准的情况下,直接选 GPT 是更稳妥的默认项。
判断当前系统用的哪种分区表,命令是:
bash复制lsblk -o NAME,PARTLABEL,PARTTYPE,SIZE
或者更直接,用 blkid 看一下分区的 PTTYPE 字段:
bash复制blkid /dev/sda
输出里 PTTYPE="dos" 就是 MBR,PTTYPE="gpt" 就是 GPT。
2.3 文件系统和挂载点的关系
分区完成后,你还得在上面建文件系统,也就是常说的“格式化”。Linux 上最常见的几种:
| 文件系统 | 适合场景 | 特点 |
|---|---|---|
| ext4 | 通用场景,默认选择 | 老牌稳重,小文件性能好,支持在线扩容 |
| xfs | 大文件、大容量存储 | 性能高,宕机后恢复快,但不能在线缩容 |
| btrfs | 需要快照、压缩、校验 | 功能丰富,但某些操作在部分发行版上还不够成熟 |
| swap | 内存交换分区 | 格式化后作为 swap 空间使用,不存储常规文件 |
选好文件系统以后,这个分区实际能不能被用户使用,还得靠“挂载”——把一个分区关联到目录树上的某个路径。比如 /dev/sdb1 挂到 /data 之后,你往 /data 里写文件,实际就是往这块分区里写。这块常识很多人上来就跳过去了,结果后边遇到“文件写不进”或者“挂载不上”的问题根本不知道从哪排查。
2.4 swap 分区还需要单独建吗
以前装 Linux 几乎必建 swap 分区,现在内存动辄 16GB 起步,很多人就开始纠结要不要留。我的建议是:除非你确定这台机器内存长期吃紧,否则系统安装器默认分配的那点 swap 就够用;但如果是自己手动分区,建议至少留一个 4GB 左右的 swap 区域。
为什么?因为 Linux 在内存压力大的时候,会把一部分不常用的内存页换到 swap,避免 OOM Killer 直接杀进程。尤其跑数据库、编译、大内存计算这类任务,swap 是兜底方案。现在更灵活的做法是先用 swap 文件替代 swap 分区,想扩容就扩容,不用动分区表。具体做法后面实操部分会写。
3. 分区操作的工具怎么选
3.1 传统三件套:fdisk、parted、gdisk
Linux 上分区工具看着很多,实际常用的就三把刀。
fdisk:绝大多数发行版默认自带,界面是交互式的,输入 n 新建、d 删除、p 打印分区表、w 写入退出。它对新手很友好,因为每一步都会提示你输入什么。但它操作 GPT 分区表时功能偏弱,而且老版本对大于 2TB 的盘支持不好。如果你的系统是新的 CentOS、Ubuntu、Debian,fdisk 已经支持 GPT,用起来没问题。
parted:功能最全面,既能分区又能调整分区大小,支持 MBR 和 GPT。它的亮点是既能交互式使用也能命令行一条命令搞定,方便写脚本。但它的警告很啰嗦,如果你没搞清楚用途,很容易在 rm 和 mkpart 上把分区搞坏。
gdisk:专门用来操作 GPT 分区表,交互方式和 fdisk 几乎一模一样,优点是排版清晰,功能比 fdisk 的 GPT 支持完善。没有预装时需要自己装,yum install gdisk 或 apt install gdisk。
工具选择上给个参考:
- 只是给数据盘快速分几个区:
fdisk。 - 需要给 2TB 以上的盘分区,或者调整分区大小:
parted。 - 纯 GPT 环境、在乎分区信息完整性:
gdisk。 - 不慎误删分区需要修复:
gdisk或testdisk。
3.2 查看磁盘状态的核心命令
动手之前一定要先看清当前环境,我个人的习惯是先敲这一串:
bash复制lsblk
blkid
df -hT
free -h
lsblk看块设备的拓扑结构,直观显示sda、sdb下面挂哪些分区。blkid看每个分区上的 UUID 和文件系统类型,写fstab的时候离不开它。df -hT看已经挂载的文件系统的使用率和类型。free -h看内存和 swap 使用情况。
加块新盘这种场景,lsblk 扫一眼就能看出 sdb 整块盘没有任何分区,直接就知道要从零开始建。
4. 实战:从一块新硬盘到正式投入使用
4.1 场景设定
假设你有台 Linux 服务器,系统盘是 /dev/sda,整个系统已经装好跑起来了。现在新插入一块 1TB 的数据盘 /dev/sdb,你要把它分成两个区:一个 200GB 挂到 /data 存业务数据,剩下的全部给 /backup 当备份盘。文件系统用 xfs(CentOS/RHEL 系默认更推荐 xfs,Ubuntu/Debian 系默认 ext4,这里按 xfs 举例)。
4.2 第一步:确认磁盘设备名
新硬盘插入后,用 lsblk 看:
bash复制lsblk
输出类似:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part /
sdb 8:16 0 1T 0 disk
看到 sdb 整块盘 1TB、没有任何分区,这就是新盘。如果之前这块盘上存过数据,lsblk 里可能能看到已有的分区,操作前务必再确认一次,别把自己的数据盘当新盘处理了。
提示:如果系统里有多块云盘或者多块物理盘,设备名可能不是按插入顺序排的。一定要通过
lsblk或者ls -l /dev/disk/by-id/这种方式交叉确认,避免误操作。
4.3 第二步:使用 parted 创建 GPT 分区表并分区
这块盘 1TB,我直接用 GPT。虽然 MBR 也能用,但既然 GPT 没任何副作用,没必要固守老传统。
bash复制parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary xfs 1MiB 200GiB
parted /dev/sdb mkpart primary xfs 200GiB 100%
逐条解释一下:
mklabel gpt:把分区表初始化为 GPT。这个操作会把整块盘上的旧分区表清零,不可恢复,所以一定要确认盘符正确。mkpart primary xfs 1MiB 200GiB:创建第一个分区。分区类型填primary其实在 GPT 里已经没有主分区/逻辑分区的概念了,这个参数只是兼容性写法。xfs只是用来标记分区类型,不会真的格式化。起点 1MiB 是为了对齐扇区,现代硬盘建议把起点设在 1MiB 或者整兆字节边界,能避免 IO 性能损失。mkpart primary xfs 200GiB 100%:创建第二个分区,从 200GiB 到磁盘末尾。
创建完以后查看结果:
bash复制parted /dev/sdb print
输出会显示分区表类型、分区编号、起始位置、结束位置、大小。注意分区号是 1 和 2,对应设备名 /dev/sdb1 和 /dev/sdb2。
不用 parted 的话,fdisk 版本也兼容:
bash复制fdisk /dev/sdb
进入交互界面后,输入 g 创建 GPT 分区表,输入 n 依次创建两个分区,最后输入 w 写入退出。效果一样,但 fdisk 的交互流程对新手更友好,每一步都有提示。两种方式选一种就行,不要混着用。
4.4 第三步:格式化分区
分区表写好以后,给两个分区分别建文件系统:
bash复制mkfs.xfs /dev/sdb1
mkfs.xfs /dev/sdb2
如果是 ext4:
bash复制mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
格式化这一步会彻底清空该分区上的数据,所以同样是高危操作。你可以在命令后面加 -f 强制,但我不建议上来就强打,先让它正常执行,如果系统提示文件系统已存在,说明这个分区上可能有数据,停下来想清楚再说。
格式化之后,最好给分区加上 label(卷标),方便以后识别:
bash复制xfs_admin -L DATA /dev/sdb1
xfs_admin -L BACKUP /dev/sdb2
ext4 用 e2label /dev/sdb1 DATA。养成打标签的习惯,后边挂载和使用的时候一眼能看出来哪个分区是干嘛的。
4.5 第四步:创建挂载点并挂载
bash复制mkdir -p /data
mkdir -p /backup
mount /dev/sdb1 /data
mount /dev/sdb2 /backup
然后验证:
bash复制df -hT
能看到 /data 和 /backup 都挂上去了,文件系统类型是 xfs,容量分别 200G 和 800G 左右。
但这种挂载方式是临时的,重启之后就不存在了。要让系统开机自动挂载,必须写入 /etc/fstab。我先用 blkid 查 UUID:
bash复制blkid /dev/sdb1 /dev/sdb2
输出类似:
code复制/dev/sdb1: UUID="xxxx-xxxx-..." TYPE="xfs"
/dev/sdb2: UUID="yyyy-yyyy-..." TYPE="xfs"
然后把下面两行加到 /etc/fstab:
code复制UUID=xxxx-xxxx-... /data xfs defaults 0 0
UUID=yyyy-yyyy-... /backup xfs defaults 0 0
这里有一个非常重要的细节:/etc/fstab 写错一条,开机就可能进不了系统或者卡在 emergency mode。所以写完以后一定要先验证:
bash复制mount -a
这条命令会按 /etc/fstab 重新挂载所有条目,如果语法有误它会直接报错。验证通过再重启,不要直接 reboot。我见过太多人写了 fstab 不测试就重启,结果系统起不来还得进单用户模式改文件,非常折腾。
4.6 动态扩容场景的处理
上面的操作是静态的,实际工作中你还要面对“这个分区快满了,要扩一下”的需求。xfs 支持在线扩容,ext4 也支持,但做法不同。
xfs 扩容步骤:扩充分区本身,然后用 xfs_growfs 扩文件系统。
比如 /dev/sdb1 原来是 200G,现在想扩到 300G,假设 /dev/sdb 上还有空闲空间:
bash复制parted /dev/sdb resizepart 1 300GiB
xfs_growfs /data
注意顺序:先扩分区,再扩文件系统。第二步执行后,df -hT 会看到 /data 空间变成 300G。
ext4 用 resize2fs:
bash复制parted /dev/sdb resizepart 1 300GiB
resize2fs /dev/sdb1
这两个命令本质上都是把文件系统元数据扩展到“分区已经扩大”的空间上。xfs 只能扩不能缩,ext4 可以缩但缩分区非常危险,操作前必须备份。生产环境的建议:尽量别缩容,实在要缩就备份重做。
4.7 swap 文件方案替代 swap 分区
刚才提到过,现在我更倾向用 swap 文件而不是单独建 swap 分区。原因是灵活,想改大小直接删掉重建,不用碰分区表。做法如下:
bash复制# 创建 4G 的 swap 文件
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 持久化到 fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab
bs=1M count=4096 就是 4GB 大小,想改 8GB 就把 count 改成 8192。权限必须改成 600,否则 swapon 会警告不安全。这方案对虚拟机、云主机、物理机都适用,不用再造分区那么麻烦。
5. 常见问题和排查技巧
5.1 新加的盘在系统里看不到
很多人插上一块硬盘或者挂载一块云盘,发现 lsblk 里根本没有。这种问题分两种情况:
一种是物理层面没识别。SATA/NVMe 盘插入后,在没有热插拔支持的机器上可能需要重启;云服务器新挂的盘需要到控制台刷新或重新扫描。可以尝试:
bash复制echo "- - -" > /sys/class/scsi_host/host0/scan
或者把 host0 换成 host1、host2 多扫几次。但如果你是物理机,最稳妥的做法还是关机确认接线,再重启。
另一种是系统识别了但你没找到。这种情况多半是设备名不是你以为的那个。用 lsblk、ls -l /dev/disk/by-id/、fdisk -l 交叉比对,看容量、厂商、序列号,别只看 /dev/sdb 这种推断。
5.2 分区表报错“invalid partition table”
这种一般出现在 MBR 和 GPT 切换,或者从 Windows 系统盘改成 Linux 数据盘时。最直接的办法是重新生成分区表。如果确认盘上数据不重要:
bash复制parted /dev/sdb mklabel gpt
这会把旧分区表彻底清掉。如果数据重要,就不要做这一步,应该用 testdisk 尝试恢复分区表。真遇到这种情况我的建议是:先做整盘镜像备份,再尝试恢复,别想着零成本解决数据丢失问题。
5.3 挂载点写入失败、提示只读文件系统
一般来说是文件系统损坏或者挂载参数带了 ro。先用 mount 看看挂载参数:
bash复制mount | grep /data
确认是 ro 就去 /etc/fstab 改成 rw。如果文件系统损坏,先卸载再修复:
bash复制umount /data
xfs_repair /dev/sdb1
注意:xfs_repair 不能对已挂载的文件系统执行,必须先卸载。ext4 对应的是 fsck /dev/sdb1,同样要先卸载。如果提示设备忙卸载不掉,用 lsof +f -- /data 看是哪个进程占用着目录。
5.4 重启后分区消失了
分两种情况。如果是云主机,重启后云盘的设备名可能漂移,比如原来 /dev/sdb 变成了 /dev/sdc。解决办法是别在 fstab 里写死 /dev/sdb1,用 UUID 替代。这也是我在 4.5 节反复强调用 UUID 的原因。
如果是自己新加的分区整个不见了,大概率是分区表没写进去。fdisk 里没按 w 就退出的话,之前在内存里的分区操作不会落盘,重启自然就没了。fdisk 这类工具的改动是“先改内存,w 才写盘”,很多人第一次用的时候在交互界面里创建了分区但忘了 w,就以为分了区。
5.5 分区满了,但删除文件后空间没释放
典型场景:删了一个大文件,df -h 显示空间没变。原因通常是这个文件被某个进程打开了,虽然文件名删了,但文件句柄还活着,空间要等进程退出才释放。用这个命令定位:
bash复制lsof +L1
或者:
bash复制find /proc/*/fd -lname '*deleted*' 2>/dev/null | xargs ls -la
找到对应的进程后,重启服务或者把服务正常停掉,空间就会释放。
5.6 快速排查命令速查表
| 问题现象 | 排查命令 | 常见原因 |
|---|---|---|
| 设备不识别 | lsblk、fdisk -l |
未扫描,驱动缺失 |
| 无法创建分区 | parted /dev/sdb print |
分区表损坏,类型选错 |
| 挂载失败 | dmesg | tail -20 |
文件系统类型错误,UUID写错 |
| 开机进紧急模式 | journalctl -xb |
fstab 写错设备,挂载参数错误 |
| 空间未释放 | lsof +L1 |
进程占用已删除文件 |
| 扩容不生效 | xfs_growfs / resize2fs |
只扩了分区没扩文件系统 |
6. Linux 分区管理面试里常被问到的点
如果看这篇文章是为了准备面试,上面这些操作还不够,有几个“考点”需要单独拎出来说。
一是 MBR 和 GPT 的区别。面试官喜欢听你讲清楚分区数量上限、单分区容量上限、引导方式差异、还有兼容性。能顺口说出“GPT 在磁盘头和尾各存一份分区表,损坏一份会自动用另一份恢复”,比背概念强。
二是 /etc/fstab 的字段含义。每一行有 6 个字段:设备、挂载点、文件系统类型、挂载选项、dump 备份标记、fsck 检查顺序。特别要能讲明白最后一列为什么根分区一般是 1、其他分区是 2 或者 0。
三是 swap 的作用和查看方式。free -h、swapon --show 都是常用命令。还要能说清楚 swap 满了会发生什么,以及为什么 swap 分区不建议放在机械盘上(性能瓶颈明显)。
四是 软链接和挂载的区别。这个问题经常有人答错。软链接 ln -s /data /home/data 只是路径映射,跨分区时底层访问没变;挂载是把一个分区真实接到目录树上,写入挂载点就是写入那块盘。很多人把这两者混为一谈,面试里用一个场景题就能套出来。
五是 inode 数满了会怎样。磁盘空间有剩余但创建不了文件,大概率是 inode 耗尽。排查命令是 df -i,解决办法是重建文件系统时调整 inode 数量,或者在应用层面清理小文件。这个知识点虽然不属于分区本身,但和分区格式化强关联,面试喜欢连着问。
7. 我自己这些年做分区管理的几点体会
操作做了不少之后,我发现分区管理真正难的不是命令本身,而是没想清楚就动手。你敲一个 mkfs 可能只要几秒,但这条命令覆盖的数据可能是别人几个月的劳动成果。所以我现在所有分区、格式化、扩容操作,不管多简单,都遵守几个死规矩:
第一,操作前一定先 lsblk + blkid 确认盘符,再用 parted /dev/sdx print 看一眼盘上有没有已有分区。确认两次再动手,磨刀不误砍柴工。
第二,涉及 fstab 的改动,写完以后必须 mount -a 验证,然后再决定要不要重启。这句话我已经重复过几次了,因为它太重要了,我见过太多临时挂载能用、重启就起不来的案例。
第三,xfs 和 ext4 各有各的优势,不要迷信某一个。生产上跑数据库的机器、备份服务器、文件服务器,需求不一样,选型标准也不一样。真让我给个默认值的话:Red Hat 系建议 xfs,Debian 系建议 ext4,两边都稳,别在这上面纠结太久。
第四,多留一份手工分区笔记。很多人以为这种事看过就会,真正到了现场,脑子一片空白。把常用的几个命令和步骤记成本地笔记,甚至做成脚本模板,需要的时候复制改个盘符就能用。省下的时间,够你多刷两部剧了。
回到开头的场景:那次我因为分区表类型选错导致扩容失效之后,每次分区都强迫自己先回答“这是谁用的盘、多大数据量、要不要跨多块盘组 RAID/LVM、启动方式是什么”。这四个问题想清楚了,分区表选型、分区大小规划、文件系统选择都有了依据,剩下的操作都是体力活。也希望你动手之前,先花五分钟把这些问题过一遍,能帮你省下后面不知道多少小时的排障时间。
