Oi eu tenho uma regra UDEV que chama um serviço systemd que desmonta meu drive USB quando ele é removido.
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ENV{SYSTEMD_WANTS}="umount_extern_backup.service"
O problema é que o serviço systemd não é executado se eu desconectar fisicamente meu drive USB.
Se eu usar a mesma regra de UDEV
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/bin/umount -l /extern-backup"
para executar diretamente /bin/umount -l /extern-backup
o comando é executado, mas recebo um erro:
udevd[10181]: Process '/bin/umount -l /extern-backup' failed with exit code 32.
É por isso que tento executar um serviço systemd porque o comando umount funciona.
Se eu alterar a regra UDEV para executar um script de shell, ele funcionará:
ACTION=="remove", KERNEL=="sd*" SUBSYSTEMS=="usb", SUBSYSTEM=="block", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/usr/local/sbin/test.sh"
O test.sh é executado. Mas eu não posso usar diretamente um script de shell chamado pelo UDEV para executar o comando umount
porque ele me dá o mesmo erro que executar /bin/umount -l /extern-backup
diretamente do UDEV.
Se eu chamar systemctl start umount_extern_backup.service
manualmente, o serviço também funcionará.
Para adicionar o Glacé no bolo, se eu substituir ACTION=="remove"
por ACTION=="add",
para a regra UDEV, o serviço systemd será executado e tentará desmontar quando eu conectar meu dispositivo USB.
Aqui está o meu serviço systemd:
[Unit]
Description=umount lazy /extern-backup service
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/bin/umount -l /extern-backup
[Install]
WantedBy=multi-user.target