Montando dispositivos alternativos (com diferentes opções de montagem) no mesmo ponto de montagem

5

Eu tenho um servidor (rodando o Ubuntu 14.04) que tem um compartimento de unidade hot-swap. Eu normalmente uso a baia de hot-swap para montar um dos vários discos rígidos soltos em que eu transfiro grandes conjuntos de dados científicos. Alguns desses discos exigem diferentes opções de montagem (diferentes sistemas de arquivos, SSDs v HDDs etc.), que eu normalmente especificaria separadamente para cada UUID dentro de /etc/fstab .

Para simplificar alguns dos meus scripts para processamento em lote e fazer o backup desses dados, eu gostaria de configurar o servidor para sempre usar o mesmo ponto de montagem para qualquer um desses discos de hot-swap atualmente conectados. / p>

Eu tentei colocar algo assim no meu fstab :

UUID=<disk A>  /common_mount_point  ext4   defaults,discard,noatime  0 0
UUID=<disk B>  /common_mount_point  btrfs  defaults,compress=lzo     0 0    

Isso funciona bem quando quero montar o disco A, mas recebo um erro sempre que tento montar o disco B:

mount: special device UUID=<disk B> does not exist

O inverso acontece se eu trocar a ordem dessas duas linhas, então parece que mount apenas procura a primeira linha em fstab que se refere a esse ponto de montagem específico e lança um erro se o descritor do sistema de arquivos associado não pode ser encontrado.

Suponho que eu provavelmente poderia escrever um script para tentar sequencialmente montar vários UUIDs diferentes no mesmo ponto de montagem até que uma das operações de montagem seja bem-sucedida, mas eu esperava que houvesse uma solução mais elegante.

Atualização 1

Curiosamente, se eu chamar sudo mount -a em vez de mount /common_mount_point , enquanto ainda recebo a mensagem de erro de que o UUID do disco A não pode ser encontrado, ele consegue montar o disco B. Portanto, parece que mount -a tente várias entradas fstab com o mesmo ponto de montagem, mas prefiro não ter sudo para fazer isso funcionar.

Esse comportamento parece estar relacionado a esse bug reportado em mountall , que foi aparentemente corrigido em v2.50 . A versão mais recente no repositório Trusty ainda é 2.49, então vou ver se consigo encontrar um PPA que tenha a versão atualizada.

Atualização 2

Acontece que o erro em mountall era irrelevante, pois mountall é invocado apenas quando eu chamo mount -a em vez de mount /common_mount_point . Na verdade, eu já estava rodando mountall v2.53, de acordo com a saída de dpkg -s mountall (mesmo que mountall --version me dissesse que era v2.49). Isso supostamente explica o fato de que sudo mount -a realmente tenta várias linhas fstab que se referem ao mesmo ponto de montagem.

    
por ali_m 12.11.2014 / 22:28

1 resposta

3

Aproveite o udev para usar o mesmo nome de dispositivo

Em vez de listar UUIDs em /etc/fstab , você poderia listar um nome de dispositivo e configurar o udev para usar o mesmo nome de dispositivo para todos esses dispositivos. Coloque uma linha como essa em um arquivo em /etc/udev/rules.d :

KERNEL=="sd*", ATTRS{serial}=="123456798", NAME="one_of_my_disks%n"

ou

KERNEL=="sd*", ATTRS{serial}=="123456798", SYMLINK+="one_of_my_disks%n"

Execute udevadm info -a -n sdb para ver quais atributos do disco (como ATTRS{serial}=="123456798" no exemplo acima) você pode comparar. Observe que você só pode usar vários atributos, mas todos eles precisam ser da mesma seção.

Em seguida, em /etc/fstab , use /dev/one_of_my_disks como o dispositivo de bloco.

Se seus discos tiverem layouts diferentes, isso é mais complicado. Você pode usar auto para o tipo de sistema de arquivos; isso deve funcionar mais do tipo. Se você precisar de diferentes números de partição ou opções de montagem, no entanto, você precisará de diferentes entradas fstab. Você pode contornar isso editando fstab rapidamente através de um script chamado pela entrada do udev, que será executada quando o disco for detectado pelo sistema. Por exemplo, use a seguinte regra do udev:

KERNEL=="sd*", ATTRS{serial}=="123456798", ENV{FSTAB4}="compress=lzo", NAME="one_of_my_disks%n", RUN+="/usr/local/sbin/fstab_update_my_disk"

e o seguinte script fstab_update_my_disk (não testado):

#!/bin/sh
/usr/bin/sed -i -e '/^\/dev\/one_of_my_disks1/ s/\([^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*[^ \t][^ \t]*[ \t][ \t]*\)[^ \t][^ \t]*/'"$FSTAB4"'/'

Aproveite o udev para não se importar com o ponto de montagem

Outra abordagem seria manter entradas fstab separadas, com nomes de dispositivos distintos e pontos de montagem distintos. Mas use um gancho udev RUN para atualizar um link simbólico que aponta para o ponto de montagem.

KERNEL=="sd*", ATTRS{serial}=="123456798", RUN+="/bin/ln -snf /media/disk1 /media/one_of_my_disks"
    
por 13.11.2014 / 03:05