udev – 允许保险丝组中的任何用户卸载

我目前正在尝试编写一些systemd / udev配置文件,这些文件允许我在Arch Linux笔记本电脑上自动安装/卸载MTP Android设备.我花了一些时间,但到目前为止它运作良好.

现在,我希望任何具有保险丝权限的用户都能够卸载设备.到目前为止,只有与一个go-mtpfs相同的用户才能启动.

我很清楚MTP的设计是为了让您可以直接拔出设备而不会产生任何后果,但是在Nautilus中单击“弹出”时会弹出一条错误消息,这是一种意想不到的事情,并不是很好.

我尝试了以下,但失败了:

>将自己添加到保险丝组,以root身份启动go-mtpfs并尝试以我自己的身份卸载
>启动go-mtpfs作为保险丝用户和组,并尝试以我自己的方式卸载,也在保险丝组中

任何的想法?此外,如果你有一个优雅的方式来实现同样的事情,而不必依赖保险丝组,我很想听听它!

systemd服务(/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文件系统.目的不是该组中的任何人都可以卸载其他人安装的文件系统.只有执行挂载或root的用户才能卸载文件系统.

您可以使用sudo授权保险丝组中的用户以执行挂载的同一用户身份运行卸载命令.运行visudo添加如下行:

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

你为什么不像自己一样安装?这是使用FUSE的常用方法.

上一篇:编译时找不到保险丝功能


下一篇:python – 原型文件系统