fstabfile system table 的缩写,即文件系统表

它是一个纯文本文件,位于 /etc/fstab。它的主要作用是记录系统在启动时需要自动挂载的文件系统

每当系统启动时,initsystemd 都会读取 /etc/fstab 文件的内容,并按照其中定义的规则,自动将硬盘分区、网络文件系统或其它存储设备挂载到指定的目录。/etc/fstabLinux/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 表示不备份,12 表示要备份。0 , 1 或 2
pass自检设置是否在启动时检查文件系统错误。0 表示不检查0 , 1
1
2
3
4
5
6
7
/etc$ grep -v '^#' fstab 
UUID=ca7701f3-3ce6-4a87-b393-b3b576426cbe / ext4 errors=remount-ro 0 1
UUID=E779-DF02 /boot/efi vfat umask=0077 0 1 # umask=0077 安全设置,确保只有 root 用户可以修改 /boot/efi 目录下的文件,防止恶意程序或普通用户篡改引导文件。
UUID=7f46a644-f860-4ff1-8838-8160070d1991 none swap sw 0 0
UUID=a604497d-ea81-415c-8e85-d319cef9ee1a /home ext4 defaults 0 2
/dev/sdc /mnt/sdc auto nosuid,nodev,nofail,noauto,x-gvfs-show 0 0
# x-gvfs-show: 这是一个特定于 GNOME 等桌面环境的选项,它告诉文件管理器(如 Nautilus)在侧边栏显示这个设备。
  • errors=remount-ro: 这是挂载选项。它的意思是,如果文件系统在运行过程中出现了I/O 错误,内核会立即将文件系统从读写模式(rw)切换到只读模式ro),以防止数据损坏。这是一个重要的保护机制。

  • 0: 这是 dump 字段。0 表示不使用 dump 工具进行备份。

  • 1: 这是 pass 字段。1 表示系统在启动时会使用 fsck 工具来检查这个文件系统的错误。1 通常只用于根文件系统,因为它必须在其他所有文件系统之前被检查。

最后一行:使用设备名来标识,用于配置非关键的、可移动的设备。它使用了 nofailnoauto 等选项,以确保在设备未连接时系统也能正常启动,并且由用户手动挂载。

各字段详解

文件系统 (device/UUID/LABEL)

  • /dev/sda1 → 按设备名(不推荐,拔插顺序会变)设备名在系统重启后可能会改变。
  • UUID=xxxx-xxxx → 推荐,稳定唯一,可以用lsblk -fblkid查看。
  • LABEL=MyDisk → 磁盘标签,给文件系统可以设置一个卷标,通过标LABEL=label_name引用
  • tmpfsproc → 虚拟文件系统
  • server:/share → NFS 挂载

UUID 的生成是一个随机且唯一的数学过程,与设备的物理特性(如序列号)没有直接关系。现代 Linux 系统和文件系统工具(如 mke2fsmkfs.xfs)在创建文件系统时,通常使用 UUID v4 的算法。UUID v4 的生成完全依赖于伪随机数,这意味着它与时间戳或 MAC 地址都无关,完全是随机生成的。

1
2
# 有 clear、random、time 三种特殊模式。
tune2fs -U <UUID|clear|random|time> /dev/sdXN
1
2
3
4
5
6
7
8
# 指定UUID
tune2fs -U c1b9d5a2-f162-11cf-9ece-0020afc76f16 /dev/sda1
# 清除UUID(很少用)
tune2fs -U clear /dev/sda1
# 生成一个全新随机UUID
tune2fs -U random /dev/sda1
# 用基于时间的算法生成 UUID(当系统缺少随机数设备时)。
tune2fs -U time /dev/sda1
  • 使用 tune2fs 命令:对于 ext2/3/4 文件系统,你可以使用 tune2fs 命令来修改它的 UUID。

  • 使用 xfs_admin 命令:对于 xfs 文件系统,你可以使用 xfs_admin 命令。

1
2
3
4
5
6
7
8
9
# 随机生成一个新的 UUID
sudo tune2fs -U random /dev/sdb1
# 或者,手动指定一个新的 UUID
sudo tune2fs -U "新的UUID" /dev/sdb1

