Configure o serviço systemd para executar após a montagem do fstab

33

Eu estou trabalhando em um systemd .servicescript que é suposto começar após um local de rede CIFS é montado por meio /etc/fstabde /mnt/no boot-up.

O script espera que um script de dependência do OpenVPN seja iniciado primeiro, mas também quero que ele aguarde a conclusão da montagem.

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

Tentei adicionar systemd.mountà linha:, After=network.target vpn-launch.service systemd.mountmas não deu os resultados que eu esperava.

Winterflags
fonte
Funciona se você adicionar systemd-remount-fsà sua Afterlista?
Eric Renouf

Respostas:

40

um local de rede CIFS é montado por meio /etc/fstabde /mnt/no boot-up.

Não não é. Faça isso direito, e o resto se encaixa naturalmente.

A montagem é manipulada por uma unidade de montagem systemd (gerada) que será chamada de algo como mnt-wibble.mount. Você pode ver seu nome real na saída do systemctl list-units --type=mountcomando. Você pode ver em detalhes como qualquer outra unidade systemctl status.

Muito simplesmente, então: você precisa solicitar que sua unidade seja iniciada depois que a unidade de montagem for iniciada.

Depois = network.target vpn-launch.service mnt-wibble.mount

Leitura adicional

JdeBP
fonte
10
Listar montagens com "systemctl list-units --type = mount"
nijave
Para os seguidores, "wibble" é apenas um nome fictício, como "foobar"
rogerdpack
17

Desculpe, mas ainda não posso comentar.

Como o JdeBP disse, você deve solicitar o suporte do sistema de arquivos. Você pode prever o nome da unidade de montagem ou, alternativamente, pode usar (na seção da unidade):

RequirementsMountsFor = / absolute / path / of / mount

Esta opção cria as dependências para as unidades * .mount apropriadas para tornar o caminho acessível antes de iniciar o serviço. Pode não estar em todas as versões do systemd, mas eu tenho usado em uma máquina CentOS 7 nos últimos 6 meses.

miguelbernadi
fonte
(E suas diferenças do vanilla systemd estão aqui .) RequiresMountsFor=Vem com seu próprio conjunto de advertências. Com o bug do RedHat nº 1088057 e Chris Siebenmann em mãos, você deve responder a superuser.com/questions/988734 . Também é uma montagem CIFS nesta questão. Mas a implicação é que é auto, felizmente.
JdeBP
@JdeBP Obrigado pelo comentário. Eu não estava ciente das advertências e problemas desse recurso.
miguelbernadi
14

Embora ambas as respostas estejam corretas, quero acrescentar meus dois centavos à discussão, porque, quando a procurei, estava perdendo algumas instruções e exemplos de como proceder.

  1. Adicione o sistema de arquivos ao /etc/fstab
  2. Tipo mount -aque monta todos os sistemas de arquivos mencionados no fstab
  3. Procure a unidade systemd que foi gerada com:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (deve retornar algo que termina com .mount)
  4. Adicione a unidade de montagem encontrada à After=instrução no *.servicearquivo

Aqui está um exemplo de como iniciar o my-daemonserviço na inicialização, mas após a rede estar pronta, um compartilhamento CIFS é montado em /mnt/cifse o vpn-launchserviço foi iniciado:

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Nota: Você pode querer adicionar nofailàs suas opções fstab (por exemplo, ao usar uma unidade externa). Caso contrário, sua máquina não inicializará se o dispositivo não estiver conectado. Veja o artigo fstab do ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

Não se esqueça de ativar o serviço para que ele seja iniciado na inicialização: systemctl enable my-daemon

Observe que isso funciona para outros sistemas de arquivos (NFS, HDDs etc.) também.

Como já mencionado, ambas as respostas estão corretas e eu incentivo todos a lê-las, mas para mim alguns exemplos teriam me poupado algum tempo.

Atualização (25/06/2019):

  • adicionou uma observação sobre as opções do fstab para impedir o bloqueio de inicialização ao usar unidades externas
  • adicionado mnt-cifs.mountà Requires=lista que causa my-daemon.servicefalha na inicialização quando a montagem cifs não foi montada com sucesso
bm-bergmotte
fonte
Só para esclarecer, "mnt-cifs.mount" é o nome da unidade de montagem para o seu ponto de montagem específico systemctl list-units --type=mount?
smdvlpr 8/11
1

@ bm-bergmotte: obrigado pela sua instrução que me ajudou muito. Para mim está funcionando, se eu colocar

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Se eu não colocar "mnt-cifs.mount" dentro de "Requer" (e nesta ordem), ele funcionará para reinicialização / inicialização, mas o serviço será iniciado assim mesmo, se o dispositivo não estiver montado. Depois de colocá-lo adicionalmente dentro de "" Requer ", o serviço monta o dispositivo antes de iniciá-lo, se o dispositivo não estiver montado.

tmade
fonte
Você está certo. Se a montagem falhar, o my-daemon.service será iniciado de qualquer maneira. After=apenas dita a ordem. Requires=torna obrigatório que a montagem CIFs esteja presente (consulte a resposta de Sufiyan Ghori nessa). Vou atualizar minha resposta.
bm-bergmotte 25/06