QEMU虚拟机及网桥设置--自己亲自测试版本

2740阅读 0评论2015-06-09 embeddedlwp
分类:虚拟化



环境: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.         /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  


  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.         /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 /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  



    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.         /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  


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

直接网桥模式:

                     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 |
          +-----------------------+                       +--------------+

第一步:安装和设置网桥(参考)

  1. 安装网桥和准备工作
yum install bridge-utils

为了让网桥顺利工作,需要关闭Network Manager,因为Network Manager好像不 支持网桥启动,可以先查看Network Manager是否启动,由于从Fedora14以后, 采用了 作为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 命令看看是否有问题!

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

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

如果没有任何信息,使用

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

如果还没有信息,就需要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地址。

上一篇:Linux内核mem_cgroup浅析
下一篇:KVM 与cgroup