# 随机生成一个新的 UUID
sudo xfs_admin -U generate /dev/sdb1
# 或者,手动指定一个新的 UUID
sudo xfs_admin -U "新的UUID" /dev/sdb1

⚠️ 修改 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 TRIM
  • x-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
2
3
4
lsblk -f               # 找到 UUID
mkfs.ext4 /dev/sdb1 # 格式化
mkdir /data
vi /etc/fstab

添加:

1
UUID=1234-ABCD  /data  ext4  defaults,noatime  0  2

然后:

1
2
3
mount -a               # 测试是否能挂载成功
# 用 df -h 命令确认是否成功挂载
df -h

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 系统上,你可以通过在启动时修改内核参数来进入紧急模式。

  1. 重启系统。
  2. 在 GRUB 引导界面,按下 e 键进入编辑模式。
  3. 找到包含 linux 的那一行,通常在末尾加上 systemd.unit=emergency.targetemergency
  4. 按下 Ctrl+XF10 启动。

系统会进入一个极简的命令行界面,并给你一个 root 权限的 shell。此时,你的根文件系统通常是只读的。

修复fstab文件:

1
2
3
4
5
6
7
# 重新挂载根文件系统为可写
mount -o remount,rw /
# 编辑 fstab 文件
vi /etc/fstab
# 重新挂载
mount -a
reboot
  • 推荐用 nofail 选项
    即使挂载失败也不影响启动:

    如果你在启动时没有插入这个 USB 设备,系统会顺利启动,而不会因为找不到设备而卡住。

    1
    UUID=xxxx-xxxx  /mnt/usb  ext4  defaults,nofail  0  0
  • 只在启动时挂载
    使用 noauto,不会 mount -a 自动挂载。

这对于那些需要用户手动挂载的设备非常有用,比如你只有在需要时才插入的 U 盘。

1
2
3
UUID=xxxx-xxxx  /mnt/archive  ext4  defaults,noauto  0  0
# 这个存档硬盘在启动时不会被自动挂载。如果你需要访问它,只需要:
mount /mnt/archive
  • 使用 x-systemd.automount

当你使用 x-systemd.automount 选项后,systemd 在系统启动时不会立即挂载文件系统。相反,它会:

  1. 创建一个挂载点(Mount Point):在指定的目录下创建一个占位符。
  2. 监听访问:当有程序或用户第一次尝试访问这个目录时,systemd 会立即在后台自动挂载文件系统。

这个过程对用户来说是完全透明的,你感觉不到任何延迟,但它只在需要时才进行挂载。

主要优势:

加快启动速度:系统启动时不需要等待所有文件系统都准备就绪。这对于挂载网络文件系统(NFS、CIFS)或外部硬盘特别有用,因为这些设备可能在启动时不可用或需要较长时间才能连接。

节省系统资源:未挂载的文件系统不占用系统资源。如果你的服务器连接了多个不常用的网络存储,这个选项可以显著减少资源消耗。

提高系统可靠性:如果一个设备在启动时不可用,使用 x-systemd.automount 会让系统正常启动,而不会因挂载失败而进入紧急模式。

1
2
# 设备                 挂载点                文件系统类型  选项                                       备份 检查
/dev/sdb1 /mnt/data ext4 defaults,x-systemd.automount,noauto,x-systemd.idle-timeout=120 0 0
  • 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

  1. 手动获取 UUID:使用 lsblk -fsudo blkid 命令,手动获取新硬盘分区的 UUID。
  2. **手动编辑 fstab**:使用 vimnano 等编辑器,手动向 /etc/fstab 文件中添加新的一行。
  3. 使用 mount -a 验证:在重启前,使用 sudo mount -a 命令来验证你的新配置是否正确,确保没有语法错误,也没有设备找不到的问题。

这种手动方式虽然需要多几步,但它能让你完全掌控配置,避免因自动化工具的局限性而导致的问题。

✅ 总结:

  • /etc/fstab 是 Linux 挂载策略的核心配置
  • UUID 挂载更可靠。
  • 熟练掌握 options 能提升 性能noatimediscard)、安全性nosuid,noexec)。
  • 搭配 nofailx-systemd.automount 可以增强稳定性。