zoukankan      html  css  js  c++  java
  • linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN

    http://smilejay.com/2012/08/qemu-kvm-networking-mode/ 

    http://smilejay.com/kvm_theory_practice/

    http://smilejay.com/2012/08/kvm-sdl-display/
    http://smilejay.com/kvm-principles-and-practices/
    http://smilejay.com/2013/12/qemu-kvm-install-guest-in-text-mode/

    http://www.diyoms.com/cloud/836.html
    http://www.diyoms.com/cloud/827.html

    在安装系统时就把桥做好,然后装完进入系统后
    systemctl disable NetworkManager
    systemctl disable wpa_supplicant
    systemctl disable irqbalance
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    reboot
    重启后桥丢失,通过systemctl status network发现报错提示没有brctl这个命令
    因为默认没有安装bridge-utils这个包,那么由NetworkManager来管理维护桥,这时候NetworkManager又被禁用了,所以不能启动网络

    结论就是如果不安装bridge-utils这个包,那么就不应禁用NetworkManager

    ip addr add 192.168.0.193/24 dev wlan0
    ip addr del 192.168.0.193/24 dev wlan0

    在我们安装好虚拟化组件(RHEL6.0之后,系统自带的均是KVM,已经没有XEN虚拟化的支持了),会自动生成一个virbr0这样的桥接设备
    [root@clovemzone ~]# brctl  show
    bridge name    bridge id        STP enabled    interfaces
    virbr0      8000.5254007543ce    yes          virbr0-nic
    按照这篇文中所说:http://www.linuxidc.com/Linux/2013-08/88720.htm ,virbr0默认使用的是NAT方式跟虚拟机网卡进行通讯,在实际生产环境中我们多数情况下面使用桥接Bridge的方式进行物理机跟虚拟机的通讯,删除这个virbr0的方法在上面给出的链接中已经说明,这篇文章主要讲述Bridge的简单实现原理以及实际配置方法。
     
    安装 Xen 或安装 KVM 后都会发现网络接口里多了一个叫做 virbr0 的虚拟网络接口:        
    这是由于安装和启用了 libvirt 服务后生成的,libvirt 在服务器(host)上生成一个 virtual network switch (virbr0),host 上所有的虚拟机(guests)通过这个 virbr0 连起来。默认情况下 virbr0 使用的是 NAT 模式(采用 IP Masquerade),所以这种情况下 guest 通过 host 才能访问外部。
    大多数时候我们虚拟机使用的是 bridge(网桥)直接连到局域网里,所以这个 virbr0 不是必须的(注:不要搞混淆了,bridge 和这里的 virbr0 bridge 是互不相干的)。如何关掉这个 virbr0 呢?先 net-destroy 然后 net-undefine,最后别忘了重启 libvirtd 让设置生效:
    # virsh net-list
    Name                State      Autostart
    -----------------------------------------
    default              active    yes
    # virsh net-destroy default
    Network default destroyed
    # virsh net-undefine default
    Network default has been undefined
    # service libvirtd restart
    Stopping libvirtd daemon:                                  [  OK  ]
    Starting libvirtd daemon:                                  [  OK  ]       

    NM_CONTROLLED这个属性值,根据redhat公司的文档是必须设置为“no”的(这个值为“yes”表示可以由服务NetworkManager来管理。NetworkManager服务不支持桥接,所以要设置为“no”。),但实际上发现设置为“yes”没有问题。通讯正常。
    编辑修改虚拟机配置文件 /etc/libvirt/qemu/v1.xml,增加如下内容

        <interface type='bridge'>
          <mac address='52:54:00:da:c3:dc'/>
          <source bridge='br0'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>

    今天在VMWare WorkStation9中安装了CentOS7虚拟机。虚拟机与宿主机网络连接有三种方式:桥接模式、NAT模式和Host Only模式。
        
    KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式。Bridge方式的配置原理和步骤。Bridge方式适用于服务器主机的虚拟化。        

    KVM 客户机网络连接有两种方式:
        用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
        虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。
       

    Linux 抽象网络设备简介

    和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来完成。一个常见的情况是,系统里装有一个硬件网卡,Linux 会在系统里为其生成一个网络设备实例,如 eth0,用户需要对 eth0 发出命令以配置或使用它了。更多的硬件会带来更多的设备实例,虚拟的硬件也会带来更多的设备实例。随着网络技术,虚拟化技术的发展,更多的高级网络设备被加入了到了 Linux 中,使得情况变得更加复杂。在以下章节中,将一一分析在虚拟化技术中经常使用的几种 Linux 网络设备抽象类型:Bridge、802.1.q VLAN device、VETH、TAP,详细解释如何用它们配合 Linux 中的 Route table、IP table 简单的创建出本地虚拟网络。

    如果已安装 VLAN 内核模块和管理工具 vconfig,TAP/TUN 设备管理工具 tunctl

    [root@localhost ~]# modprobe -l|grep vlan
    kernel/drivers/net/macvlan.ko
    kernel/net/bridge/netfilter/ebt_vlan.ko

    [root@1st-kvm ~]# lsmod |grep vlan
    [root@1st-kvm ~]# modprobe ebt_vlan
    [root@1st-kvm ~]# lsmod |grep vlan
    ebt_vlan               12911  0


    The vconfig program configures and adjusts 802.1q VLAN parameters.
    This tool is deprecated in favor of "ip link" command.
    这个工具已经降级,取而代之的是ip link命令


        查询 VLAN 设备情况:cat /proc/net/vlan/[VLAN DEVICE NAME]
        创建 VETH 设备:ip link add link [DEVICE NAME] type veth
        创建 TAP 设备:tunctl -p [TAP DEVICE NAME]
        删除 TAP 设备:tunctl -d [TAP DEVICE NAME]
        查询系统里所有二层设备,包括 VETH/TAP 设备:ip link show
        删除普通二层设备:ip link delete [DEVICE NAME] type [TYPE]

    tap参数,表明使用TAP设备。TAP是虚拟网络设备,它仿真了一个数据链路层设备(ISO七层网络结构的第二层),它像以太网的数据帧一样处理第二层数据报。
    而TUN与TAP类似,也是一种虚拟网络设备,它是对网络层设备的仿真。TAP被用于创建一个网络桥,而TUN与路由相关。
    
    
    同时启动两个虚拟机
      295  /usr/libexec/qemu-kvm -boot dc -hda disk/cs65-2.qcow2 -m 1024 -vnc :1 -net bridge -net nic -daemonize
      296  /usr/libexec/qemu-kvm -boot dc -hda disk/cs65.qcow2 -m 1024 -vnc :2 -net bridge -net nic -daemonize
    
    生成两个tap虚拟设备
    13: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500
        link/ether fe:4e:d4:29:d1:ea brd ff:ff:ff:ff:ff:ff
        inet6 fe80::fc4e:d4ff:fe29:d1ea/64 scope link 
           valid_lft forever preferred_lft forever
    14: tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500
        link/ether fe:7c:80:c8:9a:f9 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::fc7c:80ff:fec8:9af9/64 scope link 
           valid_lft forever preferred_lft forever
    但是这两个虚拟机的网卡ip与mac是一样的
    [root@2nd-kvm net]# pwd
    /sys/devices/virtual/net
    [root@2nd-kvm net]# ll
    total 0
    drwxr-xr-x 7 root root 0 8月   3 16:42 br0
    drwxr-xr-x 5 root root 0 8月   3 16:20 lo
    drwxr-xr-x 6 root root 0 8月   3 17:51 tap0
    drwxr-xr-x 6 root root 0 8月   3 17:51 tap1
    drwxr-xr-x 7 root root 0 8月   3 16:20 virbr0
    drwxr-xr-x 6 root root 0 8月   3 16:20 virbr0-nic
    
    [root@2nd-kvm net]# ll /dev/net
    total 0
    crw-rw-rw- 1 root root 10, 200 8月   3 16:20 tun
    
    
    如果是2块物理网卡冗余, 采用这样的方式,eth0 和 eth1 绑定成 bond0,br0 再绑定 bond0,客户机tap加入br0。可行吗?
    
    可以的啊,我就这样用过的,先建立bond0,再用它建立br0。宿主机双网卡,可以考虑3个用途:1. 就是你自己说的那样;2. 独立建立两个bridge,给不同的客户机用;3.可以将一个网卡VT-d直接分配给对网络要求很高的虚拟机,另一个建立br0做普通用途。
    
    大多数时候我们虚拟机使用的是 bridge(网桥)直接连到局域网里,所以这个 virbr0 不是必须的(注:不要搞混淆了,bridge 和这里的 virbr0 bridge 是互不相干的)。如何关掉这个 virbr0 呢?先 net-destroy 然后 net-undefine,最后别忘了重启 libvirtd 让设置生效:
    # virsh net-list
    Name                State      Autostart
    -----------------------------------------
    default              active    yes
    # virsh net-destroy default
    Network default destroyed
    # virsh net-undefine default
    Network default has been undefined
    # service libvirtd restart
    Stopping libvirtd daemon:                                  [  OK  ]
    Starting libvirtd daemon:                                  [  OK  ]
  • 相关阅读:
    静态文件
    orm多表操作
    thinkphp5.0模块设计
    thinkphp5.0URL访问
    thinkphp5.0入口文件
    thinkphp5.0生命周期
    thinkphp5.0架构总览
    thinkphp5.0目录结构
    thinkphp5.0开发规范
    thinkphp5.0安装
  • 原文地址:https://www.cnblogs.com/createyuan/p/5704222.html
Copyright © 2011-2022 走看看