QEMU中的网络

#qemu的基于arm的环境搭建
周同学分享的qemu的基于arm的环境搭建

#环境
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 [email protected]:~/test.txt .

说明:192.168.199.3是宿主机的br0的IP


#参考

KVM-网络配置

猜你喜欢

转载自blog.csdn.net/chengbeng1745/article/details/81271024