Linux fstab 配置与按需挂载

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
fstab挂载Linux

以前的挂载记录分成几类:根分区和 EFI 分区随系统启动,/tmp 使用 tmpfs,/swapfile 提供交换空间,额外的媒体盘挂到 /mnt/media。媒体盘的记录里同时有 ext4、xfs 和自动探测类型的写法,它们是不同配置方案,不能一起套到同一个挂载点。

下面沿着我当时的配置解释各字段和验证方法。磁盘 UUID 是设备标识,不是访问凭据,所以保留原值来对应不同的分区;在另一台机器操作时,用 lsblk -f 查到的 UUID 替换。

先确认设备,再改配置

lsblk -f
findmnt /mnt/media
sudo cp -a /etc/fstab /etc/fstab.before-media-change

备份命令应在修改前执行,已有同名备份时换一个名字保存。先核对设备类型和挂载位置,确认 /mnt/media 不承载正在使用的文件系统,再考虑新增条目。

设备名可能随发现顺序变化,UUID 更适合长期配置。util-linux 的 fstab 手册解释了 UUID=LABEL= 与六个字段的含义;路径中的空格需要写成 \040,即使路径加了引号也不能省略这个转义。

原来的几种条目

# <file system> <mount point> <type> <options> <dump> <pass>
UUID=d26d3e42-9b2b-4df0-a586-0d38967a0a07 / ext4 defaults,relatime 0 1
UUID=76A5-1345 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
tmpfs /tmp tmpfs nodev,nosuid 0 0
/swapfile none swap defaults 0 0
UUID=1cc00263-1b0b-410d-b38a-8df85a49fb3b /mnt/media auto defaults,noatime,nofail 0 0

这是条目说明,不是一份可以覆盖所有机器的 fstab。/boot 是否就是 EFI 分区,必须以本机布局为准。原记录的 vfat 编码和掩码选项也应按实际需要取舍。

第一列标识来源,第二列是挂载点,第三列是文件系统类型,第四列是逗号分隔的选项。swap 的第二列是例外:写 none,因为它不挂到目录里。第五列是 dump 备份标记,通常为 0;第六列控制启动时的文件系统检查,根文件系统常用 1,其他需要检查的本地文件系统用 20 表示跳过。不同文件系统的检查工具行为仍有差异。

relatimenoatime 影响访问时间更新;defaults 不是一套性能优化参数。媒体盘的 auto 会尝试探测类型,已经确定类型时可以明确写 ext4xfs。原记录还留有 xfs 方案:

UUID=MEDIA_UUID /mnt/media xfs defaults,noatime,nofail 0 0

fstab 不会自动创建 swap 文件,也不会替你格式化磁盘。新建 swap 需要单独完成分配、权限设置、mkswapswapon;已经在用的 swap 不要再次格式化。可以用 swapon --show 确认启用状态。将 tmpfs 挂到 /tmp 会遮住该目录原有内容,也会与已有 tmp.mount 等管理方式发生关系,应先检查当前配置。

媒体盘不常用时按需挂载

旧配置里出现过 noautox-systemd.automount。在 systemd 管理的系统上,可以采用下面的 ext4 例子:

UUID=2f572991-8c7d-4ae5-b096-5d9a43263f14 /mnt/media ext4 defaults,noauto,noatime,x-systemd.automount,x-systemd.device-timeout=3 0 2

systemd.mount 官方手册源码说明,x-systemd.automount 会生成按需挂载单元,访问目录时才触发实际挂载;使用这个选项时,autonoauto 不再决定是否启用该 automount 单元。x-systemd.device-timeout=3 限制等待设备出现的时间,不是整个文件系统挂载过程的总超时。

nofail 允许系统在这块非关键盘挂载失败时继续启动。它不保证访问目录时毫无等待,更不能保证依赖该目录的应用仍然正常。写入媒体盘的服务还要确认挂载已成功,避免把数据写进根分区上的空目录。

普通挂载和 automount 分开验证

保存 fstab 后先检查配置。只有验证没有错误时才继续挂载:

findmnt --verify --verbose
sudo systemctl daemon-reload

findmnt --verify 的手册说明将它定位为 fstab 的解析和可用性检查。检查成功不等于设备已经挂载,仍要核对实际状态。

对于普通数据盘条目,在目录未被其他文件系统占用时,只挂载本次修改的目标:

sudo mkdir -p /mnt/media
sudo mount /mnt/media
findmnt --mountpoint /mnt/media -o SOURCE,FSTYPE,OPTIONS,TARGET

mount -a 会尝试处理整个 fstab,检查单个新条目时没必要扩大范围。对于上面的 automount 方案,不先运行普通挂载命令,而是在设备尚未挂载、目录没有占用时执行:

sudo mkdir -p /mnt/media
sudo systemctl start mnt-media.automount
systemctl status mnt-media.automount --no-pager
ls /mnt/media
findmnt --mountpoint /mnt/media -o SOURCE,FSTYPE,OPTIONS,TARGET
systemctl status mnt-media.mount --no-pager

访问目录以后,应看到实际设备和文件系统,而不只是一个等待触发的 automount。mnt-media 来自 /mnt/media 路径,换挂载点时也要换对应的 unit 名称。这两组验证选择与配置相符的一组,不连续执行来冒充按需挂载测试。

配错后的恢复

还在正常系统内时,先停掉使用该目录的程序,注释新加的错误条目,重新检查并执行 daemon-reload。需要重试非关键媒体盘时,再停止对应 automount、卸载媒体盘;不要对根分区执行同样的操作,也不要直接强制卸载忙碌目录。

如果重启已经进入 emergency shell,可以从维护控制台修改 fstab;根文件系统只读时需要先按实际挂载状态恢复可写。也可以从救援系统挂载原根分区后编辑其中的 /etc/fstab。只有确认备份之后没有其他需要保留的修改,才用备份覆盖当前文件。原记录没有保存启动失败日志,这里说明的是恢复路径,不把它写成一次已经验证的故障修复。