内核找不到 init

内核找不到 init

我正在学习从头开始构建 Linux systemd 版本,按照以下说明进行操作https://www.linuxfromscratch.org/lfs/view/stable-systemd/index.html在 VirtualBox 6.1 上,但是当我启动到内核时,它给了我错误“内核恐慌 - 不同步:找不到工作 init”。

[    1.355071] Run /sbin/init as init process
[    1.356040]   with arguments:
[    1.356645]     /sbin/init
[    1.357965]   with environment:
[    1.358614]     HOME=/
[    1.359109]     TERM=linux
[    1.359797]     BOOT_IMAGE=/boot/vmlinuz-5.13.12-lfs-11.0-systemd
[    1.361244] Run /etc/init as init process
[    1.362403]   with arguments:
[    1.363103]     /etc/init
[    1.363741]   with environment:
[    1.364402]     HOME=/
[    1.364949]     TERM=linux
[    1.365571]     BOOT_IMAGE=/boot/vmlinuz-5.13.12-lfs-11.0-systemd
[    1.366633] Run /bin/init as init process
[    1.367359]   with arguments:
[    1.368024]     /bin/init
[    1.368629]   with environment:
[    1.369197]     HOME=/
[    1.369769]     TERM=linux
[    1.370361]     BOOT_IMAGE=/boot/vmlinuz-5.13.12-lfs-11.0-systemd
[    1.371632] Run /bin/sh as init process
[    1.373075]   with arguments:
[    1.373848]     /bin/sh
[    1.374396]   with environment:
[    1.375127]     HOME=/
[    1.375727]     TERM=linux
[    1.376331]     BOOT_IMAGE=/boot/vmlinuz-5.13.12-lfs-11.0-systemd
[    1.377607] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
[    1.379913] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 5.13.12 #1
[    1.381342] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[    1.382987] Call Trace:
[    1.383568]  dump_stack+0x64/0x7c
[    1.384258]  ? memcpy_orig+0xd0/0x10f
[    1.385047]  panic+0xf6/0x2b7
[    1.385734]  ? kernel_execve+0x13c/0x1a0
[    1.386571]  ? rest_init+0xa4/0xa4
[    1.387274]  kernel_init+0xf7/0xfc
[    1.387986]  ret_from_fork+0x22/0x30
[    1.389695] Kernel Offset: 0x3a600000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[    1.391756] ---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance. ]---

我检查过 /sbin/init ,它确实在那里,我对此一无所知。有人请帮帮我吗???

这是我的 grub.cfg 文件

# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,2)

menuentry "GNU/Linux, Linux 5.13.12-lfs-11.0-systemd" {
        linux   /boot/vmlinuz-5.13.12-lfs-11.0-systemd root=/dev/sda2 ro
}

这是/etc/fstab

# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order

/dev/sda2     /            ext4    defaults            1     1
/dev/sda1     swap         swap     pri=1               0     0

显示的问题是内核找不到/sbin/init 程序。关于所做的测试:

  • 我们已经检查过,/sbin/init 链接在这里并且可以指向 /lib/systemd/systemd
  • /lib/systemd/systemd 存在,并且是一个 64 位 ELF 应用程序
  • 我们尝试从 GRUB 运行“init=/sbin/init”选项,但没有成功
  • 我们使用 GRUB 启动控制台来检查文件系统是否可访问以及这些文件是否可见
  • 我们尝试直接运行/bin/bash,使用GRUB中的init参数,没有成功
  • 检查了权限,没有成功。
  • 我们甚至尝试将日志级别升级到 7,但没有显示任何其他信息。

当然,我们也查过其他教程等等,没有结果。同时,使用 SysVInit 构建 LFS 可以工作,因为它可以正常启动。

现在我们真的感觉路到了尽头。有人有什么想法吗?

编辑 1:向内核添加选项并获取其他输出和错误。更新了 grub.cfg

# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
insmod gzio
insmod part_msdos
insmod msdospart
set root=(hd0,2)

menuentry "GNU/Linux, Linux 5.13.12-lfs-11.0-systemd" {
        linux   /boot/vmlinuz-5.13.12-lfs-11.0-systemd root=UUID=7d13e10f-8433-418c-bcb8-d5e7d272ea25 ro console=ttyS0 console=tty0 ignore_loglevel init=/lib/systemd/systemd
}

来自内核的反馈:

[    3.847566] Freeing unused kernel image (initmem) memory: 1332K
[    3.854847] Write protecting the kernel read-only data: 20480k
[    3.859289] Freeing unused kernel image (text/rodata gap) memory: 2032K
[    3.865813] Freeing unused kernel image (rodata/data gap) memory: 1100K
[    3.870388] Run /lib/systemd/systemd as init process
[    3.872981]   with arguments:
[    3.874161]     /lib/systemd/systemd
[    3.876099]   with environment:
[    3.878269]     HOME=/
[    3.880556]     TERM=linux
[    3.882003]     BOOT_IMAGE=/boot/vmlinuz-5.13.12-lfs-11.0-systemd
[    3.884611] Kernel panic - not syncing: Requested init /lib/systemd/systemd failed (error -2).
[    3.885531] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.13.12 #1
[    3.885531] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[    3.885531] Call Trace:
[    3.885531]  dump_stack+0x64/0x7c
[    3.885531]  ? memcpy_orig+0xd0/0x10f
[    3.885531]  panic+0xf6/0x2b7
[    3.885531]  ? rest_init+0xa4/0xa4
[    3.885531]  kernel_init+0xab/0xfc
[    3.885531]  ret_from_fork+0x22/0x30
[    3.885531] Kernel Offset: 0x3aa00000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[    3.885531] ---[ end Kernel panic - not syncing: Requested init /lib/systemd/systemd failed (error -2). ]---

我们一直在跟踪错误代码到内核头:

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define EPERM        1  /* Operation not permitted */
#define ENOENT       2  /* No such file or directory */

启动时可以在 grub 中进行什么样的额外测试来检查我们是否具有访问权限?实际上,当使用 grub 控制台时,我们已经可以探索文件系统,并列出文件...有什么建议吗?

答案1

我们最终通过使用可正常工作的 lfs systemV 内核,然后在 systemd 实例上启动此内核,找到了问题所在。它可以启动 systemd 并使一切正常运行。我们分析了启动消息的差异,发现最初不工作的内核、SCSI 子系统未启动且磁盘未检测到,因此无法使用文件系统,也无法读取任何内容。

根本原因肯定是由于内核中错误的“make def”配置,但我们必须更深入地检查。无论如何,我们的第一个假设是错误的,因为在发生故障时,尝试访问磁盘的是 KERNEL,而不再是 GRUB,因此是否可以访问磁盘已不再重要。

我们希望这可以帮助任何构建 LFS 的人。

在此,感谢大家的支持。

相关内容