版权声明:本文由陈煜东原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/90

来源:腾云阁 https://www.qcloud.com/community

通过艰难的过程,终于使用libvirt安装完qemu kvm虚拟机了.但是发现虚拟机不能上网.虚拟机想要上网,有很多中方法.

先说两个定义:Guest机器为虚拟机,Host机器为开机运行的真实机器.

查看libvirt的教程,看到网络配置有许多中方式.详情可以访问http://libvirt.org/formatdomain.html#elementsNICS

  • NAT (默认上网) 虚拟机利用host机器的ip进行上网.对外显示一个ip
  • Bridge 将虚拟机桥接到host机器的网卡上,guest和host机器都通过bridge上网.对外不同的ip,

一.Bridge桥接原理

Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

  • Bridge桥接原理

    如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。

二. 在host机器配置桥接网络

首先可以按照ibm 文章的虚拟机配置一下host机的网络情况,这个的目的就是让host生成一个不日多个桥接,大家都通过这个桥接上网.下面我们来看看具体的步骤.

1.查看网卡是否工作

确保你想使用bridge网桥的网卡能够为kvm虚拟机模块提供网络连接能力并且网卡是否可以工作.这个网卡应该要能够给guest的kvm虚拟机提供相同的网络支持.接下来例子说明了网卡的配置,并且可以被外部网络访问.这个例子中,使用eth0网卡.

  1. # ifconfig
  2. eth0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
  3. inet addr:10.10.1.152 Bcast:10.10.1.255 Mask:255.255.255.0
  4. inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  6. RX packets:664 errors:0 dropped:526 overruns:0 frame:0
  7. TX packets:163 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:69635 (68.0 KiB) TX bytes:25091 (24.5 KiB)
  10. Interrupt:74 Memory:da000000-da012800
  11. ................

2.备份network-scripts网络脚本文件

备份网络配置到不同的目录下,将来可以用来恢复网络配置,. 根据下面的命令将网络脚本ifcfg-eth0 网卡到 /root目录:

# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/.
注意:不要把文件copy到/etc/sysconfig/network-scripts/目录或者其子目录

3.进入network-scripts目录

进入 /etc/sysconfig/network-scripts/目录.

cd /etc/sysconfig/network-scripts/

4.为桥接新建配置文件

为Linux的bridge创建一个新的配置文件为/etc/sysconfig/network-scripts/ifcfg-br0,这里br0是bridge网桥的名字,同eth0类似.使用以下命令

cp ifcfg-eth0 ifcfg-br0
具体的内容是基于已有的配置文件来进行的.

5.编辑bridge网桥配置文件

编辑配置文件,让数据包通过bridge(网桥)进行上网.你的网络配置很可能是通过静态ip(BOOTPROTO=static)上网或者是从DHCP服务器获得ip(BOOTPROTO=dhcp)上网的.

如果你的网络是通过静态ip地址来配置的,那么你的配置很可能是和下面一样的:

  1. DEVICE=eth0
  2. BOOTPROTO=static
  3. HWADDR=00:14:5E:C2:1E:40
  4. IPADDR=10.10.1.152
  5. NETMASK=255.255.255.0
  6. ONBOOT=yes

下面的显示了eth0和br0的静态ip配置内容,可以根据下面进行编辑

static ip配置


  1. /etc/sysconfig/network-scripts/ifcfg-eth0
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. HWADDR=00:14:5E:C2:1E:40
  5. ONBOOT=yes
  6. NM_CONTROLLED=no
  7. BRIDGE=br0

  1. /etc/sysconfig/network-scripts/ifcfg-br0
  2. DEVICE=br0
  3. TYPE=Bridge
  4. NM_CONTROLLED=no
  5. BOOTPROTO=static
  6. IPADDR=10.10.1.152
  7. NETMASK=255.255.255.0
  8. ONBOOT=yes

下面显示的eth0和br0的DHCP配置情况.

DHCP配置


  1. /etc/sysconfig/network-scripts/ifcfg-eth0
  2. DEVICE=eth0
  3. TYPE=Ethernet
  4. HWADDR=00:14:5E:C2:1E:40
  5. ONBOOT=yes
  6. NM_CONTROLLED=no
  7. BRIDGE=br0

  1. /etc/sysconfig/network-scripts/ifcfg-br0
  2. DEVICE=br0
  3. TYPE=Bridge
  4. NM_CONTROLLED=no
  5. BOOTPROTO=dhcp
  6. ONBOOT=yes

6.重启网络服务

重启网络以验证网络配置是否工作.

