erros do systemd quando dois dispositivos compartilham o mesmo ponto de montagem

erros do systemd quando dois dispositivos compartilham o mesmo ponto de montagem

Acabei de atualizar e instalar um monte de pacotes debian e agora estou recebendo erros devido à configuração específica do meu arquivo fstab. Tenho 2 unidades que nunca monto simultaneamente e que possuem o mesmo ponto de montagem ( /etc/fstabsnippet):

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

Porém, após as instalações, o systemd está reclamando disso:

[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 -ae isso apenas passou pelo meu /etc/fstabarquivo e montou tudo o que estava conectado.

É possível desligar a funcionalidade de montagem do systemd para que eu possa montar minhas próprias unidades manualmente como antes?

Responder1

De qualquer forma, não sei sobre essa restrição do systemd, pois o nome do diretório do ponto de montagem é convertido em um nome de arquivo do 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, após modificar /etc/fstab, de fazer um sudo systemctl daemon-reloadpara garantir que o systemd perceba suas alterações.


Se você quiser manter as entradas, /etc/fstabvocê pode fazer do segundo ponto de montagem um link simbólico para o primeiro, por exemplo ln -s /media/strontium /media/strontium2. Quando a montagem é concluída, o link é seguido para que acabe no diretório normalmente. Você deve adicionar opção noautoa ambas as linhas neste caso, caso contrário o systemd ficará confuso e desmontará imediatamente o que pensa ser a primeira entrada.

Em vez de um link simbólico você pode usar um diretório real e depois fazer um manualmontar montagempara montar esse diretório no local desejado:

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

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


No passado, você poderia ter adicionado uma regra udev para chamar mount explicitamente quando você visse 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 systemds recentes, pois ele é executado udevdem um namespace de montagem separado, portanto, embora faça a montagem, você não pode vê-lo. Ainda não sei o motivo desse namespace, mas você pode, em princípio, substituir esse recurso criando um arquivo /etc/systemd/system/systemd-udevd.servicecom 2 linhas

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

Se você quiser algo que ainda seja automático, uma alternativa é monitorar os eventos relativos udevdaos 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=""
       }'

informação relacionada