环境:Notebook-PC 3.2.0-61-generic #92-Ubuntu SMP Mon Mar 31 23:47:59 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

1. 在基于 Debian 和 Ubuntu 的系统上,首先要安装含有建立虚拟网络设备 ( TAP interfaces ) 的工具 uml-utilities 和桥接工具 bridge-utils:

  aptitude install uml-utilities

  aptitude install bridge-utils

  为了使你的虚拟机能够访问网络接口,你必须将运行虚拟主机的用户的用户名(通常是你的ubuntu登录用户名)添加到uml-net用户组(请用你的用户名替换其中的“steven”):

  sudo gpasswd -a steven uml-net

  注意:为了使改动生效,请重新启动你的电脑。

  2. 向你的 Debian 或者 ubuntu 操作系统描述你要添加的虚拟网络设备,编辑 /etc/network/interfaces:(请先备份)

  sudo vim /etc/network/interfaces

  在打开的文件后面添加下面的内容,将虚拟网络接口命名为 "tap0",指定该接口IP配置方法为手动,并指定使用该接口的用户(请用你的用户名替换其中的 "steven "):

auto tap0 
   iface tap0 inet manual 
   up ifconfig $IFACE 0.0.0.0 up 
   down ifconfig $IFACE down 
   tunctl_user steven

  3. 另外还需要在 /etc/network/interfaces 中加入如下内容,建立一个名叫 "br0" 的桥,该桥的IP配置方法为通过DHCP配置,主机中的所有网络接口,也包括tap0这个虚拟网络接口,都将建立在这个桥之上:

auto br0 
   iface br0 inet dhcp 
   bridge_ports all tap0 
 
   在这里你可以根据自己的网络状况做相应的更改,你可以使网络桥使用静态 IP: 
   #iface br0 inet static 
   address 192.168.1.2 
   netmask 255.255.255.0 
   network 192.168.1.0 
   broadcast 192.168.1.255 
   gateway 192.168.1.1



        

    创建tap网络启动脚本



  1. sudo vi /etc/qemu-ifup  



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


