초기화 프로세스/스크립트는 어디에서 끝나나요?

초기화 프로세스/스크립트는 어디에서 끝나나요?

내 이해는 적어도 초기 사용자 공간에서는 init가 종료할 수 없는 쉘 스크립트라는 것입니다. 맞습니까?

그럼 끝나면 어떻게 되나요?

일반적인 부팅 순서에서 초기 사용자 공간의 init 쉘 스크립트는 루트 파일 시스템을 마운트한 다음 새 루트에서 init로 제어권을 전송한다는 것을 알고 있습니다. 그러나 이런 일이 발생하지 않는다고 가정하면 - 루트가 마운트되지 않고 제어가 새 루트 init로 이전되지 않습니다. init 스크립트가 끝나면 어떻게 될까요?

답변1

내 이해는 적어도 초기 사용자 공간에서는 init가 종료할 수 없는 쉘 스크립트라는 것입니다. 맞습니까?

쉘 스크립트일 필요는 없습니다. 물론 init프로세스를 종료할 수도 있습니다. 이로 인해 커널 패닉이 발생하지만 완료될 수 있습니다.

그럼 끝나면 어떻게 되나요?

스크립트에는 일반적 으로 exec switch_root /root "$@".exec

따라서 프로그램이 변경 init되고 커널은 exitinit 프로세스의 정보를 볼 수 없습니다.

그러면 initramfs가 정리되고 switch_root exec마운트가 .so에 바인딩되므로 PID는 항상 1로 유지됩니다./sbin/init/root/init

여기에서 BusyBox의 switch_root에 대한 소스 코드를 볼 수 있습니다. 정말 간단합니다.https://git.busybox.net/busybox/plain/util-linux/switch_root.c마지막에는 뒤에서 무슨 일이 일어나고 있는지 설명하는 긴 해설도 있습니다.

답변2

init 프로세스 /sbin/init는 쉘 스크립트가 아니며 일반적으로 종료되지 않습니다.
~에서https://en.wikipedia.org/wiki/Init

Unix 기반 컴퓨터 운영 체제에서 init(초기화의 약어)는 컴퓨터 시스템 시작 프로세스 중에 시작되는 첫 번째 프로세스입니다. Init은 시스템이 종료될 때까지 계속 실행되는 데몬 프로세스입니다.
이는 다른 모든 프로세스의 직간접적 조상이며 모든 고아 프로세스를 자동으로 채택합니다.

커널 초기화 후 커널이 분기하고 실행하는 첫 번째 사용자 공간 프로세스입니다. 이것이 PID1(프로세스 ID 1)이라고 불리는 이유입니다.

이제 upstart 또는 systemd와 같은 다양한 init 프로세스 구현이 있으며 원래 구현은 systemV init를 기반으로 했습니다.

그들이 기본적으로 하는 일은 시작 시 시작될 각 후보 프로세스의 구성 파일을 읽는 것입니다. 일반적으로 이러한 구성 파일은 에 있습니다 /etc/init/. 프로세스가 시작으로 표시되면 프로세스가 시작됩니다. 또는 구성에 "시작 시 시작하지 않음"이라고 표시되면 시작되지 않지만 수동으로 시작할 수 있습니다. 나중에.
프로세스가 시작용으로 표시된 경우(전통적으로) 프로세스가 시작되는 방식은 init 시스템이 init 시스템의 데몬 프로세스에 해당하는 쉘 스크립트를 실행하는 것입니다 /etc/init.d/.

최신 init 시스템과 원래 System V init 간의 몇 가지 차이점은 System V는 숫자 런레벨 0, 1, 2 등을 사용하여 시스템 상태를 결정하는 반면 systemd 또는 upstart는 mulit-user.target.

또한 – 내 생각에 – 최신 init 시스템은 쉘 스크립트를 호출하는 대신 데몬 자체를 시작하고 소위 "유닛" 파일을 사용하여 구성 지시문을 정의합니다.

/lib/systemd/system/nginx.service예를 들어, nginx의 경우 다음과 같은 시작 지침을 정의하는 구성 파일이 있습니다 .

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

다음과 같은 명령을 사용하여 활성화할 수 있습니다. sudo systemctl enable nginx.service그러면 심볼릭 링크가 생성됩니다.

/etc/systemd/system/multi-user.target.wants/nginx.service

단위 파일을 가리킵니다.

/lib/systemd/system/nginx.service

sudo systemctl disable nginx.service심볼릭 링크가 제거되고 부팅 시 서비스가 시작되지 않습니다.

최신 init 시스템은 systemV init 스크립트와 역호환되며 그 안의 구성을 읽고 /etc/init쉘 스크립트를 시작합니다./etc/init.d

관련 정보