服务器磁盘被写满,SSH连上去敲 df -h,Use% 停在 99%,数据库日志疯狂报错,业务告警群里已经炸了锅——这种场面我在运维 CentOS 的几年里见过太多次。其实绝大多数磁盘问题都不是玄学,而是对分区表、文件系统、挂载链路这几个基础环节理解不透。这篇文章把我这几年操作 CentOS 磁盘管理的经验整理一遍,从分区到 LVM 扩容,从 fstab 到故障排查,尽量把每个步骤背后的原理也讲清楚。适合刚接手 CentOS 服务器的同学,也适合被扩容、磁盘满、挂载失败折腾过的朋友。
1. 磁盘管理的底层逻辑:从分区表到文件系统
1.1 Linux 如何“看见”一块磁盘
Linux 下一切皆文件,磁盘也不例外。传统 SATA/SCSI 硬盘的设备名通常是 /dev/sda、/dev/sdb,NVMe 固态是 /dev/nvme0n1,虚拟化环境可能是 /dev/vda 或 /dev/xvda,云服务器还可能直接给你一整块 /dev/vdb。这些名字由内核按照驱动探测到的顺序分配,所以“sda”和物理位置并不一定一一对应。
这里有个容易被忽略的坑:设备名在重启后可能变化。你插了两块盘,第一次启动系统识别为 sda、sdb,换了个接口或者升级了 BIOS,第二次启动可能就变成 sdb、sda 了。所以在 /etc/fstab 里写死 /dev/sda1 是非常危险的做法,更稳妥的是使用 /dev/disk/by-uuid/ 下的 UUID 或者文件系统 LABEL。
分区之后,Linux 会在设备名后面追加分区号,比如 /dev/sda1、/dev/sda2。如果是 GPT 分区表,还可能看到 /dev/sda1p1 这种命名,别慌,这是内核在部分场景下的命名方式。对于习惯 lsblk 的人来说,这些差异都无所谓,因为 lsblk 会把树状结构展示得很清楚。
1.2 MBR 与 GPT:分区表怎么选
MBR(Master Boot Record)和 GPT(GUID Partition Table)是两种主流分区表格式。
- MBR:传统格式,最多 4 个主分区,单个分区最大 2TB。为了超过 4 个分区,可以用扩展分区套逻辑分区,但操作麻烦,而且 2TB 的上限在现代服务器面前完全不够看。
- GPT:全局唯一标识分区表,最多支持 128 个分区(Windows 下更多),单个分区容量理论上可达 EB 级别,远远超过当前硬盘容量的实际需求。GPT 还在磁盘末尾保留了分区表备份,容错性更好。
CentOS 7 以上安装时默认就使用 GPT,即使是 BIOS 引导,grub2 也能正常识别。如果你新加了一块磁盘,只要容量大于 1TB,我建议直接上 GPT,避免以后扩容到 2TB 时再折腾迁移。操作上,fdisk 虽然新版也支持 GPT,但很多人还是习惯用 parted 或 gdisk。我的经验是:MBR 小盘用 fdisk,GPT 大盘用 parted -s /dev/sdb mklabel gpt,后续分区也直接用 parted 脚本,干净利落。
1.3 文件系统选择:XFS 还是 ext4
CentOS 7 开始,默认文件系统换成了 XFS。XFS 对大数据量、高并发读写优化得更好,支持在线扩容(xfs_growfs),但它有一个硬伤:不能缩容。ext4 则老当益壮,resize2fs 既支持扩容也支持缩容,小文件场景表现也很稳。
所以规划文件系统的思路是:
- 如果分区后期可能要缩小,比如
/home这种隔一段时间想调整大小的目录,用 ext4 会更灵活; - 如果分区只增不减,比如根分区
/、日志分区/var/log,用 XFS 没问题; - 跑数据库的独立数据盘,两者皆可,但 XFS 在大文件连续读写上稍占优势,ext4 在大量随机小文件写入上更耐造。
还有一点必须记住:mkfs.xfs 和 mkfs.ext4 格式化出来的文件系统,调优参数不一样,后面扩容时用的工具也不一样。XFS 用 xfs_growfs,ext4 用 resize2fs,千万别混。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分区实操:fdisk、parted、gdisk 到底怎么选
2.1 一块新盘的分区流程
假设你给 CentOS 加了一块 20GB 的 /dev/sdb,目标是把它分成一个分区、格式化成 xfs、挂载到 /data。
先确认磁盘已经识别:
bash复制lsblk
输出里如果出现了 sdb 20G,就可以开始分区了。如果看不到,先检查虚拟机/宿主机是否正确添加了磁盘,然后扫描总线(后面第 4 节详细讲)。
MBR 风格用 fdisk:
bash复制fdisk /dev/sdb
交互界面里输入 n 新建分区,p 主分区,分区号默认 1,起始扇区默认,结束扇区默认(表示使用整块盘),最后 w 写入分区表。整个过程需要按几次回车,非常简单。
GPT 风格用 gdisk 或 parted。gdisk 的交互逻辑和 fdisk 几乎一样,适合习惯 fdisk 的人。parted 更适合脚本化操作:
bash复制parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary xfs 1MiB 100%
parted -s /dev/sdb set 1 lvm on
注意我指定了 1MiB 作为起始位置。这是现代分区工具的默认对齐方式,保证分区起始位置对齐物理扇区,避免 I/O 性能损失。以前用 fdisk 默认起始扇区 63 导致的“分区未对齐”问题,在 2048 扇区(1MiB)对齐后基本消失。
分区创建完
