
Estou tentando configurar o udev no RHEL7 para que unidades flash USB recebam nomes /dev específicos (ou seja, /dev/backup1 , /dev/backup2....) para unidades flash específicas - percebo que não consigo controlar o / atribuições dev/sdx, mas estou tentando configurar links simbólicos automatizados usando regras do udev.
blkid me dá:
/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
Eu queria fazer algo como: no meu arquivo de regras
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"
mas como todas as três unidades flash USB têm o mesmo uuid - eu queria que unidades flash específicas fossem vinculadas a nomes de dispositivos virtuais específicos. Portanto, se eu conectasse aquele rotulado como "drive2", ele seria vinculado a/dev/backupkeyb. No momento temos 3 unidades flash - mas queremos expandir para cerca de 8.
udevadm me dá alguma singularidade ...
[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208
Mudei minha regra do udev para leitura (/etc/udev/rules.d/99-symlink.rules)
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"
no entanto, quando conectei a chave que tinha o número de série ...4208 - nenhum link simbólico /dev/backupkeyc foi criado. Suspeito que seja porque a saída da instrução udevadm não corresponde exatamente ao meu RESULT==
Criei um script /usr/local/udevinfo e alterei o PROGRAM=="/usr/local/udevinfo %N" conforme abaixo para não atrapalhar a regra do udev...depois de colocar o pen drive - sem link simbólico - mas o mais importante é que não havia nada em /tmp/passeddata que deveria conter o nome do dispositivo - então parece que a regra do udev nunca foi executada?
echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'
Estou faltando alguma coisa? alguma maneira mais fácil de fazer o que estou tentando fazer?
Responder1
Sim, não foi uma correspondência exata, porque 'udevadm info' gera muitas informações – não apenas o número de série.
No entanto, tudo o que você vê em 'udevadm info' édefinido pelaO udev se governa (geralmente invocando os recursos internos do udev). Portanto, o número de série já pode ser usado ENV{ID_SERIAL_SHORT}=="..."
sem a necessidade de chamar um programa externo. (Isso é o que o prefixo “E:” realmente indica.)
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"
(Na verdade, é possível que 'udevadm info' não funcionede forma algumadurante o processamento de regras. Um erro comum nas regras do udev é tentar usar ferramentas que só obtêm informações dos sinais de "regras concluídas".)
Responder2
Concordo totalmente com a resposta do @grawity de não usar um script para tal solução, mas diretamente o ambiente. Mas para os outros aspectos:
A sintaxe do programa está correta da maneira que você escreveu e funciona. Talvez você queira dizer que não há nada no arquivo que o arquivo não seja criado? Então está faltando a linha shebang (como no seu snippet) ou as permissões de execução? Caso contrário, deveria funcionar dessa maneira - E você nem precisa passar nenhum argumento, pois todas as informações que o udev conhece estão disponíveis no ambiente como variáveis. Portanto, o script pode acessá-los quando chamado pela instrução PROGRAM da regra do udev.
Mas deveria ser muito mais conveniente e genérico seguir uma abordagem diferente:
não use os números de série do dispositivo, mas atribua a eles um UUID ou rótulo de partição (ou ambos para diminuir a probabilidade de qualquer outra coisa ser inserida que tenha o mesmo UUID ou rótulo de partição ). Portanto, basta renomear as partições ou reformatá-las para definir um novo "UUID". Também é possível corrigir as informações do UUID na partição existente se você não quiser reformatar (não conheço uma ferramenta que faça isso para você, mas é muito simples escrever a sua própria).
Dessa forma, você poderá substituir os alvos sem modificar seu sistema. Ou adicione mais palitos a uma piscina, por exemplo.
Nesse caso, você pode até preferir usar um pequeno script PROGRAM que traduza o rótulo da partição de um formato específico em um nome de link simbólico de um formato específico.
Outra (se possível, a maneira mais padrão) pode ser usar um GPT nos dispositivos e atribuir algum tipo de partição específico e uma combinação -UUID para seu caso de uso - possivelmente um nome de partição adicional.