Systemd es un sistema de inicio y administrador de sistemas en sistemas Linux y es compatible con LSB y SysV. Puede usar systemd suite para administrar y optimizar los servicios y recursos de inicio del sistema en un sistema Linux. Es una herramienta práctica para que los administradores de sistemas pongan en marcha su sistema, optimicen procesos, depuren y resuelvan problemas de servicios del sistema.
Este artículo se basará en nuestra guía de la serie systemd e ilustrará cómo administrar unidades del sistema, montar sistemas de archivos, solucionar problemas y brindarle consejos y trucos cuando trabaje con sistemas.
Nuestra primera guía de systemd destacó por qué systemd es una herramienta práctica para los administradores de sistemas de Linux. El segundo ilustra cómo programar tareas del sistema con temporizadores systemd y automatizar las tediosas tareas de arranque del sistema.
Puesta en marcha de Linux
Como usuario retro de Linux, siempre existí (todavía existo) cuando el sistema Fedora arranca y páginas y páginas de mensajes de diagnóstico se desplazan antes de la solicitud de inicio de sesión. Estas páginas contienen información sobre los procesos de inicio, montajes de sistemas de archivos y mucho más. Para comprender cómo administrar y optimizar los servicios de puesta en marcha, echemos un vistazo rápido a lo que sucede entre el momento en que presiona el botón de encendido y el indicador de inicio de sesión.
Un proceso de inicio comienza con el inicio del hardware que inicializa el hardware del sistema, el inicio del sistema operativo que carga el Kernel, luego systemd y el inicio de Linux, donde systemd prepara los procesos del sistema. El proceso de puesta en marcha comienza cuando el Kernel transfiere el control del host al systemd. En este punto, un administrador de sistemas puede administrar servicios, unidades, sockets, activación de D-Bus, seguimiento de procesos, demonios y puntos de montaje del sistema de archivos.
Componentes de Systemd
Los siguientes son algunos componentes básicos del paquete de software systemd que puede usar para administrar el inicio de Linux.
- systemd-boot:un administrador de arranque UEFI.
- systemd-firstboot:administra la inicialización de la configuración básica del sistema antes del primer arranque.
- systemd-logind:una herramienta de gestión de sesiones.
- systemd-networkd:administrar configuraciones de red.
- systemd-sysusers:una herramienta para crear grupos de usuarios del sistema y agregar usuarios a grupos en el momento del arranque.
- systemd/Journal:administra el registro del sistema.
- systemd/Timers:temporizadores para controlar eventos o archivos .service.
Sistemactl
Para administrar systemd, use el comando systemctl, que utiliza la funcionalidad del servicio de SysVinit y chkconfig. Puede usarlo para administrar unidades del sistema que son representaciones de servicios y recursos del sistema.
# systemctl daemon-reload
Gestión de unidades Systemd
Las unidades en systemd pueden ser servicios (.service), puntos de montaje (.mount), dispositivos (.device) o sockets (.socket). Systemctl proporciona diferentes comandos para administrar unidades.
Utilice el siguiente comando para analizar el estado del sistema:
$ systemctl status #Show system status $ systemctl or #List running units $ systemctl list-units #List running units $ systemctl --failed #List failed units $ systemctl list-unit-files #List installed unit files1 $ systemctl status pid #Show process status for a PID
Utilice los siguientes comandos para comprobar el estado de la unidad:
$ systemctl help unit #Show a manual page associated with a unit $ systemctl status unit #Status of a unit $ systemctl is-enabled unit #Check whether a Unit is enabled
Usa los siguientes comandos para iniciar y recargar una unidad:
systemctl start unit #start a unit immediately systemctl stop unit #stop a unit immediately systemctl restart unit #restart a unit systemctl reload unit #reload a unit and configurations systemctl daemon-reload #reload systemd manager configuration
Use los siguientes comandos para enmascarar una Unidad:
systemctl mask unit #mask a Unit to make it impossible to start systemctl unmask unit #Unmask a unit
Usa los siguientes comandos para habilitar una unidad:
systemctl enable Unit #enable a Unit to start automatically at boot systemctl enable --now unit #enable a Unit to start automatically and immediately at boot systemctl disable unit #disable a Unit to no longer start at boot systemctl reenable unit #disable and enable anew
Edición de archivos de unidades
Linux carga archivos de Unidad desde múltiples ubicaciones en su sistema. Puede ejecutar el comando [systemctl show –property=UnitPath] para ver la lista completa.
- /usr/lib/systemd/system/:unidades proporcionadas por los paquetes instalados.
- /etc/systemd/system/:unidades instaladas por el administrador del sistema.
Ejemplo de archivo de unidad:
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=new dependency After=new dependency
Manejo de dependencias
Puede resolver las dependencias de la unidad diseñando correctamente los archivos de la unidad.
Por ejemplo, si la unidad A requiere que la unidad B se ejecute antes de que se inicie A. Luego, agregue Requires=B y After=B a la sección [Unidad] de A.
# /etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B
Si la dependencia es opcional, agregue Wants=B y After=B.
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B
Nota:Las dependencias se ubican en los servicios y no en los destinos.
Tipos de servicio
Puede establecer diferentes tipos de servicios de puesta en marcha en un archivo de servicio personalizado con el parámetro Tipo=en la sección [Servicio]:
/etc/systemd/system/unit.d/example_unit.conf [Unit] Requires=B After=B Wants=B [Service] Type=simple
- Type=simple (predeterminado):systemd considera que el servicio se inicia inmediatamente.
- Type=forking:systemd considera que el servicio se inició una vez que el proceso se bifurca y el padre ha salido.
- Type=oneshot:puede usarlo para secuencias de comandos que realizan un solo trabajo y luego salen. Puede configurar RemainAfterExit=yes para que systemd aún pueda considerar el servicio activo después de que el proceso haya finalizado.
- Type=idle:systemd retrasará la ejecución del servicio binario hasta que se envíen todos los trabajos.
- Type=notify:puede usarlo como Type=simple, pero el demonio le indicará al systemd cuando esté listo.
- Type=dbus:el servicio se considera listo cuando el BusName especificado aparece en el bus del sistema de DBus.
Archivos de unidad de reemplazo
Puede reemplazar un archivo de unidad en [/usr/lib/systemd/system/] creando un nuevo archivo de unidad con un nombre similar y volviendo a habilitar la Unidad para actualizar los enlaces simbólicos.
# systemctl reenable Unit
Alternativamente, puede ejecutar el comando [# systemctl edit –full Unit] que abre el archivo de la unidad en su editor y lo vuelve a cargar automáticamente cuando termina de editar.
# systemctl edit --full Unit
Archivos desplegables
Puede crear un archivo de unidad desplegable creando el directorio /etc/systemd/system/unit.d/ y colocando su nuevo archivo .conf. El archivo anulará o agregará nuevas opciones de configuración. systemd analizará y aplicará estos archivos sobre el archivo Unit original.
Como alternativa, ejecute el siguiente comando [# systemctl edit unit] para abrir el archivo /etc/systemd/system/unit.d/new_override.conf en un editor de texto y recargar automáticamente el archivo de la unidad.
Revertir cambios de un archivo de unidad
Use el siguiente comando para revertir cualquier cambio que haya realizado en una unidad usando el comando de edición systemctl.
# systemctl revert unit
Agregar dependencia adicional a una Unidad
/etc/systemd/system/unit.d/newcustomdependency.conf [Unit] Requires=new customdependency After=new customdependency
Administración de energía
Systemd proporciona diferentes comandos para reiniciar o apagar su sistema.
systemctl reboot #shut down and reboot the system systemctl poweroff #shut down and power-off the system systemctl suspend #suspend the system systemctl hibernate #put the system into hibernation systemctl hybrid-sleep #put the system into hybrid-sleep state
Montar sistemas de archivos y particiones
systemd está a cargo de montar las particiones y los sistemas de archivos especificados en /etc/fstab. Puede administrar o montar un sistema de archivos definiendo todos los parámetros necesarios en un archivo de unidad. Incluya detalles del sistema de archivos y el punto de montaje. Systemd le brinda más flexibilidad al trabajar con unidades de montaje. Utiliza el archivo /etc/fstab para la configuración y el montaje del sistema de archivos. El proceso implica el uso de la herramienta systemd-fstab-generator para crear unidades de montaje a partir de los datos del archivo fstab.
Crear una unidad de montaje systemd
La ilustración está en Fedora 33 ejecutando un sistema de archivos btrfs.
Verifique que tenga espacio libre en el grupo de volúmenes.
# lsblk
Lista de archivos de unidades de montaje disponibles:
[root@foss]# systemctl list-unit-files -t mount OR [root@foss]# systemctl status *mount
Cree un archivo de unidad systemd .mount:
Verifique el UUID del sistema de archivos usando el comando blkid.
[root@foss]# blkid /dev/sda2 /dev/sda2: LABEL="fedoraworkstation33" UUID="688a6af2-xxx-4da4-xxx-878c5b0f063b" UUID_SUB="690a86e7-yyyy-9a92-4bc6-49cca4yyyy8df" BLOCK_SIZE="4096" TYPE="btrfs" PARTUUID="0byyyb88-02"
Cree un nuevo archivo [var-lib-docker.mount] en el directorio etc/systemd/system. Agregue los datos de configuración a continuación. Tenga en cuenta que el nombre del archivo de la unidad y el punto de montaje deben ser idénticos.
# vi /etc/systemd/system/var-lib-docker.mount [Unit] Description=docker mount [Mount] What=/dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b Where=/var/lib/docker Type=btrfs Options=defaults [Install] WantedBy=multi-user.target
Tenga en cuenta que el argumento "qué" puede tomar UUID, ETIQUETA y ruta al disco.
La descripción en la sección [Unidad] proporciona el nombre del montaje, que se muestra con systemctl -t mount. Los datos de configuración en la sección [Mount] contienen los mismos datos en el archivo fstab.
Habilite la unidad de montaje para que se inicie después del arranque:
[root@foss]# systemctl enable var-lib-docker.mount Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-docker.mount → /etc/systemd/system/var-lib-docker.mount.
El comando crea un enlace simbólico en el directorio /etc/systemd/system, lo que permite montar la unidad de montaje en todos los arranques posteriores.
Inicie y monte el sistema de archivos:
# systemctl start var-lib-docker.mount
Verifique que el sistema de archivos se haya montado:
# systemctl status var-lib-docker.mount ● var-lib-docker.mount - Docker mount Loaded: loaded (/etc/systemd/system/var-lib-docker.mount; enabled; vendor preset: disabled) Active: inactive (dead) Where: /var/lib/docker What: /dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b
También puede modificar el archivo de la unidad de servicio de la ventana acoplable para asegurarse de que el servicio solo se inicie después de llamar al servicio de montaje.
# cat /usr/lib/systemd/system/docker.service [Unit] Description=docker service unit file After=network.target var-lib-docker.mount # Added mount unit for docker service to wait Requires=docker.socket
Reinicie y verifique el estado de la unidad de servicio de montaje.
# systemctl reboot # systemctl status var-lib-docker.mount
Compruebe el punto de montaje [var-lib-docker]:
# mount | grep var-lib-docker
Consejos y trucos
Ejecutar un servicio después de que la red esté activa
Puede retrasar el inicio de un servicio hasta que la red esté en funcionamiento agregando las siguientes dependencias a su archivo .service.
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target
Además, puede agregar nss-lookup.target si un servicio necesita realizar consultas de DNS.
/etc/systemd/system/test_foo.service [Unit] Wants=network-online.target After=network-online.target nss-lookup.target ...
Use el siguiente comando para verificar qué servicio está extrayendo nss-lookup.target.
# systemctl list-dependencies --reverse nss-lookup.target
Instalar las herramientas de configuración de la GUI de systemd
También puede trabajar con systemd utilizando las siguientes herramientas GUI.
- SystemdGenie:es una herramienta de administración de systemd basada en KDE.
- Systemadm:es un navegador gráfico para unidades systemd.
optimizaciones de systemd
Systemd ofrece tiempos de arranque rápidos de <2 s para entornos de escritorio actualizados. Sin embargo, podríamos optimizarlo aún más sin tener que escribir ningún código con los siguientes pasos:
- Primero, considere omitir el initrd si usa uno en su sistema.
- Considere deshabilitar SELinux y auditar agregando selinux=0 en la línea de comandos del kernel. Sin embargo, tenga en cuenta que los administradores de sistemas recomiendan dejar SElinux activado por razones de seguridad.
- Considere desinstalar Syslog y utilice journal en su lugar. Journal es la herramienta de registro predeterminada en los sistemas systemd más nuevos.
- Si la salida de su consola es lenta, use el indicador silencioso en la línea de comando y deshabilite el registro de depuración del sistema.
- Considere eliminar cron y use temporizadores systemd en su lugar.
- Utilice un entorno de escritorio moderno como GNOME 40 que no utiliza ConsoleKit.
- Verifique y deshabilite cualquier proceso o servicio de arranque innecesario. El arranque del sistema se vuelve más rápido si inicia menos procesos en el arranque.
- Deshágase de los servicios basados en shell, como los scripts de inicio de SysV, y reemplácelos con archivos unitarios.
- Evite usar Type=forking y ordenar dependencias. En su lugar, reemplácelos con activación de socket y Type=simple siempre que sea posible. Permitirá una puesta en marcha mejor paralelizada de los servicios.
Resolución de problemas
Investigar servicios fallidos
Use el siguiente comando para encontrar los servicios systemd que no pudieron iniciarse:
# systemctl --state=failed
Diagnóstico de un servicio
También puede obtener más información sobre la solución de problemas de un servicio configurando la variable de entorno SYSTEMD_LOG_LEVEL en depuración.
Por ejemplo, para ejecutar el demonio systemd-networkd en modo de depuración, agregue un archivo desplegable para el servicio y los siguientes configuraciones.
[Service] Environment=SYSTEMD_LOG_LEVEL=debug
Alternativamente, puede configurar la variable de entorno manualmente con el siguiente comando:
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd
Después de completar su configuración, reinicie el servicio y controle el diario del servicio con la opción -f/–follow para ver todos los registros.
Registros de Systemd
Los registros del sistema almacenan un historial de las actividades del sistema, como la hora de inicio, cuándo se iniciaron los servicios, los trabajos del sistema, los servicios en segundo plano, las actividades fallidas y mucho más. Systemd mantiene un "catálogo" de errores, mensajes, posibles soluciones y destaca contextos críticos en los mensajes de registro que podrían pasar desapercibidos. Puede revisar los registros de systemd con el comando journalctl.
$ journalctl --pager-end
La marca –pager-end inicia la revisión de su registro al final de la salida de journalctl.
Recursos adicionales
- Página de manual de Systemd.unit.
- Guía de sistemas del proyecto Fedora.
- Descripción de systemd de Freedesktop.org.
- Systemd ArchWiki.
Conclusión
systemd proporciona una forma robusta de administrar el inicio de Linux con unidades systemd. El artículo ha resaltado diferentes formas de usar el comando systemctl para editar archivos de unidades, administrar unidades systemd. Ha resaltado cómo crear una nueva unidad de montaje systemd para montar un nuevo sistema de archivos y permitir que se inicie durante el inicio. Finalmente, he compartido algunos consejos de optimización de systemd y cómo solucionar problemas de servicios fallidos.