switch_root 이전에 분기하면 어떻게 되나요?

switch_root 이전에 분기하면 어떻게 되나요?

따라서 일반적으로 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/이에 대해 간략하게 설명합니다.

관련 정보