浅析 fstab 与移动硬盘挂载方法

本文转自 Steins;Lab,非常详细地介绍了树莓派上 fstab 的配置项。

近期自己的Raspberry Pi出了点问题,总结总结便有了这篇文章。

本文首先记录“移动硬盘挂载”实际发生的问题,然后浅析了fstab这一重要配置文件和使用,最后总结了Raspberry Pi上自动挂载移动硬盘的方法。本文主要基于Raspberry Pi和Raspbian描述问题,当然它也广泛适用于各Linux发行版环境中 ; )。

1 问题描述和解决

之前,我的一块Raspberry Pi作为一个简单的NAS,通过 fstab 文件实现了开机自动挂载移动硬盘。

根据网上别人嚼过的东西,没有深究。fstab如下:

proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,noatime 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

使用UUID作为标识挂载了一块NTFS的移动硬盘,参数为 defaults,noatime ,一直以来相安无事。

直至,我把移动硬盘拔掉后开机,无法正常引导进入系统。

我一度以为是我经常暴力关机导致tf卡文件系统损坏。连上显示器和键盘救援一下,boot过程在

[** ]A start job is running for dev-disk-by\x2duuid-XXXXXXXX.device (xx s / 1min 30s)

随即进入emergency mode。大致知道原因了:未找到fstab中指定的硬盘

根据Archlinux wiki,若要将其设置为可忽略,可添加 nofail 选项[1]:

外部设备在插入时挂载,在未插入时忽略。这需要 nofail 选项,可以在启动时若设备不存在直接忽略它而不报错. /etc/fstab /dev/sdg1 /media/backup jfs defaults,nofail 0 2 External devices that are to be mounted when present but ignored if absent may require the nofail option. This prevents errors being reported at boot. For example: /etc/fstab /dev/sdg1 /media/backup jfs nofail,x-systemd.device-timeout=1 0 2 The nofail option is best combined with the x-systemd.device-timeout option. This is because the default device timeout is 90 seconds, so a disconnected external device with only nofail will make your boot take 90 seconds longer, unless you reconfigure the timeout as shown. Make sure not to set the timeout to 0, as this translates to infinite timeout. If your external device requires another systemd unit to be loaded (for example the network for a network share) you can use x-systemd.requires=x combined with x-systemd.automount to postpone automounting until after the unit is available. For example: /etc/fstab //host/share /net/share cifs noauto,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10,workgroup=workgroup,credentials=/foo/credentials 0 0

综合参考[2],我最终的fstab文件如下:

proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,nofail,x-systemd.device-timeout=1,noatime 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

即使boot阶段没有接入移动硬盘,也能正常启动。

2 fstab

fstab文件可以被用来定义磁盘分区,各种其他块设备,或远程文件系统应如何安装到文件系统。

每个文件系统都在一个单独的行中描述。这些定义将在引导时动态转换为systemd安装单元,并在重新加载系统管理器的配置时。

在第一节中可以看到典型的fstab结构。

2.1 手册和wiki

关于fstab,wiki上已经写得非常清晰了,参考链接如下:

https://help.ubuntu.com/community/Fstab

http://manpages.ubuntu.com/manpages/bionic/en/man5/fstab.5.html

https://wiki.archlinux.org/index.php/Fstab

其中,ArchLinux Wiki中给出了一些针对各类场景的fstab使用技巧,如果你正遇到某些问题,不妨一读:

2.2 理解

各类参数解释在上wiki中已经详细给出,能搜到的博文有许许多多。这里是我的一些理解和总结:

fstab 的作用是定义磁盘分区,也可定义其他block设备和远程文件系统。它所做出的指定,会在系统引导时挂载。

mount 命令和 fstab 也是有关系的。当 mount 参数给出一个时,剩余的参数会在 fstab 中查找[3]。

这也就意味着,除非指定某些选项,否则 /etc/fstab 在启动时和使用 mount -a 时,将自动挂载所有指定的设备。这时,若其中设备不存在将导致错误。这时需要用到的选项有 noauto , nofail 。

2.3 参数归纳

