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

近期自己的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]:

外部设备在插入时挂载,在未插入时忽略。这需要 nofail 选项,可以在启动时若设备不存在直接忽略它而不报错.

1
/etc/fstab
1
/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:

1
/etc/fstab
1
/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:

1
/etc/fstab
1
//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文件如下:

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使用技巧,如果你正遇到某些问题,不妨一读:

3提示和技巧

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>下。

这个功能我们在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

浅析 fstab 与移动硬盘挂载方法的更多相关文章

  1. Linux中盘符的两种挂载方法

    相信接触过Linux系统的人对于mount命令都不陌生,今天是农历2017年的最后一个工作日,趁着时光还在,就说一下两种不同的挂载方法吧. 课前小知识: 命令格式:mount [-t vfstype] ...

  2. Linux常用命令:fdisk mkfs mount umount fstab实现自动挂载

    写在前 记录点常用命令,fdisk mkfs mount和umount,以及fstab实现自动挂载 fdisk fdisk主要用于操作硬盘的分区表.分区,下面简单记一点最常用的部分 查看当前系统识别到 ...

  3. Tomcat 保存镜像实战操作( 目录挂载方法 )

    查看数据保存的位置 docker inspect --format='{{.Mounts}}' mxg_tomcat 宿主机数据保存在 /usr/local/project , 将此路径数据备份在 b ...

  4. Linux 通过 UUID 在 fstab 中自动挂载分区

    Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 605 https://xiexianbin.cn/lin ...

  5. Linux中挂载移动硬盘的方法

    - fdisk -l 找出移动硬盘对应的设备 - mkdir 创建挂载点 mkdir /mnt/usb - mount mount -t ntfs-3g /dev/sdb1  /mnt/usb - u ...

  6. 磁盘挂载方法 fdisk parted

    1创建磁盘分区 [root@web01 ~]# fdisk -cu /dev/sdc -c 关闭dos兼容模式-u 使用扇区进行分区 (默认位柱面)[root@web01 ~]# partprobe ...

  7. [Linux] - Windows与Linux网络共享文件夹挂载方法

    Windows与Linux网络SMB方式文件夹共享挂载 本示例系统: Windows 2003+ Linux-Centos/Ubuntu 本示例全为命令行操作,如何使用Windows.Linux命令行 ...

  8. Linux 硬盘挂载方法

    linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记 硬盘挂载操作工作步骤: 1.先查看目前机器上有几块硬盘,查看命令有两种: 命令1:# fdisk –l 命令2:# dmesg | gre ...

  9. Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法

    服务器拥有多个硬盘插槽,在进行维护或重启时,这些硬盘的相对位置可能发生变化.利用盘符(dev/vda)方式挂载磁盘,可能由于磁盘顺序变化导致重启时读取fstab文件发生错误,从而无法正常重启服务器. ...

随机推荐

  1. [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列

    You are given an integer array sorted in ascending order (may contain duplicates), you need to split ...

  2. 《30天自制操作系统》笔记5 --- (Day3)

    这个专题荒废了许久,今天补点东西 不够准确的小结 用汇编来开发操作系统,就是使用汇编本身的功能再加上BIOS中断提供的功能来完成功能的过程. 汇编本身的功能不够,毕竟没有外部IO,所以通过给多个寄存器 ...

  3. oracle--DBWN

    一,DBWN功能 将脏数据写盘 二,什么情况下会触发DBWN的进程呢? 1) check pointer:有检查点, 2) 脏数据达到阀值:达到buffer内存的10%即要将脏数据写到磁盘: 这就是造 ...

  4. IDCode校验算法

    运行地址: https://c.runoob.com/compile/10 算法源码 public class HelloWorld { public static void main(String ...

  5. 文件上传之靶场upload-labs (11-20)

    第十一关 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置 substr() 函数返回字符串的一部分 文件保存的方式是上传路径+随机时间+截取的文件后缀 其中上传路径可控,可以利用这 ...

  6. 【插件】【idea】JRebel mybatisPlus extension是JRebel热部署插件的扩展支持mybatis的xml文件热部署

    和JRebel一起使用,修改mybatis的mapper.xml文件不用重启项目 File->Settings->Plugs

  7. nginx 安装ab小工具方法

    nginx 安装ab小工具方法测试工具安装(以centos系统为例)yum -y install httpd-tools 然后测试下ab -V

  8. SQL --------------- 运算符 = 与 in

    in 用于指定查询与where 一块进行使用,可以用来指定一个或多个,和 “ = ” 差不多 语法: select * from 表名 where 字段 in (字段对应的值可以是一个或多个) 建个表 ...

  9. Delphi 10.3.2 社区版的安装

    1.去 https://www.embarcadero.com/cn/products/delphi/starter 下载安装程序 首先你要有一个embarcadero社区账号,国内线路下载有点慢,下 ...

  10. .net Core 学习笔记(实体字段映射,IOC注入)

    https://github.com/wj1034184751/ADO.NetCore.git 先简单的做一个学习架子, EF层用的是 EFCore(2.1.0)+ Pomelo.EntityFram ...