我正在尝试使用以下命令启动带有 QEMU 的 Linux x86_64:
./qemu-system-x86_64 -M pc -m 2G,slots=4,maxmem=4G -net nic -net user -append "root=/dev/sda2 console=ttyS0" -kernel /home/user/linux/arch/x86/boot/bzImage -hda ubuntu_24.04.raw -nographic -serial mon:stdio
其中 ubuntu_24.04.raw 是安装了 Ubuntu 24.04 的原始磁盘(带有 QEMU):
$ fdisk -l ubuntu_24.04.raw
Disk ubuntu_24.04.raw: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9B4F2BC3-7B90-4E31-A3B3-E3AA45A8C366
Device Start End Sectors Size Type
ubuntu_24.04.raw1 2048 4095 2048 1M BIOS boot
ubuntu_24.04.raw2 4096 3674111 3670016 1,8G Linux filesystem
ubuntu_24.04.raw3 3674112 20969471 17295360 8,3G Linux filesystem
这会以内核恐慌结束:
[ 3.577638] Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Docu.
[ 3.578333] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.9.1 #5
[ 3.578616] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.o4
[ 3.579086] Call Trace:
[ 3.579792] <TASK>
[ 3.580303] dump_stack_lvl+0x2b/0x90
[ 3.580729] dump_stack+0x14/0x20
[ 3.580828] panic+0x33a/0x390
[ 3.580947] kernel_init+0x151/0x170
[ 3.581062] ? __pfx_kernel_init+0x10/0x10
[ 3.581171] ret_from_fork+0x40/0x60
[ 3.581270] ? __pfx_kernel_init+0x10/0x10
[ 3.581376] ret_from_fork_asm+0x1a/0x30
[ 3.581566] </TASK>
[ 3.582400] Kernel Offset: disabled
[ 3.582848] ---[ end Kernel panic - not syncing: No working init found. Try passing init= option to kernel.
但是,正如您在命令中看到的,我正在传递基于 Ubuntu 24.04 的完整文件系统。为什么我需要指定 init ?它应该在文件系统中。我真的需要向 QEMU 传递一个 init 或以某种方式加载磁盘映像中的 init 吗?
我想通过 QEMU 命令行传递内核,因为我将对内核进行更改,这将需要修改内核选项。通过映像磁盘执行此操作(安装、修改选项以及使用 QEMU 加载磁盘)可能会很烦人。
这是因为你没有构建你的 initramfs ...
编译后,可以生成:
mkinitcpio -c /etc/mkinitcpio.conf -g initramfs.img
然后您可以使用 initrd 参数设置这是 qemu 命令行:
./qemu-system-x86_64 -M pc -m 2G,slots=4,maxmem=4G -net nic -net user -append "root=/dev/sda2 console=ttyS0" -kernel /home/user/linux/arch/x86/boot/bzImage -hda ubuntu_24.04.raw -nographic -serial mon:stdio -initrd initramfs.img