Linux에서 PID 1 교체 [닫기]

Linux에서 PID 1 교체 [닫기]

PID 1이 초기화되어 있다는 것을 알고 있습니다. 이제 알고 싶습니다. init 프로세스 ID를 다른 프로세스 ID로 바꾸고 PID 1로 새 프로세스를 할당할 수 있습니까? 그렇다면 어떻게 해야 합니까?

답변1

시작 시 시작된 첫 번째 프로세스는 PID 1을 받습니다.

시작 시 시작된 첫 번째 프로세스에는 하나의 작업이 있습니다. 직접 또는 간접적으로 다른 모든 프로세스를 시작해야 합니다. 시작 시 프로그램을 실행하는 커널 외에 프로세스를 생성하는 유일한 방법은 일부 프로세스가 시스템 호출을 수행하여 새 프로세스를 생성하는 것이기 때문에 모든 프로세스는 궁극적으로 해당 프로세스의 자손입니다.

PID 1을 가진 프로세스에는 작업이 있습니다. 하위 프로세스를 실행하는 동안 프로세스가 종료되면 하위 프로세스의 상위 프로세스 ID가 1로 설정됩니다. 자식 프로세스가 죽으면 PID 1은 이를 수집해야 합니다. 즉, 시스템 호출을 호출해야 합니다 wait. 그렇지 않으면좀비하위 프로세스 부분은 남겨집니다.

init여러 구현을 통해 호출되는 다양한 프로그램이 두 작업을 모두 수행합니다.

Linux 커널에는 첫 번째 프로세스로 실행되는 실행 파일을 변경하는 명령줄 인수가 있습니다². 모든 실행 파일을 실행하는 데 사용할 수 있지만 실행 파일이 init 작업을 수행하지 않으면 시스템이 제대로 실행되지 않습니다. 이 기능은 콘솔에서 셸만 실행하고 다른 작업을 수행하지 않는 등 시스템 복구 모드로 들어갈 때 주로 사용됩니다.

시스템이 정상적으로 부팅되면 init가 종료되지 않으므로 PID 1을 교체하는 것은 불가능합니다. init는 영원히 실행되도록 프로그래밍되어 있기 때문에 종료되지 않을 뿐만 아니라(init는 시스템이 종료될 때까지 실행되어야 함) 다른 프로세스를 종료하는 신호(예: SIGKILL)로부터도 특별한 보호를 받습니다.

리눅스에는PID 네임스페이스자체 프로세스 ID 세트를 사용하여 하위 시스템의 기능을 정의할 수 있습니다. 네임스페이스의 PID 프로세스는 네임스페이스 내부와 외부에서 볼 때 서로 다른 PID를 갖습니다. 네임스페이스의 첫 번째 프로세스는 네임스페이스에서 PID 1을 가져옵니다. 네임스페이스 외부에는 PID 1이 없습니다(init가 작업 완료를 방해하므로 init가 수행하지 않는 새 PID 네임스페이스 입력을 선택하지 않는 한).

1 이것은 완전히 정확하지는 않습니다. 일부 커널에는 프로세스를 시작하는 다른 방법이 있습니다. 예를 들어, modprobeLinux는 특정 상황에서 특정 하드웨어가 발견되면 시작됩니다. 그러나 init의 자손은 대부분의 프로세스를 차지합니다.
²전 전 후파일 시스템 초기화또는초기화 프로그램.

답변2

Gilles가 지적했듯이 init은 어떤 면에서 특별합니다. init가 종료되면 대부분의 경우 커널 패닉이 발생하므로 평판이 좋은 init 작성자라면 이러한 상황을 피하기 위해 많은 노력을 기울일 것입니다. 반면에 좀비 프로세스를 처리한다는 점을 제외하면 다른 프로그램과 매우 유사하며 실제로 어떤 프로그램이든 init로 사용할 수 있습니다. cat은 잘 작동하지만 완전히 유용하지는 않습니다. init이 이를 수행할 수 있는 매우 간단한 방법 중 하나는 execlve(exec 및 친구)를 호출하여 동일한 pid를 사용하여 한 프로그램을 다른 프로그램으로 대체하는 것입니다. 예를 들어, 초기 루트 디스크는 실행할 드라이브를 마운트한 후 이를 사용하여 실제 init를 실행합니다.

관련 정보