Nota:

Uso de systemd en Oracle Linux

Introducción

En este tutorial, aprenderá a utilizar la utilidad de línea de comandos systemctl para gestionar y ver las unidades systemd controladas por systemd. Este tutorial está dirigido a usuarios de Oracle Linux 8 o posterior.

systemd es el primer proceso que se inicia durante el inicio y es el proceso final para terminar en el cierre del sistema. systemd se utiliza principalmente para gestionar los servicios o procesos del sistema y la inicialización del sistema durante el inicio. Sin embargo, systemd también puede manejar muchas otras tareas y funciones, además de incluir registro de eventos, gestión de dispositivos, inicio de sesión de usuario, programación de tareas, sincronización de tiempo e inicio del sistema. Muchas características en systemd no se utilizan completamente ya que los usuarios pueden ser más cómodos con software alternativo para estos fines o diferentes distribuciones de Linux pueden tener enfoques preferidos para la configuración del sistema.

Los diferentes tipos de comportamiento o funciones dentro de systemd se manejan en unidades systemd. Por ejemplo, los procesos de daemon o los servicios del sistema se ejecutan como unidades de servicio, mientras que los estados del sistema se suelen definir como unidades de destino. Las unidades de temporizador se pueden definir para programar tareas de manera similar a como podría usar el servicio cron del sistema y se puede usar una unidad de montaje para configurar un punto de montaje de manera similar a como podría configurar un punto de montaje en la fstab del sistema.

systemd se utiliza para gestionar procesos y funciones de nivel de sistema, pero también puede gestionar procesos que se ejecutan en el espacio de usuario. Los usuarios de un sistema pueden configurar y gestionar sus propios servicios e incluso se puede configurar systemd para permitir que estos servicios continúen ejecutándose después de que el usuario haya finalizado su sesión.

Objetivos

¿Qué se necesita?

Nota: al utilizar el entorno de prácticas gratuitas, consulte Aspectos básicos del laboratorio de Oracle Linux para conocer la conexión y otras instrucciones de uso.

Explorar archivos de unidad systemd

Después de conectarse a la instancia de Oracle Linux 8, puede empezar a experimentar con el comando systemctl para obtener información sobre las diferentes unidades disponibles.

  1. Ejecute el comando systemctl para mostrar todas las unidades systemd cargadas actualmente por systemd:

    systemctl
    

    Utilice las teclas Space (Espacio) o PgDn del teclado para desplazarse por la salida.

    Este comando es equivalente a la ejecución:

    systemctl list-units
    

    La salida muestra todas las unidades de configuración activas actualmente que systemd gestiona. En la salida debe observar que hay unidades con nombre con diferentes sufijos, incluidas las unidades con nombre con los sufijos '.device', '.mount','.service', '.target' y '.timer'.

    Las unidades están activas en el sentido de que se inician, ejecutan, montan o conectan, según su finalidad. Las unidades pueden estar inactivas en el sentido de que se detienen, desmontan o desconectan. Si desea ver todas las unidades independientemente de si están activas o no, puede ejecutar:

    systemctl list-units --all
    

    La salida de estos comandos muestra una selección de los diferentes tipos de unidades systemd:

    • automount: proporciona capacidades de montaje automático para el montaje bajo demanda de sistemas de archivos y el inicio en paralelo.
    • mount: controla los puntos de montaje en la fecha y hora actuales del sistema de archivos.
    • path: puede activar servicios cuando cambia la información de ruta del sistema de archivos.
    • scope: es similar a las unidades de servicio, pero gestiona los procesos ajenos en lugar de iniciarlos.
    • service: inicia y controla los daemons y los procesos de los que constan.
    • slice: se utiliza para agrupar unidades que gestionan procesos del sistema, como unidades de servicio y unidades de ámbito, en el árbol jerárquico de cgroup con fines de gestión de recursos.
    • socket: encapsula la comunicación entre procesos (IPC) local o los sockets de red en el sistema, que son útiles para la activación basada en sockets.
    • target: se utiliza para agrupar unidades o para proporcionar puntos de sincronización conocidos durante el inicio.
    • timer: se utiliza para disparar la activación de otras unidades mediante temporizadores. Proporcionan una alternativa a las tareas que pueden haberse gestionado previamente mediante el servicio cron.
    • device: muestra los dispositivos del núcleo en systemd y también se puede utilizar para implementar la activación basada en dispositivos.
    • swap: encapsula particiones de intercambio de memoria o archivos de intercambio.
  2. Restrinja la lista de unidades a un tipo de unidad concreto mediante la opción --type.

    • Utilice el comando systemctl list-units --type services para mostrar las unidades de servicio activas actualmente en el sistema.

      systemctl list-units --type service
      
    • Vuelva a ejecutar el mismo comando, pero incluya la opción --all para ver todas las unidades cargadas, incluidas las que están inactivas, si las hay.

      systemctl list-units --type service --all
      

