跳转至内容

udisks

来自 ArchWiki

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

安装

安装 udisks2 包。

udisksd(8)D-Bus 按需启动,不应显式启用。它可以通过命令行使用 udisksctl(1) 进行控制。

配置

权限

用户使用 udisks 可以执行的操作受到 polkit 的限制。如果用户会话未激活或不存在(例如,从 systemd/User 服务控制 udisks 时),请相应调整 polkit 规则。

有关 storage 组的常见 udisks 权限,请参阅 https://github.com/coldfix/udiskie/wiki/Permissions,有关更严格的示例,请参阅 [1]。如果您使用 Dolphin,您可能会看到 [2]

默认挂载选项

可以在 /etc/udisks2/mount_options.conf 中定义默认挂载选项。如果文件不存在,请创建它。内置默认值和一些示例可以在 /etc/udisks2/mount_options.conf.example 中查看。[3]

选项可以针对特定的文件系统类型。例如,用 zstd 压缩挂载 btrfs 文件系统

/etc/udisks2/mount_options.conf
[defaults]
btrfs_defaults=compress=zstd
注意 行会覆盖相应的内置默认值。请确保不要通过此方式意外删除挂载选项。

用法

要手动挂载可移动驱动器,例如 /dev/sdc

$ udisksctl mount -b /dev/sdc1

要卸载

$ udisksctl unmount -b /dev/sdc1

有关更多信息,请参阅 udisksctl help

技巧与提示

挂载助手

使用 udisks 包装器可以轻松实现设备的自动挂载。另请参阅 List of applications/Utilities#Mount tools

注意 桌面环境,例如 GNOMEPlasma 也可能提供 udisks 包装器。
  • bashmount — 一个 bash 脚本,允许普通用户挂载和管理可移动介质。
https://github.com/jamielinux/bashmount || bashmountAUR
  • udiskie — 自动挂载程序,可选通知、托盘图标和对密码保护的 LUKS 设备的支持。有关详细信息,请参阅 udiskie wiki
https://github.com/coldfix/udiskie || udiskie
  • udiskie-dmenuudiskie 的 dmenu 界面。
https://github.com/fogine/udiskie-dmenu || udiskie-dmenu-gitAUR
  • udisksvm — 使用 Python3 和 Qt5 框架编写的 GUI 包装器。它使用鼠标单击来挂载、卸载可移动设备或弹出 CD/DVD。有关详细信息,请参阅 README 文件。
https://github.com/berbae/udisksvm || udisksvmAUR

udevadm monitor

您可以使用 udevadm monitor 来监视块事件,并在创建新块设备时挂载驱动器。stale 挂载点会被 udisksd 自动删除,因此无需特殊操作即可删除。

#!/bin/sh

pathtoname() {
    udevadm info -p /sys/"$1" | awk -v FS== '/DEVNAME/ {print $2}'
}

stdbuf -oL -- udevadm monitor --udev -s block | while read -r -- _ _ event devpath _; do
        if [ "$event" = add ]; then
            devname=$(pathtoname "$devpath")
            udisksctl mount --block-device "$devname" --no-user-interaction
        fi
done

挂载到 /media

默认情况下,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"

由于 /media/run 不同,默认不作为 tmpfs 挂载,您可能还希望创建一个 tmpfiles.d 片段,以便在每次启动时清理 stale 挂载点。

/etc/tmpfiles.d/media.conf
D /media 0755 root root 0 -

挂载 loop 设备

要轻松挂载 ISO 镜像,请使用以下命令

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

这将创建一个只读的 loop 设备,并显示可供挂载的 ISO 镜像。要能够写入,请删除 -r 标志。创建的 loop 设备的名称由上面的 loop-setup 命令输出。

只要特定的 loop 设备存在,您就可以卸载并重新挂载镜像。当不再使用特定 loop 设备时,请使用

$ udisksctl loop-delete -b /dev/loop0

