如何在QEMU中搭配自定义内核运行Fedora系统?
问题:QEMU中搭配自定义平头哥C910内核启动Fedora卡顿
我需要在QEMU中运行Fedora(首个支持RISC-V的操作系统),搭配基于平头哥C910处理器构建的自定义内核做基准测试,目前遇到启动卡顿问题,具体情况如下:
已成功的两种启动场景
1. Fedora官方内核正常启动
按照官方步骤执行以下命令,可正常启动Fedora:
qemu-system-riscv64 \ -bios none \ -nographic \ -machine virt \ -smp 8 \ -m 2G \ -kernel Fedora-Developer-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -device virtio-blk-device,drive=hd0 \ -drive file=Fedora-Developer-Rawhide-*.raw,format=raw,id=hd0 \ -device virtio-net-device,netdev=usernet \ -netdev user,id=usernet,hostfwd=tcp::10000-:22
2. 自定义内核单独启动(无完整OS)
用自定义内核构建文档中的命令,能启动内核但无法加载完整操作系统:
LD_LIBRARY_PATH=./host/lib ./host/csky-qemu/bin/qemu-system-riscv64 -M virt -kernel fw_jump.elf -device loader,file=Image,addr=0x80200000 -append "rootwait root=/dev/vda ro" -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -nographic -smp 1
当前故障
将Fedora官方命令中的-kernel参数替换为自定义内核路径后,启动出现卡顿,截图如下:
推测问题源于两种命令的QEMU参数配置差异,以下是针对性解决步骤:
解决步骤
1. 对齐内核加载逻辑
Fedora官方命令直接指定带UBoot的ELF文件作为内核,而自定义内核需要通过fw_jump.elf作为bootloader加载内核镜像,不能直接替换-kernel参数。调整命令如下:
qemu-system-riscv64 \ -nographic \ -machine virt \ -smp 8 \ -m 2G \ -kernel fw_jump.elf \ -device loader,file=./你的自定义内核Image路径,addr=0x80200000 \ -append "rootwait root=/dev/vda ro" \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -device virtio-blk-device,drive=hd0 \ -drive file=Fedora-Developer-Rawhide-*.raw,format=raw,id=hd0 \ -device virtio-net-device,netdev=usernet \ -netdev user,id=usernet,hostfwd=tcp::10000-:22
注意:若Fedora根分区不是
/dev/vda,可通过fdisk -l查看raw镜像的分区表,替换为实际根分区路径(如/dev/vda3)。
2. 统一QEMU版本
自定义内核使用的是csky-qemu,而Fedora命令用的是标准QEMU,可能存在兼容性问题,尝试用csky-qemu执行调整后的命令:
LD_LIBRARY_PATH=./host/lib ./host/csky-qemu/bin/qemu-system-riscv64 \ -nographic \ -machine virt \ -smp 8 \ -m 2G \ -kernel fw_jump.elf \ -device loader,file=./你的自定义内核Image路径,addr=0x80200000 \ -append "rootwait root=/dev/vda ro" \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -device virtio-blk-device,drive=hd0 \ -drive file=Fedora-Developer-Rawhide-*.raw,format=raw,id=hd0 \ -device virtio-net-device,netdev=usernet \ -netdev user,id=usernet,hostfwd=tcp::10000-:22
3. 检查内核配置
确保自定义内核开启了Fedora所需的关键配置:
- 开启virtio块设备、网络设备支持(
CONFIG_VIRTIO_BLK、CONFIG_VIRTIO_NET) - 开启RISC-V virt平台驱动(
CONFIG_RISCV_MACHINE_VIRT) - 开启ext4文件系统支持(
CONFIG_EXT4_FS,Fedora默认使用ext4)
4. 简化参数排查
先简化命令排除干扰项,确认基础启动正常后再逐步添加参数:
- 将
smp改为1,和自定义内核单独启动时一致,排除多核兼容性问题 - 暂时去掉RNG相关参数,减少启动负载
内容的提问来源于stack exchange,提问作者Some1
相关产品推荐
相关产品推荐