Puede repetir estos comandos para cada uno de los tipos de servicio disponibles, de modo que restrinja la información solo al tipo con el que está interesado en trabajar en cualquier momento.

Trabajar con unidades de destino programadas

Las unidades de destino se utilizan para agrupar diferentes unidades para llevar el sistema a un estado determinado de modo que esté listo para funcionar con un fin determinado.

  1. Enumere las unidades target disponibles.

    systemctl list-units --type target
    

    Las unidades pueden requerir que se carguen otras unidades o se pueden configurar para que entren en conflicto con unidades concretas. Por ejemplo, multi-user.target necesita que funcione basic.target y también entra en conflicto con las unidades rescue.service y rescue.target. Las unidades también especifican otras unidades que desean cargar para poder funcionar.

    De esta manera, los destinos se pueden encadenar juntos para configurar un estado particular, pero también son lo suficientemente modulares como para ser reutilizados para disparar un estado alternativo.

  2. Consulta de la unidad de destino por defecto.

    La unidad de destino predeterminada define el estado predeterminado del sistema después del inicio.

    • Utilice el comando systemctl get-default para ver qué unidad de destino se utiliza de forma predeterminada. La unidad de destino predeterminada está representada por el archivo /etc/systemd/system/default.target.

      systemctl get-default
      
    • Utilice el comando ls -l para mostrar información sobre el archivo /etc/systemd/system/default.target.

      ls -l /etc/systemd/system/default.target
      

      Nota: El archivo default.target es un enlace simbólico al archivo de unidad de destino predeterminado actual.

  3. Cambie la unidad de destino por defecto.

    • Utilice el comando systemctl set-default para cambiar la unidad de destino predeterminada a la unidad graphical.target.

      systemctl set-default graphical.target
      
    • Utilice el comando ls –l para confirmar que el archivo default.target es ahora un enlace simbólico al archivo graphical.target.

      ls -l /etc/systemd/system/default.target
      

      Nota: Al cambiar la unidad de destino por defecto, se elimina el enlace simbólico default.target existente y se vuelve a crear el enlace simbólico, que apunta a la nueva unidad de destino por defecto.

  4. Explore un destino para obtener más información.

    • Utilice el comando systemctl show para obtener más información sobre cualquier destino específico.

      systemctl show multi-user.target
      

      La salida muestra todos los parámetros del destino especificado. Tenga en cuenta que puede identificar las unidades que el destino necesita, desea y entra en conflicto y que también puede ver las unidades que este destino debe ejecutar antes y después.

    • Utilice el comando systemctl list-dependencies para mostrar el árbol de dependencias necesarias o deseadas para que un destino concreto alcance su estado:

      systemctl list-dependencies default.target
      

      Este comando muestra todas las unidades que se inician al iniciar el destino predeterminado. La cadena de unidades se presenta recursivamente en un árbol que hace posible evaluar completamente lo que consigue el objetivo cuando se inicia. Si ha definido graphical.target como destino predeterminado, puede ver que el sistema desea ejecutar display-manager.service para cargar la visualización gráfica, pero también ejecuta multi-user.target para hacer todo lo necesario antes de ejecutar la visualización gráfica.

