虚拟化技术(Virtualization)-KVM

2018-12-03  本文已影响0人  Net夜风

虚拟化技术(Virtualization)

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

使用qemu-kvm管理vms

示例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
虚拟化模型:

示例:创建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
    弹出虚拟机管理界面;
    创建新建时,选桥接;
    
上一篇 下一篇

猜你喜欢

热点阅读