将其删除。将 /dev/loop0 替换为特定 loop 设备的名称。

Loop 设备是廉价的。因此,实际上可以创建许多 loop 设备而无需担心拒绝服务问题。请参阅 [4]

隐藏选定分区

如果您希望防止某些分区或驱动器出现在桌面上,可以创建一个 udev 规则,例如 /etc/udev/rules.d/10-local.rules

KERNEL=="sda1", ENV{UDISKS_IGNORE}="1"
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"

在您的桌面上显示除 sda1sda2 之外的所有分区。

由于块设备名称在重启之间可能发生变化,因此也可以使用 UUID 来隐藏分区或整个设备。仅在处理完 /usr/lib/udev/rules.d/60-persistent-storage.rules 后才能按 UUID 进行匹配,因此请确保选择一个排序在其之后的​​文件名。例如

/etc/udev/rules.d/61-hide-partitions.rules
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"

上面的行对于隐藏多设备 btrfs 文件系统也很有用,因为单个 btrfs 文件系统的所有设备在设备之间共享相同的 UUID,但每个独立设备具有不同的 SUB_UUID。

应用 ATA 设置

启动时以及连接驱动器时,udisksd 将应用存储在文件 /etc/udisks2/IDENTIFIER.conf 中的配置,其中 IDENTIFIER 是驱动器的 Drive:Id 属性的值。目前支持 ATA 设置。有关可用选项,请参阅 udisks(8)。这些设置的效果与 hdparm 的设置基本相同,但只要 udisks 守护进程自动启动,它们就是持久的。

例如,要将驱动器的待机超时设置为 240(20 分钟),请添加以下内容

/etc/udisks2/DriveId.conf
[ATA]
StandbyTimeout=240

要获取驱动器的 DriveId,请使用 udevadm info --query=all --name=sdx | grep ID_SERIAL | sed "s/_/-/g"

或者,可以使用 GUI 工具管理配置文件,例如 gnome-disk-utility

默认设置 noatime

本文档或该部分可能是合并到 #Default mount options 的候选。

说明: 同一主题。(在 Talk:Udisks 讨论)

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: noatimerelatime 效果的讨论不应重复 fstab#atime options。(在 Talk:Udisks 讨论)

如果使用 Udisks 挂载的设备大部分是闪存,如 U 盘和 SD 卡,配置 Udisks 不更新文件的访问时间可能是有益的。这会导致额外的意外写入,即使内存看起来只被读取过。默认的 relatime 挂载选项限制了主存储器的过度写入。它不会阻止更新,如果访问时间超过 24 小时,这在可移动介质上很常见。要将 noatime 设置为所有 Udisks 挂载的默认值,请添加

/etc/udisks2/mount_options.conf
[defaults]
defaults=noatime

此选项以后可以被覆盖,以满足特定需要 atime 的挂载:可以在特定挂载的 /etc/udisks2/mount_options.conf 部分进行设置,或者通过 udev 规则设置 ENV{UDISKS_MOUNT_OPTIONS_DEFAULTS}="relatime"

故障排除

隐藏设备

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
[...]

待机定时器损坏

udisks 守护进程会定期轮询驱动器的 S.M.A.R.T. 数据。待机超时时间长于轮询间隔的硬盘可能无法进入待机状态。已停转的驱动器通常不受影响。目前似乎没有办法禁用轮询或更改轮询间隔,对于 udisks2。请参阅 [5][6]

但是,udisks2 应用的待机超时似乎不受影响。要通过 udisks 设置待机超时,请参阅 #Apply ATA settings

其他可能的解决方法包括将超时设置得低于轮询间隔(10 分钟),或者使用 hdparm -y /dev/sdx 强制手动停转。

NTFS 挂载失败

本文或本章节的准确性存在争议。

