虚拟化技术(Virtualization)-KVM

虚拟化技术(Virtualization)

  • 计算机基础:

    • 冯诺依曼体系中计算机的五大部件:控制器、运算器、输入设备、输出设备、存储器
    • 操作系统
      操作系统就是计算机资源的虚拟化,即把底层单组架构或单组计算机资源给虚拟化,把单核心的CPU时序复用,分成时间片来使用;把内存空间复用,分成单独的离散空间(页框)使用;操作系统将有限的计算机资源划分成复用的形式,虚拟化把操作系统这得到的资源进行分割,使用软件建模,用软件模拟出一个CPU,模拟或虚拟成一个单独的系统空间
  • 虚拟化技术的类型

    • 主机虚拟化:
      • 完全虚拟化:vmware workstation、kvm、xen(hvm)
      • 半虚拟化:xen、vmware vshphere、uml
      • 模拟:qemu是个模拟器
    • 用户空间虚拟化(容器)
      • 例如:lxc、openvz、Solaris、Containers、FresBSD jails
    • 库虚拟化:WINE、cywin
    • 应用程序虚拟化:jvm、pvm
  • 主机虚拟化

    • CPU:

      • 模拟:emulation, 虚拟机的arch与物理平台的arch可以不相同;qemu;
      • 虚拟:virtualization
        • 完全虚拟化(full-virt)
          BT: 二进制转换 (软件)
          HVM:硬件辅助的虚拟化(硬件): Intel(vt-x)、AMD(amd-v)
        • 半(准)虚拟化 (para-virt)
          GuestOS得明确知道自己运行于虚拟化技术
    • 内存:

      • MMU virtualization:中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统
        • Intel: EPT, Extended Page Table
        • AMD: NPT, Nested Page Table
      • TLB virtualization:(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
        • tagged TLB

      IO:
      Emulation
      Para-virtualization
      IO-through:IO透传

  • 主机虚拟化的类型

    • (1) Type -1:在硬件上装一个虚拟机(中间件hypervisor),所有系统都装在这个hypervisor之上;例如:xen、vmware ESX/ESXI
    • (2) Type -2:在硬件上安装运行一个OS(Host OS),而此OS上运行一个VMM; 例如:vmware workstation,virtualbox、kvm
  • Linux目前流行的开源虚拟化技术解决方案

    • 主机虚拟化:xen、kvm、virtualbox
    • 容器级:lxc、libcontainer、runC、openvz
    • 模拟器:qemu

KVM

  1. XEN


    QQ截图20181201142323.png

xen以软件的形式安装后,重启会取代linux内核跑在硬件之上,之前的linux会成为第一个虚拟化主机,被称为特权主机;xen跑在硬件之上后只驱动CPU和内存,I/O设备由之前的linux来驱动,其他主机驱动I/O设备需要通过特权主机,而使用CPU和内存则通过XEN

  1. KVM:Kernel-base Virtual Machine,Qumranet公司研发,后来被RedHat收购
    使用于X86_64操作系统;依赖于HVM,要求CPU必须支持虚拟化技术


    KVM.png

kvm做为一个内核模块,安装以后取代内核,并把系统的用户空间变为一个控制台,在之上就可以安装虚拟机,优点:不需要重启就可以使用

  • 主要作用:运行程序而不是运行CPU
  • KVM两类组件:
    • /dev/kvm (kvm.ko):工作为hypervisor,在用户空间可通过系统调用ioct()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种操作
    • qem-kvm进程:工作于用户空间,用于实现I/O设备模拟;用于实现一个虚拟机实例
  • KVM模块载入内存之后,系统的运行模式:
    • 内核模式:GuestOS执行IO类操作时,或其他的特殊治理操作时的模式;它也被称为“Guest-Kernel”模式;
    • 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
    • 来宾模式:GuestOS的用户模式;所有的非IO类请求
  • KVM的特性:
    • 内存管理:
      • 将分配给VM的内存交换至swap
      • 支持使用Huge Page(大内存页)
      • 支持使用Inter EPT或AMD RVI技术完成技术内存地址映射
      • 支持KSM(Kernel Same-page Merging)内核相同页面合并技术
    • 硬件支持:取决于Linux内核
    • 存储:
      • 本地存储
      • 网络附加存储
      • 存储区域网络
      • 分布式存储:GlusterFS等
    • 实时迁移:live migration
    • 支持GuestOS
    • 设备驱动:
      • 支持IO设备的完全虚拟化:模拟硬件
      • 支持IO设备的版虚拟化:virtio
        • virtio-blk 块设备半虚拟化
        • virtio-net 网络设备半虚拟化
        • virtio-pci 任何pci接口设备的半虚拟化
  • kvm管理工具:kvm有两组工具能实现虚拟机管理
    • 第一组工具:qemu工具
      qemu是个独立的虚拟机项目,其中有一个qemu-kvm分支是于kvm结合的分支,后来独立成了一个项目;然后又合并到了主项目,主干分支支持kvm和xen,而qemu-lvm分支只支持kvm;
      qemu-kvm组能件实现虚拟机的创建、启动管理各种接口都支持,但只是命令行接口,使用不便,而且这些组件非常底层;
      • qemu-kvm:专门用于管理kvm的工具
      • qemu-img:管理虚拟机磁盘映像文件
      • qemu-io:管理IO设备
  • 第二组工具:C/S架构的libvirt组件
    • virsh:支持基于C/S架构,与守护进程libvirtd同喜的命令行工具
    • virtual machine manger:基于python研发的图形界面工具,包括两个工具:
      • virt-manger:虚拟机管理器;创建、启动、删除、停止等
      • virt-viewer:虚拟机查看器
    • virtinst:虚拟机创建、安装工具,是命令行工具
      • virt-install
      • virt-clone
      • virt-convert
      • virt-image
    • 因此,创建虚拟机有三种方式:
      • qemu
      • virtual machine manager
      • virtinst
  • 安装使用KVM
    • 判断CPU是否支持硬件虚拟化:
      grep -i -E '(vms|svm|lm)' /porc/cpuinfo
      modinfo kvm
      lsmode|grep kvm
    • 运行中的kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数技能完成虚拟机启动,终止此进程即关闭虚拟机
    • kvm工具栈
      • qemu:
        • qemu-kvm
        • qemu-img
        • qemu-io
      • libcirt:
        • CUI:virt-manager,virt-viewer
        • CLI: virtsh,cirt-install
      • c/s:
        • libvirtd
    • 安装:
      • (1)装载内核模块

        • kvm:核心模块
        • kvm-intel|kvm-amd
      • (2)使用virt-manager管理KVM

         [root@kvm ~]# yum -y groupinstall "Virtualization Host"
         [root@kvm ~]# yum -y install qemu-kvm libvirt-daemon-kvm virt-manager
         [root@kvm ~]# systemctl start libvirtd.service
         [root@kvm ~]# ps aux |grep libvirtd
         [root@kvm ~]# virt-manager`  启动
        启动后virt-manager显示乱码需要安装字体:
         [root@kvm ~]# yum install dejavu-lgc-sans-fonts
        
使用qemu-kvm管理vms
  • Qemu:
    • 处理器模拟器
    • 仿真各种IO设备
    • 将仿真设备连接至主机的物理设备
    • 提供用户接口
  • qemu-kvm命令语法:
    qemu-kvm [option] [disk_image]
  • options有很多类别:标准选项、块设备相关选项、显示选项、网络选项、...
    • 标准选项:

      • machine [type=] name: -machine help用来获取列表;用于指定模拟的主机类型;
      • -cpu cpu: -cpu help 用来获取类别;用于指定要模拟的CPU型号;
      • -smp n[,maxcpus=cpus] [,cores=cores] [,threads=threads] [,sockets=sockets]: 指明虚拟机上的vcpu的数量及拓扑;
      • -boot [order=drives] [,once=drives] [,menu=on|off] [,splash=sp_name] [,splash-time=sp_time][,reboot-timeout=rb_time] [,strict=on|off]:
        • order:各设备的引导次序;c表示第一块硬盘,d表示第一个光驱设备;例:-boot order=dc,once=d
      • -m megs: 虚拟机的内存大小
      • name NAME: 当前虚拟机的名称,要唯一
    • 块设备相关的选项:

      • -hda/-hdb file: 指明IDE总线类型的磁盘映射文件路径,第0个和第一个
      • -hdc/-hdd file: 第2个和第3个
      • cdrom file: 指定要使用光盘映像文件
      • drive [file=file][,if=type][,media=d][,index=i][,cache=writethrough|writeback|none|directsync|unsafe][,format=f]]:
        • file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;
        • if=TYPE: 块设备总线类型,ide,scsi,sd,floppy,virtio,...
        • media=TYPE:介质类型,cdrom和disk
        • index=i:设定同一类型设备多个设备的编号
        • cache=writethrough|writeback|none|directsync|unsafe:缓存方式
        • format=f:磁盘映像文件的格式
    • 显示选项:

      • -display type:显示类型,sdl,curses,none和vnc;
      • nographic: 不使用图形接口
      • vga [std|cirrus|vmware|qxl|xenfb|none]: 模拟出的显卡的型号
      • vnc display[,option[,option[,...]]]: 启动一个vnc server来显示虚拟机
        • display:
          (1) HOST:N 在host主机的第N个桌面好输出vnc;5900+N
          (2)unix:/PATH/TO/SOCK_FILE
          (3)none
        • options:
          password:连接此服务所需要的密码
      • -monitor stdio: 在标准输出上显示monitor界面
    • 网络选项:

      • -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]: 为虚拟机创建一个网络接口,并将其添加至指定的VLAN
        • model=type:指明模拟出的网卡型号,ne2k_pci,i82551,i8255b,i82559er,rt18139,e1000,pcnet,virtio
        • net nic,model=?
        • macaddr=mac:指明mac地址;52:54:00:...
      • -net tap[,vlan=n]][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]: 通过物理的tap网络接口连接至vlan n
        • script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup

        • downscript=dfile: 关闭虚拟机时要执行的脚本,/etc/qemu-ifdown

        • ifname=NAME: 自定义接口名称

            cat  /etc/qemu-ifup                         
                        #!/bin/bash
                        #
                        bridge=br0
          
                        if [ -n "$1" ];then
                            ip link set $1 up
                            sleep 1
                            brctl addif $bridge $1
                            [ $? -eq 0 ] && exit 0 || exit 1
                        else
                            echo "Error: no interface specified."
                            exit 1
                        fi  
          
    • 其它选项:

      • -daemonize: 以守护进程运行

