Debian

udev+udisks2: udisksctl 給出“查找設備對象時出錯”

  • July 22, 2015

在 Debian Wheezy 中,我對我的 ntfs usb 硬碟有一個特殊規則。插入後,它會安裝在 /media 的特定子文件夾下。

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", SYMLINK+="mx%n"
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", RUN+="/bin/mount <options>", OPTIONS="last_rule"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", RUN+="/bin/umount <options>"

在我更新到 Jessie 之後,它就停止了工作。我發現在 udev 更改後,您無法使用 mount,建議使用 udisks2 或一些自寫的 systemd 單元。我選擇了udisks2並重寫瞭如下規則

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", SYMLINK+="mx%n"
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", RUN+="/bin/su storage_user -c '/usr/bin/udisksctl mount --block-device /dev/mx1 --filesystem-type ntfs --options locale=en_IE.UTF-8,fmask=0113,dmask=0002 --no-user-interaction'", OPTIONS="last_rule"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", RUN+="/usr/bin/udisksctl unmount --block-device /dev/mx1 --no-user-interaction"

它不起作用。在系統日誌中,我看到:

Error looking up object for device /dev/mx1

但是,如果我從 cli 執行此命令,它就可以正常工作。我相信由於 systemd 服務的非同步特性,當 udisk2 嘗試掛載 USB 硬碟時,/dev/mx1 還沒有準備好。

  1. 我應該寫什麼規則?
  2. 網際網路上有什麼好的指南如何編寫自定義自動掛載規則,尤其是針對 ntfs 文件系統?

不幸的是,我找不到udevudisks2不能一起工作的原因。但我在這裡找到了解決我的問題的方法。下面是一個簡單的例子,如何實現 ntfs usb 硬碟的自動掛載。首先是安裝驅動器的腳本mount.sh

#!/bin/bash
mkdir -p /media/usbhdd
mount -t ntfs-3g -o locale=en_IE.UTF-8,fmask=0113,dmask=0002,uid=storage-user,gid=storage-group /dev/mx1 /media/usbhdd

然後我們在/etc/systemd/system/mount-hdd.service中創建一個 systemd 單元

[Unit]
Description=mount usb hdd
[Service]
Type=forking
ExecStart=/usr/local/scripts/storage/mount.sh
[Install]
WantedBy=multi-user.target

最後是 udev 規則

ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*", ATTRS{serial}=="<serial_number>", SYMLINK+="mx%n"
ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*1", ATTRS{serial}=="<serial_number>", RUN+="/bin/systemctl start mount-hdd"
ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{serial}=="<serial_number>", RUN+="/bin/umount /media/usbhdd", RUN+="/bin/rmdir /media/usbhdd"

引用自:https://unix.stackexchange.com/questions/217265