Como se certificar de que certos dispositivos sempre usam o mesmo arquivo de dispositivo?

2

Ao montar um disco rígido via UUID e outro via arquivo de dispositivo, como posso ter certeza de que o primeiro é sempre / dev / sdaX e o segundo / dev / sdbX e não o contrário?

Algumas explicações sobre o que estou tentando fazer: estou conectando um zero framboesa, um hub USB, um disco rígido externo e um cartão SD (todos alimentados por um banco de energia). Então, quando eu ligar o framboesa, ele deve automaticamente fazer um backup do cartão SD no disco rígido externo.
Um fstab simplificado ficaria assim:

...
uuid=123123   /mnt/exthd   ntfs   rw,... 0 0
/dev/sdb1     /mnt/sdcard  vfat   ro,... 0 0

Eu não consigo montar o cartão SD via UUID, porque ele mudará quando eu formatar o cartão ou, claro, usar outro cartão.

A questão é, posso ter certeza, que a unidade externa é sempre montada usando / dev / sda1?

Ou preciso analisar, por exemplo, a saída de lsblk , ver qual dispositivo é menor em tamanho e usar esse arquivo de dispositivo?

Note que não terei nenhum feedback do framboesa ou qualquer outra coisa. Eu tenho que ter certeza, isso sempre funciona. E acho que posso fazer a análise sozinha, se necessário. A questão é unicamente, se eu tiver que lidar com isso ou se houver uma maneira mais fácil.

    
por fancyPants 25.07.2016 / 13:43

2 respostas

2

Percebi que o atributo devpath é constante para minhas portas USB. Você pode adicionar uma nova regra udev e criar links simbólicos específicos com base nas portas nas quais os dispositivos estão conectados. Basta adicionar um novo arquivo ao diretório /etc/udev/rules.d , que é assim:

#new symlink for my front USB port:
KERNELS=="2-1.8", SUBSYSTEMS=="usb", ATTRS{devpath}=="1.8", SYMLINK+="usb_port1"

e verifique se o nome termina em .rules , por exemplo %código%. De agora em diante, você pode fazer a entrada port1.rules usando fstab , pois qualquer dispositivo conectado a essa porta específica será listado sob o referido link simbólico em /dev/usb_port1 . O mesmo para o cartão SD e você deve ser resolvido.

O que está acontecendo é que verificamos as propriedades exclusivas da porta específica (as /dev/ parts) e, uma vez que essas correspondências adicionem ( == ), um novo symlink a += .

As informações sobre os atributos que você deseja corresponder podem ser recuperadas por meio de /dev/ (para um dispositivo udevadm info -a /dev/sdb1 ). Certifique-se de ter atributos de apenas um bloco de dispositivos pai, e esse deve ser o único que tem entradas exclusivas sdb1 e devpath - tente com algumas portas USB, se disponíveis, para ver quais mudam.

PS: KERNELS também permitirá executar um script ao conectar um dispositivo - pode ser útil para suas necessidades de backup. No entanto, eu não sei se a inicialização do seu sistema contará como plugando, então você terá que verificar o comportamento.

    
por 26.07.2016 / 15:46
1

Eu provavelmente usarei a resposta de Fiximan, mas, para fins de integridade, aqui está um script de exemplo que eu escrevi para montar o dispositivo que é menor em tamanho e ainda não está montado.

#!/bin/bash

output=$(lsblk -b -I 8 -i | grep "^[\'|]-sd.1" | awk '{print substr($1,3), $4, $7}')

cursize=999999999999999

while read dev size mountpath; do
        echo $dev :: $size :: $mountpath
        if [[ $size -lt $cursize && -z $mountpath ]]
        then
                cursize=$size;
                dev2mount=$dev;
        fi
done <<< "$output"

echo to mount: $dev2mount of $cursize size
    
por 26.07.2016 / 17:01