QEMU仿真树莓派
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。在QEMU的安装文件夹下有一系列可执行文件,例如:qemu-system-i386.exe,qemu-system-aarch64.exe,等这些可执行文件就是对应处理器的模拟器,用户通过执行这些程序,通过在可执行文件后面附加参数的形式,决定模拟器在模拟对应的处理器时加载哪些设备和哪些程序,由于QEMU模拟的设备数量远远超过我们常用的VMware等虚拟机软件,所以启动时用到的命令行也非常复杂,不像虚拟机软件可以傻瓜式的操作。 ref: https://zhuanlan.zhihu.com/p/452590356
qemu的安装
参考上面知乎的文章,选择Windows 64bit 版本是 qemu-w64-setup-20211215.exe: ref: https://qemu.weilnetz.de/w64/2021/
模拟树莓派1代
Qemu没有内置树莓派1代的开发板,通过versatilepb的开发板进行模拟,效果和树莓派一代一样。需要准备下列文件:
树莓派1代镜像:2019-09-26-raspbian-buster-lite.img. (树莓派精简版镜像,没有GUI,实际上只用到里面的配置、驱动、根文件系) ref:https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-09-30/内核镜像:kernel-qemu-4.19.50-buster模拟versatilepb这块电路版: versatile-pb-buster.dtb
cd D:\Program Files\qemu
qemu-system-arm.exe -M versatilepb -cpu arm1176 -drive format=raw,file=D:\Rasppi\Img\2019-09-26-raspbian-buster-lite.img -net nic -net user,hostfwd=tcp::5022-:22 -dtb D:\Rasppi\KernelA\versatile-pb-buster.dtb -kernel D:\Rasppi\KernelA\kernel-qemu-4.19.50-buster -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -serial stdio -usb
命令参数解释: qemu-system-arm.exe:运行arm模拟器,后面跟随参数
-M versatilepb 模拟versatilepb这块电路版
-cpu arm1176 CPU是arm1126
-m256 内存256M
-drive format=raw,file=D:\Rasppi\Img\2019-09-26-raspbian-buster-lite.img 存储器加载的镜像和格式
-net user,hostfwd=tcp::5022-:22 网卡使用NAT模式,将主机的5022映射到虚拟机22口 便于SSH。
-dtb D:\Rasppi\KernelA\versatile-pb-buster.dtb 设备树使用第一步下载的
-kernel D:\Rasppi\KernelA\kernel-qemu-4.19.50-buster 系统内核也是使用 下载的。
-append 附加命令,比较复杂不做解释复制即可,如不懂不要更改
-serial stdio 将CMD命令行用作标准输入输出,你可以通过CMD命令行对虚拟机发送命令,而不必使用虚拟机的显示和输入。便于使用
在ubuntu 上安装qemu
ref: https://blog.csdn.net/weixin_42231571/article/details/139942235
qemu-img create -f qcow2 test-vm.qcow2 10G
# qemu-img 使用qemu-img来创建虚拟机镜像,
# 用来模拟虚拟机的硬盘
# -f 用于指定镜像的格式
# qcow2 是qemu最常用的镜像格式,
# 采用来写时复制技术来优化性能
# test-vm.qcow2 是镜像文件的名字
# 10G 是镜像文件大小
qemu-system-x86_64 test-vm.qcow2
# qemu-system-x86 用来启动x86架构的虚拟机
# 因为未给虚拟机安装操作系统,
# 所以会提示 “No bootable device”
qemu-system-x86_64 -m 2048 -enable-kvm test-vm.qcow2 \
-cdrom ./Win11_23H2_Chinese_Simplified_x64v2.iso
# -m 指定虚拟机内存大小,默认单位是MB
# -enable-kvm 使用KVM进行加速
# -cdrom 添加Win11的安装镜像,也可以是其他安装镜像文件
# 可在弹出的窗口中操作虚拟机,安装操作系统,安装完
# 成后重起虚拟机便会从硬盘 ( test-vm.qcow2 ) 启动
qemu-system-x86_64 -m 2048 -enable-kvm test-vm.qcow2
# 安装完操作系统镜像之后,使用该命令来启动硬盘(test-vm.qcow2)
# 中的操作系统
qemu-img -h
# 查看qemu-img支持的文件格式
安装及运行RISC-V64架构的镜像
# 参考链接
https://www.cnblogs.com/orangeQWJ/p/18171574
# 1.前期准备
ubuntu镜像下载:
https://cdimage.ubuntu.com/releases/
安装qemu软件opensbi和u-boot-qemu:
sudo apt-get install qemu-system-misc opensbi u-boot-qemu
# qemu-system-misc是QEMU用于模拟虚拟RISC芯片及CLINT,PLIC等设备
# opensbi提供以机器模式运行的SBI运行环境
# u-boot-qemu是实现UEFI API并加载GRUB的固件(uboot)
安装好以后,这两个文件所在路径:
/usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.bin
/usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin
# 其中.bin文件是由objdump命令从ELF文件中,拷贝出.text段和.data段
# 及.rodata段,如:
objdump -O binary input.elf output.bin
# -O binary 指定了输出的目标文件格式为二进制格式
# 2.创建一个10GB的虚拟磁盘,并将镜像写入虚拟空磁盘
dd if=/dev/zero of=riscv_disk.img bs=1M count=1024
dd if=ubuntu-22.04.3-preinstalled-server-riscv64+unmatched.img \
of=riscv_disk.img
# 3.启动一个带有2GB RAM,4个CPU核和一个硬盘的RISC-V 64位的虚拟机,
# 使用uboot启动,并设置了网络端口转发
qemu-system-riscv64 \
-M virt \
-m 2048M \
-smp 4 \
-bios ./fw_jump.bin \
-kernel ./u-boot.bin \
-drive file=./riscv_disk.img,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22 \
-device virtio-net-device,netdev=net0 \
-nographic \
-device virtio-rng-pci
# qemu-system-riscv64 用于启动一个RISC-V64位的虚拟机
# -M virt 选择QEMU虚拟机的类型为virt(通用)
# -m 2048M 设置虚拟机的内存大小为2GB
# -smp 4 设置虚拟机的 CPU 核心数为4
# -bios ./fw_jump.bin 指定BIOS文件
# 可指定为/usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.bin
# -kernel ./u-boot.bin 指定内核映像文件
# 可指定为/usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin
# -drive file=./riscv_disk.img,format=raw,id=hd0
# 定义一个驱动器,
# file 指定磁盘映像文件,
# format 指定磁盘映像的格式为raw,
# id 给这个驱动器一个标识符
# -device virtio-blk-device,drive=hd0
# 添加一个设备,并关联前面定义的驱动器
# virtio-blk-device 这是一个块设备
# drive 指定与此设备关联的驱动器
# -netdev user,id=net0,hostfwd=tcp::2222-:22
# 定义一个网络设备,
# user 使用用户模式网络堆栈
# id 给这个网络设备一个标识符
# hostfwd 设置端口转发,将宿主机的2222
# 端口转发到虚拟机的22端口
# -device virtio-net-device,netdev=net0
# 添加一个网络设备,并关联前面的网络设备,
# virtio-net-device 这是一个网络设备
# netdev 指定与此设备关联的网络设备
# -nographic 不使用图形界面,仅使用命令行界面
# -device virtio-rng-pci
# 添加一个设备,这是一个随机数生成器
# 以上命令运行成功之后,就直接进入到ubuntu登录界面,
# 第一次的用户及密码为ubuntu/ubuntu
# 4.登录ssh登录qemu虚拟机
ssh ubuntu@localhost -p 2222
# 5. 退出qemu
sudo shutdown -h now
或
Ctrl+A,然后x
