在无头式 systemd Linux 机器上自动挂载 USB 驱动器

在无头式 systemd Linux 机器上自动挂载 USB 驱动器

Linux 中自动安装设备的方法不断变化,通过谷歌搜索可以返回不少对于现代基于 systemd 的盒子具有不同程度适用性的解决方案。

似乎存在以下方法:

  1. 通过 UUID/标签/设备手动修改/etc/fstab以添加每个驱动器安装。
  2. udev规则(显然“原始规则”可能与现有的 systemd 策略相冲突)
  3. udisks2作为 systemd 服务运行或通过乌迪斯基
  4. 乌德维尔
  5. usb安装
  6. 桌面环境提供的自动挂载,例如在 XFCE 上通过thunar+thunar-volman包,或者nautilus在 Gnome 中使用gnome-volume-manager包的自动挂载(显然它们依赖于u盘)。
  7. 自动文件系统内核自动挂载
  8. systemd自动挂载,使用示例:自动挂载 USB

选择太多了,目前还不清楚哪种方法是推荐的。此外,不同的自动安装子系统似乎会相互冲突,导致一个分区由一个工具安装,然后在几秒钟内由另一个工具自动卸载。

对于具有桌面环境的系统来说,这很简单,因为它们大多数都会自动处理 USB 安装,所以除了在设置中启用自动安装选项外,不需要采取任何额外的操作。

对于主要以文本模式运行的无头系统,当前的方法是什么?

更新

在尝试了所有的选项之后usbmountapt install usbmount)被证明是最简单的,并且只是工作编辑后/lib/systemd/system/systemd-udevd.service更改MountFlags=slaveMountFlags=shared如下所述这个问题(❗️更新:对于较新的 systemd 版本,找到并更改PrivateMounts=yesPrivateMounts=no此外,由于该文件位于/libs/...请记住此更改将是❗️覆盖每次udev软件包更新时都会自动生成一个新安装点)。无需手动将 UUID 或标签添加到任何配置文件中。唯一的缺点是它会在/media/usb<0..N>而不是下创建安装点/media/<DISK_LABEL>

还有automount-usb可以通过克隆 repo 并运行来安装configure.sh。它会创建挂载文件夹,例如/media/<device>_<disk_label>/media/sda2_mylabel❗️更新automount-usb似乎没有维护,但它仍然可以与最新的 Linux 版本兼容。

相关链接:

自动 Samba 安装:还有一个automount-usb 的分支它会自动将连接的 USB 驱动器添加为 samba 读写挂载点。

答案1

目前尚不清楚哪种方法是“官方”支持的方法。

由谁正式支持?例如,如果 GNOME 包含基于 udisks 的自动挂载功能,那么你可以肯定它是由 GNOME 本身正式支持的。

我对第二个更感兴趣(即任何 USB 存储设备),因为对于第一个,我可以将条目添加到/etc/fstab

没有“标准方法”来实现这一点。大多数现有系统最多只能在 之上添加自动化功能udisks2。就其本身而言,u盘根本不自动安装任何东西 - 但它是许多图形桌面环境使用的“后端”(至少 GNOME 和 Xfce 都使用它;我对 KDE 和 Enlightenment 只占 80% 的确定)。

(因此您的选项 3 将是“udisks2 + automount by udiskie”,而选项 4 将是“udisks2 + automount by 桌面环境”。)


关于 udev 规则:无论是挂载文件系统还是启动服务,简短的回答是“不要这样做”(出于各种原因);但详细的回答是:“不要直接这样做,但你可以询问初始化来做到这一点”。因此,从 udev 规则运行并不是什么可怕的事情systemd-mount,它只是将挂载请求传递给 init,就像 .mount 单元一样……

然而,预计这会触发 systemd 错误/缺陷/缺陷:因为 udev 报告设备仅已准备就绪处理规则时,您最终可能会导致 init 自动卸载磁盘,因为它认为设备尚未存在。

反而,乌德维尔会更好地工作,因为它不会通过规则运行任何东西,而只会对 udev 发出的“设备就绪”事件做出反应。


fstab 条目面向静态设备。但是,通过使用 ,它们可能会被滥用于其他 USB 设备/dev/disk/by-path/...,这对应于设备的物理路径(例如 PCI 插槽 3、USB 端口 1、分区 1...)。这样,您可以编写一个与插入同一 USB 端口的任何磁盘相匹配的 fstab 条目。


autofs核心自动挂载器与 udisks 类似,只是可以实现各种自动挂载的后端由用户空间。一旦设置了 autofs 挂载,所有访问它的尝试都会报告给相应的守护进程。最常见的实现是传统的(基于映射的)autofs以及最近的systemd.automount 单元。

因此,“动态”USB 设备逻辑仍然必须在用户空间中实现,而且无论哪种方式,它的工作量都比仅仅使用 udisk 要大。

  • 使用普通的 systemd,您唯一的选择是在上述 fstab“按路径”技巧的基础上进行构建。一旦为所需的 USB 端口编写了 fstab 条目,您就可以将其标记为x-systemd.automount,x-systemd.idle-timeout=300使用 autofs 自动挂载程序。(或者,当然,创建独立的 .mount + .automount 单元以获得相同的结果。)

    如果您想为所有端口上的所有 USB 磁盘动态生成自动挂载,systemd 无法在没有第三方脚本的情况下做到这一点。

  • 我不知道是否autofsd可以做你想做的事,但我记得它支持一些动态映射类型(用于用户主目录)。也许使用programmap-type(以及枚举所有连接磁盘的脚本)会有效。

答案2

/etc/fstab在基于 systemd 的系统上,中的条目仍然应该受到尊重。

可以改用 .mount 单元,并且应被视为等同于 fstab 中的条目。

如果在启动时或永久不需要挂载,则可以使用 .automount 单元;systemd 将在单元文件中给出的空闲时间过后将其卸载。

有关详细信息,请参阅systemd.mount(5)systemd.automount(5)手册页。

相关内容