Explicando ao systemd que / var é um link simbólico para / home / var

2

Suponha uma instalação do Debian unstable, usando o systemd para init, com duas partições do sistema de arquivos, / e /home . Suponha ainda que, por motivos relacionados aos discos físicos, eu movimentei o conteúdo de /var para /home/var e substituí o diretório /var por um symlink apropriado. (Por favor, não tente me impedir de mover /var para a partição /home , ou transforme isso em um argumento systemd; -)

Com esta configuração, é necessário informar ao systemd que qualquer unidade que requer nada em /var não pode ser iniciada até que /home seja montado. O que eu sei ser quebrado (como ele tenta acessar um arquivo em /var/lib muito cedo na seqüência de inicialização) é systemd-random-seed.service , mas poderia facilmente haver qualquer número de outros que eu não tenha percebido ainda.

Qual é a melhor maneira de configurar a regra geral que "qualquer coisa que precise de algo de /var não pode ser iniciada até que /home seja montado"? Aceito uma resposta do formulário "adicionar Requires= e After= diretivas a cada arquivo de unidade afetado" somente se você puder demonstrar que não há alternativa superior.

A versão do systemd atualmente no Debian Unstable é 224.

    
por zwol 14.08.2015 / 20:17

2 respostas

3

Bem, o init não pode realmente saber por si mesmo quais arquivos um determinado serviço precisa, portanto, "este serviço usa dependências / var" ainda precisam ser declarados em algum lugar de qualquer maneira .

Claro, isso deve ser feito pelos desenvolvedores & Empacotadores, não por você. Por exemplo, o systemd-random-seed.service já mencionado tem todas as dependências necessárias:

$ systemctl cat systemd-random-seed
# /usr/lib/systemd/system/systemd-random-seed.service
#  This file is part of systemd.
...
DefaultDependencies=no
RequiresMountsFor=/var/lib/systemd/random-seed
...

Portanto, no seu caso, a "alternativa superior" é usar um bind mount no lugar do symlink. Isso se encaixará naturalmente nas dependências da unidade .mount do systemd, ao mesmo tempo em que fornece uma funcionalidade idêntica a um symlink.

Ou seja, se você tiver uma montagem de ligação em /var , todas as unidades que já dependem de var.mount dependerão automaticamente (indiretamente) de home.mount .

# /etc/fstab
/home/var  /var  none  bind  0  0

(Se isso não for aceitável, talvez compilar uma versão systemd personalizada com a dependência hackeada satisfaria melhor os seus 'requisitos'.)

Se algumas de suas unidades de serviço não tiverem dependências adequadas, é outra opção - você pode transformar /var em automount usando o suporte autofs4 do systemd.

Com montagens automáticas, qualquer processo que tente acessar arquivos em / var será bloqueado até que o sistema de arquivos seja montado. Assim, uma 'dependência' global é criada sem ter que editar unidades de serviço individuais.

Para isso, adicione a opção x-systemd.automount ao fstab. (Ou, se preferir var.mount over fstab, crie também um var.automount correspondente.)

# /etc/fstab
/home/var  /var  none  bind,x-systemd.automount  0  0

É claro que isso novamente requer que /var seja uma montagem de bind em vez de um symlink.

    
por 14.08.2015 / 20:58
0

Mais de um ano depois, com a versão do systemd (229) agora disponível no Ubuntu 16.04, há suporte na fstab para montagem de dependências como essa.

então é tão fácil quanto fazer isso.

# /etc/fstab
home/var /var x-systemd.requires=/home,x-systemd.automount,none bind 0 0

teve a ideia deste post link

    
por 20.11.2016 / 16:51