我已经下载了 Raspbian 镜像这一页。我正在尝试编译一个可用于在 qemu 中启动映像的内核。
我从以下网站下载了Linux内核源代码内核.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`
我编译了这个简单的 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 操作系统配合使用,或者耐心等待开发人员为 ARM 制作更可靠的模拟器。
现在已经是 2018 年 12 月了,但qemu-system-arm
.
我能够使用新安装的 Ubuntu 18 Bionic 在 QEMU 模拟器上启动 Raspbian Jessie,但它对于我的工作来说并不稳定,所以我不得不将其留给真实的硬件。经常会被冻住。
qemu-system-arm
在我的操作系统上不起作用,所以我使用 Virtualbox 安装 Ubuntu Bionic,并在 Bionic 中安装带有 QEMU 的 Raspbian。
我按照这个教程进行操作:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/
祝你好运
答案2
我知道这是一个有点古老的问题,但因为有仍然使用 QEMU 测试 Raspberry Pi 图像没有好的答案,请允许我贡献部分答案。
我想用Ubuntu 16.04 raspi3 镜像与 QEMU。下载它,解压它,挂载启动分区,获取vmlinuz文件和initrd文件,然后... qemu-system-arm -M blabla -cpu ... -kernel ... 不起作用。黑屏。
然后使用 kernel-qemu-4.4.34-jessie 来自这里使用 xenial 映像/rootfs 导致了与您相同的“init 被杀死”问题。
但由于我使用的是一个已知的良好内核,并且由于您的简单静态链接 C 程序可以工作,因此问题可能只有在使用动态链接器时才会出现。 (链接器对内核不是特别敏感,因为基于最新 debian9 (stretch) 的 ld-2.24 在基于 4.4 debian8 (jessie) 的内核上运行良好。)
即使将适用于“jessie”图像的文件复制到 ubuntu xenial 图像中,我也只收到一个奇怪的“calling preinit: KE”错误。
答案3
您使用了正确的交叉编译器吗?
就我而言,我按照下面的链接操作,当我使用时,我收到了相同的错误,退出代码为 0x00000004ARM-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。相反,它运行 systemd,它类似于 init,但具有更高级的功能和额外的多任务处理功能,尽管与 UNIX 哲学相反,systemd 非常有用。