따라서 일반적으로 initramfs /init 스크립트는 다음과 같이 끝납니다.
exec switch_root /newroot /sbin/init
systemd 또는 보트를 떠다니는 모든 것으로 효과적으로 대체하십시오. 하지만 그 전에 포크하면 어떻게 될까요? 새로운 init 시스템은 여전히 분기된 프로세스의 상위 프로세스입니까, 아니면 좀비 프로세스입니까? systemd의 경우 systemd가 시작되기 전에 생성된 하위 프로세스로 인해 "부기 문제"가 발생하거나 다른 예상치 못한 부작용이 발생합니까?
편집: 댓글에 샘플 코드를 요청했습니다. 이것이 답변 뒤에 숨은 원칙을 어떻게 바꾸는지 실제로는 알 수 없지만 확실합니다.
tail -f /dev/urandom &
exec switch_root /newroot /sbin/init
답변1
대답은 '큰 일이 일어나지 않았다'이다. 프로세스를 ing하여 교체합니다 exec
. 분기된 프로세스는 상위 프로세스의 pid가 1이라는 것만 알고 프로세스가 systemd인지 일부 initramfs인지는 실제로 신경 쓰지 않습니다 /init
. 유일한 그늘진 점은 시스템 서비스가 없는 데몬이 될 것이므로 로깅, 다시 시작 등이 제대로 작동하지 않는다는 것입니다. - 포크된 프로세스에 자체를 "연결"하는 자체 서비스를 특별히 구축하지 않는 한(아마도 그렇게 어렵지는 않을 것입니다) ) 결정적 PID 등이 있어야 한다는 점을 고려하면).
이러한 이유로 일반 부팅 후 나머지 initramfs 코드를 실행하는 것은 일반적으로 권장되지 않지만 시스템이 충돌하지는 않습니다. 댓글 섹션에 흥미로운 토론이 있습니다.https://lwn.net/Articles/657345/이에 대해 간략하게 설명합니다.