# Udisks (简体中文)

Related articles

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

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

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

## 安装

有两个版本的 udisks，分别称为 udisksAUR 和 udisks2。为了集中精力开发udisks2，udisks 的开发已终止 。[1]

udisksd (udisks2) 和 udisks-daemon (udisksAUR) 都是由 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 是使用 udisksAUR 或 udisks2 的挂载助手，支持密码保护的 LUKS 设备. 请参考Wiki。

#### udiskie freezing and configuration

udiskie may freeze/crash or not work in some situations/setups if you do not have some of the notification support installed. For instance xfce and udiskie may not work correctly. You may see udiskie freeze in xfce if you do not install xfce4-notifyd and notify-osd also.

if you do not source /etc/X11/xinit/xinitrc.d/50-systemd-user.sh in your .xinitrc you may have issues also.

### udisksvm

udisksvmAUR is a graphical udisks2 wrapper application written in Python3 and using the Qt5 framework. It uses only mouse clicks to mount, unmount removable devices or eject a CD/DVD. It is well adapted to light weight graphical environments, like Openbox with Tint2. It is a stand-alone mounting/automounting application running in background (see the README file in the package for details)

## 提示与技巧

### 禁止隐藏设备（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"

### 挂载 loop 设备

要挂载 ISO 镜像，使用下面命令：

    $ udisksctl loop-setup -r -f image.iso

这条命令会创建 loop 设备并显示可以挂载的 ISO 镜像，卸载后，loop 设备会被 udev 删除.

提示： This mounts a read only image. To mount raw disk images, such as for QEMU, remove the `-r` flag, and release the image after use with `udisksctl loop-delete -b /dev/loop0`. Substitute `/dev/loop0` with the name of the loop device.

### 隐藏选中的分区

如果要在桌面中隐藏某些分区或设备，可以创建类似下面的 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"

Because block device names can change between reboots, it is also possible to use UUIDs (as gathered from executing the `blkid /dev/sdX` command) to hide partitions or whole devices:

For example:

    # blkid /dev/sdX
    /dev/sdX: LABEL="Filesystem Label" UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX" UUID_SUB="YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY" TYPE="btrfs"

Then the following line can be used:

    ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"

The above line is also useful to hide multi device btrfs filesystems, as all the devices from a single btrtfs filesystem will share the same UUID across the devices but will have different SUB_UUID for each individual device.

## 排错

### 卸载的设备被自动挂载

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 (简体中文)