¿Cómo se puede imprimir un registro para mostrarlo mientras se apaga, reinicia o inicia?

¿Cómo se puede imprimir un registro para mostrarlo mientras se apaga, reinicia o inicia?

Como todos sabemos, cuando reiniciamos, apagamos o iniciamos un sistema, se imprimirá algún mensaje en la pantalla, aquí una captura:

ingrese la descripción de la imagen aquí

Mi sistema es Ubuntu 16.04, sé que estos mensajes de registro anteriores provienen de systemd.

Según tengo entendido, un proceso de usuario normal puede imprimir cosas en la pantalla porque el sistema le proporciona tres descriptores de archivos: 0, 1 y 2. Podemos encontrarlos en /proc/<PID>/fd/. Aquí hay un ejemplo:

root@X86-Xenial-6:~# ls /proc/3467/fd
0  1  2  255

Es 3467un programa de hola mundo, no sé qué 225es, pero lo sé 0, 1y 2son entrada estándar, salida estándar y error estándar.

Entonces, tengo una pregunta: cuando el sistema comienza a apagarse, reiniciarse o iniciarse, el proceso de usuario no se ha creado o ha sido destruido, lo que significa que /proc/ya no existe, en este caso, 0y 1no 2existe. .

Entonces, ¿por qué el mensaje procedente de systemd se puede imprimir en la pantalla? El kernel podría imprimir cosas porque controla la pantalla inmediatamente, pero no creo que systemd pertenezca al kernel, entonces, ¿cómo podría imprimir cosas en la pantalla también? ¿Qué tipo de función o api se utiliza?

Respuesta1

El inicio y el apagado se realizan en gran medida en el espacio del usuario, no en el kernel. Tan pronto como el kernel termina de inicializarse, lo busca inity lo inicia, como un proceso normal, con los descriptores de archivos estándar apuntando a la consola. Entonces init(en su caso, el script initramfs y luego systemd) puede escribir en su salida estándar y todo lo que escriba aparecerá en la pantalla (o dondequiera que la salida de la consola esté configurada para aparecer). Este continúa siendo el caso hasta que el kernel se apaga o se reinicia, lo que ocurre después de que se cierra el espacio del usuario (y después de que todos los registros de apagado se hayan escrito en la consola).

Además, tenga en cuenta que /proces sólo un medio para acceder a cierta información mantenida por el núcleo; Esas piezas de información existen ya sea que /procestén montadas o no.

Tenga en cuenta también que

Como todos sabemos, cuando reiniciamos, apagamos o iniciamos un sistema, se imprimirá algún mensaje en la pantalla.

Esto no es necesariamente cierto: muchos sistemas ahora arrancan y se apagan sin mostrar registros, por lo que no podemos asumir que “todos lo sabemos”.

Respuesta2

Una respuesta breve, para aclarar algunos malentendidos.

  • El proceso se realiza en el espacio del usuario: específicamente initel primer proceso del usuario.
  • No necesita /proc para que existan descriptores de archivos. Si la única forma de acceder a los descriptores de archivos fuera a través de un archivo, ¿cómo accedería a un descriptor de archivo? (abriría el archivo y /procse le devolvería un descriptor de archivo, intentaría buscarlo en /procun descriptor de archivo…). /proces solo una vista, solo la necesitan los procesos que informan sobre otros procesos.
  • El descriptor de archivo 255 lsen su ejemplo es del directorio /proc/3467/fd: lstiene que abrir el directorio, por lo que esperamos un descriptor de archivo adicional. Tenemos uno extra, así que esto es lo que es.
  • /proc/fd/1etc apuntan a otros dispositivos. p.ej 1 -> /dev/pts/3. hacer unls -l /proc/self/fd
  • Cuando se inicia el kernel, initconectará su stdin, stdout, stderr a la pantalla (un dispositivo tty que se muestra en la pantalla) o a otro lugar.
  • inites el proceso 1(en su sistema systemd).

información relacionada