# Udisks (简体中文)

Related articles

- udev (简体中文)
- Mount
- Polkit (简体中文)
- File manager functionality (简体中文)

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

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

## 安装

有两个版本的 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 兼容，按照下面的优先级选择挂载程序：

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

要通过 udisks 或 udisks2 挂载，从 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 是使用 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

## 参阅

- gentoo wiki: udisks
- Udisks 介绍

Categories:

- 简体中文
- Hardware detection and troubleshooting (简体中文)