我有一个最近编译的 Linux 内核映像(vmlinuz 文件),我想启动它。我知道这不会给我一个熟悉的 Linux 系统,但我希望至少能够运行一些基本的“Hello world”程序作为 init 进程。这可能吗?如果可能的话,如何实现?
到目前为止,我已经尝试通过在 USB 上安装 GRUB 来实现此目的,该 USB 具有 ext2 文件系统,且 vmlinuz 文件位于 /boot 中。它一定已经加载了内核映像,因为它以内核恐慌消息结束:“VFS:无法在未知块(0,0)上安装根文件系统”
这是 grub.cfg 中的条目:
menuentry 'linux' --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0)'
search --no-floppy --fs-uuid --set=root <my USB drive's UUID>
linux /boot/vmlinuz root=UUID=<my USB drive's UUID> ro $vt_handoff
}
谢谢你的帮助。
答案1
这是可能的,是的。您需要传递init=/bin/sh
给内核,并且需要记住 rootfs 很可能是在之后挂载的。
要直接运行您的程序,您需要告诉内核在配置硬件后调用它,但请注意,普通用户空间将不可用于您的程序。
答案2
您不需要 GRUB 来引导内核:它已经有自己的引导加载程序,因此当您运行时:
make isoimage FDINITRD="$ROOTFS_PATH"
生成的文件arch/x86/boot/image.iso
已经可启动,可以通过以下方式验证:
qemu-system-x86_64 arch/x86/boot/image.iso
你什么做need 是一个rootfs.cpio.gz
,它是一个包含内核将在其上运行的根文件系统的文件:
- 如何创建一个超级最小的:单一应用程序 Linux |超级用户
- 如何使用 BusyBox 启动并运行:https://github.com/cirosantilli/runlinux
如果您仍然想使用 GRUB,则最少的条目是:
menuentry "main" {
linux /boot/bzImage
initrd /boot/rootfs.cpio.gz
}
从哪里来。bzImage
您可以使用目录arch/x86/boot/bzImage
轻松尝试此操作grub-mkrescue
像这样。