原因:/etc/udisks2/mount_options.conf.example 文件所述,这些是内置挂载选项(即默认值)。无需显式设置。KDE 可能无法应用此设置。(在 Talk:Udisks#udisk2 with NTFS support 讨论)

如果挂载 ntfs 分区失败并出现以下错误

Error mounting /dev/sdXY at [...]: wrong fs type, bad option, bad superblock on /dev/sdXY, missing codepage or helper program, or other error

并且在以 root 身份运行的 journalctl/dmesg 的内核日志中

ntfs: (device sdXY): parse_options(): Unrecognized mount option windows_names.

问题是(截至 udisks 2.10),默认使用 NTFS-3G 驱动程序,有两种解决方案:

1:安装 NTFS-3G,然后重新启动您的计算机。

2:配置 udisks2。默认情况下,Arch 系统未配置 udisks2,并且未为非原生文件系统定义默认值。最简单的方法是复制 /etc/udisks2/mount.options.conf.example/etc/udisks2/mount.options.conf 并取消注释以下行

/etc/udisks2/mount_options.conf
[defaults]
# 'ntfs' signature, the new 'ntfs3' kernel driver
ntfs:ntfs3_defaults=uid=$UID,gid=$GID
ntfs:ntfs3_allow=uid=$UID,gid=$GID,umask,dmask,fmask,iocharset,discard,nodiscard,sparse,nosparse,hidden,nohidden,sys_immutable,showmeta,noshowmeta,prealloc,noprealloc,hide_dot_files,nohide_dot_files,windows_names,nocase,case

然后重新启动 udisk2 守护进程,或重新启动您的计算机。

NTFS 文件创建失败(文件名相关)

udisks 2.8.2 引入了一个破坏性更改,将 windows_names 添加到 NTFS 挂载选项中,从而阻止创建与 Win32 不兼容的文件名,例如 nulscreenshot 23-08-21 19:22.jpg。除其他外,这会导致 Steam Proton 停止初始化。要恢复此行为,请使用

/etc/udisks2/mount_options.conf
[defaults]
ntfs:ntfs_defaults=uid=$UID,gid=$GID

通常情况下,在 Windows 中访问这些文件名之前不会造成问题。chkdsk 会将这些名称视为错误,并将重命名的文件移动到文件系统根目录下的 found.nnn 文件夹中。

关机时自动关闭外部硬盘

如果在系统关机时外置硬盘未正确断电,则可能需要解决此问题。

启用 udisks2.service

用于调用我们的脚本的服务可能如下所示

/etc/systemd/system/handle_external_hdds.service
[Unit]
Requires=udisks2.service
Requires=graphical.target
After=graphical.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/usr/local/bin/handle_external_hdds.sh
[Install]
WantedBy=graphical.target

启用 handle_external_hdds.service

执行系统 systemd daemon-reload 以应用新设置。

重启或重启 graphical.target 以检查是否工作。

处理单个磁盘上任意数量分区的示例脚本如下所示

/usr/local/bin/handle_external_hdds.sh
#!/bin/bash -u

declare -a uuids=(uuid_list)

# Only proceed if the drive is present.
if [[ ! -L "/dev/disk/by-uuid/${uuids[0]}" ]]; then
  exit 0
fi

for uuid in "${uuids[@]}"; do
  if findmnt "/dev/disk/by-uuid/$uuid"; then
    umount "/dev/disk/by-uuid/$uuid"
  fi
done

# udisksctl powers off proper drive even if its partition is supplied
udisksctl power-off -b "/dev/disk/by-uuid/${uuids[0]}"

uuid_list 是一个由空格分隔的 UUID 列表,对应于要检查的设备的 UUID,例如 "uuid_1" "uuid_2"

卸载或可移动介质未写入任何内容即损坏缓慢

即使看起来没有向 U 盘、存储卡或其他可移动介质写入任何内容,文件访问时间仍可能被更新。这是一个需要刷新到设备的变化。如果对此感到担忧,请考虑 设置 noatime 选项以用于所有 Udisks 挂载。

参见