Uso de systemctl para activar, desactivar y enmascarar unidades

Las unidades se pueden desactivar o activar y también se pueden enmascarar para que nunca se ejecuten bajo ninguna circunstancia. Algunas unidades son estáticas porque siempre están disponibles, generalmente porque son dependencias de otras unidades para trabajar. El comando systemctl list-units solo se puede utilizar para mostrar las unidades que están activas o inactivas en el sistema.

  1. Enumere todas las unidades disponibles en el sistema, junto con su estado:

    systemctl list-unit-files
    

    Muchas de las unidades disponibles son estáticas. Las unidades activadas comienzan en el momento del inicio. Las unidades desactivadas son unidades que están disponibles en el sistema pero que no están configuradas para iniciarse al iniciar. Las unidades enmascaradas están disponibles en el sistema, pero se han configurado de forma activa en un estado en el que no se pueden iniciar.

  2. Utilice el comando systemctl status para ver información detallada sobre la unidad nfs-server.service.

    systemctl status nfs-server.service
    

    El comando systemctl permite borrar la extensión .service al hacer referencia a las unidades de servicio.

    El comando de estado indica si una unidad está activada, activa, inactiva, desactivada o enmascarada.

    Para soluciones con secuencias de comandos, systemctl proporciona comandos cortos para mostrar el estado en una sola línea:

    • Utilice el comando systemctl is-active para comprobar si el servicio nfs-server se está ejecutando (activo) o no se está ejecutando (inactivo).

      systemctl is-active nfs-server
      
    • Utilice el comando systemctl is-enabled para comprobar si el servicio nfs-server está activado o desactivado. Con el servicio activado, el servicio se inicia al reiniciar el sistema.

      systemctl is-enabled nfs-server
      
  3. Active un servicio para que se inicie al iniciar.

    Utilice el comando systemctl enable para activar el servicio nfs-server.

    sudo systemctl enable --now nfs-server
    

    Debe ejecutar el comando systemctl con privilegios de administrador si el comando cambia el estado o la configuración del sistema. Puede utilizar la opción --now para iniciar adicionalmente el servicio al mismo tiempo que lo activa.

    Nota: El comando activa el servicio mediante la creación de un enlace simbólico para el destino de estado del sistema de nivel inferior en el que se inicia el servicio. En la salida, el comando creó el enlace simbólico nfs-server.service para el destino multi-user.

    Utilice systemctl status command para confirmar que el servicio nfs-server ahora está activado y en ejecución.

    systemctl status nfs-server
    
  4. Desactivar y parar un servicio.

    Utilice el comando systemctl disable para desactivar el servicio nfs-server. Tenga en cuenta también que el comando systemctl disable suprime el enlace systemctl para el servicio.

    sudo systemctl disable nfs-server
    

    Utilice el comando systemctl stop para parar el servicio nfs-server.

    sudo systemctl stop nfs-server
    

    Puede combinar estos pasos mediante la opción --now al desactivar el servicio.

  5. Enmascarar y desenmascarar una unidad.

    En algunos casos, puede que desee desactivar el inicio de unidades. Normalmente, puede hacerlo si una unidad concreta entra en conflicto con alguna otra funcionalidad del sistema o por un motivo de política.

    Utilice el comando systemctl mask para enmascarar el servicio nfs-server:

    sudo systemctl mask nfs-server
    

    Se crea un enlace simbólico para garantizar que la configuración de la unidad systemd apunte a /dev/null. Esto evita que el servicio se active o se inicie.

    Confirme que no puede iniciar la unidad nfs-server mientras está enmascarada:

    sudo systemctl start nfs-server
    

    El servicio no se puede iniciar y se devuelve un error para indicar que el servicio está enmascarado.

    Desenmascara la unidad para devolverla a su estado original y permitir que los usuarios inicien o activen el servicio.

    sudo systemctl unmask nfs-server
    

