我最早接触 Linux 磁盘管理时,印象最深的一件事是:在服务器上敲了一下午命令,以为自己在"管理磁盘",结果第二天系统重启,之前挂载好的数据盘不见了。后来才明白,我只是临时挂载了一下,并没有把挂载关系写进系统配置。这类问题几乎每个刚接触 Linux 运维的人都会遇到,而磁盘管理恰恰是 Linux 系统里绕不开的基本功。
这篇内容是"Linux 磁盘管理"系列的第一篇,目标是把磁盘从"硬件设备"到"可用文件系统"这一整条链路讲透。我们会从设备命名、分区表、文件系统、挂载操作这几个核心环节入手,配合实际的命令演示和踩坑记录,帮助你建立一套完整的磁盘管理知识框架。内容适用于刚入门 Linux 的开发者、准备转行运维的新人,以及那些用过 Linux 但始终对磁盘管理"知其然不知其所以然"的朋友。
磁盘管理与日常开发最大的不同在于:它的每一步操作都直接作用于真实的数据载体,一旦出错,后果可能是毁灭性的。所以这篇文章里除了讲"怎么做",我还会重点讲"为什么这么做"以及"做错了会怎样"。
1. 先搞清楚 Linux 是怎么给硬盘"起名字"的
在动手管理磁盘之前,最基础也最容易忽视的一件事,是理解 Linux 系统中的设备命名规则。很多新手在 /dev/ 目录下看到一堆 sda、sdb、nvme0n1 之类的文件,完全分不清谁是谁,更不敢动。其实这套命名规则非常直观,搞懂之后,后续所有分区、格式化、挂载操作都会变得顺理成章。
1.1 /dev 目录下的设备文件是怎么来的
Linux 的设计哲学是"一切皆文件",硬件设备也不例外。当你往服务器上插一块硬盘,系统内核检测到新硬件后,会在 /dev/ 目录下创建对应的设备文件。应用层程序不直接跟硬件打交道,而是通过读写这些设备文件来间接操作硬件。
查看当前系统识别到的所有磁盘设备,最常用的命令是:
bash复制lsblk
这个命令的输出非常直观,它会以树状结构展示磁盘和分区的关系:
bash复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 39.5G 0 part /
lsblk 全称是 list block devices,专门用来列出块设备信息。从上面的输出可以很清楚看到:系统有一块名为 sda 的磁盘,容量 40G,下面分了两个分区 sda1 和 sda2,分别挂载在 /boot 和根目录。
除了 lsblk,下面这几个命令也值得记一下:
bash复制# 查看内核环缓冲区中的设备识别日志
dmesg | grep sd
# 查看已识别的 SCSI/SATA 设备详细信息
cat /proc/scsi/scsi
# 查看块设备主次设备号等信息
lsblk -f
提示:
lsblk -f会额外显示文件系统类型和 UUID,这个在后续挂载操作中非常有用,建议平时多养成用lsblk -f查看磁盘信息的习惯。
1.2 sd 开头和 nvme 开头的设备名有什么区别
服务器和台式机上最常见的磁盘设备命名有两类,一类是 sd 开头,一类是 nvme 开头。
sd 开头的设备名对应的是 SCSI 子系统管理的磁盘,包括传统的 SATA 硬盘、SAS 硬盘、USB 移动硬盘,以及虚拟化平台里的虚拟磁盘。命名规则是从 sda 开始,按字母顺序往后排:sda 是第一块,sdb 是第二块,sdc 是第三块,以此类推。同一块磁盘上的分区则通过数字后缀区分,sda1 是 sda 的第一分区,sda2 是第二分区。
nvme 开头的设备名对应的是 NVMe 固态硬盘,这类硬盘直连 PCIe 总线,速度和延迟表现远好于 SATA 接口的 SSD。命名规则与 sd 系列不同,格式是 nvme0n1,其中 0 代表控制器编号,n1 代表 Namespace 编号。NVMe 盘的分区同样用数字后缀表示,比如 nvme0n1p1 就是第一分区。
这里有一个实用判断技巧:
bash复制# 查看磁盘类型和传输方式
lsblk -d -o NAME,ROTA,TRAN
NAME ROTA TRAN
sda 1 sata
nvme0n1 0 nvme
ROTA 列如果为 1,表示是机械盘(旋转盘),为 0 表示 SSD 等固态存储;TRAN 列显示传输类型,是 sata、nvme 还是 usb,一看便知。
1.3 为什么不能依赖 sda 这种名字来定位硬盘
这里必须提醒一个非常容易踩坑的点:sda 这个名字并不保证永远指向同一块物理硬盘。具体来说,在以下场景中设备名可能会发生变化:
- 新增或移除硬盘后,原有的设备名顺序可能重新排列。
- 服务器重启后,内核识别硬盘的顺序与上次不同。
- 在虚拟化平台中调整了磁盘的接入顺序。
我自己就踩过这个坑。有次在测试服务器上插了第二块数据盘,结果重启之后原先配置好的服务全部启动失败。排查半天发现,原来系统把两块盘的识别顺序调换了,原来的 sdb 变成了 sda,而挂载配置里写的是 /dev/sdb1,自然就找不到了。
所以专业运维在写挂载配置时,一般不会直接用设备名,而是用 UUID 或 PARTUUID 来定位分区。UUID 是文件系统在格式化时生成的全局唯一标识符,只要不重新格式化,基本不会变化。查 UUID 的方式很简单:
bash复制blkid
或者:
bash复制lsblk -f
后面写 /etc/fstab 自动挂载配置时,我会详细演示用 UUID 替代设备名的完整做法,这里先记下这个思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分区表选 MBR 还是 GPT,不只是容量问题
/dev/sda 是一块完整的硬盘,但硬盘不能直接用来存文件。使用前需要先做分区规划,也就是在硬盘上划分出一个或多个独立的区域,每个区域后续可以独立格式化、独立挂载。分区信息要记录在硬盘开头的特定区域里,这部分区域就是分区表。
2.1 MBR 与 GPT 的核心差异对照
目前主流的分区表格式只有两种:MBR 和 GPT。我在实际工作中发现,很多刚接触 Linux 的朋友对这两者的理解停留在"MBR 老、GPT 新"这种最浅层的程度,但真要回答"为什么要用 GPT",却说不出本质原因。
用一张表格直观对比:
| 对比项 | MBR | GPT |
| --- | ---
