Estou tentando usar jmtpfs
minha GoPro para transferir arquivos quando a conecto ao meu computador.
Tenho um script que funciona fora de uma regra udev. No entanto, quando executado dentro da regra udev, o script falha e desconecta meu dispositivo USB.
Um exemplo mínimo de funcionamento é dado aqui:
roteiro
#!/usr/bin/env bash
jmtpfs /media/GoPro > /tmp/gopro.log 2> /tmp/gopro.err
regra udev
SUBSYSTEM=="usb", ATTR{idVendor}=="2672", ATTR{idProduct}=="004b", ACTION=="add", RUN+="/bin/bash -c /home/matt/Projects/GoProScraping/scripts/grab_go_pro_files.sh"
A saída do arquivo /tmp/gopro.err
é:
Device 0 (VID=2672 and PID=004b) is UNKNOWN in libmtp v1.1.19.
Please report this VID/PID and the device model to the libmtp development team
fusermount: mount failed: Operation not permitted
A saída de journalctl -f
é:
Sep 29 09:45:31 nina kernel: usb 1-4: new high-speed USB device number 16 using xhci_hcd
Sep 29 09:45:31 nina kernel: usb 1-4: New USB device found, idVendor=2672, idProduct=004b, bcdDevice= 0.01
Sep 29 09:45:31 nina kernel: usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Sep 29 09:45:31 nina kernel: usb 1-4: Product: GoPro MAX
Sep 29 09:45:31 nina kernel: usb 1-4: Manufacturer: GoPro
Sep 29 09:45:31 nina kernel: usb 1-4: SerialNumber: C3351325091705
Sep 29 09:45:31 nina sudo[1455]: root : PWD=/ ; USER=root ; COMMAND=/usr/bin/jmtpfs /media/GoPro
Sep 29 09:45:31 nina sudo[1455]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=0)
Sep 29 09:45:34 nina sudo[1455]: pam_unix(sudo:session): session closed for user root
Sep 29 09:45:34 nina kernel: usb 1-4: USB disconnect, device number 16
Sep 29 09:45:34 nina systemd-udevd[1453]: 1-4: Process '/bin/bash -c /home/matt/Projects/GoProScraping/scripts/grab_go_pro_files.sh' failed with exit code 1.
Parece que eu conecto a GoPro, o udev detecta que ela está conectada, então ocorre um erro de permissão e o erro faz com que o USB seja desconectado e então o udev detecta novamente.
Entretanto, se eu tentar executar o comando: jmtpfs /media/GoPro
como usuário root, ele monta bem e eu consigo acessar os arquivos manualmente.
Achei que as regras do udev eram executadas como root. O que estou esquecendo?
Você pode estar tentando seguir conselhos obsoletos. Executar coisas arbitrárias a partir de regras udev costumava ser possível, mas então uma falha de segurança foi encontrada e algumas restrições foram aplicadas. Agora, o
systemd-udevd
processo de serviço geralmente é sandboxed, o que limita suas ações diretas a basicamente apenas criar, sondar e excluir nós de dispositivos. Mas ele ainda pode dizersystemd
para iniciar outras coisas.Em sistemas modernos, o capítulo sobre a
RUN
palavra-chaveman udev
diz:Então, primeiro crie um arquivo de serviço, por exemplo
/etc/systemd/system/gopro-jmtpfs.service
, com o seguinte conteúdo:Isto define uma unidade estática , que não pode ser iniciada manualmente. Ela será acionada por uma regra udev mais tarde.
E outro serviço para seu script de captura de arquivos, por exemplo
/etc/systemd/system/gopro-grabfiles.service
:Após criar o arquivo de serviço, lembre-se de executar
systemctl daemon-reload
para que ele tenha efeito.Em seguida, crie uma regra udev para sua GoPro como esta:
Agora, o
gopro-jmtpfs.service
deve ser iniciado automaticamente quando a GoPro for conectada egopro-grabfiles.service
deve ser acionado após o primeiro serviço começar a ser executado.Marcar uma regra udev com
TAG+="systemd"
deve fazer comsystemd
que o dispositivo em questão fique ciente disso, resultando em uma*.device
unidade sendo criada automaticamente para ele. Você poderá usar isso parasystemd
automação baseada em mais, se desejar.Por padrão, o nome da unidade do dispositivo será uma
sys-devices-pci...-usb....device
sequência longa e estranha, mas você pode adicionarENV{SYSTEMD_ALIAS}="/sys/subsystem/usb/somename"
à sua regra udev para obter um nome de unidade de dispositivo mais gerenciável.