Configurar systemd para unidades de espacio de usuario

En general, systemd se utiliza para gestionar unidades a nivel de sistema. Los usuarios requieren acceso de nivel de administrador al sistema para gestionar las unidades systemd configuradas de esta manera. En algunos entornos y para algunos tipos de unidades, es posible que los usuarios deseen utilizar la capacidad de systemd para ejecutar unidades en el espacio del usuario. Por ejemplo, es posible que los usuarios deseen programar tareas mediante las capacidades de unidad de temporizador de systemd; o que los usuarios deseen ejecutar aplicaciones o servicios específicos como unidades de servicio que no deben requerir permiso de nivel raíz para ejecutarse.

systemd inicia un proceso systemd-user para un usuario al iniciar sesión. Las unidades ubicadas en los siguientes directorios se procesan en el siguiente orden para el usuario:

Puede indicar a systemd que está trabajando en el espacio de usuario mediante la opción --user para cualquier comando systemd.

  1. Enumere los archivos de unidad disponibles actualmente para el usuario.

    systemctl --user list-unit-files
    

    Tenga en cuenta que la lista de unidades disponibles es significativamente más corta que cuando emitió el mismo comando sin la opción --user.

    La mayoría de estos archivos de unidad, en un nuevo sistema, se encuentran en /usr/lib/systemd/user. Muestre los archivos de este directorio para ver las unidades que se encuentran aquí:

    ls -la /usr/lib/systemd/user/
    
  2. Cree un directorio para alojar sus propios archivos de unidad systemd.

    mkdir -p $HOME/.config/systemd/user
    
  3. Cree su propia unidad de servicio systemd.

    cat << EOF > $HOME/.config/systemd/user/uptime.service
    [Unit]
    Description="Logs system uptime and load average"
    Wants=uptime.timer
    
    [Service]
    ExecStart=/usr/bin/uptime
    
    [Install]
    WantedBy=default.target
    
    EOF
    

    Esta unidad de servicio proporciona tres secciones de configuración.

    La sección Unit proporciona una descripción para la unidad y los requisitos. En este caso, una entrada Wants define un requisito débil para una unidad de temporizador que aún no existe. Las unidades que se muestran como entradas Wants se ejecutan si están disponibles, pero no evitan que la unidad principal se ejecute si no se encuentran o no se ejecutan.

    La sección Service define el comportamiento de esta unidad de servicio específica cuando se ejecuta. Confiamos en muchos valores por defecto para las opciones disponibles aquí y solo especificamos la línea ExecStart, que especifica el comando que se ejecuta cuando se inicia el servicio. En este caso, el comando uptime se ejecuta para registrar el tiempo de actividad del sistema y los valores de carga.

    La sección Install define cómo se debe instalar el servicio en el sistema cuando está activado. De forma notable, el servicio se agrega como un servicio que es WantedBy 'default.target'. Esto significa que el servicio está activado como parte del destino por defecto para este usuario.

  4. Ejecute la unidad systemd y compruebe su salida.

    Como ha agregado una nueva unidad, suele ser una buena idea volver a cargar la configuración de systemd antes de intentar ejecutar el servicio:

    systemctl --user daemon-reload
    

    Ahora, inicie la nueva unidad.

    systemctl --user start uptime
    

    Compruebe que el comando se haya ejecutado como se esperaba. Puede comprobar que el servicio se ha ejecutado comprobando su estado:

    systemctl --user status uptime
    

    Nota: Estos comandos utilizan la opción --user para ejecutarse en el espacio de usuario.

    Para comprobar la salida del comando uptime que se ha ejecutado, utilice el comando journalctl para ver el log y especifique la opción de etiqueta para ver los logs específicos del comando:

    journalctl -t uptime
    

    Puede activar este servicio para que se inicie cuando el usuario se conecte por primera vez al sistema.

    systemctl --user enable uptime
    

    Tenga en cuenta que el servicio se ejecuta cuando el usuario inicia sesión por primera vez en el sistema. No se inicia automáticamente al iniciar el sistema. Normalmente, los servicios que se ejecutan en el espacio de usuario terminan después de que el usuario se desconecta o se terminan todas las sesiones de usuario. La activación de la persistencia para los servicios de usuario se trata más adelante en este tutorial.

