/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 报错,其实没必要。
挂载选项的优先级
你可能会问:选项写多了会不会冲突?会。优先级是这样的:
- 命令行选项(
mount -o noexec)优先级最高 - fstab 选项次之
- 文件系统默认选项最低
举个例子: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 的核心逻辑串起来了:
实战:如何正确编写 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 测试。做到这三点,启动挂载问题能少一半。