커널을 초기화 할 수없는 이유는 무엇입니까?


14

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

kernel.org 에서 Linux 커널 소스를 다운로드하여 실행했습니다.

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 프로그램을 컴파일 한 다음 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()전화 가 질식하는 것 같습니다 .


3
나는 이것이 부동 소수점 지원과 관련된 문제라고 말할 것입니다. CONFIG_VFP = y가 있습니까?
알렉상드르 벨로 니

@AlexandreBelloni는 cat .config | grep CONFIG_VFP산출 CONFIG_VFP=y-이 활성화되어처럼 보인다.
Nathan Osman

@AlexandreBelloni 나는 커널을 사용하거나 사용하지 않고 커널을 시도했지만 CONFIG_VFP아무런 차이가 없습니다.
Nathan Osman

1
Alexandre가 올바른 길을 가고 있다고 생각하지만 VFP는 문제가되지 않습니다. versatilepbARM926 CPU는 RPi의 ARM1176보다 오래되었으므로 Raspbian 바이너리는 에뮬레이션되지 않는 다른 기능을 사용 중일 수 있습니다. 에서 unixmen.com/emulating-raspbian-using-qemu , 수행 -cpu arm1176에 도움을?
Gilles 'SO- 악마 그만해

1
흠. 아마도 armel 툴체인을 사용해보십시오. (릴레이 스텁뿐만 아니라 계속 실행되는 실제 프로그램의 경우 busybox를 사용할 수 있습니다. debian armel에서 busybox-static 바이너리를 가져옵니다.)
Gilles 'SO-stop

답변:


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/

행운을 빕니다


1

다소 오래된 질문이라는 것을 알고 있지만 QEMU로 Raspberry Pi 이미지를 테스트하는 데 여전히 좋은 답변이 없기 때문에 부분 답변을 제공 할 수 있습니다.

QEMU와 함께 Ubuntu 16.04 raspi3 이미지 를 사용하고 싶었습니다 . 그것을 다운로드하고, 압축을 풀고, 부트 파티션을 마운트하고, vmlinuz 파일과 initrd 파일을 얻었으며 ... qemu-system-arm -M blabla -cpu ... -kernel ...이 작동하지 않습니다. 검은 화면.

그런 다음 여기 에서 xenial image / rootfs와 함께 kernel-qemu-4.4.34-jessie 를 사용하면 동일한 "초기 종료"문제가 발생합니다.

그러나 나는 잘 알려진 커널을 사용하고 있으며 정적으로 링크 된 간단한 C 프로그램이 작동하기 때문에 동적 링커를 사용할 때만 문제가 될 수 있습니다. (그리고 최신의 debian9 (stretch) 기반 raspbian의 ld-2.24는 4.4 debian8 (jessie) 기반 커널에서 제대로 작동하기 때문에 링커는 커널에 특히 민감하지 않습니다.)

"jessie"이미지와 함께 작동하는 파일을 우분투 xenial 이미지로 복사 한 후에도 이상한 "calling preinit : KE"오류 만 발생했습니다.

아, 그리고 라즈베리 파 이용 커널을 컴파일하는 사람 은 " 공식 "문서 / 하우투 를 직접 참조하는 사이트를 확인해야합니다 .


0

리눅스 커널은 더 이상 init을 실행하지 않고 init와 비슷한 systemd를 실행하지만 좀 더 고급 기능과 여분의 멀티 태스킹 기능을 제공하지만 unix 철학에 대해서는 systemd가 유용합니다.


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