Trabajar con unidades de temporizador systemd

En este ejercicio, se basa en el ejercicio anterior para crear y permitir que una unidad de temporizador ejecute regularmente otra unidad systemd en un momento o intervalo determinado. Las unidades de temporizador se pueden definir en el nivel de sistema y en el nivel de usuario, y se pueden utilizar para definir cuándo systemd debe ejecutar otra unidad. Las unidades de temporizador proporcionan control granular sobre eventos programados y pueden actuar como alternativa al uso del daemon cron para manejar configuraciones más sutiles.

Muchos servicios del sistema incluyen unidades de temporizador para controlar cuando se ejecutan. Se incluye un gran ejemplo de una unidad de temporizador en el paquete dnf-automatic que se puede utilizar para mantener el sistema actualizado cuando realiza actualizaciones regulares de dnf automáticamente. Para ver esto en acción en el nivel del sistema, instale el paquete y active la unidad de temporizador:

sudo dnf install -y dnf-automatic
sudo systemctl enable dnf-automatic.timer

Puede ver el archivo de unidad para ver cómo se configura esta unidad:

cat /usr/lib/systemd/system/dnf-automatic.timer

El contenido notable de esta unidad incluye una línea Wants que espera que se cumpla network-online.target. La entrada OnCalendar en la sección Timer de la configuración sugiere que esta acción se ejecuta diariamente en 06h00. También es de interés la entrada RandomizedDelaySec, que puede ayudar a evitar que las unidades de temporizador se disparen exactamente al mismo tiempo y que empujan la carga del sistema de repente.

El ejemplo que se proporciona aquí forma parte de un conjunto de unidades mucho más complejo. Para comprender mejor cómo funcionan las unidades de temporizador, agregue una unidad de temporizador en el espacio de usuario para programar el uptime.service que ha creado en el ejercicio anterior para que se ejecute en un intervalo normal.

  1. Cree un archivo de unidad de temporizador.

    cat <<EOF > $HOME/.config/systemd/user/uptime.timer
    [Unit]
    Description=Timer for the uptime service that logs uptime
    Requires=uptime.service
    
    [Timer]
    Unit=uptime.service
    OnCalendar=*-*-* *:*:00
    
    [Install]
    WantedBy=timers.target
    

    Este archivo especifica que se necesita uptime.service para que se ejecute esta unidad de temporizador. Se trata de un requisito mucho más fuerte que cualquier elemento definido en una definición Wants y la unidad no se ejecuta si no se cumple el requisito.

    La sección Timer define que carga la unidad uptime.service mediante una entrada OnCalendar. La entrada OnCalendar funciona de manera similar a las opciones de una definición crontab, pero proporciona más granularidad. En este caso, la unidad se define para ejecutarse cada minuto a los 00 segundos.

  2. Como modificó la configuración systemd, vuelva a cargar los daemons systemd y reinicie el servicio de tiempo de actividad para que pueda seleccionar la nueva unidad de temporizador:

    systemctl --user daemon-reload
    systemctl --user restart uptime
    
  3. Enumere las unidades para comprobar que se están ejecutando las unidades uptime.service y uptime.timer.

    systemctl --user list-units
    
  4. Controle la salida del log en el diario para ver la salida de tiempo de actividad disparada por el servicio de tiempo de actividad que se ejecuta cada minuto.

    journalctl -f -t uptime
    

    Después de un par de minutos, se deben haber mostrado varias líneas de salida. Si estaba prestando mucha atención, puede observar que el comando uptime no siempre se dispara exactamente en el minuto. Se trata de una función intencional dentro de la funcionalidad de temporizador systemd. Los trabajos de temporizador se disparan con un aleatorizador que puede permitir que una tarea se dispare con un retraso de hasta un minuto. Esto ayuda a evitar que todos los temporizadores se disparen exactamente al mismo tiempo. Puede forzar que un temporizador sea increíblemente preciso estableciendo la precisión en un nanosegundos del evento programado, agregando la siguiente entrada de configuración a la sección Timer de la unidad de temporizador:

    AccuracySec=1us
    

    Sin embargo, para la mayoría de las tareas, permitir un grado de inexactitud es razonable para evitar que las tareas se ejecuten de forma demasiado síncrona.

    Puede usar la combinación de teclas Ctrl-C para salir del asiento cuando haya terminado de supervisar.