示例1:

 ~]#  qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc  :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup

示例2:

~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive  file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
虚拟化模型:
  • NAT模式(相当于仅主机,默认类型)
    • libvirtd安装启动后会自动创建出一个virbr0的接口
    • virbr0表示网桥设备,类似于vmware workstation中的nat类型网络
    • 此网络模型下虚拟机可以访问宿主机,也可以访问互联网,但是不能从网络或其他的客户机访问虚拟机,性能较差
  • Host-only模型(也叫隔离模式)
    • 类似于vmware workstation中的仅主机模式
    • 将所有的虚拟机组成一个局域网,不能和外界通信,不能访问Internet,其他主机也不能访问虚拟主机,安全性高
  • Bridge模型(桥接接口)
    • 类似于vmware workstation中的桥接
    • 虚拟机与宿主机处于同一个网络环境,类似于一台真实的宿主机,可以直接访问网络资源,设置好后虚拟机与宿主机,互联网之间的通信很容易

示例:创建2个虚拟机实例演示网络通信

  1. 隔离网络:只有虚拟机之间可以通信,与物理机无法通信,与外网也无法通信

     [root@kvm ~]# yum -y groupinstall "Virtualization Host"
     [root@kvm ~]# yum -y install virt-manager libvirt-daemon-kvm qemu-kvm dejavu0lgc-sans-fonts
     [root@kvm ~]# which brctl
     /usr/sbin/brctl
     [root@kvm ~]# rpm -qf /usr/sbin/brctl
     bridge-utils-1.5-9.el7.x86_64
     创建独立的桥设备:
     [root@kvm ~]# ip link set br-int up或者 ifconfig br-int up   #激活桥接口
     [root@kvm ~]# ifconfig
     br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
             inet6 fe80::3041:11ff:fe83:15ac  prefixlen 64  scopeid 0x20<link>
             ether 32:41:11:83:15:ac  txqueuelen 1000  (Ethernet)
             RX packets 0  bytes 0 (0.0 B)
             RX errors 0  dropped 0  overruns 0  frame 0
             TX packets 6  bytes 508 (508.0 B)
             TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

