2. /etc/fstab 文件详解:字段含义、配置规则、常见错误写法
说起 /etc/fstab,我敢说这是 Linux 系统里最让人「又爱又恨」的文件之一。爱它,是因为它帮我们自动挂载分区,省去每次手动 mount 的麻烦;恨它,是因为只要写错一个字符,系统启动就可能直接卡在 emergency mode,让你连桌面都进不去。
我自己就吃过不少这方面的亏。记得刚入行那会儿,有一次在客户的生产服务器上改 fstab,手抖多打了个空格,结果重启后系统直接起不来了。大半夜被叫去机房,满头大汗地修了半天。从那以后,我对这个文件就格外敬畏。
今天咱们就把这个文件彻底讲透。你只要跟着我走一遍,以后看到 fstab 就不会再发怵了。
2.1 文件位置与基本结构
/etc/fstab 是一个纯文本文件,位于 /etc 目录下。它的作用很简单:告诉系统在启动时,哪些设备要挂载到哪个目录,以及用什么文件系统类型。
一个典型的 fstab 文件长这样:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=1234-5678 / ext4 defaults 0 1
UUID=8765-4321 /boot ext4 defaults 0 2
UUID=abcd-efgh none swap sw 0 0
/dev/sdb1 /data xfs defaults 0 0
嗯,这里要注意:每一行代表一个挂载条目,行与行之间没有顺序要求,但系统会按顺序依次处理。以 # 开头的行是注释,系统会直接忽略。
2.2 六个字段的含义
每个挂载条目由 6 个字段组成,字段之间用空格或 Tab 分隔。我习惯用 Tab 对齐,这样看起来更整洁。
| 字段 | 含义 | 示例 |
|---|---|---|
| 1. file system | 要挂载的设备或分区 | /dev/sda1 或 UUID=xxx |
| 2. mount point | 挂载点目录 | /、/boot、/data |
| 3. type | 文件系统类型 | ext4、xfs、swap |
| 4. options | 挂载选项 | defaults、noatime |
| 5. dump | 备份标志(0 或 1) | 0(不备份) |
| 6. pass | 文件系统检查顺序 | 1(根分区)、2(其他) |
2.2.1 第一字段:file system
这个字段指定要挂载的设备。有三种写法:
- 设备路径:如
/dev/sda1。简单直接,但设备名可能变化(比如换了硬盘或插拔了 USB)。 - UUID:如
UUID=1234-5678。这是最推荐的方式,因为 UUID 是唯一的,设备名变了也不影响。 - LABEL:如
LABEL=MyData。适合有明确标签的场景,但标签可能重复。
blkid 命令可以查看所有设备的 UUID。我在项目中见过太多因为设备名漂移导致挂载失败的案例了。
2.2.2 第二字段:mount point
挂载点就是你要把设备挂到哪个目录下。根分区必须是 /,交换分区用 none,其他分区可以自定义。
这里有个坑:挂载点目录必须事先存在。如果目录不存在,系统会挂载失败。我曾经犯过这个错——新建了一个分区,忘了创建挂载点目录,结果重启后分区没挂上。
2.2.3 第三字段:type
文件系统类型。常见的有:
ext4:Linux 最常用的文件系统xfs:适合大文件和高性能场景swap:交换分区vfat:Windows 兼容的 FAT32ntfs:Windows NTFS 文件系统nfs:网络文件系统
如果你不确定类型,可以用 auto,让系统自动检测。但我不建议这么做——自动检测有时会出错,特别是对于特殊文件系统。
2.2.4 第四字段:options
这是最复杂的字段,也是出问题最多的地方。挂载选项用逗号分隔,不能有空格。
常用的选项有:
defaults:默认选项,包含rw、suid、dev、exec、auto、nouser、asyncro:只读挂载rw:读写挂载noexec:禁止执行二进制文件(安全考虑)nosuid:忽略 suid 和 sgid 位noatime:不更新访问时间(提升性能)nofail:如果设备不存在,不报错,继续启动
nofail 这个选项特别实用。如果你挂载的是一个可能不存在的设备(比如 U 盘),加上 nofail 可以防止系统因为找不到设备而卡在 emergency mode。
2.2.5 第五字段:dump
这个字段用于 dump 备份工具。大多数情况下设为 0,表示不备份。只有极少数老系统会用 1。说实话,我工作这么多年,几乎没见过谁用 dump 备份。
2.2.6 第六字段:pass
这个字段控制 fsck 文件系统检查的顺序:
0:不检查1:最先检查(通常只给根分区)2:其次检查(其他分区)
注意:只有 pass 为 1 或 2 时,系统才会在启动时检查文件系统。如果设为 0,即使文件系统有问题,系统也不会自动修复。
2.3 配置规则与最佳实践
写 fstab 时,有几个规则你必须记住:
- 每行 6 个字段,一个都不能少。少一个字段,系统启动就会报错。
- 字段之间用空格或 Tab 分隔。我习惯用 Tab,因为对齐后看起来更舒服。
- 不要用相对路径。挂载点必须用绝对路径,比如
/data而不是data。 - 根分区必须存在且正确。如果根分区写错了,系统连 emergency mode 都进不去。
- 修改后先测试。用
mount -a命令测试所有挂载条目是否正确。
mount -a 测试。如果测试失败,系统启动时也会失败。我曾经见过有人改完 fstab 直接重启,结果系统起不来了,只能进救援模式修复。
2.4 常见错误写法
下面这些错误,我几乎每个月都能在论坛或群里看到有人问。你提前了解一下,以后就能避开这些坑。
错误 1:字段数不对
UUID=1234-5678 /data ext4 defaults 0
少了一个字段(pass)。系统会报错:invalid fstab entry。
错误 2:挂载点目录不存在
UUID=1234-5678 /mydata ext4 defaults 0 2
如果 /mydata 目录不存在,挂载会失败。记得先 mkdir /mydata。
错误 3:UUID 写错
UUID=1234-5679 / ext4 defaults 0 1
UUID 多写或少写一个字符,系统就找不到设备。用 blkid 确认 UUID 后再写。
错误 4:选项中有空格
UUID=1234-5678 /data ext4 defaults, noatime 0 2
选项之间不能用空格,只能用逗号。正确写法是 defaults,noatime。
错误 5:交换分区写错
/dev/sda2 swap swap defaults 0 0
交换分区的挂载点必须是 none,类型必须是 swap。如果写错了,系统不会报错,但交换分区不会启用。
2.5 知识体系结构图
下面这张图帮你理清 fstab 的整体脉络:
2.6 实战测试技巧
修改 fstab 后,别急着重启。先用下面几个命令测试:
# 测试所有挂载条目
mount -a
# 查看当前挂载情况
mount | grep -E "^/dev|^UUID"
# 查看 fstab 语法是否正确
findmnt --verify
mount -a 会尝试挂载 fstab 中所有标记为 auto 的设备。如果报错,说明有配置问题,赶紧修。等确认无误后再重启。
好了,fstab 的六个字段、配置规则和常见错误,咱们都过了一遍。说白了,这个文件就是个「挂载说明书」,告诉系统怎么挂载每个分区。只要记住每个字段的含义,写的时候细心一点,基本不会出问题。
下一节咱们会讲如何用 mount -a 和 findmnt 来验证配置,以及当系统因为 fstab 错误卡在 emergency mode 时,该怎么一步步修复。到时候我会分享几个我亲身经历的故障案例,保证让你印象深刻。