IOT环境搭建–如何使用qemu运行各种指令架构程序
概述
考虑到性能等因素,IoT
设备往往采用arm
, mips
等指令架构,还有少量采取ppc
x86
等,在IOT
分析中,往往需要使用硬件虚拟化的虚拟机qemu
来实现针对不同指令架构程序的仿真模拟.
环境搭建
在IoT
分析中,一些情况下只需要在用户模式下针对单个的程序进行仿真,另一些情况则需要建立一个完整的对应指令架构的虚拟机.以下是针对性的解决方案.
使用qemu-user
运行不同指令架构程序
qemu-user
安装
$ sudo apt-get install qemu qemu-user qemu-user-static
qemu-user
使用
此时可以运行静态链接的arm
程序:
1 | $ file ./arm_static |
而要运行动态链接的程序,需要安装对应架构的动态链接库方可,例如以下这个arm64
程序:
1 | $ file ./arm64_shared |
要首先安装对应架构arm64
的汇编器及动态链接库:
1 | $ sudo apt-get install binutils-aarch64-linux-gnu |
其中具体的汇编器和动态链接库可以通过以下命令进行查找:
1 | $ sudo apt search binutils| grep aarch64 |
然后就可以实现该程序的仿真:
1 | $ qemu-aarch64 -L /usr/aarch64-linux-gnu ./arm64_shared |
其它架构处理类似.
使用qemu
搭建不同指令架构虚拟机
使用qemu
搭建不同指令架构虚拟机可以有两种方式:
- 下载对应指令架构的内核和文件系统,然后使用
qemu-system
建立相应指令架构的虚拟机,但是这种方法需要配置好虚拟机网络 - 直接使用
docker
运行各种指令架构的容器
使用qemu-system
建立不同指令架构虚拟机
qemu-system
安装
$ sudo apt-get install qemu qemu-user-static qemu-system uml-utilities bridge-utils
使用qemu-system
可模拟完整的各种指令架构的linux
系统
虚拟机建立步骤
配置虚拟机网络
安装依赖文件
sudo apt-get install bridge-utils uml-utilities
修改 ubuntu主机网络配置,将ubuntu主机系统中的网络接口配置文件 /etc/network/interfaces 修改为如下内容并保存、关闭。
bash1
2
3
4
5
6
7
8
9
10auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
#auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_maxwait 0创建QEMU的网络接口启动脚本,重启网络使配置生效。使用如下命令,在 /etc/qemu-ifup的后面加入以下内容。
sudo gedit /etc/qemu-ifup
bash1
2
3
4
5
6
7
echo "Executing /etc/qemu-ifup"
echo "Bringing $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /sbin/brctl addif br0 $1
sleep 3保存 文件/etc/qemu-ifup 以后,赋予文件/etc/qemu-ifup 可执行权限,然后重启网络使所有的配置生效。
bash1
2
3
4$ sudo chmod a+x /etc/qemu-ifup
# 重启网络使配置生效
$ sudo /etc/init.d/networking restart在本地ubuntu命令行终端,启动桥连网络。
bash1
2sudo ifdown eth0
sudo ifup br0下载虚拟机内核文件系统文件
可以在以下地址下载:
下载地址:https://people.debian.org/~aurel32/qemu/
当然也可以自己编译对应架构内核.
各架构虚拟机开启命令
下载好各种架构的内核文件和系统文件后运行以下命令即可打开对应指令架构的虚拟机
mips 32位:
qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic
mips 64位:
qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic
mipsel 32位:
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 -nographic
mipsel 64位
qemu-system-mips64el -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic
armel
qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -net nic -net tap -nographic
armhf
qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap -nographic
arm64
qemu-system-x86_64 -hda debian_wheezy_amd64_standard.qcow2 -net nic -net tap -nographic
与docker
的兼容性问题
安装了docker
后,可能会发现qemu
开启的虚拟机无法正常联网了,这是因为docker
安装中更改了iptables
,可执行一下命令更正一下路由表
iptables -I FORWARD -i br0 -o br0 -j ACCEPT
然而这是临时生效,下次重启还需要重新执行,可按以下方法一劳永逸:
1 | $ sudo apt-get install iptables-persistent |
另外可能还需要修改DNS
:
$ cp /etc/resolv.conf /etc/resolv.confbak
将/etc/resolv.conf
内容更改为以下:
1 | nameserver 8.8.8.8 #设置首选dns |
使用docker
建立不同指令架构虚拟机
安装qemu
环境
1 | $ sudo apt-get install qemu qemu-user-static qemu-system uml-utilities bridge-utils |
下载镜像(armhf
为例)
$ docker pull ioft/armhf-ubuntu:trusty
其它架构类似,直接search
即可
使用docker运行容器(armhf
为例)
1 | $ docker run -it --privileged -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static ioft/armhf-ubuntu:trusty /bin/bash |
进入容器查看
1 | $ sudo docker exec -it 240f58b9b3ba bash |