近期自己的Raspberry Pi出了点问题,总结总结便有了这篇文章。
本文首先记录“移动硬盘挂载”实际发生的问题,然后浅析了fstab这一重要配置文件和使用,最后总结了Raspberry Pi上自动挂载移动硬盘的方法。本文主要基于Raspberry Pi和Raspbian描述问题,当然它也广泛适用于各Linux发行版环境中 ; )。
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
– 允许任意用户挂载此文件系统,若无显示定义,隐含启用noexec
,nosuid
,nodev
参数。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
的默认参数为:rw
,suid
,dev
,exec
,auto
,nouser
,async
.
3 Desktop Environment的自动挂载
实际使用Raspbian桌面版的同学们可能发现了,在PIXEL(LXDE)桌面环境中,即使我们没有设置fstab
,插入usb存储设备后,它将自动被挂载到 /media/<user>/<label>
下。
这个功能我们在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
出处:http://shumeipai.nxez.com/2019/01/17/fstab-and-mobile-hard-disk-mounting-method.html