QEMU是目前最先进的动态二进制翻译跨平台仿真软件,它可以模拟x86、ARM、ARM64、MIPS、PowerPC等架构。QEMU的原理主要是将ELF格式的可执行文件翻译成中间形式,然后根据中间形式,拷贝编译好的微操作代码,形成目标基本块,最后再执行此基本块。它的总体结构如图所示
QEMU主要有两种仿真方式:
-
用户模式仿真:允许一个(Linux)进程执行在不同架构的CPU上,该模式下,QEMU 可以作为进程级虚拟机
-
系统模式仿真:允许仿真完整的系统,包括处理器和配套的外设,该模式下,QEMU 也可以作为系统虚拟机
接下来我们从QEMU的安装开始来讲解这两种仿真方式,需要用到的固件可以在后台回复「QEMU」获取
1 安装QEMU
sudo apt-get update
sudo apt-get install qemu-system-mips
sudo apt-get install qemu-user
sudo apt-get install qemu-user-static
sudo apt-get install qemu-utils
2 QEMU系统模式仿真
首先我们需要从debian官网下载kernel和image,地址如下:
https://people.debian.org/~aurel32/qemu/mipsel/
「为什么我们这里知道使用mipsel呢,你可以在文件系统内随便找一个ELF文件,然后使用file命令查看一下」
将目录中的所有文件下载到一个kernel内即可,同时也将固件解压放到同一目录
首先安装虚拟网络设备tun
sudo apt-get install uml-utilities
为root用户添加网卡tap0
sudo tunctl -t tap0 -u root
设置IP地址
sudo ifconfig tap0 192.168.3.1/24
查看一下我们设置的IP地址
ifconfig
进入kernel目录,并使用如下命令启动qemu:
sudo qemu-system-mipsel -M malta -kernel ./vmlinux-3.2.0-4-4kc-malta -hda ./debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -s
命令解析如下
效果如图所示
账号密码均为root
使用ifconfig配置仿真机的eth0网卡为192.168.3.2
ifconfig eth0 192.168.3.2
使用物理机测试与仿真机之间的连通性
ping 192.168.3.2
使用scp命令将squashfs.tar传入仿真机
scp squashfs.tar root@192.168.3.2:/root
在仿真机内使用tar命令解压
tar -zxvf squashfs.tar
挂载固件文件系统中的proc目录和dev目录到chroot环境,因为proc中存储着进程所需的文件,比如pid文件等等,而dev中存储着相关的设备
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/
使用chroot更改root目录,系统的目录结构将以squashfs-root作为根
chroot ./squashfs-root/ sh
至此,我们就可以运行该文件系统中的程序啦
3 QEMU用户模式仿真
因为我们要运行的是mipsel的程序,所以这里我们使用qemu-mipsel来执行
但如果有的时候目标程序使用了动态链接库就会导致我们执行失败,这个时候我们只要配合chroot使用即可,首先将qemu-mipsel拷贝到squashfs-root目录
cp $(which qemu-mipsel-static) .
sudo chroot . ./qemu-mipsel-static ./www/api
4 总结
QEMU的出现为我们这些测试人员节约了大量的成本。我们可以在没有开发板的情况下进行测试、调试和运行,大大提高了效率
参考引用:
https://swordfaith.github.io/2019/09/24/QEMU%20%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/
基于QEMU的嵌入式系统仿真环境的构建(陈宇星)
原文始发于微信公众号(物联网IoT安全):精选|QEMU仿真方式总结