Configurar procesos de espacio de usuario para continuar después de la desconexión

Por defecto, los servicios y procesos que se inician y son propiedad de un usuario terminan cuando el usuario se desconecta o cuando todas las sesiones del usuario han terminado. Hay varios métodos que puede utilizar para cambiar este comportamiento predeterminado dentro de systemd. Aquí se exploran dos opciones.

Utilice el comando loginctl para activar los usuarios de linger systemd.

El comando loginctl se puede utilizar para cambiar el comportamiento predeterminado de un usuario específico y para permitir que los procesos de ese usuario "linger" una vez finalizada la sesión del usuario.

  1. Use la utilidad loginctl para activar linger para un usuario específico. En esta instancia, active el comportamiento de linger systemd para el usuario 'oracle':

    sudo loginctl enable-linger oracle
    
  2. Para verificar que se aplica la configuración, compruebe si hay un archivo con el mismo nombre que el usuario en el directorio /var/lib/systemd/linger.

    ls /var/lib/systemd/linger/oracle
    

    El comando debe verificar que el archivo existe.

Editar el archivo systemd logind.conf

Systemd gestiona los eventos de inicio de sesión del usuario y proporciona un archivo de configuración que se puede editar para definir el comportamiento predeterminado para los diferentes eventos relacionados con la sesión del usuario. Este archivo de configuración se encuentra en /etc/systemd/logind.conf.

  1. Vuelque el contenido de la configuración existente en /etc/systemd/logind.conf a la pantalla para revisar:

    cat /etc/systemd/logind.conf
    

    La mayoría de las opciones se comentan, pero muestran los valores por defecto de tiempo de compilación. Hay tres opciones en este archivo que pueden controlar cómo systemd maneja los procesos que se ejecutan en el espacio de usuario cuando termina la sesión del usuario.

    • KillUserProcesses: esta opción puede controlar si los procesos de usuario se terminan por defecto cuando finaliza la sesión. La configuración de esta opción en 'no' permite que systemd ejecute procesos de usuario después de que cualquier usuario se desconecte del sistema.
    • KillExcludeUsers: si la opción KillUserProcesses está activada, esta opción permite especificar una lista separada por espacios de usuarios para los que systemd permite que los procesos continúen ejecutándose una vez finalizada la sesión. La agregación de un nombre de usuario a esta lista se comporta de manera similar a la agregación de un usuario al grupo linger systemd mediante el comando loginctl.
    • KillOnlyUsers: si la opción KillUserProcesses está desactivada, este parámetro se puede utilizar para especificar una lista separada por espacios de usuarios para los que se deben terminar los procesos después de la desconexión.

Demostración en vídeo

Las demostraciones de vídeo sobre systemd se proporcionan en https://www.youtube.com/watch?v=9uDvnZKhU8A y https://www.youtube.com/watch?v=Tkxs-wfZrnw si necesita más información sobre cómo trabajar con el systemd en Oracle Linux 8.

Administrador de servicio y sistema en Oracle Linux 8

Unidades de destino systemd en Oracle Linux 8

Más información

Más recursos de aprendizaje

Explore otras prácticas en docs.oracle.com/learn o acceda a contenido de aprendizaje más gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de formación de Oracle.

Para obtener documentación sobre los productos, visite Oracle Help Center.