Tutorial de introducción a Systemd: Parte práctica
Tutorial introductorio a Systemd: Parte de comandos 1. Origen II. Resumen de Systemd Tres, gestión del sistema. 3.1 systemctl 3.2 systemd-analyze 3.3 hostnamectl 3.4 localectl 3.5 timedatectl 3.6 loginctl cuatro, unidad 4.1 Significado Estado de la unidad 4.2 4.3 Gestión de Unidad 4.4 Relaciones de dependencia Cinco, el archivo de configuración de Unit. 5.1 Resumen 5.2 Estado del archivo de configuración 5.3 Formato del archivo de configuración 5.4 Bloques de configuración del archivo Seis, Objetivo Siete, gestión de registros. Información del documento
Autor: Ruan Yifeng
Fecha: 7 de marzo de 2016
Systemd es una herramienta del sistema Linux utilizada para iniciar. proceso de supervisión se ha convertido en la configuración estándar de la mayoría de las distribuciones.
Este artículo presenta su uso básico, dividido en dos partes. Hoy se introducen sus comandos principales. Siguiente artículo. Introducir cómo se utiliza en la práctica.
A lo largo de la historia,
El arranque de Linux
siempre adoptando
init
Proceso.
El siguiente comando se utiliza para iniciar el servicio.
xxxxxxxxxx
$ sudo /etc/init.d/apache2 start
# O o
$ service apache2 start
Este método tiene dos desventajas.
Uno es el largo tiempo de inicio.
init
Los procesos se inician de manera secuencial; solo se inicia el siguiente proceso una vez que el anterior ha finalizado.
En segundo lugar, el script de inicio es complejo.
init
El proceso solo ejecuta el script de inicio, sin preocuparse por otras cosas. El script necesita manejar diversas situaciones por sí mismo, lo que a menudo hace que el script sea muy largo.
Systemd nació para resolver estos problemas. Su objetivo de diseño es proporcionar una solución completa para el arranque y la gestión del sistema.
Según la convención de Linux, la letra
d
Es la abreviatura de "daemon". El significado del nombre Systemd es que debe cuidar todo el sistema.
(La imagen de arriba es del autor de Systemd) Lennart Poettering )
Si se utiliza Systemd, no es necesario usar más.
init
Systemd reemplazó a
initd
se convierte en el primer proceso del sistema (PID igual a 1), y los otros procesos son sus procesos.
xxxxxxxxxx
$ systemctl --version
El comando anterior muestra la versión de Systemd.
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的 Filosofía de Unix
(La imagen de arriba es el diagrama de arquitectura de Systemd)
Systemd no es un comando, sino un conjunto de comandos que abarca todos los aspectos de la gestión del sistema.
systemctl
Es el comando principal de Systemd, utilizado para gestionar el sistema.
xxxxxxxxxx
# Reiniciar el sistema
$ sudo systemctl reboot
# Apagar el sistema, desconectar la alimentación
$ sudo systemctl poweroff
# La CPU ha dejado de funcionar
$ sudo systemctl halt
# Pausar el sistema
$ sudo systemctl suspend
# Poner el sistema en estado de hibernación
$ sudo systemctl hibernate
# Poner el sistema en estado de suspensión interactiva
$ sudo systemctl hybrid-sleep
# Iniciar en modo de rescate (modo de un solo usuario)
$ sudo systemctl rescue
systemd-analyze
El comando se utiliza para ver el tiempo de arranque.
xxxxxxxxxx
# Ver el tiempo de inicio
$ systemd-analyze
# Ver el tiempo de inicio de cada servicio
$ systemd-analyze blame
# Mostrar el flujo del proceso de inicio en forma de cascada
$ systemd-analyze critical-chain
# Mostrar el flujo de inicio del servicio especificado
$ systemd-analyze critical-chain atd.service
hostnamectl
El comando se utiliza para ver la información del host actual.
xxxxxxxxxx
# Mostrar información del host actual
$ hostnamectl
# Establecer el nombre del host.
$ sudo hostnamectl set-hostname rhel7
localectl
El comando se utiliza para ver la configuración de localización.
xxxxxxxxxx
# Ver la configuración de localización
$ localectl
# Configurar parámetros de localización.
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
El comando se utiliza para ver la configuración de la zona horaria actual.
# Ver la configuración actual de la zona horaria
$ timedatectl
# Mostrar todas las zonas horarias disponibles
$ timedatectl list-timezones
# Establecer la zona horaria actual
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
El comando se utiliza para ver los usuarios actualmente conectados.
xxxxxxxxxx
# Listar la sesión actual
$ loginctl list-sessions
# Listar los usuarios que han iniciado sesión actualmente
$ loginctl list-users
# Listar la información del usuario especificado.
$ loginctl show-user ruanyf
Systemd puede gestionar todos los recursos del sistema. Los diferentes recursos se denominan en conjunto Unidades.
La unidad se divide en un total de 12 tipos.
systemctl list-units
El comando puede mostrar todas las unidades del sistema actual.
xxxxxxxxxx
# Listar las unidades en ejecución
$ systemctl list-units
# Enumera todas las unidades, incluidas las que no tienen archivo de configuración o que han fallado al iniciar.
$ systemctl list-units --all
# Enumera todas las unidades que no están en funcionamiento.
$ systemctl list-units --all --state=inactive
# Lista todas las unidades que fallaron al cargar
$ systemctl list-units --failed
# Enumera todas las unidades de tipo service que están en ejecución.
$ systemctl list-units --type=service
systemctl status
El comando se utiliza para ver el estado del sistema y el estado de una unidad individual.
xxxxxxxxxx
# Mostrar el estado del sistema
$ systemctl status
# Mostrar el estado de una unidad individual
$ sysystemctl status bluetooth.service
# Mostrar el estado de una unidad en un host remoto
$ systemctl -H root@rhel7.example.com status httpd.service
excepto
status
orden,
systemctl
También se proporcionaron tres métodos simples para consultar el estado, principalmente para su uso en declaraciones de juicio internas del script.
xxxxxxxxxx
# Mostrar si una unidad está en funcionamiento.
$ systemctl is-active application.service
# Mostrar si una unidad está en estado de fallo al iniciar
$ systemctl is-failed application.service
# Mostrar si un servicio de Unit ha establecido un enlace de inicio.
$ systemctl is-enabled application.service
Para los usuarios, los comandos más utilizados son los siguientes, que se utilizan para iniciar y detener unidades (principalmente servicios).
xxxxxxxxxx
# Iniciar un servicio de inmediato
$ sudo systemctl start apache.service
# Detener un servicio de inmediato
$ sudo systemctl stop apache.service
# Reiniciar un servicio
$ sudo systemctl restart apache.service
# Matar todos los subprocesos de un servicio
$ sudo systemctl kill apache.service
# Recargar el archivo de configuración de un servicio
$ sudo systemctl reload apache.service
# Recargar todos los archivos de configuración modificados
$ sudo systemctl daemon-reload
# Mostrar todos los parámetros subyacentes de una unidad.
$ systemctl show httpd.service
# Mostrar el valor de un atributo específico de una unidad
$ systemctl show -p CPUShares httpd.service
# Establecer propiedades específicas de una unidad
$ sudo systemctl set-property httpd.service CPUShares=500
Existen relaciones de dependencia entre las unidades: si A depende de B, significa que Systemd iniciará B al mismo tiempo que inicia A.
systemctl list-dependencies
Ordena listar todas las dependencias de una unidad.
xxxxxxxxxx
$ systemctl list-dependencies nginx.service
En la salida del comando anterior, algunas dependencias son del tipo Target (ver más abajo), que por defecto no se mostrarán. Si deseas expandir Target, necesitas usar
--all
Parámetro.
xxxxxxxxxx
$ systemctl list-dependencies --all nginx.service
Cada unidad tiene un archivo de configuración que indica a Systemd cómo iniciar esa unidad.
El directorio predeterminado de Systemd
/etc/systemd/system/
Leer el archivo de configuración. Sin embargo, la mayoría de los archivos almacenados en él son enlaces simbólicos que apuntan a directorios.
/usr/lib/systemd/system/
El archivo de configuración real se encuentra en ese directorio.
systemctl enable
El comando se utiliza para establecer una relación de enlace simbólico entre los dos directorios mencionados.
xxxxxxxxxx
$ sudo systemctl enable clamd@scan.service
# Equivalente a
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
si el archivo de configuración está configurado para iniciar al arrancar,
systemctl enable
El comando equivale a activar el inicio automático.
correspondientemente,
systemctl disable
El comando se utiliza para revocar la relación de enlace simbólico entre dos directorios, lo que equivale a desactivar el inicio automático.
xxxxxxxxxx
$ sudo systemctl disable clamd@scan.service
La extensión del archivo de configuración es el tipo de esa Unidad, por ejemplo,
sshd.socket
Si se omite, la extensión predeterminada de Systemd es.
.service
por lo tanto
sshd
será entendido como
sshd.service
。
systemctl list-unit-files
El comando se utiliza para listar todos los archivos de configuración.
xxxxxxxxxx
# Listar todos los archivos de configuración
$ systemctl list-unit-files
# Listar archivos de configuración de tipo específico
$ systemctl list-unit-files --type=service
Este comando generará una lista.
xxxxxxxxxx
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
Esta lista muestra el estado de cada perfil, que puede ser de cuatro tipos.
[Install]
Parte (no se puede ejecutar), solo puede actuar como una dependencia de otros archivos de configuración.
Nota: No se puede determinar desde el estado del archivo de configuración si esta unidad está en funcionamiento. Esto debe realizarse según lo mencionado anteriormente.
systemctl status
Orden.
xxxxxxxxxx
$ systemctl status bluetooth.service
Una vez que se modifique el archivo de configuración, es necesario hacer que SystemD recargue el archivo de configuración y luego reiniciarlo; de lo contrario, los cambios no tendrán efecto.
xxxxxxxxxx
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
El archivo de configuración es un archivo de texto común que se puede abrir con un editor de texto.
systemctl cat
El comando puede ver el contenido del archivo de configuración.
xxxxxxxxxx
$ systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
A partir de la salida anterior, se puede ver que el archivo de configuración se divide en varios bloques. La primera línea de cada bloque se representa con un nombre distintivo entre corchetes, como por ejemplo.
[Unit]
Nota: los nombres de los bloques y los nombres de los campos en el archivo de configuración son sensibles a mayúsculas y minúsculas.
Dentro de cada bloque hay pares clave-valor conectados por signos de igual.
xxxxxxxxxx
[Section]
Directive1=value
Directive2=value
. . .
[Unit]
El bloque de configuración suele ser el primer bloque del archivo de configuración, utilizado para definir los metadatos de la Unidad y las relaciones con otras Unidades. Sus principales campos son los siguientes.
Dsecription
Descripción breve
Documentation
Dirección del documento
Requires
La unidad actual depende de otras unidades, y si estas no están en funcionamiento, la unidad actual no podrá iniciarse.
Wants
: Las otras unidades que trabajan en conjunto con la unidad actual no harán que la unidad actual falle al iniciar si no están en funcionamiento.
BindsTo
y
Requires
De manera similar, si la Unidad especificada sale, provocará que la Unidad actual deje de funcionar.
Before
Si la unidad especificada por este campo también debe iniciarse, debe iniciarse después de la unidad actual.
After
Si la unidad especificada en este campo también debe iniciarse, debe iniciarse antes de la unidad actual.
Conflicts
La Unidad especificada aquí no puede ejecutarse al mismo tiempo que la Unidad actual.
Condition...
Las condiciones que deben cumplirse para que la unidad funcione actualmente, de lo contrario no se ejecutará.
Assert...
Las condiciones que debe cumplir la unidad en funcionamiento, de lo contrario se informará un error de inicio.
[Install]
Normalmente es el último bloque del archivo de configuración, utilizado para definir cómo iniciar y si se debe iniciar al encender el equipo. Sus campos principales son los siguientes.
WantedBy
Su valor es uno o más Targets, y cuando la Unidad está activada (enable), el enlace simbólico se colocará.
/etc/systemd/system
Bajo el índice, con
Nombre del objetivo +
.wants
en el subdirectorio formado por el sufijo
RequiredBy
Su valor es uno o más Target, cuando la Unidad actual está activada, el enlace simbólico se coloca en.
/etc/systemd/system
Bajo el índice, con
Nombre del objetivo +
.required
en el subdirectorio formado por el sufijo
Alias
Alias que se puede usar para iniciar la unidad actual.
Also
Cuando la unidad está activada (enable), se activarán simultáneamente otras unidades.
[Service]
El bloque de configuración para el Service, solo está presente en las unidades de tipo Service. Sus principales campos son los siguientes.
Type
Define el comportamiento del proceso al iniciar. Tiene los siguientes valores.
Type=simple
Valor predeterminado, ejecutar.
ExecStart
Comando designado, iniciar el proceso principal.
Type=forking
Se crea un proceso hijo desde el proceso padre de manera fork, y después de la creación, el proceso padre se cerrará inmediatamente.
Type=oneshot
Proceso de una sola vez, Systemd esperará a que el servicio actual salga antes de continuar con la ejecución.
Type=dbus
El servicio actual se inicia a través de D-Bus.
Type=notify
El servicio actual se ha iniciado y se notificará.
Systemd
Continuar ejecutando.
Type=idle
Si hay otras tareas que se han completado, el servicio actual solo se ejecutará entonces.
ExecStart
: Comando para iniciar el servicio actual.
ExecStartPre
Comando que se ejecuta antes de iniciar el servicio actual.
ExecStartPost
Comando que se ejecuta después de iniciar el servicio actual.
ExecReload
Comando ejecutado al reiniciar el servicio actual.
ExecStop
Comando ejecutado al detener el servicio actual.
ExecStopPost
: Detener el comando que se ejecuta después de su servicio.
RestartSec
Intervalo de segundos para reiniciar automáticamente el servicio actual.
Restart
Definir en qué situaciones Systemd reiniciará automáticamente el servicio actual, los valores posibles incluyen:
always
(Siempre reiniciando)
on-success
、
on-failure
、
on-abnormal
、
on-abort
、
on-watchdog
TimeoutSec
Definir el número de segundos que Systemd espera antes de detener el servicio actual.
Environment
: Establecer variable de entorno
Para la lista completa de campos de configuración de la unidad, consulte. documentación oficial
Al iniciar la computadora, es necesario activar una gran cantidad de unidades. Si cada vez que se inicia hay que especificar cuáles unidades se necesitan, resulta evidentemente muy incómodo. La solución de Systemd es el Target.
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
tradicional
init
En el modo de inicio, existe el concepto de RunLevel, que tiene una función similar a la de Target. La diferencia es que el RunLevel es excluyente, no es posible que se inicien múltiples RunLevel al mismo tiempo, mientras que múltiples Target pueden iniciarse simultáneamente.
xxxxxxxxxx
# Ver todos los Target del sistema actual
$ systemctl list-unit-files --type=target
# Ver todas las Unidades que contiene un Target
$ systemctl list-dependencies multi-user.target
# Ver el Target predeterminado al iniciar
$ systemctl get-default
# Establecer el Target predeterminado al iniciar
$ sudo systemctl set-default multi-user.target
Al cambiar de objetivo, no se cierran por defecto los procesos iniciados por el objetivo anterior.
El comando # systemctl isolate cambia este comportamiento.
# Cerrar todos los procesos en el Target anterior que no pertenecen al Target siguiente.
$ sudo systemctl isolate multi-user.target
La correspondencia entre Target y los niveles de ejecución tradicionales es la siguiente.
xxxxxxxxxx
Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
Lo tiene con
init
Las principales diferencias entre los procesos son las siguientes.
(1) Nivel de ejecución predeterminado
(en)
/etc/inittab
La configuración del archivo) ahora ha sido reemplazada por el Target predeterminado, la ubicación es
/etc/systemd/system/default.target
, normalmente el enlace simbólico a
graphical.target
(interfaz gráfica) o
multi-user.target
(Interfaz de línea de comandos multiusuario).
(2) Ubicación del script de inicio
antes era
/etc/init.d
Directorio, enlaces simbólicos a diferentes directorios de RunLevel (por ejemplo,
/etc/rc3.d
、
/etc/rc5.d
ahora se almacena en
/lib/systemd/system
y
/etc/systemd/system
Índice.
(3) Ubicación del archivo de configuración
antes
init
El archivo de configuración del proceso es
/etc/inittab
Los archivos de configuración de varios servicios se almacenan en
/etc/sysconfig
Directorio. Los archivos de configuración actuales se almacenan principalmente en
/lib/systemd
Índice, en
/etc/systemd
Las modificaciones en el directorio pueden sobrescribir la configuración original.
Systemd gestiona de manera unificada los registros de inicio de todas las unidades. La ventaja de esto es que se puede utilizar únicamente
journalctl
Un comando para ver todos los registros (registros del núcleo y registros de aplicaciones). El archivo de configuración de los registros es
/etc/systemd/journald.conf
。
journalctl
Es potente y tiene muchas aplicaciones.
# Ver todos los registros (por defecto, solo se guardan los registros de este inicio)
$ sudo journalctl
# Ver los registros del kernel (sin mostrar los registros de aplicaciones)
$ sudo journalctl -k
# Ver los registros del inicio del sistema esta vez.
$ sudo journalctl -b
$ sudo journalctl -b -0
# Ver los registros de inicio anteriores (se requieren cambios en la configuración)
$ sudo journalctl -b -1
# Ver los registros de un tiempo específico
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# Mostrar las últimas 10 líneas del registro en la parte inferior
$ sudo journalctl -n
# Mostrar las líneas de registro especificadas al final
$ sudo journalctl -n 20
# Mostrar los últimos registros en tiempo real
$ sudo journalctl -f
# Ver los registros del servicio especificado
$ sudo journalctl /usr/lib/systemd/systemd
# Ver los registros de un proceso específico
$ sudo journalctl _PID=1
# Ver los registros del script en una ruta específica
$ sudo journalctl /usr/bin/bash
# Ver los registros de un usuario específico
$ sudo journalctl _UID=33 --since today
# Ver los registros de una unidad específica
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# Mostrar en tiempo real los últimos registros de una unidad
$ sudo journalctl -u nginx.service -f
# Combinar y mostrar los registros de múltiples Unidades
$ journalctl -u nginx.service -u php-fpm.service --since today
# Ver los registros de la prioridad especificada (y niveles superiores), hay un total de 8 niveles.
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# La salida de registro se paginará por defecto, --no-pager cambiará a salida estándar normal.
$ sudo journalctl --no-pager
{"mensaje":"Salida en formato JSON (una línea)"}
$ sudo journalctl -b -u nginx.service -o json
```json
{
"mensaje": "La salida en formato JSON (multilínea) es más legible."
}
```
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# Mostrar el espacio en disco ocupado por los registros
$ sudo journalctl --disk-usage
# Especificar el espacio máximo que puede ocupar el archivo de registro
$ sudo journalctl --vacuum-size=1G
# Especificar cuánto tiempo se debe guardar el archivo de registro.
$ sudo journalctl --vacuum-time=1years
(Fin)
Recientemente has utilizado: