/etc/fstab 文件详解:字段含义、挂载选项、文件系统标识符

说起 /etc/fstab,我估计不少运维朋友都跟它打过交道。这文件看着简单,就几行文本,但系统启动时能不能顺利挂载磁盘,全看它配得对不对。我遇到过好几次线上事故,都是因为 fstab 写错了,导致服务器重启后起不来。嗯,今天咱们就把这个文件彻底讲透。

fstab 文件长什么样?

先看一个典型的例子:

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=abc123-...  /               ext4    defaults        0       1
UUID=def456-...  /boot           ext4    defaults        0       2
UUID=ghi789-...  /data           xfs     defaults        0       0
/dev/sdb1        /backup         ext4    noexec,nodev    0       0
192.168.1.100:/nfs  /mnt/nfs    nfs4    defaults        0       0

每一行代表一个挂载项,一共 6 个字段,用空格或 Tab 隔开。少了任何一个字段,系统启动时就会报错。我当年刚入行时,就犯过少写 pass 字段的错,结果 fsck 顺序全乱了。

六个字段,逐个拆解

字段位置 字段名 含义 常见值
1 file system 要挂载的设备或文件系统标识 UUID、LABEL、设备路径、网络路径
2 mount point 挂载点目录 /、/boot、/data
3 type 文件系统类型 ext4、xfs、nfs4、swap
4 options 挂载选项 defaults、noexec、ro
5 dump 是否备份(0 或 1) 通常填 0
6 pass fsck 检查顺序(0、1、2) 根分区填 1,其他填 2

字段 1:文件系统标识符

这是最容易出问题的地方。系统怎么找到你要挂载的磁盘?有三种方式:

  • UUID:全球唯一标识符。我最推荐这种方式。磁盘换了接口位置,UUID 不变,系统照样能找到。用 blkid 命令就能查到。
  • LABEL:给磁盘打个标签。比如 LABEL=DATA。方便记忆,但标签不能重复。
  • 设备路径:比如 /dev/sda1。简单直接,但路径会变。插拔硬盘或换了内核,sda 可能变成 sdb。我个人不太建议在生产环境用这个。

我的习惯:新装系统一律用 UUID。用 blkid /dev/sda1 拿到 UUID,然后写到 fstab 里。这样不管磁盘怎么插拔,系统启动时都能找到它。

字段 2:挂载点

就是你要把磁盘挂到哪个目录。注意:这个目录必须存在。如果目录不存在,系统启动时会挂载失败。我见过有人把 /data 写成了 /data/,多了一个斜杠,结果挂不上。嗯,细节决定成败。

字段 3:文件系统类型

告诉内核用哪个驱动来读这个分区。常见的有:

  • ext4:Linux 最常用的文件系统
  • xfs:大文件、高并发场景常用
  • nfs4:网络文件系统
  • swap:交换分区
  • auto:让系统自动检测。不推荐,因为启动时可能会猜错

字段 4:挂载选项

这个字段最灵活,也最容易踩坑。常用的选项有:

选项 含义 使用场景
defaults 默认选项(rw, suid, dev, exec, auto, nouser, async) 大多数场景
ro 只读挂载 备份盘、安全加固
noexec 禁止执行二进制文件 /tmp、/var/tmp 防攻击
nodev 不解析设备文件 普通数据盘
nosuid 忽略 suid 和 sgid 位 安全敏感目录
noatime 不更新访问时间 提升性能,减少磁盘写
nofail 设备不存在时不报错 可移动设备、网络盘

我曾经踩过的坑:给 /tmp 分区配了 defaults,结果被人上传了恶意脚本直接执行。后来我改成 noexec,nodev,nosuid,安全多了。记住:/tmp 和 /var/tmp 一定要加 noexec。

字段 5:dump 备份

这个字段现在基本没人用了。填 0 就行。dump 是个老古董备份工具,现在谁还用啊?

字段 6:pass fsck 检查顺序

系统启动时,会用 fsck 检查文件系统完整性。这个字段控制检查顺序:

  • 0:不检查
  • 1:最先检查(只有根分区用这个)
  • 2:其次检查(其他分区)

注意:只有 ext 系列文件系统才支持 fsck。xfs 有自己的 xfs_repair,但 fstab 里 pass 字段对 xfs 无效。我见过有人给 xfs 分区配了 pass=2,结果启动时 fsck 报错,其实没必要。

挂载选项的优先级

你可能会问:选项写多了会不会冲突?会。优先级是这样的:

  1. 命令行选项(mount -o noexec)优先级最高
  2. fstab 选项次之
  3. 文件系统默认选项最低

