Как можно отобразить журнал печати во время выключения, перезагрузки или запуска?

Как можно отобразить журнал печати во время выключения, перезагрузки или запуска?

Как мы все знаем, когда мы перезагружаем, выключаем или запускаем систему, на экране появляется некоторое сообщение, вот фрагмент:

введите описание изображения здесь

Моя система — Ubuntu 16.04, я знаю, что эти сообщения журнала, указанные выше, исходят от systemd.

Насколько я понимаю, обычный пользовательский процесс может печатать что-то на экране, потому что система дает ему три файловых дескриптора: 0, 1 и 2. Мы можем найти их в /proc/<PID>/fd/. Вот пример:

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

Это 3467программа Hello World, я не знаю, что 225это, но я знаю, что это 0, 1и 2есть стандартный ввод, стандартный вывод и стандартная ошибка.

Итак, у меня возник вопрос: когда система начинает завершать работу, перезагружаться или запускаться, пользовательский процесс не создается или уничтожается, что означает, что он /proc/больше не существует, в данном случае 0, 1и 2не существует.

Так почему сообщение, приходящее от systemd, может быть выведено на экран? Ядро может печатать, потому что оно управляет экраном немедленно, но я не думаю, что systemd принадлежит ядру, так как же оно может печатать что-то на экране? Какая функция или API используется?

решение1

Запуск и завершение работы в основном выполняются в пользовательском пространстве, а не ядром. Как только ядро ​​завершает инициализацию, оно ищет initи запускает его как обычный процесс со стандартными файловыми дескрипторами, указывающими на консоль. Таким образом init(в вашем случае скрипт initramfs, а затем systemd) может писать в свой стандартный вывод, и все, что он пишет, будет отображаться на экране (или там, где настроен вывод консоли). Это продолжается до тех пор, пока ядро ​​не выключится или не перезагрузится, что происходит после выключения пользовательского пространства (и после того, как все журналы выключения будут записаны на консоль).

Кстати, отметим, что /procэто всего лишь средство доступа к определенным фрагментам информации, поддерживаемым ядром; эти фрагменты информации существуют независимо от того, /procсмонтировано оно или нет.

Обратите внимание также, что

Как мы все знаем, когда мы перезагружаем, выключаем или запускаем систему, на экране появляется какое-то сообщение.

не обязательно так — многие системы теперь загружаются и выключаются, не отображая журналы, поэтому мы не можем предполагать, что «мы все знаем».

решение2

Короткий ответ, чтобы прояснить некоторые недопонимания.

  • Процесс выполняется в пользовательском пространстве: конкретно, initпервый пользовательский процесс.
  • Вам не нужен /proc для существования файловых дескрипторов. Если бы единственный способ доступа к файловым дескрипторам был через файл, то как бы вы получили доступ к файловому дескриптору? (вы бы открыли файл в и /procполучили бы файловый дескриптор, попытались бы найти его в и /procполучили бы файловый дескриптор…). /procэто всего лишь представление, оно нужно только процессам, которые сообщают о других процессах.
  • Файловый дескриптор 255 lsв вашем примере принадлежит каталогу /proc/3467/fd: lsдолжен открыть каталог, поэтому мы ожидаем один дополнительный файловый дескриптор. У нас есть один дополнительный, так что вот что это такое.
  • /proc/fd/1и т.д. указывают на другие устройства. например 1 -> /dev/pts/3. Сделайтеls -l /proc/self/fd
  • При запуске ядра initоно подключает свои stdin, stdout, stderr к экрану (устройству tty, которое выводится на экран) или к другому месту.
  • initэто процесс 1(в вашей системе systemd).

Связанный контент