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

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

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

1 问题描述和解决

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

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

1
2
3
4
5
6
7
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过程在

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

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

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

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

1
2
3
4
5
6
7
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结构如下:

1
2
3
4
# <device>             <dir>         <type><options>             <dump> <fsck>
/dev/sda1              /             ext4      noatime               0      1
/dev/sda2              none          swap      defaults              0      0
/dev/sda3              /home         ext4      noatime               0      2

每一行由以下参数组成 <device> <dir> <type> <options> <dump> <fsck>

  • <device>描述了要安装的块特殊设备或远程文件系统; 请参阅#Identifying filesystems
  • <dir>介绍了安装目录,<type>文件系统类型,以及<options>相关的安装选项; 见mount(8)ext4(5)
  • <dump>dump(8)实用程序检查。此字段通常设置为0,禁用检查。
  • <fsck>设置启动时文件系统检查的顺序; 见fsck(8)。对于根设备应该是1。对于其他分区应该是2,或0禁用检查。

options常用参数类型:

  • auto – 在启动时或键入了 mount -a 命令时自动挂载。
  • noauto – 只在你的命令下被挂载。
  • exec – 允许执行此分区的二进制文件。
  • noexec – 不允许执行此文件系统上的二进制文件。
  • ro – 以只读模式挂载文件系统。
  • rw – 以读写模式挂载文件系统。
  • user – 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexecnosuidnodev 参数。
  • users – 允许所有 users 组中的用户挂载文件系统.
  • nouser – 只能被 root 挂载。
  • owner – 允许设备所有者挂载.
  • sync – I/O 同步进行。
  • async – I/O 异步进行。
  • dev – 解析文件系统上的块特殊设备。
  • nodev – 不解析文件系统上的块特殊设备。
  • suid – 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。
  • nosuid – 禁止 suid 操作和设定 sgid 位。
  • noatime – 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。
  • nodiratime – 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。
  • relatime – 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。
  • flush – vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。
  • defaults – 使用文件系统的默认挂载参数,例如 ext4 的默认参数为:rwsuiddevexecautonouserasync.

3 Desktop Environment的自动挂载

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

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

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

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

有趣的是,我曾经分别以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

 

出处:http://shumeipai.nxez.com/2019/01/17/fstab-and-mobile-hard-disk-mounting-method.html

05-23 23:19