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