Como posso executar o comando na inicialização (alternativa rc.local) no Ubuntu 16.10

49

Estou configurando uma cota no meu servidor Linode executando o Ubuntu 16.10 e recebo o seguinte erro

Não é possível montar o dispositivo montado stat () / dev / root: esse arquivo ou diretório não existe

Então, para corrigir isso, cheguei a este segmento para a correção que é feita adicionando

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

para o /etc/rc.local. Mas o Ubuntu 16.10 não usa rc.localmais, em vez disso, usa systemd . Qual é a alternativa para rc.local: Como executar os comandos acima na inicialização?

Também habilitei o serviço usando, systemctl enable rc-local.servicemas não funcionou para mim. Qualquer vantagem seria apreciada.

Saurabh Sharma
fonte
di você o executou como root e reiniciou o sistema?
George Udosen
@George sim, eu fiz as duas coisas
Saurabh Sharma
tente isso #
407 George Udosen
@George Isso não funcionar tão bem
Saurabh Sharma
Acabei de ver esse hack, veja se ele voa ...
George Udosen

Respostas:

65

Introdução

Eu acho que você não deve criar um novo serviço, conforme sugerido no link por George. O rc-local.servicejá existe no systemd e o arquivo de serviço sugere que o rc.local, se existir e for executável, é puxado automaticamente para dentromulti-user.target . Portanto, não há necessidade de recriar ou forçar algo que é feito de outra maneira pelo systemd-rc-local-generator.

Uma solução

Uma solução rápida (não sei se essa é a maneira canônica):

Em um terminal, faça:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

Depois disso rc.local, será chamado na inicialização do sistema. Insira o que você deseja.

fundo

Se você faz em um terminal:

sudo systemctl edit --full rc-local

Você pode ver que o comentário principal contém linhas como:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Isso indica que, neste sistema, se houver um arquivo chamado /etc/rc.localexecutável, ele será automaticamente puxado para o multiusuário.target. Então você apenas cria o arquivo de acordo ( sudo touch...) e o torna executável ( sudo chmod +x ...).

Jan
fonte
4
#!/bin/bashPorém, não use , a #!/bin/shmenos que você realmente precise do bash em seu script. Todos os outros scripts do sistema usam o traço, não o bash, por motivos de desempenho.
Spikyjt # 25/18
"não há necessidade de recriar ou forçar algo que é feito de outra maneira pelo systemd-rc-local-generator" rc-localnão permite encomendá-lo depois de outra unidade, não é?
x-yuri
20

Eu vi essa solução sugerida, que envolve o uso de systemd aqui :

  1. Crie um serviço:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Adicione seu código lá:

    [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
    
  3. Crie e verifique se /etc/rc.localé executável e adicione este código dentro dele:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Habilite o serviço:

    sudo systemctl enable rc-local
    
  5. Inicie o serviço e verifique o status:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Se tudo correr bem, você pode adicioná code-lo ao /etc/rc.localarquivo e reiniciá-lo.

Nota: Testado no Lubuntu 16.10.

Fonte:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

George Udosen
fonte
Eu fiz todos os passos. Eu tenho o rc.local com: touch "hello"antes do exit 0. O serviço parece estar ativo, mas não cria nenhum arquivo no / etc / dir Rodando no ubuntu 16.04 Arabian 5.31
Danny182
Como a resposta de @Jan aponta, a criação de um serviço totalmente novo não é necessária, pois o systemd já suporta o rc.local.
TommyPeanuts
Obrigado youuuuuuuuuuuuuuuuuuuu, isso simplesmente funciona
GPrathap
2

Para adicionar à resposta de Jan que, diferentemente do rc.localarquivo usual , rc-local serviceé executado não depois que todos os serviços foram iniciados, mas depois que a rede fica on-line.

Em alguns casos, você pode querer executar comandos rc.localposteriormente. Por exemplo, eu queria que fosse executado após o lxdinício.

Nesse caso, você pode editar as rc-local servicedependências de inicialização criando um arquivo conf drop-in: /etc/systemd/system/rc-local.service.d/override.conf com o conteúdo:

[Unit]
After=network.target lxd.service

Onde você pode adicionar um nome de unidade necessário (como eu adicionei lxd.service)

Não se esqueça de systemctl daemon-reloaddepois disso.

user2586441
fonte
Bem-vindo ao Ask Ubuntu! Se você quiser melhorar outra resposta, sugira uma edição. Se você quiser apresentar uma alternativa parcial, repita ou cite as partes iguais (caso a resposta original mude) e destaque as diferenças. De qualquer forma, não crie uma nova resposta incompleta ! Obrigado.
David Foerster