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  ]
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/createyuan/p/5704222.html
Copyright © 2011-2022 走看看