종료, 재부팅 또는 시작 중에 로그 인쇄를 표시하려면 어떻게 해야 합니까?

종료, 재부팅 또는 시작 중에 로그 인쇄를 표시하려면 어떻게 해야 합니까?

우리 모두 알고 있듯이 시스템을 재부팅하거나 종료하거나 시작할 때 일부 메시지가 화면에 인쇄됩니다. 캡처는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

내 시스템은 Ubuntu 16.04입니다. 위와 같은 로그 메시지가 systemd에서 나온 것으로 알고 있습니다.

제가 이해한 바에 따르면, 일반 사용자 프로세스는 시스템이 세 가지 파일 설명자(0, 1, 2)를 제공하기 때문에 화면에 내용을 인쇄할 수 있습니다. 에서 찾을 수 있습니다 /proc/<PID>/fd/. 예는 다음과 같습니다.

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

이것은 3467hello-world 프로그램입니다. 무엇인지는 모르지만 , 표준 입력, 표준 출력 및 표준 오류 225라는 것은 알고 있습니다 .012

그래서 질문이 있습니다. 시스템이 종료, 재부팅 또는 시작되기 시작할 때 사용자 프로세스가 생성되지 않았거나 파괴되었습니다. 이는 /proc/더 이상 존재하지 않음을 의미합니다. 이 경우에는 0, 12존재하지 않습니다. .

그러면 systemd에서 오는 메시지가 왜 화면에 인쇄될 수 있습니까? 커널은 화면을 즉시 제어하기 때문에 인쇄할 수 있지만 systemd가 커널에 속하지 않는데 어떻게 화면에도 인쇄할 수 있습니까? 어떤 종류의 함수나 API가 사용되나요?

답변1

시작과 종료는 커널이 아닌 사용자 공간에서 주로 수행됩니다. 커널은 초기화를 완료하자마자 init콘솔을 가리키는 표준 파일 설명자를 사용하여 일반 프로세스로 이를 찾아 시작합니다. 따라서 init(귀하의 경우 initramfs 스크립트와 systemd) 표준 출력에 쓸 수 있으며, 기록한 모든 내용이 화면(또는 콘솔 출력이 표시되도록 구성된 모든 위치)에 표시됩니다. 이는 사용자 공간이 종료된 후(그리고 모든 종료 로그가 콘솔에 기록된 후) 커널이 종료되거나 재부팅될 때까지 계속 발생합니다.

여담이지만 이는 /proc커널이 유지 관리하는 특정 정보에 액세스하는 수단일 뿐입니다. 이러한 정보는 /proc마운트 여부에 관계없이 존재합니다.

그것도 참고하세요

우리 모두 알고 있듯이 시스템을 재부팅하거나 종료하거나 시작할 때 일부 메시지가 화면에 인쇄됩니다.

반드시 사실은 아닙니다. 이제 많은 시스템이 로그를 표시하지 않고 부팅 및 종료되므로 "우리 모두 알고 있다"고 가정할 수 없습니다.

답변2

몇 가지 잘못된 이해를 정리하기 위한 짧은 답변입니다.

  • 프로세스는 사용자 공간, 특히 init첫 번째 사용자 프로세스에서 수행됩니다.
  • 파일 설명자가 존재하기 위해 /proc가 필요하지 않습니다. 파일 설명자에 액세스하는 유일한 방법이 파일을 통해서였다면 파일 설명자에 어떻게 액세스하시겠습니까? (반환된 파일 설명자에서 파일을 열고 , 반환된 파일 설명자 /proc에서 파일을 찾아보십시오 …). 단지 뷰일 뿐이며 다른 프로세스에 대해 보고하는 프로세스에만 필요합니다./proc/proc
  • ls예에서 의 255 파일 설명자는 디렉토리에 속합니다 /proc/3467/fd. ls디렉토리를 열어야 하므로 하나의 추가 파일 설명자가 필요합니다. 하나 더 남았으니 이렇습니다.
  • /proc/fd/1등은 다른 장치를 가리킵니다. 예를 들어 1 -> /dev/pts/3. 을 하세요ls -l /proc/self/fd
  • 커널이 시작되면 initstdin, stdout, stderr을 화면(화면에 렌더링되는 tty 장치)이나 다른 곳에 연결합니다.
  • init프로세스입니다 1(시스템에서 systemd).

관련 정보