文档:https://www.qemu.org/docs/master/
Wiki: https://wiki.qemu.org/Main_Page
Qemu Mips文档:https://www.qemu.org/docs/master/system/target-mips.html
1. 安装
本文以mips小端版本为例:
sudo apt install qemu-system-mipsel -y
然后下载mips的内核和镜像:
内核文件 vmlinux-2.6.32-5-4kc-malta
磁盘镜像 debian_squeeze_mips_standard.qcow2
有两个地址:
- https://people.debian.org/~aurel32/qemu/mips/, 开发人员使用;
- http://ftp.debian.org/debian/dists/stable/main/installer-mipsel/current/images/malta/netboot/, debian的ftp,有临时根文件系统initd, 但没有提供磁盘镜像。
从第一个开发网站上下载即可, 下载页面还提供了启动qemu的指令。
启动虚拟机:
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
sudo 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"
sudo qemu-system-mips64 -M malta -kernel vmlinux-2.6.32-5-5kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
sudo 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"
登录root/root
。
2. 网络配置
宿主机安装网络依赖:
sudo apt-get install bridge-utils
sudo apt-get install uml-utilities # 提供tunctl工具
有一种修改/etc/network/interfaces
的方法,容易失败,推荐brctl的方法。
# 创建网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.122.1/24 up
# 创建tap接口,名字为tap0,并添加到网桥
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.122.11/24 up
sudo brctl addif br0 tap0
启动虚拟机:
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet
# 输入root/root进入虚拟机,设置ip:
ifconfig eth0 192.168.122.12/24 up
网络通了之后,就可以把文件拷进去了:
$ scp -r squashfs-root/ root@192.168.122.12:/root/
关于tap网卡
普通的网卡一端连接物理链路,一端连接内核协议栈。当数据通过物理链路进来后,到达内核协议栈做进一步的处理:
- 对于一些错误的数据包,协议栈可以选择丢弃;
- 对于不属于本机的数据包,协议栈可以选择转发;
- 对于属于本机的数据,协议栈就会通过Socket API告知上层正在等待的应用程序。
普通的物理网卡是通过物理链路来收发数据,而tun/tap 是通过/dev/net/tun来收发数据,一端连着/dev/net/tun,一端连着协议栈。
tap网卡主要是两部分组成:
- 字符设备驱动:把数据写入/dev/net/tun,然后通知用户进程从/dev/net/tun里面拿数据实现数据交互
- 虚拟网卡驱动:负责和网络协议栈的数据打交道
3. 其它使用方法
退出:ctrl+a, x。 不过配好网卡之后退出,居然就没法再启动了,后来参考firmadyne是因为没有删除网卡。所以后面直接用firmadyne的run.sh改了一下:
#!/bin/bash
set -u
ARCHEND=mipseb
IID=1
# if [ -e ./firmadyne.config ]; then
# source ./firmadyne.config
# elif [ -e ../firmadyne.config ]; then
# source ../firmadyne.config
# elif [ -e ../../firmadyne.config ]; then
# source ../../firmadyne.config
# else
# echo "Error: Could not find 'firmadyne.config'!"
# exit 1
# fi
# IMAGE=`get_fs ${IID}`
IMAGE="debian_wheezy_mips_standard.qcow2"
# KERNEL=`get_kernel ${ARCHEND}`
KERNEL="vmlinux-3.2.0-4-4kc-malta"
# QEMU=`get_qemu ${ARCHEND}`
QEMU=qemu-system-mips
# QEMU_MACHINE=`get_qemu_machine ${ARCHEND}`
QEMU_MACHINE=malta
# QEMU_ROOTFS=`get_qemu_disk ${ARCHEND}`
# armel)
# echo "/dev/vda1"
# ;;
# mipseb)
# echo "/dev/sda1"
# ;;
# mipsel)
# echo "/dev/sda1"
# ;;
QEMU_ROOTFS="/dev/sda1"
# WORK_DIR=`get_scratch ${IID}`
WORK_DIR="./"
TAPDEV_0=tap${IID}_0
HOSTNETDEV_0=${TAPDEV_0}
echo "Creating TAP device ${TAPDEV_0}..."
sudo tunctl -t ${TAPDEV_0} -u ${USER}
echo "Bringing up TAP device..."
sudo ip link set ${HOSTNETDEV_0} up
sudo ip addr add 192.168.0.100/24 dev ${HOSTNETDEV_0}
echo "Adding route to 192.168.0.99..."
sudo ip route add 192.168.0.99 via 192.168.0.99 dev ${HOSTNETDEV_0}
function cleanup {
pkill -P $$
echo "Deleting route..."
sudo ip route flush dev ${HOSTNETDEV_0}
echo "Bringing down TAP device..."
sudo ip link set ${TAPDEV_0} down
echo "Deleting TAP device ${TAPDEV_0}..."
sudo tunctl -d ${TAPDEV_0}
}
trap cleanup EXIT
echo "Starting firmware emulation... use Ctrl-a + x to exit"
sleep 1s
sudo ${QEMU} -m 256 -M malta \
-kernel ${KERNEL} \
-hda ${IMAGE} \
-append "root=/dev/sda1 console=tty0" \
-nographic \
# -netdev tap,id=net0,ifname=${TAPDEV_0},script=no \
# -device e1000,netdev=net0
-net nic -net tap,ifname=${TAPDEV_0},script=no
# ${QEMU} -m 256 \
# -M ${QEMU_MACHINE} \
# -kernel ./${KERNEL} \
# # -hda ${IMAGE} \
# -drive if=ide,format=raw,file=${IMAGE}
# # -append "root=${QEMU_ROOTFS} console=ttyS0" \
# -append "root=${QEMU_ROOTFS} console=ttyS0 nandsim.parts=64,64,64,64,64,64,64,64,64,64 rw debug ignore_loglevel print-fatal-signals=1 user_debug=31 firmadyne.syscall=0"
# -nographic \
# -netdev tap,id=net0,ifname=${TAPDEV_0},script=no \
# -device e1000,netdev=net0 \
# -netdev socket,id=net1,listen=:2001 \
# -device e1000,netdev=net1 \
# -netdev socket,id=net2,listen=:2002 \
# -device e1000,netdev=net2 \
# -netdev socket,id=net3,listen=:2003 \
# -device e1000,netdev=net3 | tee ${WORK_DIR}/qemu.final.serial.log
进入qemu后,登录root/root
,执行以下命令修改ip,顺利的话就能与其它机器ping通了:
ifconfig eth0 192.168.0.99/24
注意:
- -nographic可能导致启动时不显示console;
- VirtualBox导致qemu的ip固定为10.0.2.15(nat)。