qemu 网络通信

qemu安装:
1、
apt-get install qemu kernel-package linux-source kqemu-source build-essential
2、
cd /usr/src/linux
module-assistant prepare kqemu 
module-assistant build kqemu
module-assistant install kqemu
depmod -a
3、
modprobe kqemu
mknod /dev/kqemu c 250 0 
chmod 666 /dev/kqemu

一、获取powerpc虚拟镜像

1.手动生成
下载debian-502a-powerpc-netinst.iso文件
1)生成镜像文件,大小自定义
qemu-img create -f qcow ppc.qcow 2G 
默认生成.raw格式的镜像文件。qcow应该算是qemu下最佳格式,它的优点在于磁盘映像的大小与表示映像的物理文件的大小不同,比如一个空的4GB磁盘映像只需要16KB的物理空间
qemu支持nbd parallels qcow2 vvfat vpc bochs dmg cloop vmdk qcow cow host_device raw等格式
2)安装
qemu-system-ppc -hdc ppc.qcow -cdrom debian-502a-powerpc-netinst.iso -boot d
3)运行
qemu-system-ppc -hdc debian_lenny_powerpc_small.qcow -redir tcp:22000::22 -m 512
-redir tcp:22000::22   重定向TCP或者UDP连接从主机端口到虚拟机端口。监听虚拟机上的22端口,即sshd服务。当主机ssh指定22000时就连到22端口
-m 512    指定虚拟机的内存大小(512MB)
4)数据共享  (此处默认是user模式,也可以用tap/tun模式)
在ppc虚拟机里面安装openssh-server,启动sshd服务
ssh root@127.0.0.1 -p 22000  [用root用户登陆ppc虚拟机]
scp lb@192.168.100.181:/home/lb/test.txt /root  [把主机192.168.100.181上的test.txt文件传送到ppc虚拟机的root目录下]
scp -r doc/ lb@192.168.100.181:/home/lb        [把ppc虚拟机上的doc目录传送到主机192.168.100.181的/home/lb目录下]

2.下载使用
到http://people.debian.org/~aurel32/qemu/powerpc处下载for ppc的镜像文件,拿来直接使用
1)gunzip debian_lenny_powerpc_small.qcow.gz
2)qemu-system-ppc -hdc debian_lenny_powerpc_small.qcow -redir tcp:22000::22 -m 512

二、生成rootfs
如果需要图形,可以在rootfs中安装x-server(xorg)和x-window(xfce、gnome、kde等),记得chroot ^_^
在powerpc虚拟机中执行以下命令:
1)apt-get install debootstrap
2)scp lb@192.168.100.181:/home/lb/debian-502a-powerpc-netinst.iso .
3)mount -o loop debian-502a-powerpc-netinst.iso /mnt
4)mkdir rootfs
5)debootstrap --arch powerpc lenny ./rootfs/ file:/mnt/debian

三、nfs挂载
powerpc虚拟机:
1)cd rootfs
2)tar cvf rootfs.tar $(ls . | grep -v -e tmp -e mnt -e proc -e media -e sys)
3)scp rootfs.tar lb@192.168.100.181:/home/lb

pc机:
1)mkdir rootfs
2)tar xvf rootfs.tar -C rootfs
3)cd rootfs
4)mkdir {tmp,mnt,proc,media,sys}

powerpc目标板:
在bootload(u-boot)中设置nfs参数,如:
setenv bootargs console=ttyS0,115200 console=tty0 root=/dev/nfs rw nfsroot=192.168.100.181:/home/lb/rootfs resolution=1024x768 ip=192.168.100.230

[
注:.qcow格式的镜像文件不能直接被mount,要先转换成.raw格式
qemu-img convert -f qcow debian_lenny_powerpc_small.qcow -O raw debian_lenny_powerpc_small.raw
mount -o loop,offset=32256 debian_lenny_powerpc_small.raw /mnt/cdrom

raw和qcow的区别:
raw格式是一种"直读直写"的格式,不具备特殊的特性
qcow格式有一些高级的特性,可以对它进行加密和压缩,以节省磁盘空间并保证数据安全,但一旦损坏将很难恢复 
]

