lunes, 14 de mayo de 2018

¿Cómo activo /etc/rc.local con systemd en Ubuntu 18.04LTS?



Un sistema operativo ha de responder al mismo principio rector que tiene la política y que tiene la vida. Ha de mejorarse, idealmente de una manera concienzuda y escalonada, en pos de lograr la perfección en su funcionamiento y mejorar su andar.

La mayoría de los cambios suelen referirse a los aspectos "visibles" del sistema, pues - como en la política - son los que definen la preferencia del Pueblo, y son los que acarrean los votos a nuestras urnas. Estos cambios espectaculares promueven un mejor y más sencillo uso del sistema.
Sin embargo, en ciertas ocasiones también han de estudiarse y aplicarse cambios que hacen a la esquematización fundamental del sistema. Estos cambios internos raramente son percibidos por la Masa popular, pero han de llevarse a cabo a fin de afianzar los cimientos del sistema y permitir mas sólidos estructuras de software sin recurrir a andamiajes de "quita y pon" en la ingeniería de nuestro Software Libre.

Uno de estos elementos es systemd. Se trata - entre otras cosas - de un fundamental aplicativo orientado a la inicialización del sistema y sus servicios, y reemplaza a la veterana estructura de arranque que tenía GNU como sistema operativo, herederas ellas del Unix V y de las distribuciones de la universidad de Berkley (BSD). Con el tiempo muchas distribuciones de GNU con Linux han adoptado a systemd como estructura básica de arranque, y esto ha llevado a que cada vez más software de usuario (esto es, aplicaciones de uso), requieran de systemd, ya sea de forma parcial o total para su funcionamiento...
Esto podría provocar problemas con ciertas estrategias de inicio o ciertos programas que requieren de los esquemas anteriores. Uno de los más prominentes era el archivo de ejecución de inicio rc.local, al cual podríamos añorar como a una antigua novia tiratiros.
Vean señores, rc.local es un archivo de texto en el cual podíamos introducir comandos, los cuales se autoejecutarían con privilegio de administración al arrancar el sistema y antes de entregar control al usuario, omitiendo de esta forma tener que ejecutarlos posteriormente con privilegios de usuario reducidos. Por ejemplo, podíamos cargar módulos de hardware antiguo que no se detectaba automáticamente, por ejemplo placas sintonizadoras analógicas de radio FM o TV, y evitarle al usuario tener que escalar sus priviegios al de Conductor (o root) para hacerlo, con la incomodidad que ello significa y sobre todo, con el riesgo añadido a la seguridad intrínseca de nuestro sistema computado.

Pues bien, si ejecutamos una distribución de GNU con Linux que emplea el nuevo esquema Systemd para demonios de sistema (usualmente las más modernas), podríamos encontrarnos que el archivo clásico /etc/rc.local no se ejecuta ya durante el arranque de sistema.

Si tipeamos el siguiente comando en la terminal

sudo systemctl status rc-local

...el sistema podría devolvernos lo siguiente:


rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabl
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: failed (Result: exit-code) since Fri 2018-05-11 09:55:51 -03; 10h ago

 Process: 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
may 11 09:55:51 cgt systemd[1]: Starting /etc/rc.local Compatibility...
may 11 09:55:51 cgt systemd[1]: rc-local.service: Control process exited, code=exited
may 11 09:55:51 cgt systemd[1]: rc-local.service: Failed with result 'exit-code'.
may 11 09:55:51 cgt systemd[1]: Failed to start /etc/rc.local Compatibility.
may 11 20:23:06 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o
may 11 20:23:37 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o
may 11 20:24:21 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o


...lo cual nos indica que rc.local no está activo, y si intentamos activar /etc/rc.local para que se ejecute al inicio del sistema con el comando:

sudo systemctl enable rc-local

...podríamos obtener:

The unit files have no [Install] section. They are not meant to be enabled
 using systemctl.
 Possible reasons for having this kind of units are:
 1) A unit may be statically enabled by being symlinked from another unit's
 .wants/ or .requires/ directory.
 2) A unit's purpose may be to act as a helper for some other unit which has
 a requirement dependency on it.
 3) A unit may be started when needed via activation (socket, path, timer,
 D-Bus, udev, scripted systemctl call, ...).

Como vemos arriba, el archivo pertinente rc-local.service no tiene una sección [Install]. Como tal, Systemd no podrá activarla.

En vista de este problema, os explicaré de forma Justicialista cómo activar la ejecución de scripts desde /etc/rc.local al arranque del sistema.

