fstab
fstab
是 file system table 的缩写,即文件系统表。
它是一个纯文本文件,位于 /etc/fstab
。它的主要作用是记录系统在启动时需要自动挂载的文件系统。
每当系统启动时,init
或 systemd
都会读取 /etc/fstab
文件的内容,并按照其中定义的规则,自动将硬盘分区、网络文件系统或其它存储设备挂载到指定的目录。/etc/fstab
是 Linux/Unix 系统的文件系统静态信息表,它决定了系统启动时如何挂载分区、设备、远程文件系统。
- 定义 设备 → 挂载点 → 文件系统类型 → 挂载选项。
- 可以控制:
- 磁盘分区挂载
- 网络文件系统(NFS、CIFS、GlusterFS 等)
- 伪文件系统(tmpfs、proc、sysfs 等)
- 特殊挂载(swap、UUID 绑定)
fstab 文件格式
fstab
文件中的每一行都代表一个需要挂载的文件系统,并且由六个字段组成。每个字段之间用空格或 Tab 键分隔。
1 | <device> <mount point> <fs_type> <options> <dump> <pass> |
字段 | 名称 | 作用 | 示例值 |
---|---|---|---|
device | 要挂载的设备或分区 | 指定要挂载的磁盘设备或分区 | /dev/sdb1, UUID=… |
mount point | 挂载点 | 设备要挂载到的目录 | /data, /home |
fs_type | 文件系统类型 | 指定分区使用的文件系统类型 | ext4, xfs, ntfs, swap |
options | 挂载选项 | 控制挂载行为的参数 | defaults, noatime, ro |
dump | 备份设置 | 是否备份。0 表示不备份,1 或 2 表示要备份。 | 0 , 1 或 2 |
pass | 自检设置 | 是否在启动时检查文件系统错误。0 表示不检查 | 0 , 1 |
1 | /etc$ grep -v '^#' fstab |
errors=remount-ro
: 这是挂载选项。它的意思是,如果文件系统在运行过程中出现了I/O 错误,内核会立即将文件系统从读写模式(rw
)切换到只读模式(ro
),以防止数据损坏。这是一个重要的保护机制。0
: 这是dump
字段。0
表示不使用dump
工具进行备份。1
: 这是pass
字段。1
表示系统在启动时会使用fsck
工具来检查这个文件系统的错误。1
通常只用于根文件系统,因为它必须在其他所有文件系统之前被检查。
最后一行:使用设备名来标识,用于配置非关键的、可移动的设备。它使用了 nofail
和 noauto
等选项,以确保在设备未连接时系统也能正常启动,并且由用户手动挂载。
各字段详解
文件系统 (device/UUID/LABEL)
/dev/sda1
→ 按设备名(不推荐,拔插顺序会变)设备名在系统重启后可能会改变。UUID=xxxx-xxxx
→ 推荐,稳定唯一,可以用lsblk -f
或blkid
查看。LABEL=MyDisk
→ 磁盘标签,给文件系统可以设置一个卷标,通过标LABEL=label_name
引用tmpfs
、proc
→ 虚拟文件系统server:/share
→ NFS 挂载
UUID 的生成是一个随机且唯一的数学过程,与设备的物理特性(如序列号)没有直接关系。现代 Linux 系统和文件系统工具(如 mke2fs
、mkfs.xfs
)在创建文件系统时,通常使用 UUID v4 的算法。UUID v4 的生成完全依赖于伪随机数,这意味着它与时间戳或 MAC 地址都无关,完全是随机生成的。
1 | # 有 clear、random、time 三种特殊模式。 |
1 | # 指定UUID |
使用
tune2fs
命令:对于ext2/3/4
文件系统,你可以使用tune2fs
命令来修改它的 UUID。使用
xfs_admin
命令:对于xfs
文件系统,你可以使用xfs_admin
命令。
1 | # 随机生成一个新的 UUID |
⚠️ 修改 UUID 后:
- 必须更新
/etc/fstab
或任何用到旧 UUID 的地方,否则系统可能无法启动或挂载出错。 - 一般不建议随便改 UUID,除非要复制/克隆磁盘,避免 UUID 冲突。
在修改 UUID 后,必须立即手动编辑 /etc/fstab
文件,将旧的 UUID 替换为新的。
如果只用来生成uuid,uuidgen
命令专门用于生成一个全新的 UUID,但它不会将其写入任何设备。
挂载点 (mount point)
- 挂载目录,例如
/
,/home
,/data
。 none
用于swap
等无挂载点的情况。
文件系统类型
常见类型:
- 本地磁盘:
ext4
,xfs
,btrfs
- 光盘:
iso9660
- 网络:
nfs
,cifs
- 特殊:
swap
,tmpfs
,proc
,sysfs
挂载选项 (options)
可用逗号分隔多个选项:
defaults
→ 相当于rw,suid,dev,exec,auto,nouser,async
,对于大多数情况,这个选项就够了ro
→ 只读rw
→ 可写noexec
→ 禁止执行二进制文件auto
:在启动时自动挂载(默认)。noauto
:只允许手动挂载(mount <mount_point>
)nosuid
→ 禁止 setuid 程序nodev
→ 不解析设备文件noatime
→ 不更新访问时间(提高性能)relatime
→ 只在修改时间改变时更新 atime(折中)user
/nouser
→ 是否允许普通用户挂载discard
→ 启用 SSD TRIMx-systemd.automount
→ 按需挂载(延迟挂载)x-systemd.requires=
→ 依赖某个 unit 才挂载
dump (0/1)
0
→ 不做dump
备份1
→ 允许dump
命令做备份(很少用)
dump
是一个老牌的 UNIX/Linux 工具,用来做 分区级别的备份(按文件系统块拷贝,不是按文件)。几乎 所有场景都设为 0,现代 Linux 已经很少使用 dump
了。更常见的备份工具是 rsync、tar、Borg、Restic、Duplicity 等。
fsck 检查顺序 (pass)
0
→ 不检查1
→ 根文件系统(/
)。它必须是第一个被检查的,所以根文件系统的pass
字段通常为1
2
→ 其他分区(按顺序并行检查)
实例
挂载一块新硬盘:
1 | lsblk -f # 找到 UUID |
添加:
1 | UUID=1234-ABCD /data ext4 defaults,noatime 0 2 |
然后:
1 | mount -a # 测试是否能挂载成功 |
tmpfs 提高编译速度
1 | tmpfs /tmp tmpfs size=2G,noatime 0 0 |
👉 /tmp
使用内存,读写极快,适合编译、缓存。
禁止 /home
执行二进制
1 | UUID=xxxx-xxxx /home ext4 defaults,nodev,nosuid,noexec 0 2 |
👉 提高安全性,防止用户执行恶意二进制。
自动挂载 Samba (Windows 共享)
1 | //192.168.1.10/share /mnt/share cifs username=foo,password=bar,iocharset=utf8 0 0 |
常见问题 & 排错
- 挂载失败导致无法启动:
→ 用systemd.unit=emergency.target
启动单用户模式,修复/etc/fstab
在大多数现代 Linux 系统上,你可以通过在启动时修改内核参数来进入紧急模式。
- 重启系统。
- 在 GRUB 引导界面,按下
e
键进入编辑模式。 - 找到包含
linux
的那一行,通常在末尾加上systemd.unit=emergency.target
或emergency
。 - 按下
Ctrl+X
或F10
启动。
系统会进入一个极简的命令行界面,并给你一个 root
权限的 shell。此时,你的根文件系统通常是只读的。
修复fstab
文件:
1 | # 重新挂载根文件系统为可写 |
推荐用
nofail
选项:
即使挂载失败也不影响启动:如果你在启动时没有插入这个 USB 设备,系统会顺利启动,而不会因为找不到设备而卡住。
1
UUID=xxxx-xxxx /mnt/usb ext4 defaults,nofail 0 0
只在启动时挂载:
使用noauto
,不会mount -a
自动挂载。
这对于那些需要用户手动挂载的设备非常有用,比如你只有在需要时才插入的 U 盘。
1 | UUID=xxxx-xxxx /mnt/archive ext4 defaults,noauto 0 0 |
- 使用
x-systemd.automount
当你使用 x-systemd.automount
选项后,systemd
在系统启动时不会立即挂载文件系统。相反,它会:
- 创建一个挂载点(Mount Point):在指定的目录下创建一个占位符。
- 监听访问:当有程序或用户第一次尝试访问这个目录时,
systemd
会立即在后台自动挂载文件系统。
这个过程对用户来说是完全透明的,你感觉不到任何延迟,但它只在需要时才进行挂载。
主要优势:
加快启动速度:系统启动时不需要等待所有文件系统都准备就绪。这对于挂载网络文件系统(NFS、CIFS)或外部硬盘特别有用,因为这些设备可能在启动时不可用或需要较长时间才能连接。
节省系统资源:未挂载的文件系统不占用系统资源。如果你的服务器连接了多个不常用的网络存储,这个选项可以显著减少资源消耗。
提高系统可靠性:如果一个设备在启动时不可用,使用 x-systemd.automount
会让系统正常启动,而不会因挂载失败而进入紧急模式。
1 | # 设备 挂载点 文件系统类型 选项 备份 检查 |
noauto
:这个选项非常重要,它告诉系统不要在启动时自动挂载。它必须和x-systemd.automount
一起使用。x-systemd.automount
:这个选项告诉systemd
创建一个自动挂载点。x-systemd.idle-timeout=120
:这个可选参数也很实用,它告诉systemd
,如果这个挂载点在 120 秒内没有被访问,就自动卸载文件系统。这可以帮助你保持系统整洁,释放资源。
在这个例子中,/mnt/data
目录在系统启动时只是一个占位符。只有当你访问 /mnt/data
目录时,/dev/sdb1
才会自动挂载。如果你在两分钟内没有再次访问它,系统会自动卸载它。
在 Linux 中,最常用于生成 fstab
文件内容的是 genfstab
命令,但通常不推荐直接在生产环境中使用。这个命令通常在进行 Linux 发行版安装时使用,例如在 Arch Linux 的安装教程中,它是一个关键步骤。
运维中的正确做法:
在日常的运维工作中,我通常会遵循以下步骤,而不是依赖 genfstab
:
- 手动获取 UUID:使用
lsblk -f
或sudo blkid
命令,手动获取新硬盘分区的 UUID。 - **手动编辑
fstab
**:使用vim
或nano
等编辑器,手动向/etc/fstab
文件中添加新的一行。 - 使用
mount -a
验证:在重启前,使用sudo mount -a
命令来验证你的新配置是否正确,确保没有语法错误,也没有设备找不到的问题。
这种手动方式虽然需要多几步,但它能让你完全掌控配置,避免因自动化工具的局限性而导致的问题。
✅ 总结:
/etc/fstab
是 Linux 挂载策略的核心配置。- 用
UUID
挂载更可靠。 - 熟练掌握
options
能提升 性能(noatime
、discard
)、安全性(nosuid
,noexec
)。 - 搭配
nofail
、x-systemd.automount
可以增强稳定性。