Use o UUID nas regras do udev e monte a unidade usb em / media / $ UUID

13

Quero montar a unidade USB com /mediabase no UUID do disco. Como posso usar o UUID de uma unidade USB em um arquivo de regras do udev e o que é uma regra do udev para montar a unidade USB com o número UUID como o nome da pasta.

O blkidcomando gera o UUID de um disco, mas apenas na montagem.

Talespin_Kit
fonte
1
Advertência 2019: Nos sistemas Linux de desktop modernos que usam systemd, as regras do udev não montam sistemas de arquivos no espaço para nome do usuário comum, ou seja, você não pode montar um sistema de arquivos usando o comando mount em uma regra do udev. Além disso, nesses sistemas, o sistema de fusíveis (sistemas de arquivos do usuário) é configurado para lidar com montagens USB através de um ícone na área de trabalho, portanto, montar manualmente usando uma regra fstab até certo ponto entra em conflito com o sistema de fusíveis. Para montar sistemas de arquivos USB pelo UUID automaticamente em um servidor sem cabeça, seria melhor remover a configuração de fusível do systemd e usar as regras do udev para acionar serviços de montagem de uma só vez.
Jonathan Ben-Avraham
Veja esta solução usando o fstab, systemd e automount, testado no Debian recente: unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

Respostas:

14

Mesmo que os UUIDs não sejam acessíveis diretamente pelo udev, pelo menos no Fedora e Ubuntu eles são definidos como variáveis ​​de ambiente ( ENV). Você pode ler todas as variáveis ​​de ambiente de um dispositivo chamando udevadm info /dev/sdc. Por exemplo, para um NTFS em uma unidade externa, recebo:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

Tudo com um E:na frente é definido como uma variável de ambiente.

Correspondência contra UUIDs

Você pode combinar com ele ENV{ID_FS_UUID}=="4A6F2ABC1232FA37". Como primeiro filtro, comparo-me KERNEL=="sd?2"para garantir que apenas manipule dispositivos de bloco com o número de partição correto. A regra completa ficaria assim:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

O comando logger é útil para afirmar que a regra é realmente executada. Em seguida, verifique se a regra não contém nenhum erro de sintaxe udevadm test /dev/sdc2. Seu arquivo de regras deve estar listado na saída e nenhuma mensagem de erro deve aparecer ao lado. Agora você pode acionar todas as regras para o seu dispositivo para verificar se a sua regra funciona como o planejado: sudo udevadm trigger /dev/sdc2. Se sua regra corresponder, você encontrará a mensagem de log personalizada no log do sistema ( /var/log/syslogou via journalctl -b).

Edit: ali_m indicou que as variáveis ​​de ambiente são definidas pelas regras anteriores e, portanto, apenas acessíveis se o seu .rulesarquivo tiver uma ordem lexicográfica suficientemente alta . Começar com "60" deve ser suficiente. Pessoalmente, inicio minhas regras com "zz" (se possível) para distingui-las das regras predefinidas rapidamente.

Usando UUIDs no RUNcomando e em outros lugares

O Udev tem uma sintaxe de substituição de variável e atributo bastante poderosa . Especificamente, toda ocorrência de $env{ID_FS_UUID}será substituída pelo UUID da unidade. Portanto, para montar um dispositivo, /media/UUIDvocê pode usar esta regra:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

Você provavelmente deseja configurar udisks, no entanto, ele é especializado no espaço do problema que você deseja resolver. Veja https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia como ponto de partida.

Meu caso de uso real para montar dispositivos com udev em vez de /etc/fstabou com udisks é montar sistemas de arquivos zfs que possuem algumas idiossincrasias, tornando-os inadequados para as ferramentas usuais.

Perseids
fonte
1
Um ponto crucial que demorei um pouco para descobrir: para corresponder às variáveis ​​de ambiente, sua regra deve ser aplicada após a configuração dessas variáveis. Para conseguir isso, o .rulesnome do arquivo precisa começar com um número> 60 .
ali_m
@ali_m: Obrigado, adicionei suas informações à resposta.
Perseids
Ubuntu 18.04, alguns comandos do udevadm podem ser apontados para / dev / sdXX (por exemplo, informações do udevadm), outros precisam ser apontados para / sys / block / sdXX por algum motivo (por exemplo, teste do udevadm).
Greg Bell
0

Há uma solução difícil que vem à minha mente. Defina a entrada fstab com resposta correspondente identificada por UUID. E nas regras do udev, execute mount -asempre que houver um novo dispositivo sd * adicionado.

água
fonte