Nota:
- Este tutorial está disponible en un entorno de prácticas gratuitas proporcionado por Oracle.
- Utiliza valores de ejemplo para credenciales, arrendamiento y compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por valores específicos de su entorno en la nube.
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
- Detectar diferentes tipos de unidades systemd
- Usar unidades de destino systemd
- Descripción de la sintaxis común del comando systemctl
- Cree su propia unidad de temporizador systemd en el espacio de usuario
- Configurar systemd para permitir que los procesos de espacio de usuario se ejecuten después de la desconexión
¿Qué se necesita?
- Un sistema con Oracle Linux 8 instalado.
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.
-
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.
-
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.
-
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 funcionebasic.target
y también entra en conflicto con las unidadesrescue.service
yrescue.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.
-
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.
-
-
Cambie la unidad de destino por defecto.
-
Utilice el comando
systemctl set-default
para cambiar la unidad de destino predeterminada a la unidadgraphical.target
.systemctl set-default graphical.target
-
Utilice el comando
ls –l
para confirmar que el archivodefault.target
es ahora un enlace simbólico al archivographical.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.
-
-
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 ejecutardisplay-manager.service
para cargar la visualización gráfica, pero también ejecutamulti-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.
-
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.
-
Utilice el comando
systemctl status
para ver información detallada sobre la unidadnfs-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 servicionfs-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 servicionfs-server
está activado o desactivado. Con el servicio activado, el servicio se inicia al reiniciar el sistema.systemctl is-enabled nfs-server
-
-
Active un servicio para que se inicie al iniciar.
Utilice el comando
systemctl enable
para activar el servicionfs-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 destinomulti-user
.Utilice
systemctl status command
para confirmar que el servicionfs-server
ahora está activado y en ejecución.systemctl status nfs-server
-
Desactivar y parar un servicio.
Utilice el comando
systemctl disable
para desactivar el servicionfs-server
. Tenga en cuenta también que el comandosystemctl disable
suprime el enlace systemctl para el servicio.sudo systemctl disable nfs-server
Utilice el comando
systemctl stop
para parar el servicionfs-server
.sudo systemctl stop nfs-server
Puede combinar estos pasos mediante la opción
--now
al desactivar el servicio. -
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 servicionfs-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:
/usr/lib/systemd/user/
: unidades de espacio de usuario proporcionadas por los paquetes instalados$HOME/.local/share/systemd/user/
: unidades de espacio de usuario de paquetes instalados en el directorio raíz/etc/systemd/user/
: unidades de usuario globales del sistema que se deben ejecutar en el espacio de usuario para todos los usuarios$HOME/.config/systemd/user/
: unidades creadas por el usuario
Puede indicar a systemd que está trabajando en el espacio de usuario mediante la opción --user
para cualquier comando systemd.
-
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/
-
Cree un directorio para alojar sus propios archivos de unidad systemd.
mkdir -p $HOME/.config/systemd/user
-
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 entradaWants
define un requisito débil para una unidad de temporizador que aún no existe. Las unidades que se muestran como entradasWants
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íneaExecStart
, que especifica el comando que se ejecuta cuando se inicia el servicio. En este caso, el comandouptime
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 esWantedBy
'default.target'. Esto significa que el servicio está activado como parte del destino por defecto para este usuario. -
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 comandojournalctl
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.
-
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ónWants
y la unidad no se ejecuta si no se cumple el requisito.La sección
Timer
define que carga la unidaduptime.service
mediante una entradaOnCalendar
. La entradaOnCalendar
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. -
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
-
Enumere las unidades para comprobar que se están ejecutando las unidades
uptime.service
yuptime.timer
.systemctl --user list-units
-
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.
-
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
-
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
.
-
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ónKillUserProcesses
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ónKillUserProcesses
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
- Documentación de Systemd: https://systemd.io/
- Página manual
systemd(1)
- Página manual
systemctl(1)
- Página manual
journalctl(1)
- Página manual
systemd.unit(5)
- Página manual
logind.conf(5)
- Oracle Linux 8: Gestión de la configuración del sistema básico
- Documentación de Oracle Linux
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.