虛擬化技術(shù)(Virtualization)-KVM

虛擬化技術(shù)(Virtualization)

  • 計(jì)算機(jī)基礎(chǔ):

    • 馮諾依曼體系中計(jì)算機(jī)的五大部件:控制器、運(yùn)算器、輸入設(shè)備、輸出設(shè)備、存儲(chǔ)器
    • 操作系統(tǒng)
      操作系統(tǒng)就是計(jì)算機(jī)資源的虛擬化,即把底層單組架構(gòu)或單組計(jì)算機(jī)資源給虛擬化,把單核心的CPU時(shí)序復(fù)用,分成時(shí)間片來(lái)使用;把內(nèi)存空間復(fù)用,分成單獨(dú)的離散空間(頁(yè)框)使用;操作系統(tǒng)將有限的計(jì)算機(jī)資源劃分成復(fù)用的形式,虛擬化把操作系統(tǒng)這得到的資源進(jìn)行分割,使用軟件建模,用軟件模擬出一個(gè)CPU,模擬或虛擬成一個(gè)單獨(dú)的系統(tǒng)空間
  • 虛擬化技術(shù)的類型

    • 主機(jī)虛擬化:
      • 完全虛擬化:vmware workstation、kvm、xen(hvm)
      • 半虛擬化:xen、vmware vshphere、uml
      • 模擬:qemu是個(gè)模擬器
    • 用戶空間虛擬化(容器)
      • 例如:lxc、openvz、Solaris、Containers、FresBSD jails
    • 庫(kù)虛擬化:WINE、cywin
    • 應(yīng)用程序虛擬化:jvm、pvm
  • 主機(jī)虛擬化

    • CPU:

      • 模擬:emulation, 虛擬機(jī)的arch與物理平臺(tái)的arch可以不相同;qemu;
      • 虛擬:virtualization
        • 完全虛擬化(full-virt)
          BT: 二進(jìn)制轉(zhuǎn)換 (軟件)
          HVM:硬件輔助的虛擬化(硬件): Intel(vt-x)、AMD(amd-v)
        • 半(準(zhǔn))虛擬化 (para-virt)
          GuestOS得明確知道自己運(yùn)行于虛擬化技術(shù)
    • 內(nèi)存:

      • MMU virtualization:中文名是內(nèi)存管理單元,它是中央處理器(CPU)中用來(lái)管理虛擬存儲(chǔ)器、物理存儲(chǔ)器的控制線路,同時(shí)也負(fù)責(zé)虛擬地址映射為物理地址,以及提供硬件機(jī)制的內(nèi)存訪問(wèn)授權(quán),多用戶多進(jìn)程操作系統(tǒng)
        • Intel: EPT, Extended Page Table
        • AMD: NPT, Nested Page Table
      • TLB virtualization:(Translation Lookaside Buffer)轉(zhuǎn)換檢測(cè)緩沖區(qū)是一個(gè)內(nèi)存管理單元,用于改進(jìn)虛擬地址到物理地址轉(zhuǎn)換速度的緩存。
        • tagged TLB

      IO:
      Emulation
      Para-virtualization
      IO-through:IO透?jìng)?/p>

  • 主機(jī)虛擬化的類型

    • (1) Type -1:在硬件上裝一個(gè)虛擬機(jī)(中間件hypervisor),所有系統(tǒng)都裝在這個(gè)hypervisor之上;例如:xen、vmware ESX/ESXI
    • (2) Type -2:在硬件上安裝運(yùn)行一個(gè)OS(Host OS),而此OS上運(yùn)行一個(gè)VMM; 例如:vmware workstation,virtualbox、kvm
  • Linux目前流行的開(kāi)源虛擬化技術(shù)解決方案

    • 主機(jī)虛擬化:xen、kvm、virtualbox
    • 容器級(jí):lxc、libcontainer、runC、openvz
    • 模擬器:qemu

KVM

  1. XEN


    QQ截圖20181201142323.png

xen以軟件的形式安裝后,重啟會(huì)取代linux內(nèi)核跑在硬件之上,之前的linux會(huì)成為第一個(gè)虛擬化主機(jī),被稱為特權(quán)主機(jī);xen跑在硬件之上后只驅(qū)動(dòng)CPU和內(nèi)存,I/O設(shè)備由之前的linux來(lái)驅(qū)動(dòng),其他主機(jī)驅(qū)動(dòng)I/O設(shè)備需要通過(guò)特權(quán)主機(jī),而使用CPU和內(nèi)存則通過(guò)XEN

  1. KVM:Kernel-base Virtual Machine,Qumranet公司研發(fā),后來(lái)被RedHat收購(gòu)
    使用于X86_64操作系統(tǒng);依賴于HVM,要求CPU必須支持虛擬化技術(shù)


    KVM.png

