Estou tentando criar uma regra udev que monte meu dispositivo pelo seu uuid, para que eu possa ler seu conteúdo posteriormente.
Meu arquivo udev está localizado no /etc/udev/rules.d/99-local.rules
, e este é o seu conteúdo:
ACTION=="add", ENV{ID_FS_UUID}=="12CB-F616", SYMLINK+="masterkey", RUN+="/usr/bin/mountkey.sh"
O script executado pela regra udev consiste em:
LOG_FILE="/tmp/mount-key.log"
mount /dev/masterkey /mnt/masterkey > "$LOG_FILE"
MOUNT_POINT="$(findmnt -n -o TARGET --source '/dev/masterkey')"
echo "Device mounted at $MOUNT_POINT" >> "$LOG_FILE"
O problema é que quando o udev invoca o comando mount, aparentemente ele não funciona e nem o comando produz nenhuma saída, bem como a variável de ambiente MOUNT_POINT no arquivo de log, embora o udev realmente crie o link simbólico da chave mestra .
O arquivo de log se parece com isto:
Device mounted at
Eu comprovei que ele não montou a partição após executar lsblk
:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 3.8G 0 disk
└─sda1 8:1 1 3.8G 0 part
...
Editei o script e, em vez disso, executei-o com sudo , mas obtive a mesma saída acima. Então, decidi executar o comando mount como root sem esperar por uma senha (pensando que era o problema), editei o /etc/sudoers
arquivo com visudo e adicionei a linha com o campo NOPASSWD para mount para o usuário root , assim:
root ALL=(ALL:ALL) ALL
root ALL=NOPASSWD:/usr/bin/mount
Também tentei escrever para executá-lo de diferentes maneiras:
ACTION=="add", ENV{ID_FS_UUID}=="12CB-F616", SYMLINK+="masterkey", RUN+="/bin/bash -c '/usr/bin/mountkey.sh'"
ACTION=="add", ENV{ID_FS_UUID}=="12CB-F616", SYMLINK+="masterkey", RUN+="/bin/bash -c 'sudo /usr/bin/mount /dev/masterkey /mnt/masterkey'"
ACTION=="add", ENV{ID_FS_UUID}=="12CB-F616", SYMLINK+="masterkey", RUN+="/bin/bash -c '/usr/bin/mount /dev/masterkey /mnt/masterkey'"
Também fiz tudo isso com sh (com #!/bin/sh) e de nenhuma dessas formas funcionou. Então parece que não tem problema nenhum em invocar o script e criar o symlink, mas executar o binário mount de qualquer forma que ele seja apresentado.
E nem é meu binário de montagem , porque quando eu executo:
sudo mount /dev/sdnx /mnt/masterkey
funciona corretamente.
Depois de muitas tentativas sem ver nenhuma pista sobre qual poderia ser o problema, alterei a regra do udev para esta:
ACTION=="add", ENV{ID_FS_UUID}=="12CB-F616", RUN+="/bin/bash -c '/usr/local/bin/mountkey.sh $ID_FS_UUID'"
E meu script bash:
#!/bin/bash
UUID="$1"
DEVICE=$(blkid -o device -t UUID="$UUID")
echo "$UUID\n$DEVICE" > "/tmp/mountkey.log"
mount $DEVICE /media/masterkey
Mas, nossa! surpresa, nada mudou.
SISTEMA VM
Vagrant (archlinux/archlinux)
Kernel 6.10.10-arch1-1
SISTEMA REAL
Tentei executar a regra udev dentro da minha máquina real, que é:
Arco linux / 6.13.2-arch1-1
Mas ainda obtive o mesmo resultado (nenhuma partição montada no sistema).
Então, ao fazer isso, descobri que o problema está em um dos arquivos (a regra udev ou o script bash).
Você não pode usar
mount
as regras do udev. O udev roda com um namespace de montagem separado , então rodarmount
não funciona; você precisa usarsystemd-mount
instead. Assim:--no-block
diz ao systemd-mount para não esperar por uma resposta da montagem do dispositivo, porque as regras do udev ao executar comandos têm um tempo minúsculo antes de expirarem.--automount=yes
– você deve usar automount sempre de acordo com as regras do udev, quando tiver um dispositivo removível, como neste caso um USB. O que isso faz é que cada vez que um usuário ou aplicativo acessa o ponto de montagem, systemd-mount montará automaticamente a unidade naquele diretório para que você possa acessá-lo.