systemd não executa /etc/rc.local?

11

Estou usando o Archlinux e comecei a tentar o systemd hoje em dia.

No entanto, descobri que o systemd não carrega meu script /etc/rc.local.

Como mencionado na página do Wiki, eu corri systemctl enable rc-local.service, mas isso não ajudou.

O conteúdo do meu arquivo /etc/rc.local é:

echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 250 > /sys/devices/platform/i8042/serio1/sensitivity
iptables --table nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

Alguma sugestão?

Felix Yan
fonte

Respostas:

15

O Arch pode não ter incluído o arquivo da unidade de serviço necessário para executar rc.local.

Basta criar um arquivo /etc/systemd/system/rc-local.servicecom o seguinte conteúdo (copiado literalmente do meu sistema systemd do Fedora):

# Este arquivo faz parte do systemd.
#
# systemd é um software livre; você pode redistribuí-lo e / ou modificá-lo
# sob os termos da Licença Pública Geral GNU, publicada por
# a Free Software Foundation; a versão 2 da licença ou
# (a seu critério) em qualquer versão posterior.

[Unidade]
Descrição = / etc / rc.local Compatibility
ConditionPathExists = / etc / rc.local

[Serviço]
Tipo = bifurcação
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = yes
SysVStartPriority = 99

Em seguida, basta executar systemctl enable rc-local.servicecomo root para habilitá-lo. Você também pode testá-lo / executá-lo agora executando systemctl start rc-local.service.

Patches
fonte
Esses dois arquivos já existem: /etc/systemd/system/multi-user.target.wants/rc-local.servicee /lib/systemd/system/rc-local.service
Felix Yan
2
Provavelmente está desativado então. Tente correr systemctl enable rc-local.service. Se você continuar tendo problemas, publique a saída de systemctl status rc-local.service.
Patches
5
Você não pode emitir "enable" na unidade que não possui seção Install; talvez este exemplo não funcione.
Lzap
11
Por outro lado, o arquivo (espero um link) multi-user.target.wantsé exatamente o que o habilita .
Pavel Šimerda
28

Com o systemd 188-2, o systemd reclama de não ter uma [Install]seção e, como tal, não conseguir ativar o serviço rc.local. Pode ter sido o caso de versões anteriores, mas desde que os desenvolvedores do Arch anunciaram recentemente o systemd se tornará o padrão, estou corrigindo meu sistema.

Para corrigir isso, basta adicionar uma seção para o destino multiusuário em /etc/systemd/system/rc-local.service:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

Crie o /etc/rc.localscript e torne-o executável comchmod +x /etc/rc.local

Borromini
fonte
11
Isso ocorre porque rc-local.servicenunca foi um serviço que foi ativado via, systemctl enablemas desde 2011 é um serviço ativado automaticamente por um gerador . No entanto, o Arch Linux, conforme explicado em unix.stackexchange.com/a/471871/5132 , não ativa as opções de compatibilidade com versões anteriores no systemd que fornecem o gerador em primeiro lugar.
JdeBP
2

Não se esqueça de tornar o rc.local executável - ou a camada de compatibilidade não o executará! Nos exemplos acima, listados - você executaria chmod a + x para tornar o arquivo rc.local executável. Do seguinte modo:

$ chmod a+X /etc/systemd/system/rc-local.service 

Eu acho que outro possível problema é a localização do seu script rc.local! Se você ainda não adicionou a compatibilidade ao systemd (que deve estar embutido - e parece já ter sido mencionado), talvez seja necessário verificar novamente a localização dos arquivos ... No meu sistema operacional, tenho rc-local em /etc/rc.d/rc.local, executei o seguinte:

$ sudo chmod a+x /etc/rc.d/rc.local
$ sudo systemctl restart rc-local.service
$ sudo systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
      Loaded: loaded (/lib/systemd/system/rc-local.service; static)
      Active: active (exited) since Fri, 13 Apr 2012 14:42:39 -0600; 3s ago
     Process: 2285 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/rc-local.service
Rio1
fonte
4
Não faz sentido tornar o systemdarquivo de serviço executável, como mostra seu primeiro trecho de código. Além disso, no Arch Linux, o caminho do arquivo é /etc/rc.local- talvez o conteúdo do systemdarquivo de serviço esteja incorreto.
RavuAlHemio
1

Duas dicas comuns:

  1. Não se esqueça de tornar /etc/rc.d/rc.localexecutável. Você pode usar

    # chmod a+rx /etc/rc.d/rc.local
    

    para torná-lo executável.

  2. Não se esqueça de colocar uma #!/bin/shlinha na primeira linha de /etc/rc.d/rc.local. Aqui está como as coisas devem ficar:

    #  head -1 /etc/rc.d/rc.local 
    #!/bin/sh
    # file /etc/rc.d/rc.local 
    /etc/rc.d/rc.local: POSIX shell script, ASCII text executable
    

    Se você não obtiver resultados semelhantes, edite /etc/rc.d/rc.localpara adicionar uma linha no topo contendo apenas #!/bin/sh.

DW
fonte
1

Se você tiver /etc/rc.localum arquivo executável, ele será puxado para o processo de inicialização por systemd-rc-local-generator/ rc-local.service.

Pelo menos /etc/rc.localé o caminho padrão usado, mas é definido pela distribuição. Porque é principalmente para compatibilidade com versões anteriores, e diferentes distribuições estavam usando caminhos diferentes. Por exemplo, no Fedora, o caminho é /etc/rc.d/rc.local. Você pode verificar o caminho da seguinte maneira:

$ systemctl cat rc-local.service
# /usr/lib/systemd/system/rc-local.service
# ...

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

Parece que isso não é muito conhecido. Existem várias postagens que mostram uma versão anterior do arquivo, que não possui esse comentário.

sourcejedi
fonte
11
Isso não é verdade. Conforme explicado em unix.stackexchange.com/a/471871/5132 , o Arch não usa os mecanismos de compatibilidade com versões anteriores e não possui esse gerador.
JdeBP