kvm做為一個(gè)內(nèi)核模塊,安裝以后取代內(nèi)核,并把系統(tǒng)的用戶空間變?yōu)橐粋€(gè)控制臺(tái),在之上就可以安裝虛擬機(jī),優(yōu)點(diǎn):不需要重啟就可以使用

  • 主要作用:運(yùn)行程序而不是運(yùn)行CPU
  • KVM兩類組件:
    • /dev/kvm (kvm.ko):工作為hypervisor,在用戶空間可通過(guò)系統(tǒng)調(diào)用ioct()與內(nèi)核中的kvm模塊交互,從而完成虛擬機(jī)的創(chuàng)建、啟動(dòng)、停止、刪除等各種操作
    • qem-kvm進(jìn)程:工作于用戶空間,用于實(shí)現(xiàn)I/O設(shè)備模擬;用于實(shí)現(xiàn)一個(gè)虛擬機(jī)實(shí)例
  • KVM模塊載入內(nèi)存之后,系統(tǒng)的運(yùn)行模式:
    • 內(nèi)核模式:GuestOS執(zhí)行IO類操作時(shí),或其他的特殊治理操作時(shí)的模式;它也被稱為“Guest-Kernel”模式;
    • 用戶模式:Host OS的用戶空間,用于代為GuestOS發(fā)出IO請(qǐng)求;
    • 來(lái)賓模式:GuestOS的用戶模式;所有的非IO類請(qǐng)求
  • KVM的特性:
    • 內(nèi)存管理:
      • 將分配給VM的內(nèi)存交換至swap
      • 支持使用Huge Page(大內(nèi)存頁(yè))
      • 支持使用Inter EPT或AMD RVI技術(shù)完成技術(shù)內(nèi)存地址映射
      • 支持KSM(Kernel Same-page Merging)內(nèi)核相同頁(yè)面合并技術(shù)
    • 硬件支持:取決于Linux內(nèi)核
    • 存儲(chǔ):
      • 本地存儲(chǔ)
      • 網(wǎng)絡(luò)附加存儲(chǔ)
      • 存儲(chǔ)區(qū)域網(wǎng)絡(luò)
      • 分布式存儲(chǔ):GlusterFS等
    • 實(shí)時(shí)遷移:live migration
    • 支持GuestOS
    • 設(shè)備驅(qū)動(dòng):
      • 支持IO設(shè)備的完全虛擬化:模擬硬件
      • 支持IO設(shè)備的版虛擬化:virtio
        • virtio-blk 塊設(shè)備半虛擬化
        • virtio-net 網(wǎng)絡(luò)設(shè)備半虛擬化
        • virtio-pci 任何pci接口設(shè)備的半虛擬化
  • kvm管理工具:kvm有兩組工具能實(shí)現(xiàn)虛擬機(jī)管理
    • 第一組工具:qemu工具
      qemu是個(gè)獨(dú)立的虛擬機(jī)項(xiàng)目,其中有一個(gè)qemu-kvm分支是于kvm結(jié)合的分支,后來(lái)獨(dú)立成了一個(gè)項(xiàng)目;然后又合并到了主項(xiàng)目,主干分支支持kvm和xen,而qemu-lvm分支只支持kvm;
      qemu-kvm組能件實(shí)現(xiàn)虛擬機(jī)的創(chuàng)建、啟動(dòng)管理各種接口都支持,但只是命令行接口,使用不便,而且這些組件非常底層;
      • qemu-kvm:專門用于管理kvm的工具
      • qemu-img:管理虛擬機(jī)磁盤映像文件
      • qemu-io:管理IO設(shè)備
  • 第二組工具:C/S架構(gòu)的libvirt組件
    • virsh:支持基于C/S架構(gòu),與守護(hù)進(jìn)程libvirtd同喜的命令行工具
    • virtual machine manger:基于python研發(fā)的圖形界面工具,包括兩個(gè)工具:
      • virt-manger:虛擬機(jī)管理器;創(chuàng)建、啟動(dòng)、刪除、停止等
      • virt-viewer:虛擬機(jī)查看器
    • virtinst:虛擬機(jī)創(chuàng)建、安裝工具,是命令行工具
      • virt-install
      • virt-clone
      • virt-convert
      • virt-image
    • 因此,創(chuàng)建虛擬機(jī)有三種方式:
      • qemu
      • virtual machine manager
      • virtinst
  • 安裝使用KVM
    • 判斷CPU是否支持硬件虛擬化:
      grep -i -E '(vms|svm|lm)' /porc/cpuinfo
      modinfo kvm
      lsmode|grep kvm
    • 運(yùn)行中的kvm虛擬機(jī)就是一個(gè)qemu-kvm進(jìn)程,運(yùn)行qemu-kvm程序并傳遞給它合適的選項(xiàng)及參數(shù)技能完成虛擬機(jī)啟動(dòng),終止此進(jìn)程即關(guān)閉虛擬機(jī)
    • kvm工具棧
      • qemu:
        • qemu-kvm
        • qemu-img
        • qemu-io
      • libcirt:
        • CUI:virt-manager,virt-viewer
        • CLI: virtsh,cirt-install
      • c/s:
        • libvirtd
    • 安裝:
      • (1)裝載內(nèi)核模塊

        • 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`  啟動(dòng)
        啟動(dòng)后virt-manager顯示亂碼需要安裝字體:
         [root@kvm ~]# yum install dejavu-lgc-sans-fonts
        
使用qemu-kvm管理vms
  • Qemu:
    • 處理器模擬器
    • 仿真各種IO設(shè)備
    • 將仿真設(shè)備連接至主機(jī)的物理設(shè)備
    • 提供用戶接口
  • qemu-kvm命令語(yǔ)法:
    qemu-kvm [option] [disk_image]
  • options有很多類別:標(biāo)準(zhǔn)選項(xiàng)、塊設(shè)備相關(guān)選項(xiàng)、顯示選項(xiàng)、網(wǎng)絡(luò)選項(xiàng)、...
    • 標(biāo)準(zhǔn)選項(xiàng):

      • machine [type=] name: -machine help用來(lái)獲取列表;用于指定模擬的主機(jī)類型;
      • -cpu cpu: -cpu help 用來(lái)獲取類別;用于指定要模擬的CPU型號(hào);
      • -smp n[,maxcpus=cpus] [,cores=cores] [,threads=threads] [,sockets=sockets]: 指明虛擬機(jī)上的vcpu的數(shù)量及拓?fù)洌?/li>
      • -boot [order=drives] [,once=drives] [,menu=on|off] [,splash=sp_name] [,splash-time=sp_time][,reboot-timeout=rb_time] [,strict=on|off]:
        • order:各設(shè)備的引導(dǎo)次序;c表示第一塊硬盤,d表示第一個(gè)光驅(qū)設(shè)備;例:-boot order=dc,once=d
      • -m megs: 虛擬機(jī)的內(nèi)存大小
      • name NAME: 當(dāng)前虛擬機(jī)的名稱,要唯一
    • 塊設(shè)備相關(guān)的選項(xiàng):

      • -hda/-hdb file: 指明IDE總線類型的磁盤映射文件路徑,第0個(gè)和第一個(gè)
      • -hdc/-hdd file: 第2個(gè)和第3個(gè)
      • 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: 塊設(shè)備總線類型,ide,scsi,sd,floppy,virtio,...
        • media=TYPE:介質(zhì)類型,cdrom和disk
        • index=i:設(shè)定同一類型設(shè)備多個(gè)設(shè)備的編號(hào)
        • cache=writethrough|writeback|none|directsync|unsafe:緩存方式
        • format=f:磁盤映像文件的格式
    • 顯示選項(xiàng):

      • -display type:顯示類型,sdl,curses,none和vnc;
      • nographic: 不使用圖形接口
      • vga [std|cirrus|vmware|qxl|xenfb|none]: 模擬出的顯卡的型號(hào)
      • vnc display[,option[,option[,...]]]: 啟動(dòng)一個(gè)vnc server來(lái)顯示虛擬機(jī)
        • display:
          (1) HOST:N 在host主機(jī)的第N個(gè)桌面好輸出vnc;5900+N
          (2)unix:/PATH/TO/SOCK_FILE
          (3)none
        • options:
          password:連接此服務(wù)所需要的密碼
      • -monitor stdio: 在標(biāo)準(zhǔn)輸出上顯示monitor界面
    • 網(wǎng)絡(luò)選項(xiàng):

      • -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]: 為虛擬機(jī)創(chuàng)建一個(gè)網(wǎng)絡(luò)接口,并將其添加至指定的VLAN
        • model=type:指明模擬出的網(wǎng)卡型號(hào),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]: 通過(guò)物理的tap網(wǎng)絡(luò)接口連接至vlan n
        • script=file:?jiǎn)?dòng)虛擬機(jī)時(shí)要執(zhí)行的腳本,默認(rèn)為/etc/qemu-ifup

        • downscript=dfile: 關(guān)閉虛擬機(jī)時(shí)要執(zhí)行的腳本,/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  
          
    • 其它選項(xiàng):

      • -daemonize: 以守護(hù)進(jìn)程運(yùn)行

示例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模式(相當(dāng)于僅主機(jī),默認(rèn)類型)
    • libvirtd安裝啟動(dòng)后會(huì)自動(dòng)創(chuàng)建出一個(gè)virbr0的接口
    • virbr0表示網(wǎng)橋設(shè)備,類似于vmware workstation中的nat類型網(wǎng)絡(luò)
    • 此網(wǎng)絡(luò)模型下虛擬機(jī)可以訪問(wèn)宿主機(jī),也可以訪問(wèn)互聯(lián)網(wǎng),但是不能從網(wǎng)絡(luò)或其他的客戶機(jī)訪問(wèn)虛擬機(jī),性能較差
  • Host-only模型(也叫隔離模式)
    • 類似于vmware workstation中的僅主機(jī)模式
    • 將所有的虛擬機(jī)組成一個(gè)局域網(wǎng),不能和外界通信,不能訪問(wèn)Internet,其他主機(jī)也不能訪問(wèn)虛擬主機(jī),安全性高
  • Bridge模型(橋接接口)
    • 類似于vmware workstation中的橋接
    • 虛擬機(jī)與宿主機(jī)處于同一個(gè)網(wǎng)絡(luò)環(huán)境,類似于一臺(tái)真實(shí)的宿主機(jī),可以直接訪問(wèn)網(wǎng)絡(luò)資源,設(shè)置好后虛擬機(jī)與宿主機(jī),互聯(lián)網(wǎng)之間的通信很容易

示例:創(chuàng)建2個(gè)虛擬機(jī)實(shí)例演示網(wǎng)絡(luò)通信

  1. 隔離網(wǎng)絡(luò):只有虛擬機(jī)之間可以通信,與物理機(jī)無(wú)法通信,與外網(wǎng)也無(wú)法通信

     [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
     創(chuàng)建獨(dú)立的橋設(shè)備:
     [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接口后,此時(shí)沒(méi)有ip地址,就意味著不能作為物理機(jī)的接口與外部通信;創(chuàng)建兩個(gè)虛擬機(jī)網(wǎng)卡關(guān)聯(lián)到這個(gè)橋上,然后兩個(gè)虛擬機(jī)配置同一個(gè)網(wǎng)段的ip地址,就能互相通信了;

    啟動(dòng)2個(gè)虛擬機(jī)實(shí)例:
    [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
    此時(shí)可以使用vncviewer連接兩個(gè)虛擬機(jī)實(shí)例
    [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 & 

此時(shí)2個(gè)虛擬機(jī)實(shí)例都以及啟動(dòng)起來(lái),并且br-int橋上沒(méi)有ip地址,在兩個(gè)虛擬機(jī)上配置同網(wǎng)段的IP地址后可以實(shí)現(xiàn)2個(gè)虛擬機(jī)通信:


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
...

至此就完成虛擬機(jī)間通信,兩個(gè)虛擬機(jī)都橋接到同一個(gè)橋上,這個(gè)橋本身沒(méi)有ip地址,所以是隔離的網(wǎng)絡(luò)模型;


  1. 僅主機(jī)網(wǎng)絡(luò)模式:
    每啟動(dòng)一個(gè)虛擬機(jī),tap0,tap1是兩個(gè)接口,在物理機(jī)上沒(méi)有地址,它們都是虛擬機(jī)網(wǎng)卡的后半段不需要地址,這兩個(gè)是連接虛擬交換機(jī)的(橋設(shè)備);

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

此時(shí),如果要想虛擬機(jī)與物理機(jī)通信,只需向網(wǎng)橋添加地址即可,或者是手動(dòng)創(chuàng)建添加一對(duì)兒網(wǎng)卡,一半在留在網(wǎng)橋上,一半留在物理機(jī)上;

給橋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
        此時(shí)在物理機(jī)上ping虛擬機(jī)可以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
在物理機(jī)上打開(kāi)核心轉(zhuǎn)發(fā)功能:
[root@kvm ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
在虛擬機(jī)上添加默認(rèn)網(wǎng)關(guān):
# route add default gw 10.0.0.254
# ping 192.168.43.33 此時(shí)與物理機(jī)ip可以通信

此時(shí)虛擬機(jī)和物理機(jī)之間可以正常通信,這就是僅主機(jī)模式。


  1. NAT模式:

    # ping 61.135.169.121  #此時(shí)ping外網(wǎng)(百度ip)是不通的
    在物理機(jī)上是用tcpdump監(jiān)控網(wǎng)卡發(fā)現(xiàn):,虛擬機(jī)可以ping出去到外部的61.135.169.121主機(jī),但是,ping包不能回來(lái);
    [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
    要從虛擬機(jī)ping出去到外部的包能回來(lái),要么讓外部的主機(jī)添加能到虛擬機(jī)的路由,要么在物理機(jī)上添加iptables規(guī)則:
    [root@kvm ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.43.33
    在虛擬機(jī)上ping測(cè)試:
    # ping 61.135.169.121
    查看物理網(wǎng)卡監(jiān)控:
    [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

這就實(shí)現(xiàn)了NAT模式的網(wǎng)絡(luò)模式;但是此時(shí)可以訪問(wèn)外網(wǎng),但是外網(wǎng)是不能訪問(wèn)虛擬機(jī)的;想要外網(wǎng)能夠訪問(wèn)虛擬機(jī),需要在添加一條DNAT規(guī)則:

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

  1. 橋接模式:
    把物理網(wǎng)卡當(dāng)橋使用,需要手動(dòng)配置橋接接口;
    把網(wǎng)卡配置文件復(fù)制一份,并修改相關(guān)參數(shù)就可創(chuàng)建橋接口了;
    但是,也有非常簡(jiǎn)潔的方法配置橋接口,如果安裝了virsh或libvirtd并且有virsh命令,因?yàn)関irsh命令自己就能創(chuàng)建橋接口,并且它能自動(dòng)創(chuàng)建一個(gè)物理橋,把物理網(wǎng)卡關(guān)聯(lián)到橋接口上去;

    演示手動(dòng)實(shí)現(xiàn)配置橋接接口:

    ]# cd /etc/sysconfig/network-scripts/
    
    復(fù)制網(wǎng)卡配置文件為橋設(shè)備配置文件:
    ]# cp ifcfg-eno16777736 ifcfg-br0
    
    修改網(wǎng)卡配置文件為交換機(jī)使用:
    ]# vim ifcfg-eno16777736
    修改:
    BOOTPROTO=none
    刪除接口地址;
    BRIDGE="br0"
    
    編輯橋設(shè)備配置文件:
    ]# vim  ifcfg-br0
    修改:
    DEVICE=br0
    TYPE=Bridge 必須首字母大寫;
    刪除NAME,其它地址等保留;
    
    使用virsh命令創(chuàng)建橋設(shè)備:
    
    ]# virsh iface-list
     名稱               狀態(tài)     MAC 地址
    ---------------------------------------------------
     eno16777736          活動(dòng)     00:0c:29:3f:67:86
     lo                   活動(dòng)     00:00:00:00:00:00
    
    查看命令幫助:
    ]# virsh help iface-bridge
    語(yǔ)法格式:
    iface-bridge <interface> <bridge> [--no-stp] [--delay <number>] [--no-start]
    其中:
    OPTIONS
    [--interface] <string>  現(xiàn)有接口名稱
    [--bridge] <string>  新橋接設(shè)備名稱
    --no-stp         無(wú)法為這個(gè)橋接啟用 STP
    --delay <number>  在新連接的端口中 squelch 流量的秒數(shù)
    --no-start       不要立即啟動(dòng)橋接
    
    interface:指明把哪個(gè)接口關(guān)聯(lián)到橋上;
    bridge:橋的名稱;
    --no-stp:表示不支持生成樹(shù)協(xié)議;
    

    創(chuàng)建物理橋:

    注意:紅帽研發(fā)的網(wǎng)絡(luò)功能NetworkManager服務(wù)必須關(guān)閉,才能使用virsh創(chuàng)建橋;只使用network服務(wù);

    centos6和7都有這兩種服務(wù)能管理網(wǎng)絡(luò)功能NetworkManager和network;如果要使用橋接接口,不能使用NetworkManager服務(wù),必須停掉,讓network來(lái)作為網(wǎng)卡管理功能;然后,還有編輯網(wǎng)卡不受nm控制;

    ]# systemctl stop NetworkManager.service
    ]# systemctl disable NetworkManager.service
    ]# systemctl status network.service
    
    ]# virsh iface-bridge eno16777736 br0
    使用附加設(shè)備 br0 生成橋接 eno16777736 失敗
    已啟動(dòng)橋接接口 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
    

    此時(shí),網(wǎng)卡已經(jīng)變成交換機(jī)了;橋設(shè)備獲得了ip地址;

    ]# virt-manager
    彈出虛擬機(jī)管理界面;
    創(chuàng)建新建時(shí),選橋接;
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容