커널이 init를 실행할 수 없는 이유는 무엇입니까?

커널이 init를 실행할 수 없는 이유는 무엇입니까?

Raspbian 이미지를 다운로드했습니다.이 페이지. qemu에서 이미지를 부팅하는 데 사용할 수 있는 커널을 컴파일하려고 합니다.

다음 웹사이트에서 Linux 커널 소스 코드를 다운로드했습니다.kernel.org그리고 다음을 실행하세요:

make versatile_defconfig
make menuconfig

그런 다음 커널에 다음 기능을 추가했습니다.

  • PCI 지원(CONFIG_PCI)
  • SCSI 장치 지원(CONFIG_SCSI)
  • SCSI 디스크 지원(CONFIG_BLK_DEV_SD)
  • SYM53C8XX 버전 2 SCSI 지원(CONFIG_SCSI_SYM53C8XX_2)
  • 확장 3(ext3) 파일 시스템(CONFIG_EXT3_FS)
  • 확장 4(ext4) 파일 시스템(CONFIG_EXT4_FS)

또한 디스크 이미지를 순환하면서 다음을 수행했습니다.

  • 주석 처리됨/etc/ld.so.preload
  • /etc/fstab사용에 맞게 조정 /dev/sda1하고/dev/sda2

그런 다음 이미지를 마운트 해제하고 다음을 사용하여 머신 부팅을 시도했습니다.

qemu-system-arm \
    -M versatilepb \
    -m 256 \
    -kernel linux-4.3/arch/arm/boot/zImage \
    -hda 2015-09-24-raspbian-jessie.img \
    -serial stdio \
    -append "root=/dev/sda2 rootfstype=ext4 rw console=ttyAMA0"

커널은 파일 시스템을 마운트할 수 있지만 즉시 문제가 발생합니다.

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

CPU: 0 PID: 1 Comm: init Not tainted 4.3.0 #1
Hardware name: ARM-Versatile PB
[<c001b5c0>] (unwind_backtrace) from [<c0017e18>] (show_stack+0x10/0x14)
[<c0017e18>] (show_stack) from [<c0069860>] (panic+0x84/0x1ec)
[<c0069860>] (panic) from [<c0025b98>] (do_exit+0x81c/0x850)
[<c0025b98>] (do_exit) from [<c0025c5c>] (do_group_exit+0x3c/0xb8)
[<c0025c5c>] (do_group_exit) from [<c002dfcc>] (get_signal+0x14c/0x59c)
[<c002dfcc>] (get_signal) from [<c001bf28>] (do_signal+0x84/0x3a0)
[<c001bf28>] (do_signal) from [<c0017a94>] (do_work_pending+0xb8/0xc8)
[<c0017a94>] (do_work_pending) from [<c0014f30>] (slow_work_pending+0xc/0x20)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

처음에는 이것이 SELinux와 아무 관련이 없는지 궁금했습니다. 다음 명령을 사용하여 커널을 시작하려고 합니다.

selinux=0 enforcing=0

...하지만 전혀 차이가 없습니다.

내가 뭘 잘못했나요? 이 오류는 무엇을 의미합니까?

고쳐 쓰다

