커널 및 BusyBox가 포함 된 최소 Linux : / etc / inittab은 무시되고 / init 만 실행됩니다.


12

나는 커널 (기본 옵션으로 컴파일 됨)과 BusyBox (기본 옵션 + 정적으로 컴파일 됨, 포함하여 모든 애플릿 포함 /sbin/init)가 포함 된 작고 완벽하게 작동하는 라이브 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, setsid /sbin/init그리고 exec setsid /sbin/init나는 커널 패닉으로 돌아가 셨습니다. / etc / inittab의 유무에 관계없이 파일 시스템에 존재합니다.

/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의 세 가지 라이브 Linux 배포판을 조사했습니다. 그들 모두는 가지고 /init있고 아무도 가지고 있지 않습니다 /etc/inittab. 또한 이 Wiki 기사/sbin/init 는 전혀 호출되지 않은 의심을 결론 짓 습니다.

당신이 여기에 온 경우, 한 번 봐 걸릴 최소 리눅스 라이브 어떤 욕구를 할 것, 그리고 바로 작동합니다 github.com/ivandavidov/minimal을
치로 틸리冠状病毒审查六四事件法轮功

아, OP는 Minimal Linux Live! 당신은 바위.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

답변:


11

나는 많은 광범위한 연구를했고 무엇이 잘못되었는지 알아 냈습니다. 하나씩 시작해 봅시다 :

  • initramfs부트 스킴 을 사용할 때 커널이 호출하는 첫 번째 프로세스는 /init스크립트입니다. 커널은 절대로 /sbin/init직접 실행을 시도하지 않습니다 .
  • /init 프로세스 식별자 1이 할당됩니다. 이것은 매우 중요합니다!
  • 이제 문제는 /sbin/init시작할 수는 PID 1있지만 이미 /initPID 1로 실행 되고 있다는 것입니다.
  • 해결책은 exec /sbin/init내부에있는 동안 명령 줄을 실행 하는 것 /init입니다. 이런 식으로 새 프로세스 ( /sbin/init)는 상위 ( /initPID 1 포함) 에서 PID를 상속 하며 이것이 우리가해야 할 전부입니다.

내 초기 구성 (질문 참조)에서 겪은 문제는 /init스크립트가 마지막으로하는 일은 /bin/sh새로운 PID가 할당 된 새로운 프로세스 를 생성 하는 것입니다. 이 시점 /sbin/init에서 대화식 콘솔에서 직접 실행할 수는 없습니다. 명령 행을 실행할 때도 exec /sbin/init쉘에 이미 지정된 동일한 PID를 지정하는 것이 가장 좋습니다.이 PID는 확실히 PID 1이 아니기 때문입니다.

간단히 말해-명령 줄을 exec /sbin/init직접 실행하면 /init됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.