Primero necesitamos crear un archivo. Lo haremos con el siguiente Comando de Organización:

sudo nano /etc/systemd/system/rc-local.service

Tras ingresar nuestra contraseña de Conductor, se utilizará el editor GNI Nano para crear dicho archivo, en blanco. Debemos pegarle el siguiente texto:

[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


Lo grabamos con Ctrl+o y salimos del editor con Ctrl+x.

Cuando regresemos a al prompt, debemos aseguramos de tener un archivo /etc/rc.local y que el mismo sea ejecutable. Para ello ingresamos:

sudo nano /etc/rc.local

Y le podríamos pegar el siguiente contenido básico:

#!/bin/sh -e
##
## Archivo /etc/rc.local
## Este script se ejecuta al final del runlevel multiusuario.
## Asegúrese que este script finalice con la línea "exit 0" si tiene éxito
## o en cualquier otro valor si tiene un error.
# Ingrese bajo esta línea lo que quiera ejecutar antes de dar inicio a los usuarios.

#----- fin del archivo ------
exit 0



Naturalmente podríamos agregar antes de en las líneas previas a exit 0 cualquier comando que necesitemos. Guardamos con Ctrl+o y salimos del editor con Ctrl+x. Ahora en la terminal haremos ejecutable al archivo rc.local con este comando:

sudo chmod +x /etc/rc.local

Conforme /etc/rc.local tenga la capacidad de ejecutarse, debemos activar el servicio que lo dispare al momento del arranque del sistema. Ahora esto se hace con:

sudo systemctl enable rc-local

Esto no nos devolverá nada en Ubuntu, aunque en otras distribuciones podría devolver:

Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /etc/systemd/system/rc-local.service.

Ahora iniciamos el servicio con:

sudo systemctl start rc-local.service

...y revisamos su status con:

sudo systemctl status rc-local.service

Debería devolvernos algo como:


 ● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabl
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (exited) since Fri 2018-05-11 20:25:16 -03; 10s ago
  Process: 14573 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)

may 11 20:25:16 cgt systemd[1]: Starting /etc/rc.local Compatibility...
may 11 20:25:16 cgt sudo[14576]:     root : TTY=unknown ; PWD=/dev/input ; USER=root ;
may 11 20:25:16 cgt sudo[14576]: pam_unix(sudo:session): session opened for user root
may 11 20:25:16 cgt sudo[14576]: pam_unix(sudo:session): session closed for user root
may 11 20:25:16 cgt systemd[1]: Started /etc/rc.local Compatibility.



Denotando ahora la ejecución y activación del viejo y veterano esquema rc.local, para felicidad del Pueblo y de los programas o esquemas que lo pudieran necesitar.

