Linux 中自动安装设备的方法不断变化,通过谷歌搜索可以返回不少对于现代基于 systemd 的盒子具有不同程度适用性的解决方案。
似乎存在以下方法:
- 通过 UUID/标签/设备手动修改
/etc/fstab
以添加每个驱动器安装。 udev
规则(显然“原始规则”可能与现有的 systemd 策略相冲突)- udisks2作为 systemd 服务运行或通过乌迪斯基
- 乌德维尔
- usb安装
- 桌面环境提供的自动挂载,例如在 XFCE 上通过
thunar
+thunar-volman
包,或者nautilus
在 Gnome 中使用gnome-volume-manager
包的自动挂载(显然它们依赖于u盘)。 - 自动文件系统内核自动挂载
- systemd自动挂载,使用示例:自动挂载 USB
选择太多了,目前还不清楚哪种方法是推荐的。此外,不同的自动安装子系统似乎会相互冲突,导致一个分区由一个工具安装,然后在几秒钟内由另一个工具自动卸载。
对于具有桌面环境的系统来说,这很简单,因为它们大多数都会自动处理 USB 安装,所以除了在设置中启用自动安装选项外,不需要采取任何额外的操作。
对于主要以文本模式运行的无头系统,当前的方法是什么?
更新
在尝试了所有的选项之后usbmount
(apt install usbmount
)被证明是最简单的,并且只是工作编辑后/lib/systemd/system/systemd-udevd.service
更改MountFlags=slave
为MountFlags=shared
如下所述这个问题(❗️更新:对于较新的 systemd 版本,找到并更改PrivateMounts=yes
到PrivateMounts=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 版本兼容。
相关链接:
- https://github.com/rbrito/usbmount
- https://github.com/six-k/automount-usb
- 无需用户登录,在启动时自动将外部驱动器安装到 /media/LABEL?
- https://askubuntu.com/a/457904/74172
- https://unix.stackexchange.com/questions/119973/mounting-usb-automatically-having-usbs-label-as-mountpoint
- https://www.freedesktop.org/software/systemd/man/systemd.automount.html
- https://www.freedesktop.org/software/systemd/man/systemd.mount.html
- http://blog.tomecek.net/post/automount-with-systemd/
- https://serverfault.com/questions/766506/automount-usb-drives-with-systemd
自动 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
可以做你想做的事,但我记得它支持一些动态映射类型(用于用户主目录)。也许使用program
map-type(以及枚举所有连接磁盘的脚本)会有效。
答案2
/etc/fstab
在基于 systemd 的系统上,中的条目仍然应该受到尊重。
可以改用 .mount 单元,并且应被视为等同于 fstab 中的条目。
如果在启动时或永久不需要挂载,则可以使用 .automount 单元;systemd 将在单元文件中给出的空闲时间过后将其卸载。
有关详细信息,请参阅systemd.mount(5)
和systemd.automount(5)
手册页。