커널 및 BusyBox가 있는 최소 Linux: /etc/inittab을 무시하고 /init만 실행

커널 및 BusyBox가 있는 최소 Linux: /etc/inittab을 무시하고 /init만 실행

/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/initexec 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/initPID 1로만 시작할 수 있지만 PID 1이미 /initPID 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그게 전부입니다.

관련 정보