如果网络配置不正确,网络连接将会断开,你的电脑将失去访问能力.这样的话,检查以下配置文件,然后使用以下的命令重启以下网络服务:

# service network restart

7.禁用网络过滤器

向文件/etc/sysctl.conf添加以下代码:

  1. net.bridge.bridge-nf-call-ip6tables = 0
  2. net.bridge.bridge-nf-call-iptables = 0
  3. net.bridge.bridge-nf-call-arptables = 0

8.重新加载kernel参数

  1. # sysctl -p
  2. net.ipv4.ip_forward = 0
  3. ...
  4. net.bridge.bridge-nf-call-ip6tables = 0
  5. net.bridge.bridge-nf-call-iptables = 0
  6. net.bridge.bridge-nf-call-arptables = 0

9.验证配置是否成功

通过运行ifconfig来验证以下配置是否成功.如果出现两个项,即网桥的br0和现在在工作的eth0:

  1. br0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
  2. inet addr:10.10.1.152 Bcast:10.10.1.255 Mask:255.255.255.0
  3. inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
  4. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  5. RX packets:125 errors:0 dropped:0 overruns:0 frame:0
  6. TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
  7. collisions:0 txqueuelen:0
  8. RX bytes:16078 (15.7 KiB) TX bytes:18542 (18.1 KiB)
  9. eth0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
  10. inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
  11. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  12. RX packets:206 errors:0 dropped:0 overruns:0 frame:0
  13. TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
  14. collisions:0 txqueuelen:1000
  15. RX bytes:27308 (26.6 KiB) TX bytes:13881 (13.5 KiB)
  16. Interrupt:74 Memory:da000000-da012800

注意:你可能发现eth0的网络信息里面没有ipv4的地址了.或者你的GUI界面的网络显示你是断网的. 这不用担心.因为eth0的网络能力已经通过br0进行工作.你的host网络还是能正常工作的.
也可以使用以下的命令来查看网桥是否工作.

  1. # brctl show
  2. bridge name bridge id STP enabled interfaces
  3. virbr0 8000.000000000000 yes
  4. br0 8000.000e0cb30550 no eth0

如果是类似的输出,那么你的Linux的Bridge网桥就配置的差不多了.

二.为Guest虚拟机配置网络

1.配置Guest虚拟机的xml文件

在虚拟机的xml配置文件进行设置网络的连接方式为bridge桥接,并且桥接的设备为br0.其中mac地址要改变!不然MAC相同,局域网MAC地址相同的电脑不能上网.

  1. <interface type="bridge"> <!--虚拟机网络连接方式-->
  2. <source bridge="br0" /> <!-- 当前主机网桥的名称-->
  3. <mac address="00:16:e4:9a:b3:6a" /> <!--为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突-->
  4. </interface>

2.在虚拟机配置网络

我使用的是CentOS Minimal Installation的发行版.使用以下命令就可以进行上网了. 一开始只有lo显示.没有看到eth0,后来想到了eth0被禁用了,于是开启即可.

  1. # ifconfig eth0 up
  2. # dhclient eth0

现在还有个问题是,网络不随开机启动. 我打开/etc/sysconfig/network-scripts/ifcfg-eth0显示:

  1. DEVICE=eth0
  2. HWADDR=52:54:00:12:34:56
  3. ONBOOT=yes
  4. NM_CONTROLLED=yes
  5. BOOTPROTO=dhcp

虽然设置了开机启动,但是每次开机都需要运行上面的两个命令.这样就没办法远程控制主机了.

后来发现是udev弄的.udev在/etc/udev/rules.d/下面搞了一个持久命名规则(persistent-net.rules),对于网卡的持久命令,就采取了MAC地址的匹配方式

原来虚拟机安装后自带MAC网卡地址和我xml定义的网卡不一样.于是我就将虚拟机的MAC网卡提取出来,替换xml文件的MAC网卡信息.然后undefine和define以下虚拟机.

重启虚拟机,发现这次网络能够自动开机获得了.

参考资料
http://blog.csdn.net/samlei/article/details/7598541
http://www.linuxtopia.org/online_books/rhel6/rhel_6_virtualization/rhel_6_virtualization_sect-Virtualization-Network_Configuration-Bridged_networking_with_libvirt.html
IBM – Configuring the network
http://ueaner.iteye.com/blog/1291350
http://blog.csdn.net/xiyuan1999/article/details/5125002