1. #!/bin/sh    
2. #set -x    
3.  switch=br0    
4. if [ -n "$1" ];then   
5. $1   
6. $1 up    
7.          sleep 0.5s    
8. $switch $1   
9.          exit 0    
10. else   
11. "Error: no interface specified"   
12.          exit 1    
13.  fi


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



    1.  sudo vi /etc/qemu-ifdown


    其内容如下:



      1. #!/bin/sh   
      2.



        4. 首次使用需要激活刚才建立的虚拟网络接口和网络桥:

       

      sudo /sbin/ifup tap0 
         sudo /sbin/ifup br0

        这个步骤只需要做一次,下次主机重新启动时,这个接口和桥将自动激活

        5. 让 QEMU 使用这个虚拟网络接口

      kvm -hda debian.img -boot c -localtime -m 512 -net tap -net nic

        撤销网络桥

        1. 禁用网桥和虚拟网卡:

      sudo /sbin/ifdown br0 
         sudo /sbin/ifdown tap0

        2. 将前面修改的 /etc/network/interfaces 文件还原。


      sudo qemu-system-x86_64 -enable-kvm -m 1024 testcloudstack1.img -smp 4,sockets=2 -net nic -net tap

      网桥配置 。我的机器是64位Ubuntu,网桥配置过程如下:

        这个步骤只需要做一次,下次主机重新启动时,这个接口和桥将自动激活。

        1. 在基于 Debian 和 Ubuntu 的系统上,首先要安装含有建立虚拟网络设备 ( TAP interfaces ) 的工具 uml-utilities 和桥接工具 bridge-utils:

        aptitude install uml-utilities

        aptitude install bridge-utils

        为了使你的虚拟机能够访问网络接口,你必须将运行虚拟主机的用户的用户名(通常是你的ubuntu登录用户名)添加到uml-net用户组(请用你的用户名替换其中的“steven”):

        sudo gpasswd -a steven uml-net

        注意:为了使改动生效,请重新启动你的电脑。

        2. 向你的 Debian 或者 ubuntu 操作系统描述你要添加的虚拟网络设备,编辑 /etc/network/interfaces:(请先备份)

        sudo vim /etc/network/interfaces

        在打开的文件后面添加下面的内容,将虚拟网络接口命名为 "tap0",指定该接口IP配置方法为手动,并指定使用该接口的用户(请用你的用户名替换其中的 "steven "):

        auto tap0

        iface tap0 inet manual

        up ifconfig $IFACE 0.0.0.0 up

        down ifconfig $IFACE down

        tunctl_user steven

        3. 另外还需要在 /etc/network/interfaces 中加入如下内容,建立一个名叫 "br0" 的桥,该桥的IP配置方法为通过DHCP配置,主机中的所有网络接口,也包括tap0这个虚拟网络接口,都将建立在这个桥之上:

        auto br0

        iface br0 inet dhcp

        bridge_ports all tap0

        在这里你可以根据自己的网络状况做相应的更改,你可以使网络桥使用静态 IP:

        #iface br0 inet static

        address 192.168.1.2

        netmask 255.255.255.0

        network 192.168.1.0

        broadcast 192.168.1.255

        gateway 192.168.1.1

      创建tap网络启动脚本



      1. sudo vi /etc/qemu-ifup  



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


      1. #!/bin/sh    
      2. #set -x    
      3.  switch=br0    
      4. if [ -n "$1" ];then   
      5. $1   
      6. $1 up    
      7.          sleep 0.5s    
      8. $switch $1   
      9.          exit 0    
      10. else   
      11. "Error: no interface specified"   
      12.          exit 1    
      13.  fi


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


      1.  sudo vi /etc/qemu-ifdown


      其内容如下:


      1. #!/bin/sh   
      2.



          4. 首次使用需要激活刚才建立的虚拟网络接口和网络桥:

        sudo /sbin/ifup tap0

        sudo /sbin/ifup br0

        这个步骤只需要做一次,下次主机重新启动时,这个接口和桥将自动激活

        5. 让 QEMU 使用这个虚拟网络接口

             kvm -hda debian.img -boot c -localtime -m 512 -net tap -net nic

        撤销网络桥

        1. 禁用网桥和虚拟网卡:

        sudo /sbin/ifdown br0

        sudo /sbin/ifdown tap0

        2. 将前面修改的 /etc/network/interfaces 文件还原。

       

       

      kvm -hda ./debian.img -boot c -serial /dev/ttyS0 -localtime -m 512 -net tap -net nic

      这样就可以让虚拟机使用宿主机器的串口设备啦~~

       

      也可以使用NFS做文件系统以及独立的kernel image,但是这种方式未测试通过

      qemu -kernel bzImage-xxxx -append "root=/dev/nfs nfsroot=192.168.1.152:/exports/nfs/diskless/debian rw ip=dhcp console=tty" -localtime -m 512 -net tap -net nic

      在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. $1   
          6. $1 up    
          7.          sleep 0.5s    
          8. $switch $1   
          9.          exit 0    
          10. else   
          11. "Error: no interface specified"   
          12.          exit 1    
          13.  fi



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



          1. sudo vi /etc/qemu-ifdown  



          其内容如下:



          1. #!/bin/sh  





          如此配置完成后,即可使用以下命令启动qemu,直接使用网桥,而不必作其他配置(FILENAME为镜像文件路径):


          1. $FILENAME -net nic,model=e1000,macaddr=DE:AD:BE:EF:3E:10 net tap -m 512 -vnc 10.60.1.124:10


          说明:[主机操作系统为 Fedora 16 x86_64]使用qemu的网桥模式,这样由qemu创建的guest os和 主机操作系统在同一个局域网内,即局域网内的所有主机都可以访问 该guest os。当然由于网桥可以在直接网桥方式和NAT/Masquerading 方式下工作,因此guest 和 host可以在同一个子网内(直接桥接方 式)也可以将guest隐藏起来,不与host在同一个子网,如下图 (http://en.gentoo-wiki.com/wiki/KVM#Networking_2)。

          直接网桥模式:



          host   
                    +-----------------------+
                    |                       |        KVM GUEST1
                    |  +-----------+        |     +--------------+ 
          LAN ------+--+---  eth0  |   +----------+---  nic0     |      
                    |  |     tap0 -----+    |     | 192.168.0.83 |      KVM GUEST2         
                    |  |     tap1 -----+    |     +--------------+  +--------------+
                    |  +-----------+   |    |                       |              |
                    |          br0     +----+-----------------------+---- nic0     |
                    |    192.168.0.88       |                       | 192.168.0.84 |
                    +-----------------------+                       +--------------+



          NAT/Masquerading (网络地址转换/隐藏)网桥模式:


          host   
                    +-----------------------+
                    |                       |        KVM GUEST1
                    |   192.168.1.88        |     +--------------+ 
          LAN ------+-----  eth0            |     |              |
                    |  +-----------+   +----+-----+-----nic0     |   
                    |  |     tap0 -----+    |     | 192.168.0.83 |      KVM GUEST2         
                    |  |     tap1 -----+    |     +--------------+  +--------------+
                    |  +-----------+   |    |                       |              |
                    |          br0     +----+-----------------------+---- nic0     |
                    |    192.168.0.88       |                       | 192.168.0.84 |
                    +-----------------------+                       +--------------+


          第一步:安装和设置网桥(参考Virtualization With KVM On A Fedora 14 Server)

          1. 安装网桥和准备工作

          yum install bridge-utils



          为了让网桥顺利工作,需要关闭Network Manager,因为Network Manager好像不 支持网桥启动,可以先查看Network Manager是否启动,由于从Fedora14以后, 采用了Systemd 作为linux的系统和服务管理器,因此查看和关闭服务使用:



          systemctl status networkmanager.service
          systemctl stop networkmanager.service


          永久关闭该服务使用:



          chkconfig NetworkManager off
          chkconfig --levels 35 network on



          这时候重启网络,看看什么情况


          systemctl restart network.service


          1. 开始配置网卡和网桥

          /etc/sysconfig/network-scripts/ifcfg-p4p1的内容如下:重点需要关注的是 这里的NMCONTROLLED="no",而不是"yes",就是说要关闭network manager,另 外就是加上了BRIDGE=br0。 (至于为什么是p4p1 不是eth0等,那是fedora新版本采用的名称)



          DEVICE=p4p1
          #BOOTPROTO=static
          ONBOOT=yes
          NM_CONTROLLED="no"
          TYPE=Ethernet
          DEFROUTE=yes
          IPV4_FAILURE_FATAL=yes
          IPV6INIT=no
          NAME="System p4p1"
          UUID=5dd47203-fffb-671a-4fd0-4cff98347a3b
          HWADDR=00:25:64:8E:58:8C
          PREFIX0=24
          BRIDGE=br0


          还需要配置网桥,使用/etc/sysconfig/network-scripts/ifcfg-br0文件来完成, 可以看到该文件中配置了ip,gateway,dns等


          DEVICE=br0
          TYPE=Bridge
          BOOTPROTO=static
          ONBOOT=yes
          IPADDR=192.168.0.88
          NETMASK=255.255.255.0
          GATEWAY=192.168.0.1
          DNS1=192.168.0.1
          DELAY=0
          STP=off


          这时候重启网络



          systemctl restart network.service



          正常的情况下应该看到如下信息:

          [abelard@localhost ~]$ ifconfig
          br0       Link encap:Ethernet  HWaddr 00:25:64:8E:58:8C  
                    inet addr:192.168.0.88  Bcast:192.168.0.255  Mask:255.255.255.0
                    inet6 addr: fe80::225:64ff:fe8e:588c/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:11611 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:10348 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:0 
                    RX bytes:8935226 (8.5 MiB)  TX bytes:1445532 (1.3 MiB)
          
          lo        Link encap:Local Loopback  
                    inet addr:127.0.0.1  Mask:255.0.0.0
                    inet6 addr: ::1/128 Scope:Host
                    UP LOOPBACK RUNNING  MTU:16436  Metric:1
                    RX packets:8 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:0 
                    RX bytes:480 (480.0 b)  TX bytes:480 (480.0 b)
          
          p4p1      Link encap:Ethernet  HWaddr 00:25:64:8E:58:8C  
                    inet6 addr: fe80::225:64ff:fe8e:588c/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:12061 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:10384 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:1000 
                    RX bytes:9225251 (8.7 MiB)  TX bytes:1497788 (1.4 MiB)
                    Interrupt:16


          可以使用nslookup www.google.com命令看看是否有问题!

          第二步,创建tap设备 有了网桥以后,先使用



          [abelard@localhost ~]$ sudo lsmod | grep tun


          如果没有任何信息,使用




          如果还没有信息,就需要google一下,查找怎么yum一个tun模块。有信息的话, 就继续。 使用tunctl命令创建tap设备,并将tap设备添加到网桥br0中,


          [abelard@localhost ~]$ sudo tunctl -b  -t tap0
          [abelard@localhost ~]$ brctl addif br0 tap0
          [abelard@localhost ~]$ sudo ifconfig tap0 up
          [abelard@localhost ~]$ ifconfig
          br0       Link encap:Ethernet  HWaddr 00:25:64:8E:58:8C  
                    inet addr:192.168.0.88  Bcast:192.168.0.255  Mask:255.255.255.0
                    inet6 addr: fe80::225:64ff:fe8e:588c/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:12165 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:10867 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:0 
                    RX bytes:9116034 (8.6 MiB)  TX bytes:1529806 (1.4 MiB)
          
          lo        Link encap:Local Loopback  
                    inet addr:127.0.0.1  Mask:255.0.0.0
                    inet6 addr: ::1/128 Scope:Host
                    UP LOOPBACK RUNNING  MTU:16436  Metric:1
                    RX packets:8 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:0 
                    RX bytes:480 (480.0 b)  TX bytes:480 (480.0 b)
          
          p4p1      Link encap:Ethernet  HWaddr 00:25:64:8E:58:8C  
                    inet6 addr: fe80::225:64ff:fe8e:588c/64 Scope:Link
                    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                    RX packets:12677 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:10903 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:1000 
                    RX bytes:9431240 (8.9 MiB)  TX bytes:1584348 (1.5 MiB)
                    Interrupt:16 
          
          tap0      Link encap:Ethernet  HWaddr 26:A1:36:5F:18:64  
                    UP BROADCAST MULTICAST  MTU:1500  Metric:1
                    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                    collisions:0 txqueuelen:500 
                    RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


          这时候,网桥和tap设备都可以工作了,意味着qemu的网桥模式可以开始。

          第三步 在qemu中使用网桥模式

          使用过两种方式,

          (1) 不设置启动脚本


          sudo qemu-kvm -hda CentOs5.7.img -net nic,macaddr=00:1d:92:ab:3f:78 -net tap,ifname=tap0,script=no,downscript=no -boot c


          这种方式,因为没有用到启动脚本(script=no,downscript=no),因此需要手动来使用上面的命令:


          [abelard@localhost ~]$ brctl addif br0 tap0
          [abelard@localhost ~]$ sudo ifconfig tap0 up


          (2) 设置qemu网络启动脚本/etc/qemu-ifup



          #!/bin/sh
          brctl addif br0 $1
          ifconfig $1 up 0.0.0.0 promisc



          使用以下命令就可以启动guest os,并且可以在同一个子网中访问这个guest(192.168.0.81) 了,



          sudo qemu-kvm -hda CentOs5.7.img -net nic,macaddr=00:1d:92:ab:3f:78 -net tap,ifname=tap0  -boot c




          sudo qemu-kvm -hda CentOs5.7.img -net nic,macaddr=00:00:00:00:00:00 -net tap,ifname=tap0 -boot c



          sudo qemu-kvm -hda CentOs5.7.img -net nic -net tap,ifname=tap0 -boot c




          Kvm 网络桥接方案

          下面介绍配置KVM桥接网络的方法: \\特别注意,大部分不能桥接无线网卡。。。只能桥接PCI网卡。。。。
          安装桥接工具:

          代码:



          sudo apt-get install bridge-utils


          安装创建TAP界面的工具:

          代码:



          sudo apt-get install uml-utilities



          编辑网络界面配置文件
          代码:



          sudo vi /etc/network/interfaces ,根据你的情况加入以下内容:



          代码:



          auto eth0 iface eth0 inet static \\这里可以为DHCP address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1



          或使用最保守的eth0配置:

          auto eth0
           iface eth0 inet manual  auto tap0
           iface tap0 inet manual
           up ifconfig $IFACE 0.0.0.0 up
           down ifconfig $IFACE down
           tunctl_user lm \\lm是我的用户名,在这里换为你的用户名  auto br0
           iface br0 inet static \\当然这里也可以使用DHCP分配
           bridge_ports eth0 tap0
           address 192.168.1.3
           netmask 255.255.255.0
           network 192.168.1.0
           broadcast 192.168.1.255
           gateway 192.168.1.1


          激活tap0和br0: //有些时候会不奏效,但重启后就行了

          代码:



          sudo /sbin/ifup tap0 sudo /sbin/ifup br0



          好了以后ifconfig看一下,多了一个tap0和br0, br0上的IP地址就是你本机的IP地址。