一个典型的fstab结构如下:

#

/dev/sda1 / ext4 noatime 0 1 /dev/sda2 none swap defaults 0 0 /dev/sda3 /home ext4 noatime 0 2

每一行由以下参数组成

描述了要安装的块特殊设备或远程文件系统; 请参阅#Identifying filesystems。

描述了要安装的块特殊设备或远程文件系统; 请参阅#Identifying filesystems。

介绍了安装目录, 该文件系统类型,以及 相关的安装选项; 见 和 。

介绍了安装目录, 该文件系统类型,以及 相关的安装选项; 见 和 。 由 实用程序检查。此字段通常设置为 0 ,禁用检查。

由 实用程序检查。此字段通常设置为 ,禁用检查。 设置启动时文件系统检查的顺序; 见 。对于根设备应该是 1 。对于其他分区应该是 2 ,或 0 禁用检查。

options常用参数类型:

auto – 在启动时或键入了 mount -a 命令时自动挂载。

– 在启动时或键入了 命令时自动挂载。 noauto – 只在你的命令下被挂载。

– 只在你的命令下被挂载。 exec – 允许执行此分区的二进制文件。

– 允许执行此分区的二进制文件。 noexec – 不允许执行此文件系统上的二进制文件。

– 不允许执行此文件系统上的二进制文件。 ro – 以只读模式挂载文件系统。

– 以只读模式挂载文件系统。 rw – 以读写模式挂载文件系统。

– 以读写模式挂载文件系统。 user – 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec , nosuid , nodev 参数。

– 允许任意用户挂载此文件系统,若无显示定义,隐含启用 , , 参数。 users – 允许所有 users 组中的用户挂载文件系统.

– 允许所有 users 组中的用户挂载文件系统. nouser – 只能被 root 挂载。

– 只能被 root 挂载。 owner – 允许设备所有者挂载.

– 允许设备所有者挂载. sync – I/O 同步进行。

– I/O 同步进行。 async – I/O 异步进行。

– I/O 异步进行。 dev – 解析文件系统上的块特殊设备。

– 解析文件系统上的块特殊设备。 nodev – 不解析文件系统上的块特殊设备。

– 不解析文件系统上的块特殊设备。 suid – 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。

– 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。 nosuid – 禁止 suid 操作和设定 sgid 位。

– 禁止 suid 操作和设定 sgid 位。 noatime – 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。

– 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。 nodiratime – 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。

– 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。 relatime – 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。

– 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。 flush – vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。

– 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。 defaults – 使用文件系统的默认挂载参数,例如 ext4 的默认参数为: rw , suid , dev , exec , auto , nouser , async .

3 Desktop Environment的自动挂载

实际使用Raspbian桌面版的同学们可能发现了,在PIXEL(LXDE)桌面环境中,即使我们没有设置 fstab ,插入usb存储设备后,它将自动被挂载到 /media//

这个功能我们在Linux各个发行版的桌面版本都用到过。自动挂载对于桌面用户,非常友好。通常由GUI/DE协同处理[4]。对于Raspbian来说,在PIXEL自带的PCManFM文件管理器中,对自动挂载usb存储设备的设置选项如下:

有趣的是,我曾经分别以root和pi的账户开启了2个PIXEL桌面。此时插入USB存储介质时,某一个桌面就会显示挂载冲突。这也使我开始意识到自动挂载是由GUI/DE操作的。

若你的Raspberry Pi作为远端服务器设备,也在运行桌面版,不妨使用Desktop Environment作为你的工具帮你实现自动挂载。

参考资料

[1] Archlinux Wiki – Fstab https://wiki.archlinux.org/index.php/Fstab

[2] How to setup mount / auto-mount USB Hard Drive on Raspberry Pi https://gist.github.com/etes/aa76a6e9c80579872e5f

[3] mount(8) – debian wiki https://manpages.debian.org/jessie/mount/mount.8.en.html

[4] Stock Pi3 – what process is auto-mounting removable media? https://raspberrypi.stackexchange.com/questions/65739/stock-pi3-what-process-is-auto-mounting-removable-media