qemu相关
qemu支持的平台有: arm x86_64 mips ppc sparc等
如果是arm平台用qemu-system-arm命令;如果是x86平台用qemu-system-x86_64命令

Ctrl+Alt+F    全屏和恢复


网络模式
qemu有两种上网方式:
user mode network:
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数(默认情况下就是-user-net),虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。
tap/tun network:
这种方式要比user mode复杂一些,但是设置好后powerpc虚拟机和互联网、powerpc虚拟机和pc机之间通信都很容易。这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增加一块虚拟网络设备(tap0),然后就可以象真实网卡一样配置它。

tap/tun模式实现方法:
一、pc机:
1.tap/tun驱动支持 (如果没有就重编内核)
1)ll /dev/net/tun
crw-rw-rw- 1 root root 10, 200 09-07 15:39 /dev/net/tun
2)qemu运行时内核会加载tun模块
lsmod |grep tun
tun                     9508  1

2.tap/tun初始化文件
/etc/qemu-ifup:
sudo -p "Password for $0:" /sbin/ifconfig $1 172.20.0.1

172.20.0.1: tap0的默认ip,可以自定义,如改为192.168.0.1

3.外网实现
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 172.20.0.0/24 -j MASQUERADE

4.启动qemu
qemu-system-ppc -hdc debian_lenny_powerpc_small.qcow -m 256 -net nic,vlan=0 -net tap,vlan=0
输入命令ifconfig -a就会显示tap0的信息,默认ip是172.20.0.1

二、powerpc虚拟机:
1.设置ip和route
ifconfig eth0 172.20.0.100
route add default gw 172.20.0.1

2.DNS
dns与pc机相同

3.其它
powerpc虚拟机ip与pc机上tap0的ip相同网段     [powerpc->ip: 172.20.0.100        tap0->ip: 172.20.0.1]
网关为tap0的ip        [powerpc->gateway: 172.20.0.1    tap0->ip: 172.20.0.1] 
其余参数与tap0相同,比如子网掩码都为255.255.0.0,广播地址都为172.20.255.255

网桥模式实现方法:
1、修改/etc/qemu-ifup文件,修改后内容如下:
#!/bin/sh
## 获取原来主系统 eth0 的 IP 和网关
IP=`ifconfig eth0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
## 删除 eth0 的 IP
ip addr del $IP dev eth0
## 激活 tap0 ($1 是qemu传递过来的网卡名称,即tap0)
ip link set $1 up
## 停止并删除存在的网桥
ip link set br0 down &>/dev/null
brctl delbr br0 &>/dev/null
## 添加网桥接口 br0
brctl addbr br0
## 将 eth0 加入网桥
brctl addif br0 eth0
## 将 tap0 加入网桥
brctl addif br0 $1
## 启动网桥
ifconfig br0 $IP up
## 添加默认路由
route add default gw $GATEWAY
2、运行qemu
qemu-system-ppc -hdc debian_lenny_powerpc_small.qcow -m 256 -net nic,vlan=0 -net tap,vlan=0
3、恢复原状,运行qemu-ifdown脚本,内容如下:
#!/bin/sh
IP=`ifconfig br0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
ip addr del $IP dev br0
ip link set br0 down
brctl delbr br0
ifconfig eth0 $IP up

route add default gw $GATEWAY



