En Aprender a amar systemd , el primer artículo de esta serie, analicé las funciones y la arquitectura de systemd y la controversia en torno a su papel como reemplazo del antiguo programa de inicio SystemV y los scripts de inicio. En este segundo artículo, comenzaré a explorar los archivos y las herramientas que administran la secuencia de inicio de Linux. Explicaré la secuencia de inicio de systemd, cómo cambiar el destino de inicio predeterminado (nivel de ejecución en términos de SystemV) y cómo cambiar manualmente a un destino diferente sin tener que reiniciar.
También veré dos herramientas systemd importantes. El primero es el systemctl comando, que es el medio principal para interactuar y enviar comandos a systemd. El segundo es journalctl , que proporciona acceso a los diarios systemd que contienen grandes cantidades de datos del historial del sistema, como mensajes del kernel y del servicio (tanto informativos como de error).
Asegúrese de utilizar un sistema que no sea de producción para las pruebas y la experimentación en este y futuros artículos. Su sistema de prueba debe tener instalado un escritorio GUI (como Xfce, LXDE, Gnome, KDE u otro).
Escribí en mi artículo anterior que planeaba crear una unidad systemd y agregarla a la secuencia de inicio en este artículo. Debido a que este artículo se hizo más largo de lo que esperaba, lo guardaré para el próximo artículo de esta serie.
Explorando el inicio de Linux con systemd
Más sobre administradores de sistemas
- Habilitar el blog de administrador del sistema
- La empresa automatizada:una guía para administrar TI con automatización
- Libro electrónico:Automatización de Ansible para administradores de sistemas
- Historias del campo:una guía del administrador de sistemas para la automatización de TI
- eBook:Una guía de Kubernetes para SRE y administradores de sistemas
- Últimos artículos de administrador de sistemas
Antes de que pueda observar la secuencia de inicio, debe hacer un par de cosas para que las secuencias de inicio y de inicio estén abiertas y visibles. Normalmente, la mayoría de las distribuciones utilizan una animación de inicio o una pantalla de inicio para ocultar los mensajes detallados que, de otro modo, se mostrarían durante el inicio y el apagado de un host de Linux. Esto se llama la pantalla de inicio de Plymouth en las distribuciones basadas en Red Hat. Esos mensajes ocultos pueden proporcionar una gran cantidad de información sobre el inicio y el apagado a un administrador de sistemas que busca información para solucionar un error o simplemente aprender sobre la secuencia de inicio. Puede cambiar esto usando la configuración de GRUB (Grand Unified Boot Loader).
El archivo de configuración principal de GRUB es /boot/grub2/grub.cfg , pero debido a que este archivo se puede sobrescribir cuando se actualiza la versión del kernel, no desea cambiarlo. En su lugar, modifique el /etc/default/grub archivo, que se utiliza para modificar la configuración predeterminada de grub.cfg .
Comience mirando la versión actual sin modificar de /etc/default/grub archivo:
[root@testvm1 ~]# cd /etc/default ; cat grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
testvm1/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
[root@testvm1 default]#
El capítulo 6 de la documentación de GRUB contiene una lista de todas las entradas posibles en /etc/default/grub archivo, pero me concentro en lo siguiente:
- Cambio GRUB_TIMEOUT , la cantidad de segundos para la cuenta regresiva del menú de GRUB, de cinco a 10 para dar un poco más de tiempo para responder al menú de GRUB antes de que la cuenta regresiva llegue a cero.
- Elimino los dos últimos parámetros en GRUB_CMDLINE_LINUX , que enumera los parámetros de la línea de comandos que se pasan al kernel en el momento del arranque. Uno de estos parámetros, rhgb significa Red Hat Graphical Boot, y muestra la pequeña animación del ícono de Fedora durante la inicialización del kernel en lugar de mostrar mensajes de tiempo de arranque. El otro, el tranquilo parámetro, evita que se muestren los mensajes de inicio que documentan el progreso del inicio y cualquier error que ocurra. Elimino ambos rhgb y tranquilo porque los administradores de sistemas necesitan ver estos mensajes. Si algo sale mal durante el arranque, los mensajes que se muestran en la pantalla pueden señalar la causa del problema.
Después de realizar estos cambios, su archivo GRUB se verá así:
[root@testvm1 default]# cat grub
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
testvm1/usr"
GRUB_DISABLE_RECOVERY="false"
[root@testvm1 default]#
El grub2-mkconfig programa genera el grub.cfg archivo de configuración utilizando el contenido de /etc/default/grub para modificar algunas de las configuraciones predeterminadas de GRUB. El grub2-mkconfig el programa envía su salida a STDOUT . Tiene una -o opción que le permite especificar un archivo para enviar el flujo de datos, pero es tan fácil de usar como redirección. Ejecute el siguiente comando para actualizar /boot/grub2/grub.cfg archivo de configuración:
[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64
Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img
Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64
Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img
Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64
Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504
Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img
done
[root@testvm1 grub2]#
Reinicie su sistema de prueba para ver los mensajes de inicio que, de lo contrario, estarían ocultos detrás de la animación de inicio de Plymouth. Pero, ¿qué sucede si necesita ver los mensajes de inicio y no ha desactivado la animación de arranque de Plymouth? ¿O lo ha hecho, pero los mensajes pasan demasiado rápido para leerlos? (Lo que hacen.)
Hay un par de opciones, y ambas involucran archivos de registro y diarios systemd, que son tus amigos. Puedes usar el menos comando para ver el contenido de /var/log/messages expediente. Este archivo contiene mensajes de arranque e inicio, así como mensajes generados por el sistema operativo durante el funcionamiento normal. También puede usar el journalctl comando sin ninguna opción para ver el diario systemd, que contiene esencialmente la misma información:
[root@testvm1 grub2]# journalctl
-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. --
Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 ([email protected]) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct >
Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd>
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map:
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable
Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active
Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present.
Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles
Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor
Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable
<snip>
Trunqué este flujo de datos porque puede tener cientos de miles o incluso millones de líneas. (La lista de diarios en mi estación de trabajo principal tiene 1.188.482 líneas). Asegúrese de probar esto en su sistema de prueba. Si se ha estado ejecutando durante algún tiempo, incluso si se ha reiniciado muchas veces, se mostrarán grandes cantidades de datos. Explore los datos de este diario porque contiene mucha información que puede ser muy útil al realizar la determinación de problemas. Saber cómo se ven estos datos para un inicio y un inicio normales puede ayudarlo a localizar los problemas cuando ocurren.
Discutiré las revistas systemd, la journalctl comando y cómo clasificar todos esos datos para encontrar lo que desea con más detalle en un artículo futuro de esta serie.
Después de que GRUB cargue el kernel en la memoria, primero debe extraerse de la versión comprimida del archivo antes de que pueda realizar cualquier trabajo útil. Después de que el kernel se haya extraído y comenzado a ejecutarse, carga systemd y le entrega el control.
Este es el final del proceso de arranque. En este punto, el kernel de Linux y systemd se están ejecutando pero no pueden realizar ninguna tarea productiva para el usuario final porque no se está ejecutando nada más, no hay un shell para proporcionar una línea de comando, no hay procesos en segundo plano para administrar la red u otros enlaces de comunicación, y nada que permita a la computadora realizar alguna función productiva.
Systemd ahora puede cargar las unidades funcionales requeridas para llevar el sistema a un estado de ejecución objetivo seleccionado.
Objetivos
Un destino systemd representa el estado de ejecución actual o deseado de un sistema Linux. Al igual que los scripts de inicio de SystemV, los objetivos definen los servicios que deben estar presentes para que el sistema se ejecute y esté activo en ese estado. La Figura 1 muestra los posibles objetivos de estado de ejecución de un sistema Linux que usa systemd. Como se vio en el primer artículo de esta serie y en la página del manual de systemd bootup (man bootup), hay otros objetivos intermedios que se requieren para habilitar varios servicios necesarios. Estos pueden incluir swap.target , temporizadores.objetivo , local-fs.objetivo , y más. Algunos objetivos (como basic.target ) se utilizan como puntos de control para garantizar que todos los servicios necesarios estén en funcionamiento antes de pasar al siguiente nivel superior.
A menos que se cambie lo contrario en el momento del arranque en el menú de GRUB, systemd siempre inicia el default.target . El objetivo.predeterminado El archivo es un enlace simbólico al verdadero archivo de destino. Para una estación de trabajo de escritorio, normalmente será el graphical.target , que es equivalente al nivel de ejecución 5 en SystemV. Para un servidor, es más probable que el valor predeterminado sea multi-user.target , que es como el nivel de ejecución 3 en SystemV. El objetivo.de.emergencia El archivo es similar al modo de usuario único. Los objetivos y los servicios son unidades systemd.
La siguiente tabla, que incluí en el artículo anterior de esta serie, compara los objetivos de systemd con los antiguos niveles de ejecución de inicio de SystemV. Los alias de destino de systemd son proporcionados por systemd para compatibilidad con versiones anteriores. Los alias de destino permiten que los scripts y los administradores de sistemas usen comandos de SystemV como init 3 para cambiar los niveles de ejecución. Por supuesto, los comandos de SystemV se reenvían a systemd para su interpretación y ejecución.
objetivos systemd | Nivel de ejecución de SystemV | alias de destino | Descripción |
predeterminado.objetivo | Este objetivo siempre tiene un alias con un enlace simbólico a cualquiera de multi-user.target o objetivo.gráfico . systemd siempre usa el default.target para iniciar el sistema. El objetivo.predeterminado nunca debe tener un alias para halt.target , apagar.objetivo o reboot.target . | ||
objetivo.gráfico | 5 | runlevel5.objetivo | Objetivo.multiusuario con una GUI |
4 | runlevel4.objetivo | Sin usar. El nivel de ejecución 4 era idéntico al nivel de ejecución 3 en el mundo SystemV. Este objetivo podría crearse y personalizarse para iniciar servicios locales sin cambiar el multi-user.target predeterminado. . | |
multiusuario.objetivo | 3 | runlevel3.objetivo | Todos los servicios en ejecución, pero solo la interfaz de línea de comandos (CLI) |
2 | runlevel2.objetivo | Multiusuario, sin NFS, pero todos los demás servicios no GUI en ejecución | |
objetivo.rescate | 1 | nivel de ejecución1.objetivo | Un sistema básico, incluido el montaje de los sistemas de archivos con solo los servicios más básicos ejecutándose y un shell de rescate en la consola principal |
objetivo.de.emergencia | S | Modo de usuario único:no hay servicios en ejecución; los sistemas de archivos no están montados. Este es el nivel de operación más básico con solo un shell de emergencia ejecutándose en la consola principal para que el usuario interactúe con el sistema. | |
detener.objetivo | Detiene el sistema sin apagarlo | ||
reiniciar.objetivo | 6 | runlevel6.objetivo | Reiniciar |
apagar.objetivo | 0 | runlevel0.objetivo | Detiene el sistema y apaga la alimentación |