종료, 재부팅 또는 시작 시 표시할 로그를 어떻게 인쇄합니까?

종료, 재부팅 또는 시작 시 표시할 로그를 어떻게 인쇄합니까?

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

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

내 시스템은 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단지 보기이며 다른 프로세스에 대해 보고하는 프로세스에만 필요합니다.
  • 귀하의 예에서는 255개의 파일 설명자가 ls디렉터리에 속합니다 /proc/3467/fd. ls디렉터리를 열어야 하므로 추가 파일 설명자가 필요합니다. 여분의 것이 있으니 그게 다입니다.
  • /proc/fd/1다른 장치에도 마찬가지입니다. 예를 들어 1 -> /dev/pts/3. 어떤 것을 만들어ls -l /proc/self/fd
  • 커널이 시작되면 initstdin, stdout, stderr을 화면(화면에 렌더링하는 tty 장치)이나 다른 곳에 연결합니다.
  • init1(시스템의 ) 프로세스입니다 systemd.

관련 정보