Udisks (简体中文)

翻译状态: 本文是英文页面 Udisks翻译,最后翻译时间:2016-05-27,点击这里可以查看翻译后英文页面的改动。

udisks 提供了 udisksd 守护进程,它实现了用于查询和管理存储设备的 D-Bus 接口;还提供了一个命令行工具 udisksctl,用于查询和使用该守护进程。

安装

有两个版本的 udisks,分别称为 udisksudisks2。为了集中精力开发udisks2udisks 的开发已终止 。[1]

udisksd (udisks2) 和 udisks-daemon (udisks) 都是由 D-Bus 在后台启动,不应该被显式地启用。(参阅 man udisksdman udisks-daemon)。可以通过 udisksctludisks 以命令行方式分别进行管控。详情参阅 man udisksctlman udisks

配置

用户通过 udisks 可执行的动作 Polkit 控制。如果会话不活跃或不存在,例如通过 systemd/User 控制 udisks 是,需要手动配置 policykit.

这里 包含 storage 群组的 udisk 配置, 这里有一个更严格的版本。

挂载助手

通过 udisks 工具程序也可以实现挂载,请参考 List of applications#Mount toolsFile manager functionality#Mounting

Devmon

udevil 包含 devmon, 这个程序和 udisks/udisks2 兼容,按照下面的优先级选择挂载程序:

  1. udevil (SUID)
  2. pmount (SUID)
  3. udisks
  4. udisks2

要通过 udisksudisks2 挂载,从 udevil 删除 SUID:

# chmod -s /usr/bin/udevil
Note: 用 root 执行 chmod -x /usr/bin/udevil 会让 devmon 使用 udisks 执行设备监控。
Tip: 要在后台执行 devmon 自动挂载,用 devmon@.service 启用服务,用户名作为参数: devmon@user.service. 请注意这里是在 session 之外执行的,需要调整 Polkit 规则或从用户会话启动,参考 自动启动.

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 是使用 udisksudisks2 的挂载助手,支持密码保护的 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"

会隐藏 sda1sda2,如果使用 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

参阅