Udev

允許熔斷器組中的任何使用者解除安裝

  • April 21, 2015

我目前正在嘗試編寫幾個 systemd/udev 配置文件,這些文件將允許我在 Arch Linux 筆記型電腦上自動掛載/解除安裝 MTP Android 設備。我花了一些時間,但到目前為止它工作得很好。

現在,我希望任何有fuse權限的使用者都能夠解除安裝設備。到目前為止,只有與go-mtpfs啟動時相同的使用者才有可能。

我很清楚 MTP 的設計目的是讓您可以直接拔掉設備而不會產生任何後果,但是在 Nautilus 中點擊“彈出”時彈出錯誤消息有點出乎意料,而且不是很好。

我嘗試了以下方法,但失敗了:

  • 將自己添加到fuse組中,開始並嘗試以我自己的go-mtpfs身份解除安裝root
  • go-mtpfs以使用者和組開始fuse,並嘗試以我自己的身份解除安裝,也在fuse組中

任何想法?另外,如果你有一種優雅的方式來實現同樣的事情而不必依賴於fuse團隊,我很想听聽!

系統服務 (/etc/systemd/system/android-mtp.service)

[Service]
Type=forking
ExecStartPre=/bin/mkdir -p /media/Android
ExecStart=/usr/sbin/daemonize -l /var/lock/go-mtpfs.lock /usr/bin/go-mtpfs -allow-other=true /media/Android
ExecStop=/bin/umount /media/Android
ExecStopPost=/bin/rmdir /media/Android

udev 規則 (/etc/udev/rules.d/99-android-mtp.rules)

# Google Nexus 7 16 Gb Bootloader & recovery mode
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0666" # Bootloader
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0666" # Recovery

# Google Nexus 7 16 Gb PTP mode (camera)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e43", MODE="0666" # PTP media
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e44", MODE="0666" # PTP media with USB debug on

# Google Nexus 7 16 Gb MTP mode (multimedia device)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e41", MODE="0666" # MTP media
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0666" # MTP media with USB debug on

# Google Nexus 7 MTP mode : automatic unmount when unplugged (all android versions)
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e41", ACTION=="remove", RUN+="/usr/bin/systemctl stop android-mtp.service"
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e42", ACTION=="remove", RUN+="/usr/bin/systemctl stop android-mtp.service"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e41", ACTION=="remove", RUN+="/usr/bin/systemctl stop android-mtp.service"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e42", ACTION=="remove", RUN+="/usr/bin/systemctl stop android-mtp.service"

# Google Nexus 7 MTP mode : automatic mount when plugged (all android versions)
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e41", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="android-mtp.service"
ENV{ID_MODEL}=="Nexus", ENV{ID_MODEL_ID}=="4e42", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="android-mtp.service"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e41", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="android-mtp.service"
ENV{ID_MODEL}=="Nexus_7", ENV{ID_MODEL_ID}=="4e42", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="android-mtp.service"

fuse組旨在指示誰可以掛載 FUSE 文件系統。目的不是該組中的任何人都可以解除安裝其他人安裝的文件系統。只有進行掛載的使用者或 root 才能解除安裝文件系統。

您可以使用sudo授權fuse組中的使用者以執行掛載的同一使用者身份執行解除安裝命令。執行visudo以添加如下行:

%fuse ALL = (fuse) fusermount -u /media/Android

你為什麼不自己做安裝?這是使用 FUSE 的常用方法。

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