如何在 Linux (Debian) 中自动挂载 USB 驱动器?

如何在 Linux (Debian) 中自动挂载 USB 驱动器?

随着每个新版本的发布,在 Linux 中自动挂载 USB 驱动器的方式似乎都会发生变化(幸运的是我使用的是 Debian,所以每两年我只会在这方面损失几天时间)。我们曾经有 usbmount、udisks、udisks2、udisks-glue、pmount、自定义 udev 规则,我可能忘记了更多。 (快速浏览一下,至少有一个名为的东西afuse似乎存在,但没有很好地记录)。这些都不再起作用了(至少对我来说)。

在 Debian 中自动挂载 USB 驱动器的“当前”方式是什么?我使用了以下udev规则,但自从从stretch更新到buster后,它就停止工作了:

SUBSYSTEM=="usb", DRIVERS=="usb-storage", ACTION=="add", \
RUN+="mkdir /media/usb%n; mount -o gid=plugdev,umask=002,fmask=111,users /dev/%k%n /media/usb%n"

另外:什么是稳定的解决方案来做到这一点,即使在更新到新版本后也能可靠地工作,我可能错过了?

答案1

您可以创建systemd.mountsystemd.automount单元文件。这是一个例子:

要安装/dev/sdb1在 下/mnt/mountpoint,请创建一个mnt-mountpoint.mount文件:

sudo nano /etc/systemd/system/mnt-mountpoint.mount

注意:单元文件的名称dir-sub-dir.mount要从挂载点中提取/dir/sub-dir (如果需要挂载/media/mountpoint该名称下的设备则为media-mountpoint.mount

然后粘贴以下行:

[Unit]
Description=Mount sdb1

[Mount]
What=/dev/disk/by-uuid/UUID_here
Where=/mnt/mountpoint
Type=auto
Options=defaults

[Install]
WantedBy=multi-user.target

用于blkid将 替换UUID_here为 的 uuid /dev/sdb1

创建mnt-mountpoint.automount文件:

sudo nano /etc/systemd/system/mnt-mountpoint.automount

包含以下行:

[Unit]
Description=Automount usb

[Automount]
Where=/mnt/mountpoint

[Install]
WantedBy=multi-user.target

连接 USB,然后启用并启动设备:

sudo systemctl daemon-reload
sudo systemctl enable --now  mnt-mountpoint.mount mnt-mountpoint.automount

答案2

更新[2022-03-06]:apt install udisks2应该给你USB自动挂载。

我研究了(反向)Debian 中 nautilus、udisks2 和 libglib2.0-bin(包含 gio 二进制文件)的软件包依赖关系。以此为基础并以此为基础Archlinux U盘页面我现在相信:

  • 实际进行安装的最先进技术是 udisks2。自动挂载的下一个最好的事情是udisksctl unmount -b /dev/$DEVICE.
  • 在“标准”Debian Gnome 安装中,nautilus 控制桌面上的图标。插入 USB 驱动器时,会显示该驱动器的图标,但只有单击该图标才能安装该驱动器。
  • 对于 USB 自动挂载的最小桌面的最佳选择可能是乌迪斯基

我添加了一个用户 systemd 服务来启动 udiskie:

[Unit]
Description=Udiskie automount daemon

[Install]
WantedBy=graphical-session.target

[Service]
ExecStart=/usr/bin/udiskie --verbose --use-udisks2 --automount --no-config --notify --tray --appindicator

答案3

从 Stretch 升级到 Buster(无头 Raspberry Pi Zero W)后,我也遇到了同样的问题。就我而言,我使用的是/etc/fstab,因此 systemd 会自动从中生成安装单元。我的所有磁盘都在 fstab 中指定,并且它们在 Stretch 中自动安装在热插件上。这一切在巴斯特都失效了。 (不过,磁盘在重新启动时可以正常安装。)

问题的罪魁祸首似乎是改变在新的 systemd 版本中:

    * The .device units generated by systemd-fstab-generator and other
      generators do not automatically pull in the corresponding .mount unit
      as a Wants= dependency. This means that simply plugging in the device
      will not cause the mount unit to be started automatically. But please
      note that the mount unit may be started for other reasons, in
      particular if it is part of local-fs.target, and any unit which
      (transitively) depends on local-fs.target is started.

我用systemctl show my-mount.mount命令验证了它:列表中缺少该设备WantedBy=,只有local-fs.target. (而在Stretch上有local-fs.target和对应的dev-sdaX.device,都列出来了。)结果,当插入磁盘时,并没有触发my-mount.mount单元启动。

因此,对我有用的解决方案是创建新的 udev 规则,local-fs.target每次插入新磁盘时都会触发该规则:

$ cat /etc/udev/rules.d/98-usb-disk-mount.rules 
ACTION=="add", KERNEL=="sd?[0-9]", SUBSYSTEM=="block", RUN+="/bin/systemctl start local-fs.target"

(注意:systemctl start local-fs.target建议使用该命令来触发 fstab 磁盘挂载系统手册.)

相关内容