나는 또한 다음을 시도했지만 운이 없습니다.

  • 나는 유무에 관계없이 CONFIG_VFP컴파일을 시도했다
  • 나는 추가 CONFIG_DEVTMPFS했고CONFIG_DEVTMPFS_MOUNT
  • 현재 신청 중이번 패치CPU_V6, CONFIG_MMC_BCM2835, & 활성화CONFIG_MMC_BCM2835_DMA
  • 사용gcc-linaro-arm-linux-gnueabihf-raspbian도구 체인
  • 툴체인을 사용하여 간단한 C 프로그램을 컴파일한 다음 Works를 통해 해당 경로를 커널에 전달하면 init=바이너리 형식 간에 차이가 있다고 믿게 됩니다.

    • file <sample program>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=e5ec8884499c51b248df60aedddfc9acf72cdbd4, not stripped
      
    • file <file from the image>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3e92423821f3325f8cb0ec5d918a7a1c76bbd72c, stripped`
      
    • ELF 헤더 차이점

나는 편집했다이 간단한 C 프로그램툴체인 사용:

<path>/arm-linux-gnueabihf-gcc --static simple.c -o simple

/root... 이미지 에 복사하고 init=부팅 매개변수를 /root/simple.

Starting bash...
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

통화를 하다가 조금 목이 막힌 것 같았어요 execv().

답변1

또한 안정적인 성공 없이 QEMU를 사용하여 ARM 이미지 부팅을 시도했습니다. 불행하게도 ARM OS로 작업하려면 실제 하드웨어를 사용해야 하며, 아니면 개발자가 보다 안정적인 ARM용 에뮬레이터를 만들 때까지 인내심을 갖고 기다려야 합니다.

벌써 2018년 12월인데 qemu-system-arm..

새로 설치된 Ubuntu 18 Bionic을 사용하여 QEMU 에뮬레이터에서 Raspbian Jessie를 부팅할 수 있었지만 작업에 충분히 안정적이지 않아 실제 하드웨어에 맡겨야 했습니다. 얼어붙는 경우가 많습니다.

qemu-system-arm내 OS에서 작동하지 않아서 Virtualbox를 사용하여 Ubuntu Bionic을 설치하고 Bionic에서 QEMU와 함께 Raspbian을 설치했습니다.

나는 이 튜토리얼을 따랐다:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

행운을 빌어요

답변2

나는 이것이 약간 오래된 질문이라는 것을 알고 있지만아직QEMU를 사용하여 Raspberry Pi 이미지를 테스트하는 데는 좋은 답변이 없습니다. 몇 가지 답변을 제공할 수 있도록 해주세요.

나는 사용하고 싶다우분투 16.04 raspi3 이미지QEMU와 함께. 다운로드하고, 압축을 풀고, 부팅 파티션을 마운트하고, vmlinuz 파일과 initrd 파일을 가져온 다음... qemu-system-arm -M blabla -cpu... -kernel...이 작동하지 않습니다. 검은 화면.

그런 다음 다음에서 kernel-qemu-4.4.34-jessie를 사용하십시오.여기xenial image/rootfs를 사용하면 귀하와 동일한 "init가 종료되었습니다" 문제가 발생했습니다.

그러나 나는 알려진 좋은 커널을 사용하고 있고 간단한 정적으로 링크된 C 프로그램이 작동하므로 문제는 아마도 동적 링커를 사용할 때만 발생할 것입니다. (링커는 커널에 특별히 민감하지 않습니다. 최신 debian9(stretch) 기반 ld-2.24는 4.4 debian8(jessie) 기반 커널에서 잘 실행되기 때문입니다.)

"jessie" 이미지용 파일을 ubuntu xenial 이미지에 복사한 후에도 이상한 "calling preinit: KE" 오류가 발생합니다.

아, 그리고 Raspberry Pi용 커널을 컴파일하려는 사람은 이것을 확인해야 합니다.이것"를 직접 인용하는 웹사이트공식적인"문서/방법.

답변3

올바른 크로스 컴파일러를 사용하고 있습니까?

내 경우에는 아래 링크를 따라갔고 이를 사용했을 때 종료 코드 0x00000004와 동일한 오류가 발생했습니다.ARM-Linux-gnueabihf-(즉, 하드 부동 소수점) gcc 컴파일러.

https://www.zachpfeffer.com/single-post/Build-the-Linux-kernel-and-Busybox-and-run-on-QEMU

모든 것을 다시 컴파일할 때ARM-Linux-gnueabi-, 커널이 성공적으로 시작됩니다. 이것이 문제를 해결하는지 확인하십시오.

답변4

Linux 커널은 더 이상 init를 실행하지 않습니다. 대신 init와 유사하지만 더 고급 기능과 추가 멀티태스킹 기능을 갖춘 systemd를 실행합니다. 비록 UNIX 철학과는 달리 systemd는 매우 유용합니다.

관련 정보