随着每个新版本的发布,在 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.mount
和systemd.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 磁盘挂载系统手册.)