19 comentarios:

  1. EXcelente tutorial, me ha funcionado

    ResponderEliminar
  2. Me gusta la manera peronista de explicar estos temas. Gracias!

    ResponderEliminar
  3. Excelente data!!! muchas gracias... ahora te hago una consulta sino te molesta: es recomendable volver a habilitar el rc.local o hecho mano al systemd para correr script al iniciar linux?

    ResponderEliminar
    Respuestas
    1. Naturalmente, le recomendamos systemd para este menester siempre que pueda. En algunas ocasiones se debe usar el viejo sistema.
      Atte.

      Juan Perón

      Eliminar
  4. Hola compa;ero, me aparece el siguiente error, cuando inicio el servicio con sudo systemctl start rc-local.service, a que se puede deber>
    _Job for rc-local.service failed because the control process exited with error code.
    See "systemctl status rc-local.service" and "journalctl -xe" for details.

    ResponderEliminar
    Respuestas
    1. Me pasó algo parecido. Era porque YA TENÍA ESCRITO ALGO EN EL etc/rc.local
      Lo que hice fuer borrar eso y colocar el texto por defecto:

      #!/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

      Eliminar
    2. Estimado Nicolás:

      Eso indica un error en el archivo /etc/rc.local. Su sintaxis es específica. Asegúrese que el archivo comience con:

      #!/bin/sh -e

      y termine con:

      exit 0

      Atte,
      Juan Perón

      Eliminar
  5. Cuando hice esto, luego al reiniciar la maquina quedo colgada en el boot. Mostrando el logo de ubuntu y los ... que cambian de color.

    Veo un mensaje de [OK] con la leyenda... Started crash report

    ResponderEliminar
  6. Magnífico. Me ha funcionado a la primera.
    Señores ubunteros. No penseis que Ubuntu es superior en todo. CentOS trae rc.local.service de serie. Simplemente hay que instalar el paquete y a correr.

    ResponderEliminar
    Respuestas
    1. Estimado Anónimo:

      Naturalmente tal solución será adecuada en CentOS.

      A los muchachos le gusta ponerse calificativos. Los hay Ubunteros, los hay Debianeros, los hay CentOreros, los hay Archeros. Pero todos trabajan.

      Atte.

      Juan Perón

      Eliminar
  7. Estimado General, despues de iniciar el primer comando en vez de falied me sale esto an@esteban:~$ sudo systemctl status rc-local
    [sudo] contraseña para esteban:
    ● rc-local.service - /etc/rc.local Compatibility
    Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset:
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
    └─debian.conf
    Active: inactive (dead)
    Docs: man:systemd-rc-local-generator(8)
    lines 1-6/6 (END)

    creo que es el origen de que no pueda terminar bien la mision, no tengo apuro asi como comando bien agazapado en una casa de seguridad, espero confirmacion o nuevas intrucciones, saludos desde el centro del pais

    ResponderEliminar
    Respuestas
    1. Estimado Anónimo:

      Seguramente haya introducido algún comando dentro del rc.local que le provoca un error al ejecutarse. Asegúrese que las mismas se ejecuten bien. Si no tiene otra opción, péguele a /etc/rc.local el siguiente contenido básico y pelado, reinicie su sistema, y debería cargar bien.

      #!/bin/sh -e
      ## Los comandos de autoejecución van a partir de aquí:
      ## -- fin de comandos de autoejecución --
      exit 0

      Eliminar
  8. Muchas gracias Juan Domingo, impecable lo suyo

    ResponderEliminar
    Respuestas
    1. Estimado Marcelo:

      Hemos dado la lucha y seguiremos dándola, en todo tiempo y en todo lugar. Gracias al rc.local podrá con facilidad realizar propuestas de ejecución a la hora del arranque del sistema.

      Reciba un saludo,

      Juan Perón

      Eliminar
  9. Estimado Anónimo:

    Reciba un saludo muy afectuoso.

    ResponderEliminar
  10. muy poderoso. Muchas gracias por compartir esta info.

    ResponderEliminar
  11. Hola Juan.
    Excelente aporte, me ha sido muy util desde hace un par de años que encontre este articulo. Ahora tengo otro asunto entre manos, Se trata de que estoy buscando la forma de crear backup de todo mi ubuntu ya que mi priveedor no ofrece esta opcion desde el panel de control. He googleado y veo muchas opciones pero me gustaria saber que piensas sobre esto y/ó cual es tu mejor eleccion.
    Muchas gracias Juan

    ResponderEliminar
    Respuestas
    1. Estimado Manuel:

      Normalmente no querrías confiar en un proveedor por tus datos, no sólo porque no debes almacenar tus datos en computadoras ajenas, sino que en el momento que los necesites, estarás frente a un cuello de botella desesperante. A seguro se lo llevaron preso.

      Realiza respaldos locales siempre que sea posible.

      Delimta una política de respaldos según tus necesidades de acuerdo a la importancia y volúmen de los datos que manejes. Considera que el costo de discos rígidos es hoy ínfimo si lo comparas a la información que contienen.

      La información personal, y la laboral son las más importantes pues no podrás encontrarla en otro lado. De acuerdo a tus actividades, considera respaldos por triplicado o cuadruplicado de la misma. Evita servicios en computadoras ajenas (perniciosamente apodados "nube"), ya que no eres socio de Googl€, Amazon ni Appl€, sino su enemigo encarnizado en una lucha por la Liberación de tus datos y la de los tuyos.

      En ambientes de trabajo medio (una oficina) es simple armar un servidor RAID con cuatro discos grandes (ni siquiera tiene que ser un equipo nuevo). Estos equipos funcionando exclusivamente como centro de respaldo con Ubuntu se pagan solos.

      En caso personal, no hace falta tanto. Para respaldos personales puedes sobrevivir con rígidos mecánicos. Recicla esos antiguos discos de portátiles, de 320 y 500GB, junto a un par de cajas USB3 para discos rígidos y utilizalos para triplicar tu información personal cada 3 meses.

      En otros ambientes con un manejo de información mucho más dinámico esto podría ser insuficiente. En tal caso, los NAT es lo mejor.

      Eliminar