¿Cómo puedo ejecutar el comando al inicio (alternativa rc.local) en Ubuntu 16.10

49

Estoy configurando la cuota en mi servidor Linode con Ubuntu 16.10, y aparece el siguiente error

No se puede stat () dispositivo montado / dev / root: no existe tal archivo o directorio

Entonces, para solucionar esto, llegué a este hilo para la solución que se realiza agregando

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

a la /etc/rc.local. Pero Ubuntu 16.10 ya no usa rc.localsino que usa systemd . ¿Cuál es la alternativa para rc.local, cómo puedo ejecutar los comandos anteriores en el inicio?

También habilité el servicio usando systemctl enable rc-local.servicepero no funcionó para mí. Cualquier ventaja sería apreciada.

Saurabh Sharma
fuente
di lo ejecutó como root y reinició su sistema?
George Udosen
@George sí, hice ambas cosas
Saurabh Sharma
intente esto
George Udosen
@George Eso no funciona tan bien
Saurabh Sharma
Acabo de ver este truco, mira si vuela ...
George Udosen

Respuestas:

65

Introducción

Creo que no debería crear un nuevo servicio como lo sugiere George en el enlace. El rc-local.serviceya existe en systemd y el archivo de servicio sugiere que rc.local, si existe y es ejecutable, se extrae automáticamentemulti-user.target . Por lo tanto, no es necesario recrear o forzar algo que acaba de hacer de otra manera systemd-rc-local-generator.

Una solución

Una solución rápida (no sé si esa es la forma canónica):

En una terminal hacer:

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

Después de eso rc.local, se llamará al inicio del sistema. Inserta lo que quieras.

Antecedentes

Si lo haces en una terminal:

sudo systemctl edit --full rc-local

Puede ver que el comentario principal contiene líneas como:

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

Esto indica que en este sistema, si hay un archivo llamado /etc/rc.localque es ejecutable, entonces se extraerá en multiusuario.target automáticamente. Entonces solo crea el archivo correspondiente ( sudo touch...) y lo hace ejecutable ( sudo chmod +x ...).

ene
fuente
44
Sin #!/bin/bashembargo, no lo use , a #!/bin/shmenos que realmente necesite bash en su script. Todos los demás scripts del sistema usan guiones, no bash, por razones de rendimiento.
spikyjt
"no es necesario recrear o forzar algo que acaba de hacer de otra manera el systemd-rc-local-generator" rc-localno permite ordenarlo después de otra unidad, ¿no es así?
x-yuri
20

Vi esta solución sugerida que implica el uso de systemd aquí :

  1. Crea un servicio:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Agregue su código allí:

    [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. Cree y asegúrese de que /etc/rc.localsea ​​ejecutable y agregue este código dentro de él:

    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. Habilitar el servicio:

    sudo systemctl enable rc-local
    
  5. Inicie el servicio y verifique el estado:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Si todo va bien, puede agregar su codeal /etc/rc.localarchivo y luego reiniciarlo.

Nota: Probado en Lubuntu 16.10.

Fuente:

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

George Udosen
fuente
Hice todos los pasos. Tengo el rc.local con: touch "hello"antes del exit 0. El servicio parece estar activo pero no crea ningún archivo en el directorio / etc / Ejecutando en ubuntu 16.04 Arabian 5.31
Danny182
Como señala la respuesta de @Jan, no es necesario crear un servicio completamente nuevo ya que systemd ya admite rc.local.
TommyPeanuts
Graciasuuuuuuuuuuuuuuuuuuuu, esto simplemente funciona
GPrathap
2

Para agregar a la respuesta de Jan que, a diferencia del rc.localarchivo habitual , rc-local servicese ejecuta no después de que se hayan iniciado todos los servicios, sino después de que la red se conecte.

En algunos casos, es posible que desee ejecutar comandos desde rc.localmás adelante. Por ejemplo, quería que se ejecutara después del lxdinicio.

En este caso, puede editar rc-local servicelas dependencias de inicio creando un archivo conf desplegable: /etc/systemd/system/rc-local.service.d/override.conf con contenido:

[Unit]
After=network.target lxd.service

Donde puede agregar un nombre de unidad necesario (como agregué lxd.service)

No te olvides de systemctl daemon-reloaddespués de eso.

usuario2586441
fuente
Bienvenido a Ask Ubuntu! Si desea mejorar otra respuesta, sugiérale que la modifique. Si desea presentar una alternativa parcial, repita o cite las partes que son iguales (en caso de que cambie la respuesta original) y resalte las diferencias. En cualquier caso, ¡no cree una nueva respuesta incompleta ! Gracias.
David Foerster