配置kvm的网络有2种方法。其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送。其二,使用桥接方式(Bridged Networking),外部的机器可以直接联通到虚拟机,就像联通到你的主机一样。我着重介绍桥接方式,并在ubuntu10.10上测试通过。主要参考了 https://help.ubuntu.com/community/KVM/Networking 。

    第一,用户模式
    虚拟机可以使用网络服务,但局域网中其他机器包括宿主机无法连接它。比如,它可以浏览网页,但外部机器不能访问架设在它里面的web服务器。
    默认的,虚拟机得到的ip空间为10.0.2.0/24,主机ip为10.0.2.2供虚拟机访问。你可以ssh到主机(10.0.2.2),可以用scp来拷贝文件。
    
    第二,桥接模式
    这种模式允许虚拟机就像一台独立的主机一样拥有网络。这种模式需要网卡支持,一般的有线网卡都支持,绝大部分的无线网卡都不支持(如:ipw3945,我的T400上无线网卡)!

    A) 在主机上创建一个网络桥
    1)安装bridge-utils
        sudo apt-get install bridge-utils
    2)我们将改变网络设置,先停止网络
        sudo invoke-rc.d networking stop
        如果是用远程连接进行设置,我们需要将之后的设置完了,然后重启网络sudo invoke-rc.d networking restart,如果中途有一步错误,你将不能连接上去了。。
    3)修改/etc/network/interfaces,可以直接用下面的替换。
        a) 静态ip模式
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

        b) DHCP模式
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
    4)重启网络
        sudo /etc/init.d/networking restart

    B) 随机生成一个KVM的MAC地址
    MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^/(../)/(../)/(../)/(../).*$//1:/2:/3:/4/')"; echo $MACADDR
    你也可以指定一个mac地址,但要注意,第一个字节必须为偶数,如00,52等,不能为奇数(01),否则会有不可预料的问题。因为奇数保留为多播使用。如,KVM可以接收ARP包并回复,但这些回复会使其他机器迷惑。这是以太网的规则,而非KVM的问题。
    我直接将网卡地址设置为MACADDR="32:32:32:32:32:32"

    C) 将以前安装的虚拟机网络改为桥接方式或者安装新的虚拟机使用桥接网络
    我写了一个脚本文件
#start kvm.winxp
USERID=`whoami`
MACADDR="32:32:32:32:32:32"
model=e1000e
iface=`sudo tunctl -b -u $USERID`
kvm -net nic,vlan=0,macaddr=$MACADDR -net tap,vlan=0,ifname=$iface $@
sudo tunctl -d $iface
#end kvm.winxp
    使用iso文件安装winxp,运行如下命令:
sudo ./kvm.bridge -m 512 -hda winxp.img -cdrom /home/software/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso -boot d
    运行安装完的虚拟机,运行如下命令:
sudo ./kvm.bridge -m 512 -hda winxp.img -boot c



在Qemu网络中,为了实现虚拟机网卡和真实物理网络的连通,就需要使用桥接网络。通常情况下qemu的桥接网络是通过使用tap虚拟网卡来实现的,具体原理请参考相关文档,这里只介绍配置桥接网络的方法:

1. 安装tap相关工具

  1. sudo apt-get install uml-utilities  

2. 配置网桥

  1. sudo vi /etc/network/interfaces  

修改为以下内容:

  1. auto lo   
  2. iface lo inet loopback   
  3. auto br0   
  4. iface br0 inet static   
  5. bridge_ports eth0 tap0   
  6. address 10.0.7.6   
  7. netmask 255.255.0.0   
  8. network 10.0.0.0   
  9. broadcast 10.0.255.255   
  10. gateway 10.0.0.2  

3. 创建tap网络启动脚本

  1. sudo vi /etc/qemu-ifup  

创建qemu-ifup脚本,写入以下内容:

  1. #!/bin/sh   
  2. #set -x   
  3. switch=br0   
  4. if [ -n "$1" ];then  
  5.         /usr/bin/sudo /usr/sbin/tunctl -u `whoami` -t $1  
  6.         /usr/bin/sudo /sbin/ip link set $1 up   
  7.         sleep 0.5s   
  8.         /usr/bin/sudo /usr/sbin/brctl addif $switch $1  
  9.         exit 0   
  10. else  
  11.         echo "Error: no interface specified"  
  12.         exit 1   
  13. fi  

4. 创建一个空的tap网络关闭脚本(避免关闭虚拟机时的一个警告)

  1. sudo vi /etc/qemu-ifdown  

其内容如下:

  1. #!/bin/sh  

如此配置完成后,即可使用以下命令启动qemu,直接使用网桥,而不必作其他配置(FILENAME为镜像文件路径):
  1. sudo qemu-system-x86_64 -hda $FILENAME -net nic,model=e1000,macaddr=DE:AD:BE:EF:3E:10 net tap -m 512 -vnc 10.60.1.124:10 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值