systemd erros quando dois dispositivos compartilham o mesmo ponto de montagem

1

Acabei de atualizar e instalar uma carga inteira de pacotes debian e agora estou recebendo erros devido a minha configuração particular do arquivo fstab. Eu tenho 2 drives que nunca montei simultaneamente e ambos têm o mesmo ponto de montagem ( /etc/fstab snippet):

UUID=xxxx-xxxx /media/strontium vfat user,rw,exec,nofail 0 2                    
UUID=yyyy-yyyy /media/strontium vfat user,rw,exec,nofail 0 2

No entanto, após as instalações, o systemd está reclamando sobre isso:

[518052.191024] systemd-fstab-generator[28811]: Failed to create mount unit file /run/systemd/generator/media-strontium.mount, as it already exists. Duplicate entry in /etc/fstab?

Na verdade, não quero usar o systemd para montar unidades para mim. Eu usei anteriormente sudo mount -a e isso acabou de passar pelo meu arquivo /etc/fstab e montou qualquer coisa que estivesse conectada.

É possível desativar a funcionalidade de montagem do systemd para que eu possa montar meus próprios drives manualmente como antes?

    
por mulllhausen 22.10.2016 / 04:00

1 resposta

4

Eu não sei de qualquer maneira em torno desta restrição systemd, como o nome do diretório do ponto de montagem é convertido em um nome de arquivo systemd. A resposta mais simples pode ser remover as entradas do fstab e escrever um pequeno script para fazer as montagens sob demanda:

#!/bin/bash
( mount -U xxxx-xxxx /media/strontium -t vfat -o rw,exec ||
  mount -U yyyy-yyyy /media/strontium -t vfat -o rw,exec
) && echo ok

Não se esqueça, depois de modificar /etc/fstab , para fazer um sudo systemctl daemon-reload para garantir que o systemd perceba suas alterações.

Se você quiser manter as entradas em /etc/fstab , você pode usar para fazer o segundo ponto de montagem um link simbólico para o primeiro, por exemplo, ln -s /media/strontium /media/strontium2 . Quando a montagem é feita, o link é seguido para que termine no diretório como de costume. Você deve adicionar a opção noauto a ambas as linhas neste caso, senão o systemd ficará confuso e desmontará imediatamente o que acha ser a primeira entrada.

Em vez de um link simbólico, você pode usar um diretório real e, em seguida, fazer um bind mount manual para montar o diretório no local desejado:

mount --bind /media/strontium2 /media/strontium

Você deve se lembrar de desmontar essa montagem de ligação, assim como a primeira montagem.

No passado, você poderia ter adicionado uma regra do udev para chamar o mount explicitamente quando o UUID aparecer, por exemplo, em /etc/udev/rules.d/92-my.rules :

ACTION=="add", ENV{ID_FS_UUID}=="xxxx-xxxx", RUN+="/usr/bin/mount /dev/%k /media/strontium"

mas isso não funciona com os systemd's recentes, pois ele executa udevd em um espaço de nomes de montagem separado, por isso, embora faça a montagem, não é possível vê-lo. Eu ainda não sei o motivo deste namespace, mas você pode, em princípio substituir esse recurso criando um arquivo /etc/systemd/system/systemd-udevd.service com as 2 linhas

.include /usr/lib/systemd/system/systemd-udevd.service
MountFlags=shared 

Se você quer algo que ainda é automático, uma alternativa é monitorar os eventos de udevd sobre dispositivos de bloco e fazer uma montagem explícita. Por exemplo, execute permanentemente:

#!/bin/bash
# udevadm monitor outputs a stanza ending with a blank line
#  UDEV  [5291328.3] add  /devices/pci0000:00/.../usb3/..../block/sdd (block)
#  ACTION=add
#  DEVNAME=/dev/sdd
stdbuf -o L udevadm monitor -u -p -s 'block/disk' |
awk -F= '
$0~/^ACTION=/{ action = $2 }
$0~/^DEVNAME=/{ name = $2 }
$0~/^ID_FS_UUID=/{ uuid = $2 }
$0~/^$/{ if(action=="add" && (uuid=="xxxx-xxxx"||uuid=="yyyy-yyyy")
          system("sudo mount mount " name " /media/strontium -t vfat -o rw,exec")
         uuid=""
       }'
    
por 22.10.2016 / 20:34

Tags