libvirt kvm 虚拟机上网 – Bridge桥接的更多相关文章

  1. 【转】libvirt kvm 虚拟机上网 – Bridge桥接

    libvirt kvm 虚拟机上网 – Bridge桥接 2013 年 7 月 3 日 / 东东东 / 暂无评论 目录 [hide] 1 Bridge桥接原理 2 在host机器配置桥接网络 2.1  ...

  2. CentOS 6.9下KVM虚拟机网络Bridge(网桥)方式与NAT方式详解(转)

    摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式.Bridge方式的配置原理和步骤.Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. NAT的网络结构图: ...

  3. KVM虚拟机安装及桥接网络配置

    1.查看CPU是否支持intel或AMD的虚拟技术 cat /proc/cpuinfo | grep -E "vmx|svm" --color --vmx intel的CPU sv ...

  4. Ubuntu18.04服务器使用netplan网络构建桥接kvm虚拟机

    参考链接 Ubuntu 18.04 LTS安装KVM虚拟机 如何在 Ubuntu 18.04 服务器上安装和配置 KVM KVM日常管理和克隆 KVM详解 1.准备工作 首先需要检查一下CPU是否支持 ...

  5. 命令行安装kvm虚拟机、桥接网络、用virt-manager管理

    宿主机CentOS Linux release 7.2.1511 (Core),内核3.10.0-327.el7.x86_64 1.配置宿主机网络桥接 想让虚拟机有自己的ip且外网可访问,需要在安装虚 ...

  6. 使用 libvirt创建和管理KVM虚拟机

      1. libvirt介绍    Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等.Libvirt概括起来包括一个API库.一个 daemon(libv ...

  7. kvm上已安装的虚拟机修改为桥接网络

    kvm上安装的虚拟机默认使用的nat网络格式,现在已经调整kvm主机为桥接方式了,但是已经安装的虚拟机还是nat方式,所以需要修改一下 让KVM虚拟主机使用桥接网络br0 修改虚拟机的配置文件,默认存 ...

  8. 校园网 虚拟机VMware Linux桥接模式 无法上网 问题

    只是解决常见虚拟机桥接模式 无法上网问题,基本的百度都有 基本知识 虚拟机有三种网络连接模式:桥接模式,net模式,仅主机 桥接模式:同一网段允许的话,相当于一个独立的物理主机,独立ip net模式: ...

  9. 云计算概述及Centos7下安装kvm虚拟机

    云计算(cloud computing)是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源 云计算到底是什么? 按定义:云计算指的是一种使用模式,是基 ...

随机推荐

  1. html静态页面调用php文件

    如在页面a.html中用下面这句调用,可以将action=test的参数传递到b.php. Javascript代码 <script type="text/javascript&quo ...

  2. Linq中的ToList()和CopyToDataTable()

    最近在项目中使用了Linq,想把Linq的查询结果直接转换成DataTable对象,通过查找发现Linq有一个CopyToDataTable<T>的泛型方法,该方法只能在T是DataRow ...

  3. WPF路由事件二:路由事件的三种策略

    一.什么是路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件.路由事件是一个CLR事件. 路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件 ...

  4. 执行一条sql语句update多条不同值的记录实现思路

    如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: ...

  5. 有趣的 Mysql 存储引擎

    Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的.应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供 ...

  6. C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点

    C++ 语言中的重载.内联.缺省参数.隐式转换等机制展现了很多优点,但是这些 优点的背后都隐藏着一些隐患.正如人们的饮食,少食和暴食都不可取,应当恰到好处. 我们要辨证地看待 C++的新机制,应该恰如 ...

  7. DOM编程 学习笔记(二)

    学习内容: 1.document对象 2.event对象 该对象将标记型文档进行封装 该对象的作用,是对可标记型文档进行操作 常见操作,想要实现动态效果,需要对节点操作,那么先获取到这个节点,想获取节 ...

  8. linux -- ubuntu搭建nodejs环境

    需求:在web端做一个实时性功能比较强的模块, 客户端:用websocket 服务端:node.js node.js介绍:node.js天生就是一个高效的服务端语言,可以直接使用 javascript ...

  9. 学习 TList 类的实现[4]

    现在准备一步步地模拟 TList 类, 建立一个自己的 TMyList. 首先, 这个类中应该包括前面提到的那个 Pointer 数组(TPointerList)的指针(PPointerList): ...

  10. UGUI之Canvas和EventSystem

    先介绍一下UGUI必不可缺的两个组件:Canvas和EventSystem 事实上在场景中第一次创建UGUI控件的时候,这两个物体都会自动添加到场景中,当然,必不可缺的不是这两个物体,而是他们身上挂载 ...