举个例子:fstab 里写了 defaults,但你用 mount -o ro /dev/sda1 /mnt,最终生效的是 ro。说白了,命令行覆盖 fstab,fstab 覆盖内核默认值。

文件系统标识符详解

这部分我多说几句。标识符选错了,系统启动就卡在 Waiting for /dev/sda1 那里,急死人。

UUID

用 blkid 查看:

# blkid /dev/sda1
/dev/sda1: UUID="a1b2c3d4-..." TYPE="ext4"

UUID 是 128 位的随机数,几乎不会重复。磁盘换了机器、换了接口,UUID 不变。所以生产环境我强烈推荐用 UUID。

LABEL

给磁盘打个标签:

# e2label /dev/sda1 MYDATA
# blkid /dev/sda1
/dev/sda1: LABEL="MYDATA" UUID="..." TYPE="ext4"

然后在 fstab 里写 LABEL=MYDATA。方便是方便,但要注意:同一台机器上标签不能重复。我见过有人把两块盘都标成 DATA,结果挂载时只挂上了最后一块。

设备路径

就是 /dev/sda1、/dev/nvme0n1p1 这种。简单粗暴,但不可靠。为什么?因为 Linux 内核枚举设备的顺序不一定固定。插了 U 盘再重启,sda 可能变成 sdb。你想想看,生产服务器重启后起不来,就因为 sda 变成了 sdb,冤不冤?

我的建议:

  • 根分区、系统分区:用 UUID
  • 数据盘:用 UUID 或 LABEL
  • 网络存储(NFS、iSCSI):用 IP 或域名
  • 临时挂载、测试环境:可以用设备路径

知识体系图

下面这张图把 fstab 的核心逻辑串起来了:

/etc/fstab 核心知识体系 /etc/fstab 核心知识体系 /etc/fstab 字段1: 设备标识 字段2: 挂载点 字段3: 文件系统 字段4: 选项 字段5: dump 字段6: pass UUID LABEL 设备路径 defaults noexec nofail ⚠ 生产环境推荐使用 UUID,避免设备路径变化导致启动失败 挂载选项优先级:命令行 > fstab > 文件系统默认值

实战:如何正确编写 fstab

说了这么多,咱们来写一个靠谱的 fstab。假设我有两块盘:

  • /dev/sda:系统盘,分两个区 sda1(/boot)和 sda2(/)
  • /dev/sdb:数据盘,一个分区 sdb1,挂到 /data

第一步,查 UUID:

# blkid
/dev/sda1: UUID="1111-AAAA" TYPE="ext4"
/dev/sda2: UUID="2222-BBBB" TYPE="ext4"
/dev/sdb1: UUID="3333-CCCC" TYPE="xfs"

第二步,写 fstab:

UUID=1111-AAAA  /boot   ext4  defaults        0  2
UUID=2222-BBBB  /       ext4  defaults        0  1
UUID=3333-CCCC  /data   xfs   defaults,nofail 0  0

注意几个细节:

  • 根分区 pass=1,先检查
  • /boot 分区 pass=2,后检查
  • 数据盘加了 nofail,万一磁盘坏了,系统还能正常启动
  • xfs 分区 pass=0,因为 fsck 对 xfs 无效

小技巧:写完 fstab 后,先执行 mount -a 测试一下。这个命令会读取 fstab 并尝试挂载所有未挂载的分区。如果报错,说明 fstab 有问题,赶紧改。别等到重启才发现。

常见错误与排查

我总结几个最常见的 fstab 错误:

  • UUID 写错:多一个字母或少一个横杠,系统就找不到设备。用 blkid 核对。
  • 挂载点不存在:系统启动时不会自动创建目录。手动 mkdir 创建。
  • 文件系统类型写错:比如把 xfs 写成了 ext4。用 blkid 查看实际类型。
  • 选项冲突:比如同时写了 ro 和 rw,后面的覆盖前面的。
  • 缺少 nofail:网络盘或可移动设备没加 nofail,设备不在时系统启动卡住。

我曾经遇到的事故:有一次给 NFS 挂载配了 fstab,但没加 nofail。结果 NFS 服务器宕机了,客户端重启时一直等 NFS 响应,等了 90 秒超时后才继续启动。90 秒啊,线上服务都凉透了。从那以后,所有网络挂载我都加 nofail,而且配上 _netdev 选项,告诉系统等网络就绪后再挂载。

好了,fstab 的核心内容就这些。记住:写 fstab 时多用 UUID,少用设备路径;关键分区加 nofail;写完用 mount -a 测试。做到这三点,启动挂载问题能少一半。