qemu-mips环境搭建跳坑指南
-
qemu安装
安装有很多方式,对于ubuntu/debian用户,直接apt安装即可
官网:https://www.qemu.org/download/
sudo apt-get install zlib1g-dev sudo apt-get install libglib2.0-0 sudo apt-get install libglib2.0-dev sudo apt-get install libtool sudo apt-get install libsdl1.2-dev sudo apt-get install libpixman-1-dev sudo apt-get install autoconf sudo apt-get install qemu sudo apt-get install qemu-user-static sudo apt-get install qemu-system
或者使用源码安装的方式
https://www.qemu.org/download/
https://github.com/qemu/qemu -
buildroot 交叉编译环境的配置
下载buildroot
wget http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2
tar -jxvf buildroot-snapshot.tar.bz2
cd buildroot
配置buildroot
sudo apt-get install libncurses-dev patch
make clean
make menuconfig
出现的界面当中,”Target Architecture”改为”MIPS”大端小端自行选择,另外在”Toolschain”中要将”Kernel Headers”的版本改为自己系统的版本
可以使用 uname -r
查询
我的内核版本是4.13.0-36-generic
很难受的一点是 在Kernel Headers选项中并没有4.13.x……
这时候要选择”Manually specified Linux version”,并在下方的”Custom kernel headers series”中手动指定为4.13.x
退出后执行下方命令
sudo apt-get install texinfo
sudo apt-get install bison
sudo apt-get install flex
sudo make
在编译过程中……会比较慢…..耐心等待 = =
其中要注意的一点是,我在编译的时候遇到了一个问题
其中一部分文件在下载时本应是linux-4.13.tar.xz
但是Makefile好像有些问题,访问成了linux-.tar.xz
我对这个问题的处理方式是:
1. 手动下载linux-4.13.tar.xz
2. 手动保存为
```buildroot/output/build/linux-headers/.stmap_download```
和
``buildroot/dl/linux/linux-.tar.xz``
3. 继续编译
编译结束后,使用mipsel-linux-gnu-gcc
指令即可编译出mips架构下的elf文件
同时,mips程序执行所需要的依赖库也都保存到了/usr/mipsel-linux-gnu/lib
下
-
qemu虚拟机的网络环境配置
首先安装依赖
sudo apt-get install bridge-utils uml-utilities
我这里选择使用网桥的方法使宿主机与虚拟机互联,然后通过NAT的方式使虚拟机与外网链接
注意一点,如果不进行NAT设置的话,虚拟机是不能访问外网的,这也是许多文章没有提到的问题(我在坑里呆了好久)
sudo brctl addbr br0 sudo ifconfig br0 192.168.122.1/24 up sudo tunctl -t tap0 sudo ifconfig tap0 192.168.122.11/24 up sudo brctl addif br0 tap0
下载qemu虚拟机的镜像
https://people.debian.org/~aurel32/qemu/mips/
我选择的内核和镜像是
vmlinux-3.2.0-4-4kc-malta
和debian_wheezy_mips_standard.qcow2
默认用户名密码是:root/root
然后在本机配置dhcp,dns服务
sudo dnsmasq --strict-order --except-interface=lo --interface=br0 --listen-address=192.168.122.1 --bind-interfaces --dhcp-range=192.168.122.2,192.168.122.254 --conf-file="" --pid-file=/var/run/qemu-dhcp-virbr0.pid --dhcp-leasefile=/var/run/qemu-dhcp-virbr0.leases --dhcp-no-override
现在使用
sudo qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic
命令启动虚拟机,就可以做到虚拟机与宿主机互通了
接下来进行外网连接的配置
开启端口转发
sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -p /etc/sysctl.conf
配置iptables
sudo iptables -t nat -A POSTROUTING -s "192.168.122.0/255.255.255.0" ! -d "192.168.122.0/255.255.255.0" -j MASQUERADE sudo iptables -N vm-service sudo iptables -A vm-service -j ACCEPT sudo iptables -A FORWARD -s 192.168.122.0/24 -j vm-service
再使用上方的命令启动虚拟机,就可以与外网互通了
-
qemu-mipsel运行动态编译的程序
qemu-mipsel平时运行程序,遇到动态编译的程序时,就会提示依赖库缺少
书上和网上给出的方法都是chroot,但使用这个命令时也有几个坑
先将buildroot所编译出的lib库复制到程序文件夹下
然后再执行chroot的命令
cp $(which qemu-mipsel) . sudo chroot . ./qemu-mipsel hello
已经将lib库复制到目录下,但是在执行时还是缺少依赖库
这时候大概率就是qemu-mipsel缺少依赖库了…….一种解决方式是通过ldd指令查看qemu的依赖库,并复制,另一种方法是我更推荐的,直接使用静态编译的qemu-mipsel-static
cp $(which qemu-mipsel-static) . sudo chroot . ./qemu-mipsel-static hello
至此…..我的qemu安装爬坑结束,哪里有问题,还望师傅们多多包涵(告诉我)