내 이해는 적어도 초기 사용자 공간에서는 init가 종료할 수 없는 쉘 스크립트라는 것입니다. 맞습니까?
그럼 끝나면 어떻게 되나요?
일반적인 부팅 순서에서 초기 사용자 공간의 init 쉘 스크립트는 루트 파일 시스템을 마운트한 다음 새 루트에서 init로 제어권을 전송한다는 것을 알고 있습니다. 그러나 이런 일이 발생하지 않는다고 가정하면 - 루트가 마운트되지 않고 제어가 새 루트 init로 이전되지 않습니다. init 스크립트가 끝나면 어떻게 될까요?
답변1
내 이해는 적어도 초기 사용자 공간에서는 init가 종료할 수 없는 쉘 스크립트라는 것입니다. 맞습니까?
쉘 스크립트일 필요는 없습니다. 물론 init
프로세스를 종료할 수도 있습니다. 이로 인해 커널 패닉이 발생하지만 완료될 수 있습니다.
그럼 끝나면 어떻게 되나요?
스크립트에는 일반적 으로 exec switch_root /root "$@"
.exec
따라서 프로그램이 변경 init
되고 커널은 exit
init 프로세스의 정보를 볼 수 없습니다.
그러면 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