Estou desenvolvendo um aplicativo que em algum momento precisa gravar em uma unidade USB. O aplicativo é executado com permissões de não-superusuário e pensei que a melhor maneira de escrever no drive seria montá-lo com a opção flush assim que o drive for inserido, desta forma, teoricamente não preciso faça qualquer operação umount, com esta regra do udev:
ACTION="add", KERNEL="sd*[0-9]", SUBSYSTEMS="usb", RUN+="/bin/sh mymountscript.sh '%E{DEVNAME}'"
O script de montagem tenta invocar o comando desta forma:
mount -o --flush $1 /media/my-user/my-usb-unit
Mas eu entendoesse erro de montagem:
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
O curioso é que recebo esse erro apenas ao tentar montá-lo através da regra do udev, se eu mymountscript.sh
me invocar a unidade fica montada corretamente no ponto.
Além de uma solução para esse problema, gostaria de saber se é arriscado fazer dessa forma (entendo que é porque não desmonto o drive após a gravação do arquivo). Se eu seguir o outro caminho, precisarei do script do aplicativo (que é executado em nome do usuário) para poder montar/desmontar a unidade sozinho. Para isso, eu precisaria salvar o nome do dispositivo em algum lugar quando ele for inserido e também conceder permissões de montagem ao aplicativo.
O sistema operacional é o Xubuntu 16.04.
Responder1
Minha solução alternativa para isso foi gerenciá-lo desta maneira:
Uma regra do udev para a ação inserida no USB.
Enquanto isso, os scripts que chegam montam/desmontam a unidade.
Uma regra do udev para a ação de remoção de USB.
USB é inserido
Eu executo um script que apenas salva o nome do dispositivo em um arquivo. Posso acrescentar qualquer outro script nesta regra:
ACTION=”add”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh my-usb-inserted.sh”, RUN+=”/bin/sh myownscript.sh”
Aqui, myownscript.sh
montaremos o dispositivo usandomontagem, que permite montar/desmontar unidades removíveis para usuários padrão. Posso chamar qualquer outro script depois desses, desde que eu desmonte a unidade em cada um deles antes que o próximo a utilize.
USB é removido
Aqui, um script simples remove o arquivo criado por my-usb-inserted.sh
, então sabemos que não há nenhuma unidade flash inserida dentro dos scripts.
ACTION=”remove”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh usb-removed.sh”
Esta solução alternativa não levou em consideração o fato de ter que lidar com mais de uma unidade USB.
Veja também: