我正在学习从头开始构建 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 的人。
在此,感谢大家的支持。