Udisks (简体中文)
Related articles
udisks 提供了 udisksd 守护进程,它实现了用于查询和管理存储设备的 D-Bus 接口;还提供了一个命令行工具 udisksctl,用于查询和使用该守护进程。
Contents
安装
有两个版本的 udisks,分别称为 udisks 和 udisks2。为了集中精力开发udisks2,udisks 的开发已终止 。[1]
udisksd (udisks2) 和 udisks-daemon (udisks) 都是由 D-Bus 在后台启动,不应该被显式地启用。(参阅 man udisksd
和 man udisks-daemon
)。可以通过 udisksctl 和 udisks 以命令行方式分别进行管控。详情参阅 man udisksctl
和 man udisks
。
配置
用户通过 udisks 可执行的动作 Polkit 控制。如果会话不活跃或不存在,例如通过 systemd/User 控制 udisks 是,需要手动配置 policykit.
这里 包含 storage
群组的 udisk 配置, 这里有一个更严格的版本。
挂载助手
通过 udisks 工具程序也可以实现挂载,请参考 List of applications#Mount tools 和 File manager functionality#Mounting。
Devmon
udevil 包含 devmon, 这个程序和 udisks/udisks2 兼容,按照下面的优先级选择挂载程序:
- udevil (SUID)
- pmount (SUID)
- udisks
- udisks2
要通过 udisks 或 udisks2 挂载,从 udevil 删除 SUID:
# chmod -s /usr/bin/udevil
udevadm monitor
可以使用 udevadm monitor
监测块设备事件并在新的块设备被创建时进行挂载。无用的挂载点会被 udisksd 自动删除,所以删除时不需要额外动作。
#!/bin/bash pathtoname() { udevadm info -p "/sys/$1" | awk -v FS== '/DEVNAME/ {print $2}' } while read -r _ _ event devpath _; do if [[ $event == add ]]; then devname=$(pathtoname "$devpath") udisksctl mount --block-device "$devname" --no-user-interaction fi done < <(stdbuf -o L udevadm monitor --udev -s block)
udiskie
udiskie 是使用 udisks 或 udisks2 的挂载助手,支持密码保护的 LUKS 设备. 请参考Wiki.
提示与技巧
禁止隐藏设备(udisks2)
Udisks2 在默认情况下会隐藏一些设备,如果不希望隐藏,可以将 /usr/lib/udev/rules.d/80-udisks2.rules
复制到 /etc/udev/rules.d/80-udisks2.rules
并删除不需要隐藏的设备:
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # ------------------------------------------------------------------------ # Devices which should not be display in the user interface [...]
挂载到 /media (udisks2)
默认情况下, udisks2 在 ACL 控制下将可移动设备挂载到 /run/media/$USER/
目录下。如果你希望改为挂载到 /media
目录下,应用这条规则:
/etc/udev/rules.d/99-udisks2.rules
# UDISKS_FILESYSTEM_SHARED # ==1: mount filesystem to a shared directory (/media/VolumeName) # ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName) # See udisks(8) ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
挂载 ISO 镜像
要挂载 ISO 镜像,使用下面命令:
$ udisksctl loop-setup -r -f image.iso
这条命令会创建 loop 设备并显示可以挂载的 ISO 镜像,卸载后,loop 设备会被 udev 删除.
隐藏选中的分区
如果要在桌面中隐藏某些分区或设备,可以创建类似下面的 udev 规则 /etc/udev/rules.d/10-local.rules
:
KERNEL=="sda1", ENV{UDISKS_PRESENTATION_HIDE}="1" KERNEL=="sda2", ENV{UDISKS_PRESENTATION_HIDE}="1"
会隐藏 sda1
和 sda2
,如果使用 udisks2,请使用 UDISKS_IGNORE
:
KERNEL=="sda1", ENV{UDISKS_IGNORE}="1" KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"
排错
卸载的设备被自动挂载
udisks 会定期检查设备并自动挂载,这会在格式化磁盘,虚拟机 共享时导致问题,不利于省电。
禁用设备定期检查,以 CD/DVD 设备为例:
# udisks --inhibit-polling /dev/sr0
要禁用所有设备的定期检查:
# udisks --inhibit-all-polling
详情请参考man udisks
.
物理设备移除后再连接,无法再次挂载
当 udisk 和 systemd 同时尝试卸载设备时可能会出现此问题,[2] [3] 错误信息:
Jan 16 18:46:04 thinkpad systemd[1]: media-ASMT_2105.mount: Unit is bound to inactive unit dev-sdc2.device. Stopping, too. Jan 16 18:46:04 thinkpad systemd[1]: Unmounting /media/ASMT_2105...
重置设备挂载状态:
# systemctl reset-failed