2015年(123)
分类: 虚拟化
2015-06-21 11:41:57
原文地址:QEMU虚拟机及网桥设置--自己亲自测试版本 作者:mingfei10
环境: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网络启动脚本
创建qemu-ifup脚本,写入以下内容:
4. 创建一个空的tap网络关闭脚本(避免关闭虚拟机时的一个警告)
其内容如下:
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 文件还原。
网桥配置 。我的机器是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网络启动脚本
创建qemu-ifup脚本,写入以下内容:
4. 创建一个空的tap网络关闭脚本(避免关闭虚拟机时的一个警告)
其内容如下:
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相关工具
2. 配置网桥
修改为以下内容:
3. 创建tap网络启动脚本
创建qemu-ifup脚本,写入以下内容:
4. 创建一个空的tap网络关闭脚本(避免关闭虚拟机时的一个警告)
其内容如下:
说明:[主机操作系统为 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 | +-----------------------+ +--------------+
第一步:安装和设置网桥(参考)
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
/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桥接网络的方法: \\特别注意,大部分不能桥接无线网卡。。。只能桥接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地址。