/etc/fstab 文件详解:文件格式、各字段含义、挂载选项、常见配置示例

说到启动挂载,/etc/fstab 绝对是绕不开的核心文件。我经常跟团队里的新人说,这个文件就是 Linux 的「挂载地图」。系统启动时,内核读完根文件系统后,就会来找这张地图,按图索骥把剩下的分区都挂上。

嗯,咱们今天就把这张地图彻底拆开看看。

文件格式:一行一个挂载点

/etc/fstab 的格式其实很简单。每一行代表一个挂载条目,用空格或制表符分隔字段。空行和以 # 开头的行会被忽略——这是写注释的好地方。

一个典型的条目长这样:

# <file system>  <mount point>  <type>  <options>  <dump>  <pass>
/dev/sda1         /boot         ext4    defaults    0       2

一共六个字段,少一个都不行。我见过有人漏写最后一个字段,结果系统启动时直接报错挂起——那场面,挺尴尬的。

六个字段,逐个拆解

第一字段:设备标识

这里写你要挂载的设备。有三种写法:

  • 设备路径:比如 /dev/sda1。简单直观,但有个坑——设备名可能变。比如你加了块硬盘,原来的 /dev/sdb1 可能变成 /dev/sdc1。我在生产环境遇到过,重启后系统直接进救援模式,就是因为这个。
  • UUID:比如 UUID=3f6f9b4e-...-...。这是最推荐的方式。UUID 是硬盘分区的唯一标识,不会变。我个人习惯,新装系统一律用 UUID。
  • LABEL:比如 LABEL=MYDATA。适合自己玩的环境,但标签容易重复,生产环境慎用。
我的建议:生产环境一律用 UUID。用 blkid 命令可以查到所有分区的 UUID,很方便。

第二字段:挂载点

就是你要把设备挂到哪个目录下。比如 /、/boot、/home。注意,挂载点必须存在,否则挂载会失败。我曾经手滑写了个不存在的目录,结果那个分区就没挂上,数据倒是没丢,但服务全挂了。

第三字段:文件系统类型

常见的包括 ext4、xfs、btrfs、swap、ntfs 等。如果你不确定,可以写 auto,让系统自动检测。但说实话,我很少用 auto——明确指定类型更可靠,也更快。

第四字段:挂载选项

这是最灵活、也最容易出错的字段。多个选项用逗号分隔,不能有空格。常用的有:

选项 含义 我的经验
defaults 默认选项(rw, suid, dev, exec, auto, nouser, async) 大部分场景够用,但别盲目用
rw / ro 读写 / 只读 系统盘用 rw,备份盘有时用 ro 更安全
noexec 禁止执行二进制文件 挂载 /tmp 时我必加这个,安全
nosuid 忽略 suid 和 sgid 位 挂载外部存储时建议加上
nodev 不解析设备文件 挂载 /home 时我习惯加上
noatime 不更新访问时间 提升性能,尤其是数据库服务器
注意:defaults 包含 auto,意味着系统启动时会自动挂载。如果你不想自动挂载,用 noauto。我见过有人把移动硬盘写进 fstab 还用了 defaults,结果开机时硬盘没插,系统卡在挂载那一步——嗯,那画面太美。

第五字段:dump 备份标记

这个字段现在基本废弃了。写 0 就行。只有极少数老系统还用 dump 命令做备份,才会用到这个字段。我工作这么多年,从没见人用过。

第六字段:fsck 检查顺序

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

  • 0:不检查
  • 1:最先检查(通常只给根文件系统)
  • 2:其次检查(其他分区)

根分区必须设成 1,其他分区设 2。如果你把根分区设成 0,系统启动时不会检查根文件系统——万一有坏道,你可能很久之后才发现。我曾经接手过一台服务器,根分区设了 0,结果跑了一年多,坏道越来越多,最后系统直接崩了。

常见配置示例

光说不练假把式。我列几个实际项目中用过的配置:

1. 标准 Linux 系统

UUID=abc123... /       ext4    defaults,noatime    0 1
UUID=def456... /boot   ext4    defaults            0 2
UUID=ghi789... /home   ext4    defaults,nodev      0 2
UUID=jkl012... swap    swap    defaults            0 0

根分区加了 noatime,减少磁盘写入,提升性能。/home 加了 nodev,防止普通用户创建设备文件。

2. 挂载 Windows 共享(CIFS)

//192.168.1.100/share  /mnt/share  cifs  username=user,password=pass,iocharset=utf8,file_mode=0755,dir_mode=0755  0 0
安全提醒:把密码明文写在 fstab 里不安全。我一般用 credentials=/etc/smb-credentials,把用户名密码单独放一个文件,权限设成 600。

3. 挂载 ISO 镜像

/path/to/image.iso  /mnt/iso  iso9660  loop,defaults  0 0

注意那个 loop 选项,它告诉内核要用 loop 设备来挂载镜像文件。我第一次用的时候忘了加,结果挂载失败,还以为是镜像坏了。

知识体系结构图

下面这张图,是我梳理的 fstab 知识结构。你看一眼,心里就有谱了。

/etc/fstab 设备标识 挂载点 文件系统类型 挂载选项 dump 标记 fsck 顺序 defaults rw / ro noexec nosuid nodev noatime auto / noauto 修改 fstab 后,用 mount -a 测试,别直接重启 出错了还能救,重启了就只能进救援模式了

避坑指南

最后,分享几个我踩过的坑:

  • 修改后一定要测试:用 mount -a 命令模拟挂载所有条目。如果报错,当场就能改。别直接重启,否则你可能连系统都进不去。
  • 备份原文件:改之前 cp /etc/fstab /etc/fstab.bak。这是基本操作,但我见过太多人省略这一步。
  • 注意换行符:Windows 下编辑过的文件会带 \r\n,Linux 只认 \n。我曾经帮同事排查过一个诡异的问题——fstab 看起来完全正确,但就是报错。最后发现是换行符搞的鬼。
  • 网络文件系统要加 _netdev:如果你挂载 NFS 或 CIFS,记得在选项里加 _netdev。这样系统会等网络就绪后再挂载,否则启动时网络还没起来,挂载必然失败。

好了,fstab 的内容就这些。说白了,它就是一张表,六个字段,搞清楚每个字段的含义和常见取值,你就能驾驭它。下次遇到启动挂载失败,先检查 fstab——八成问题出在这里。

可可精品资料库