能看到br-int接口后,此时没有ip地址,就意味着不能作为物理机的接口与外部通信;创建两个虚拟机网卡关联到这个桥上,然后两个虚拟机配置同一个网段的ip地址,就能互相通信了;

    启动2个虚拟机实例:
    [root@kvm ~]# vim /etc/qemu-ifup
        #!/bin/bash 
        #
        bridge=br-int
        if [ -n "$1" ];then
                ip link set $1 up
                sleep 1
                brctl addif $bridge $1
                [ $? -eq 0 ] && exit 0 || exit 1
        else
                echo "ERROR:no interface specified"
                exit 2
        fi      
    [root@kvm ~]# bash -n /etc/qemu-ifup
    [root@kvm ~]# chmod +x /etc/qemu-ifup
    [root@kvm ~]# vim /etc/qemu-ifdown      
        #!/bin/bash
        #
        bridge=br-int
        if [ -n "$1" ];then
                brctl delif $bridge $1
                ip link set $1 down 
                exit 0
        else
                echo "ERROR: no interface specified"
                exit 1
        fi
    [root@kvm ~]# bash -n /etc/qemu-ifdown      
    [root@kvm ~]# chmod +x /etc/qemu-ifdown
    
    [root@kvm ~]# mkdir -pv /vms/cirros
    mkdir: created directory ‘/vms’
    mkdir: created directory ‘/vms/cirros’
    [root@kvm ~]# cd /vms/cirros
    [root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros1.img
    [root@kvm cirros]# cp /root/cirros-0.3.4-x86_64-disk.img cirros2.img
    [root@kvm cirros]# ln -sv /usr/libexec/qemu-kvm /usr/sbin/    #qemu-kvm命令
    ‘/usr/sbin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’
    [root@kvm cirros]# qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
    [root@kvm cirros]# qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
    [root@kvm cirros]# ps aux | grep qemu-kvm
    root      37969 10.6  6.3 720160 118664 ?       Sl   08:59   0:12 qemu-kvm -name c1 -m 256 -smp 2 -drive file=/vms/cirros/cirros1.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -daemonize
    root      38025 12.4  5.4 719140 101044 ?       Sl   08:59   0:11 qemu-kvm -name c2 -m 256 -smp 2 -drive file=/vms/cirros/cirros2.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:00:00:22 -net tap,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
    此时可以使用vncviewer连接两个虚拟机实例
    [root@kvm ~]# ss -tnl
    State       Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
    LISTEN      0      1                                    *:5900                                             *:*                  
    LISTEN      0      1                                    *:5901                                             *:*           
    [root@kvm ~]# vncviewer :0 &
    [root@kvm ~]# vncviewer :1 & 

此时2个虚拟机实例都以及启动起来,并且br-int桥上没有ip地址,在两个虚拟机上配置同网段的IP地址后可以实现2个虚拟机通信:


kvm-cirros.png
c1:
$ sudo su - root 
# ifconfig eth0 10.0.0.1/24 up
c2:
$ sudo su - root 
# ifconfig eth0 10.0.0.2/24 up
# ping 10.0.0.1
64 bytes from 10.0.0.1: seq=0 ttl=64 time=12.112 ms
...

至此就完成虚拟机间通信,两个虚拟机都桥接到同一个桥上,这个桥本身没有ip地址,所以是隔离的网络模型;


  1. 仅主机网络模式:
    每启动一个虚拟机,tap0,tap1是两个接口,在物理机上没有地址,它们都是虚拟机网卡的后半段不需要地址,这两个是连接虚拟交换机的(桥设备);

    [root@kvm ~]# brctl show
    bridge name bridge id STP enabled interfaces
    br-int 8000.362a10196967 no tap0
    tap1

此时,如果要想虚拟机与物理机通信,只需向网桥添加地址即可,或者是手动创建添加一对儿网卡,一半在留在网桥上,一半留在物理机上;

给桥br-int添加地址:
[root@kvm ~]# ifconfig br-int 10.0.0.254/24
[root@kvm ~]# ifconfig br-int 
br-int: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.254  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::3041:11ff:fe83:15ac  prefixlen 64  scopeid 0x20<link>
        ether 36:2a:10:19:69:67  txqueuelen 1000  (Ethernet)
        RX packets 19  bytes 2704 (2.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        此时在物理机上ping虚拟机可以ping通:
[root@kvm ~]# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=4.45 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=1.62 ms
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 1.627/3.043/4.459/1.416 ms
[root@kvm ~]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=49.5 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=2.67 ms
在物理机上打开核心转发功能:
[root@kvm ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
在虚拟机上添加默认网关:
# route add default gw 10.0.0.254
# ping 192.168.43.33 此时与物理机ip可以通信

此时虚拟机和物理机之间可以正常通信,这就是仅主机模式。


  1. NAT模式:

    # ping 61.135.169.121  #此时ping外网(百度ip)是不通的
    在物理机上是用tcpdump监控网卡发现:,虚拟机可以ping出去到外部的61.135.169.121主机,但是,ping包不能回来;
    [root@kvm ~]# tcpdump -i ens33 -nn icmp
    09:30:57.006063 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 0, length 64
    09:30:58.007888 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 1, length 64
    09:30:59.010346 IP 10.0.0.1 > 61.135.169.121: ICMP echo request, id 32001, seq 2, length 64
    要从虚拟机ping出去到外部的包能回来,要么让外部的主机添加能到虚拟机的路由,要么在物理机上添加iptables规则:
    [root@kvm ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.43.33
    在虚拟机上ping测试:
    # ping 61.135.169.121
    查看物理网卡监控:
    [root@kvm ~]# tcpdump -i ens33 -nn icmp
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
    09:35:26.191195 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 0, length 64
    09:35:26.212348 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 0, length 64
    09:35:27.193508 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 1, length 64
    09:35:27.226221 IP 61.135.169.121 > 192.168.43.33: ICMP echo reply, id 32257, seq 1, length 64
    

    09:35:28.195532 IP 192.168.43.33 > 61.135.169.121: ICMP echo request, id 32257, seq 2, length 64

这就实现了NAT模式的网络模式;但是此时可以访问外网,但是外网是不能访问虚拟机的;想要外网能够访问虚拟机,需要在添加一条DNAT规则:

[root@kvm ~]# iptables -t nat -A PREROUTING -d 192.168.43.33 -j DNAT --to-destination 10.0.0.1

  1. 桥接模式:
    把物理网卡当桥使用,需要手动配置桥接接口;
    把网卡配置文件复制一份,并修改相关参数就可创建桥接口了;
    但是,也有非常简洁的方法配置桥接口,如果安装了virsh或libvirtd并且有virsh命令,因为virsh命令自己就能创建桥接口,并且它能自动创建一个物理桥,把物理网卡关联到桥接口上去;

    演示手动实现配置桥接接口:

    ]# cd /etc/sysconfig/network-scripts/
    
    复制网卡配置文件为桥设备配置文件:
    ]# cp ifcfg-eno16777736 ifcfg-br0
    
    修改网卡配置文件为交换机使用:
    ]# vim ifcfg-eno16777736
    修改:
    BOOTPROTO=none
    删除接口地址;
    BRIDGE="br0"
    
    编辑桥设备配置文件:
    ]# vim  ifcfg-br0
    修改:
    DEVICE=br0
    TYPE=Bridge 必须首字母大写;
    删除NAME,其它地址等保留;
    
    使用virsh命令创建桥设备:
    
    ]# virsh iface-list
     名称               状态     MAC 地址
    ---------------------------------------------------
     eno16777736          活动     00:0c:29:3f:67:86
     lo                   活动     00:00:00:00:00:00
    
    查看命令帮助:
    ]# virsh help iface-bridge
    语法格式:
    iface-bridge <interface> <bridge> [--no-stp] [--delay <number>] [--no-start]
    其中:
    OPTIONS
    [--interface] <string>  现有接口名称
    [--bridge] <string>  新桥接设备名称
    --no-stp         无法为这个桥接启用 STP
    --delay <number>  在新连接的端口中 squelch 流量的秒数
    --no-start       不要立即启动桥接
    
    interface:指明把哪个接口关联到桥上;
    bridge:桥的名称;
    --no-stp:表示不支持生成树协议;
    

    创建物理桥:

    注意:红帽研发的网络功能NetworkManager服务必须关闭,才能使用virsh创建桥;只使用network服务;

    centos6和7都有这两种服务能管理网络功能NetworkManager和network;如果要使用桥接接口,不能使用NetworkManager服务,必须停掉,让network来作为网卡管理功能;然后,还有编辑网卡不受nm控制;

    ]# systemctl stop NetworkManager.service
    ]# systemctl disable NetworkManager.service
    ]# systemctl status network.service
    
    ]# virsh iface-bridge eno16777736 br0
    使用附加设备 br0 生成桥接 eno16777736 失败
    已启动桥接接口 br0
    
    ]# ifconfig
    br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.18.11.115  netmask 255.255.0.0  broadcast 172.18.255.255
            inet6 fe80::20c:29ff:fe3f:6786  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:3f:67:86  txqueuelen 0  (Ethernet)
            RX packets 123  bytes 11913 (11.6 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 23  bytes 1902 (1.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            ether 00:0c:29:3f:67:86  txqueuelen 1000  (Ethernet)
            RX packets 251384  bytes 87346879 (83.3 MiB)
            RX errors 0  dropped 527  overruns 0  frame 0
            TX packets 17222  bytes 1562170 (1.4 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    ...
    virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
            ether 52:54:00:8e:05:ad  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    此时,网卡已经变成交换机了;桥设备获得了ip地址;

    ]# virt-manager
    弹出虚拟机管理界面;
    创建新建时,选桥接;
    

推荐阅读更多精彩内容