/sbin/init
나는 커널(기본 옵션으로 컴파일됨)과 BusyBox(기본 옵션 + 정적 컴파일, 모든 애플릿 존재, 포함 ) 만 포함된 작고 완전한 기능을 갖춘 라이브 Linux CD를 만들었습니다 . initrd
생성하고 채우는 데 아무런 문제가 없으며 /dev
쉘 /proc
스크립트 에도 /sys
문제가 없습니다 /init
.
최근 BusyBox가 구성을 (적어도 어느 정도) 지원한다는 내용을 읽었 /etc/inittab
으며 다음 중 하나를 수행하고 싶습니다.
/init
내 쉘 스크립트는 잊어버리고 전적으로/etc/inittab
구성에 의존하십시오./init
쉘 스크립트와 구성을 모두 사용하십시오/etc/inittab
.
/etc/inittab
이제 실제 문제는 내 배포판이 시작될 때 완전히 무시되는 것 같습니다. 증상은 다음과 같습니다.
- 그냥
/init
삭제하고 나가면/etc/inittab
커널 패닉이 발생합니다. 내 가정은 커널이/sbin/init
그것을 전혀 실행하지 않거나/sbin/init
그것을 찾을 (또는 읽을) 수 없다는 것입니다/etc/inittab
. - .BusyBox 없이도 제대로 작동한다는 내용을 읽었습니다
/etc/inittab
. 그래서 저는 둘 다 삭제/init
하고/etc/inittab
커널이 다시 패닉 상태가 되는 것을 추측했습니다. - 나는 쉘에서 실행을 시도했고
/sbin/init
많은 추측(포함) 끝에 커널 패닉이 발생 했습니다exec /sbin/init
. /etc/inittab은 파일 시스템에 존재할 수도 있고 존재하지 않을 수도 있습니다.setsid /sbin/init
exec setsid /sbin/init
/init
이것은 내 쉘 스크립트의 내용입니다.
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
/etc/inittab
이 시점에서는 구성이 실제로 작동하는지 알 수 있는 방법이 있는 한 내용이 무엇인지 상관하지 않습니다 . /etc/inittab
내가 찾은 정보를 기반으로 여러 구성을 시도했습니다 .여기.
내 /etc/inittab에는 최소한 다음 줄만 포함되어 있습니다.
::sysinit:/bin/sh
다시 말하지만 결국 커널 패닉이 발생했고 /etc/inittab
무시되는 것 같았습니다.
BusyBox에서 소규모 라이브 배포가 제대로 작동하도록 하는 방법에 대한 제안 사항이 있으면 /etc/inittab
높이 평가하겠습니다!
고쳐 쓰다:
- 확실히 해두자면 - 나는원하지 않는다현재
/init
쉘 스크립트 는/etc/inittab
./bin/ash
유일한 문제는/etc/inittab
위에서 설명한 대로 완전히 무시된다는 것입니다. - 저는 Slax, Finnix 및 SysResCD의 3가지 라이브 Linux 배포판을 살펴보았습니다. 그들 둘 다 그것을 가지고 있고
/init
그렇지 않습니다/etc/inittab
. 또한이 위키 기사내 의심은/sbin/init
전혀 발생하지 않았습니다.
답변1
좋아요, 저는 광범위한 연구를 많이 했고 문제를 발견했습니다. 하나씩 시작해 보겠습니다.
initramfs
부팅 시나리오를 사용할 때 커널이 호출하는 첫 번째 프로세스는/init
스크립트입니다. 커널은/sbin/init
직접 실행을 시도하지 않습니다./init
프로세스 식별자 1이 할당됩니다. 이건 매우 중요합니다!- 이제 문제는
/sbin/init
PID 1로만 시작할 수 있지만PID 1
이미/init
PID 1로 실행되고 있다는 것입니다. exec /sbin/init
해결책은 우리가 아직 내부에 있는 동안 명령줄을 실행하는 것입니다/init
. 이런 식으로 새 프로세스(예:/sbin/init
)는 상위 프로세스(PID 1)로부터 PID를 상속받으며/init
이것이 우리가 해야 할 전부입니다.
초기 구성(질문 참조)에서 겪고 있는 문제는 /init
내 스크립트가 수행하는 마지막 작업이 /bin/sh
완전히 새로운 PID가 할당된 새 프로세스를 생성하는 것입니다. 이 시점부터 대화형 콘솔에서 직접 실행하는 것은 불가능합니다. /sbin/init
왜냐하면 명령줄을 실행하더라도 exec /sbin/init
우리가 얻을 수 있는 최선의 방법은 이미 쉘에 할당된 것과 동일한 PID를 할당하는 것이고 이 PID는 확실히 PID 1이 아니기 때문입니다. .
간단히 말해서, exec /sbin/init
명령줄을 직접 실행하면 /init
그게 전부입니다.