为什么内核不能运行init?

为什么内核不能运行init?

我已经下载了 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_DEVTMPFSCONFIG_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 操作系统配合使用,或者耐心等待开发人员为 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”错误。

哦,任何想要为 Raspberry Pi 编译内核的人都应该检查一下网站,它直接引用了“官方的“文档/操作方法。

答案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 非常有用。

相关内容