我已经在此页面上下载了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程序,然后通过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()
通话似乎令人窒息。
cat .config | grep CONFIG_VFP
产生CONFIG_VFP=y
-好像已启用。
CONFIG_VFP
这没有什么区别。
versatilepb
是一个ARM926 CPU,它比RPi的ARM1176老,因此Raspbian二进制文件可能正在使用某些其他未被仿真的功能。来自unixmen.com/emulating-raspbian-using-qemu,有-cpu arm1176
帮助吗?