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

ccp*_*zza 17 linux fstab udev automount systemd

在 Linux 中自动挂载设备的方法不断变化,谷歌搜索返回了相当多的解决方案,对现代基于 systemd 的机器具有不同程度的适用性。

似乎存在以下方法:

  1. 修改/etc/fstab以通过 UUID/标签/设备添加每个驱动器的安装。
  2. udev 规则(显然“原始规则”可能与现有的 systemd 策略冲突)
  3. udisks2运行作为systemd服务或经由udiskie
  4. 恶魔
  5. 挂载
  6. 桌面环境提供的自动挂载,即在 XFCE 上通过thunar+thunar-volman包,或nautilus在 Gnome 中使用gnome-volume-manager包自动挂载(显然它们依赖udisks)。
  7. autofs内核自动挂载程序
  8. systemd自动挂载,使用示例:automount-usb

选择可能是压倒性的,目前尚不清楚哪种方法是推荐的。此外,似乎不同的自动挂载子系统可能会相互冲突,导致分区由一个工具挂载,然后在几秒钟内被另一个工具自动卸载。

对于具有桌面环境的系统,这很简单,因为它们中的大多数会自动处理 USB 挂载,因此除了在设置中启用自动挂载选项外,不需要额外的操作。

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

更新

所有我发现的选项摆弄后usbmount,以(几乎)刚刚工作后,我编辑 /lib/systemd/system/systemd-udevd.service和改变MountFlags=slave,以MountFlags=shared在描述这个问题(???? UPDATE:对于最近的systemd版本PrivateMounts=no,而应使用!)。无需手动向任何配置文件添加任何 UUID 或标签。缺点是它创建的挂载点/media/usbN并不完美,所以我已经切换到automount-usb非常容易设置(只需运行configure.sh脚本)并创建挂载文件夹,/media/<device>_<disk_label>例如像/media/sda2_mylabel(???? UPDATE :automount-usb似乎不可维护)。

相关链接:

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

use*_*686 6

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

官方支持谁?例如,如果 GNOME 包括基于 udisks 的自动挂载功能,您可以确定 GNOME 自己正式支持它。

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

没有这样做的“标准方法”。充其量,大多数现有系统已经决定在udisks2. 就其本身而言,udisks根本不会自动挂载任何东西——但它是许多图形桌面环境使用的“后端”(至少 GNOME 和 Xfce 都使用它;我对 KDE 和 Enlightenment 只有 80% 的把握)。

(因此您的选项 3 将是“udisks2 + udiskie 自动挂载”,选项 4 将是“udisks2 + 桌面环境自动挂载”。)


关于 udev 规则:无论是挂载文件系统还是启动服务,简短的回答是“不要这样做”(出于各种原因);但长答案是:“不要直接做,但你可以要求 init做”。因此,systemd-mount从 udev 规则运行并不会很糟糕,然后就像 .mount 单元一样将挂载请求传递给 init ......

但是,预计这会触发 systemd 错误/疣/错误功能:因为 udev 仅在处理规则后才报告设备准备就绪,您最终可能会 init 自动卸载磁盘,因为它认为该设备尚不存在。

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


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


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

因此,“动态”USB 设备逻辑仍必须在用户空间中实现,无论哪种方式,它都比仅使用 udisk 更有效。

  • 使用普通的 systemd,您唯一的选择是在上述 fstab “by-path” hack 之上构建。为所需的 USB 端口写入 fstab 条目后,您可以将其标记x-systemd.automount,x-systemd.idle-timeout=300为使用 autofs 自动挂载程序。(或者,当然,为相同的结果创建独立的 .mount + .automount 单元。)

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

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


Ign*_*ams 4

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

可以使用 .mount 单元来代替,并且应将其视为等同于 fstab 中的条目。

如果启动时或永久不需要安装,则可以使用 .automount 单元;systemd 将在单元文件中指定的空闲时间过去后卸载它。

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