#环境
qemu version: 2.12.0
kernel version: 3.14.79
zlib version: 1.2.11
dropbear version: 2017-75
system version:ubuntu 14.04_X64
network interface:eth0 (wire interface) ,eth1(wireless interface)
#qemu支持网络
qemu向客户机提供了如下四种不同模式的网络
1、基于网桥的虚拟网卡
2、基于nat的虚拟网络
3、QEMU内置的用户网络模式
4、直接分配网络设备的网络
##网络配置参数
-net nic[,vlan=n][,netdev=nd][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
本机使用:-net nic,macaddr=00:aa:00:60:00:01,model=lan9118 -net tap,ifname=tap0,script=no
##查看支持虚拟网络
qemu-system-arm -net nic,model=? -M module-name
qemu启动的是cpu模块:vexpress-a9
qemu-system-arm -net nic,model=? -M vexpress-a9
qemu: Supported NIC models: lan9118
#网桥模式
##网桥实现原理
虚拟出一个bridge,将这个bridge绑定到物理网卡上并分配一个对外的地址,再将对应的虚拟机网络设备绑定到这个虚拟bridge的一个端口上。
本机环境:虚拟网桥br0,将物理网口eth0和虚拟网络接口tap0绑定成br0的端口,这样实现了通过共享物理网络接口eth0实现访问网络。
网络的拓扑,如下图所示:
##网桥配置
###宿主机中安装工具,bridge-utils和uml-utilities
sudo apt-get install uml-utilities bridge-utils
uml-utilities : 例如命令 tunctl -t tap0 :创建tap0虚拟网卡
bridge-utils : 例如命令 brctl addbr br0 : 创建br0网桥
###网络配置脚本qemu-ifup和qemu-ifup
/etc/qemu-ifup的代码如下:
#!/bin/bash
switch=br0
interface=eth0
if [ -n "$1" ]; then
switch_exit=`sudo ifconfig -a | grep $switch`
interface_switch=`sudo brctl show | grep $interface`
if [ "$switch_exit" = "" ] ; then
sudo brctl addbr $switch
fi
if [ "$interface_switch" = "" ] ; then
sudo ifconfig $interface 0.0.0.0 promisc up
sudo brctl addif $switch $interface
fi
sudo ifconfig $1 0.0.0.0 promisc up
sudo brctl addif $switch $1
sudo dhclient $switch
else
echo "Error: no interface specified"
exit
fi
/etc/qemu-ifdown的代码如下:
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
# sudo tunctl -d $1
sudo brctl delif $switch $1
sudo ifconfig $1 down
else
echo "error: no interface specified"
exit 1
fi
1)如果传递参数:-net tap,vlan=0,ifname=tap0,则会执行/etc/qemu-ifup ,则ifname的值会传递给脚本/etc/qemu-ifup,也可以通过-net tap,ifname=tap0,script=no,中的script=no,则不执行脚本/etc/qemu-ifup;
2)因为qemu会自动创建tap0,则不需要在/etc/qemu-ifup中添加tunctl -u $(whoami) -t $1
3)如果脚本中没有sudo,则会报如下错误:ioctl(TUNSETIFF): Device or resource busy
###添加resolv.conf到文件系统/etc目录下
resolv.conf的内容如下
nameserver 223.6.6.6
###配置虚拟机网络
传递给qemu的启动参数如下:
sudo /home/tom/qemu-on-arm32/qemu/qumu-2.12.0/bin/qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd arm32_rootfs.ext4 -net nic,macaddr=00:aa:00:60:00:01,model=lan9118 -net tap,ifname=tap0,script=no
1)配置虚拟机的eth0的IP和br0的地址在同一网段
2)在虚拟机中添加条网关路由规则
route add default gw 192.168.199.1
注:网关地址和eth0和br0的地址在同一网段
测试:
1)ping 宿主机的br0的IP,测试宿主机和虚拟机的网络通路
2)ping www.baidu.com,测试虚拟机是否和外网是否相通
#宿主机和虚拟机的文件传输
宿主机和虚拟机通讯模型:宿主机作ssh服务端,虚拟机作ssh客户端。
注:也可以直接选在busybox中的ftp,本人习惯scp的用法。
宿主机是ubuntu,直接apt-get install安装:
sudo apt-get install openssh-server
虚拟机的客户端则采用dropbear中的dbclient作为ssh客户端。
##编译zlib
zlib-1.2.11的下载地址
解压源码
./configure --prefix=/usr/local/zlib
vim Makefile
Makefile修改如下:
CC=arm-linux-gnueabi-gcc
AR=arm-linux-gnueabi-ar
RANLIB=arm-linux-gnueabi-ranlib
LDSHARED=arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-linux-gnueabi-gcc -E
修改后保存退出
make
make install
##编译dropbear
dropbear-2017.75的下载地址
./configure --prefix=~/qemu/dropbear --with-zlib=/usr/local/zlib/ CC=arm-linux-gnueabihf-gcc --host=arm
make
make scp
make install
###拷贝scp,dhclient到文件系统
拷贝scp到文件系统sbin和dbclient到文件系统usb/bin目录下:
sudo cp ../dropbear/sbin/scp rootfs/sbin/
sudo cp ../dropbear/bin/dbclient rootfs/usr/bin
###测试scp
qemu启动虚拟机,在虚拟机下测试文件传输:
cd /tmp
scp -r user@192.168.199.3:~/test.txt .
说明:192.168.199.3是宿主机的br0的IP
#参考