Como obtenho o systemd para iniciar meu script de montagem do ZFS antes de fazer qualquer outra coisa?

7

Neste momento, estou usando o zfsonlinux no Fedora 19 e ele funciona de maneira excelente. A montagem funciona no bootup como planejado usando o initscript (incluído no zfs) que o systemd chama, mas há uma falha bastante significativa: o ZFS é montado de maneira muito lenta durante o boot, ao ponto que a transmissão e outros serviços são perdidos sem / zfs montado e não pode recuperar, portanto, não-los.

O que eu estou procurando é uma forma de obter o sistema para iniciar o script antes de fazer qualquer outra coisa. Eu sei como fazê-lo usando initscripts (basta configurá-lo para um runlevel mais baixo, digamos 2), mas não tenho a menor ideia quando se trata de fazer isso com o sistema de destino do systemd.

Eu tentei configurar coisas nos serviços que exigem que o zfs esteja ativo, mas isso não funciona, exceto Tipo = ocioso (mas deve haver uma maneira melhor de fazer isso independentemente):

Requires=network.target
After=zfs
Type=idle

E, para referência, aqui está o script de inicialização fornecido pelo Fedora . Devido à natureza de como o ZFS é montado no linux (?), Não posso simplesmente plotar uma entrada no fstab e terminar com ele, ele deve ser montado usando comandos.

    
por duck. 02.08.2013 / 00:27

2 respostas

1

systemd tem uma diretiva específica para este caso, chamada RequiredMountsFor ; veja man systemd.directives .

O uso seria RequiresMountsFor=[mountpoint] , por ex. RequiresMountsFor=/zfs .

A questão principal pode ser se você realmente precisa refletir uma condição "qualquer outra coisa", como seus estados Q. Eu acho que a idéia é usar essas dependências da maneira mais seletiva possível para suportar encontrar a seqüência ideal e a máxima paralelização.

    
por 09.11.2015 / 14:18
-1

Vou tentar responder da melhor maneira possível, não tão familiarizado com o systemd.

O script que é fornecido é apenas um padrão, então você sempre pode iniciá-lo com script_name start .

Pelo que vi nas páginas man do systemd, você pode definir dependências e a melhor delas seria usar Antes e Depois de alvos específicos. Observando os arquivos, há um alias do nível de execução 2 3 e 4 para ser sempre multiuser.target.

se você fizer o systemctl list-dependencies basic.target, você pode facilmente descobrir onde deseja que seu serviço seja iniciado.

[Unit]
Description=my Service
Before=basic.target 
After=local-fs.target

[Service]
Type=simple
ExecStart=/path/to/script start
ExecStop=/path/to/script stop

salve o arquivo /usr/lib/systemd/myservice.service. systemctl enable myservice.service.

    
por 05.08.2013 / 14:11