KVM 虛擬化技術

慘綠少年發表於2018-01-31

  

1.1 前言

1.1.1 什麼是虛擬化?

在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源(CPU、記憶體、磁碟空間、網路介面卡等),予以抽象、轉換後呈現出來並可供分割槽、組合為一個或多個電腦配置環境。

 

圖 - 虛擬化示意圖

由此,打破實體結構間的不可切割的障礙,使使用者可以比原本的配置更好的方式來應用這些電腦硬體資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。

一般所指的虛擬化資源包括計算能力和資料儲存。

由於目前資訊科技領域的很多企業都曾在宣傳中將該企業的某種技術稱為虛擬化技術,這些技術涵蓋的範圍可以從Java虛擬機器技術系統管理軟體,這就使得準確的界定虛擬技術變得困難。因此各種相關學術論文在談到虛擬技術時常常提到的便是如前面所提到的那個不嚴格的定義。

1.1.2 為什麼要用虛擬化

  ?同一臺物理機執行多個不同版本應用軟體

  ?硬體依賴性較低和便於資料遷移

圖 - 虛擬化前後對比

   詳情參考<1.1.3 虛擬化技術的優勢>。

1.1.3 虛擬化技術的優勢

  1.降低運營成本

  伺服器虛擬化降低了IT基礎設施的運營成本,令系統管理員擺脫了繁重的物理伺服器、OS、中介軟體及相容性的管理工作,減少人工干預頻率,使管理更加強大、便捷。

  2.提高應用相容性

  伺服器虛擬化提供的封裝性和隔離性使大量應用獨立執行於各種環境中,管理人員不需頻繁根據底層環境調整應用,只需構建一個應用版本並將其釋出到虛擬化後的不同型別平臺上即可。

  3.加速應用部署

  採用伺服器虛擬化技術只需輸入啟用配置引數、拷貝虛擬機器、啟動虛擬機器、啟用虛擬機器即可完成部署,大大縮短了部署時間,免除人工干預,降低了部署成本。

  4.提高服務可用性

  使用者可以方便地備份虛擬機器,在進行虛擬機器動態遷移後,可以方便的恢復備份,或者在其他物理機上執行備份,大大提高了服務的可用性。

  5.提升資源利用率

  通過伺服器虛擬化的整合,提高了CPU、記憶體、儲存、網路等裝置的利用率,同時保證原有服務的可用性,使其安全性及效能不受影響。

  6.動態排程資源

  在伺服器虛擬化技術中,資料中心從傳統的單一伺服器變成了統一的資源池,使用者可以即時地調整虛擬機器資源,同時資料中心管理程式和資料中心管理員可以靈活根據虛擬機器內部資源使用情況靈活分配調整給虛擬機器的資源。

  7.降低能源消耗

  通過減少執行的物理伺服器數量,減少CPU以外各單元的耗電量,達到節能減排的目的。

1.1.4 KVM簡介

  KVM,基於核心的虛擬機器(英語:Kernel-based Virtual Machine,縮寫為 KVM),是一種用於Linux核心中的虛擬化基礎設施,可以將Linux核心轉化為一個hypervisor。KVM在2007年2月被匯入Linux 2.6.20核心中,以可載入核心模組的方式被移植到FreeBSD及illumos上。

  KVM在具備Intel VT或AMD-V功能的x86平臺上執行。它也被移植到S/390,PowerPC與IA-64平臺上。在Linux核心3.9版中,加入ARM架構的支援。

  KVM目前由Red Hat等廠商開發,對CentOS/Fedora/RHEL等Red Hat系發行版支援極佳。

1.1.5 關於KVM

  1. KVM是開源軟體,全稱是kernel-based virtual machine(基於核心的虛擬機器)。
  2. 是x86架構且硬體支援虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。
  3. 它包含一個為處理器提供底層虛擬化 可載入的核心模組kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
  4. KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛擬機器上層控制和介面。
  5. KVM能在不改變linux或windows映象的情況下同時執行多個虛擬機器,(它的意思是多個虛擬機器使用同一映象)併為每一個虛擬機器配置個性化硬體環境(網路卡、磁碟、圖形介面卡……)同時KVM還能夠使用ksm技術幫助宿主伺服器節約記憶體。
  6. 在主流的Linux核心,如2.6.20以上的核心均已包含了KVM核心。

1.1.6 關於Virtual Machine Manager

  在電腦運算中,紅帽公司的Virtual Machine Manager是一個虛擬機器管理員,可以讓使用者管理多個虛擬機器。

  基於核心的虛擬機器libvirt與Virtual Machine Manager。 

Virtual Machine Manager可以讓使用者

  ? 建立、編輯、引導或停止虛擬機器。

  ? 檢視並控制每個虛擬機器的控制檯。

  ? 檢視每部虛擬機器的效能以及使用率。

  ? 檢視每部正在執行中的虛擬機器以及主控端的即時效能及使用率資訊。

  ? 不論是在本機或遠端,皆可使用KVM、Xen、QEMU。

圖 -  libvirt服務

1.1.7 其他虛擬化軟體

? Xen

  Xen是一個開放原始碼虛擬機器監視器,由XenProject開發。它打算在單個計算機上執行多達128個有完全功能的作業系統。

  在舊(無虛擬硬體)的處理器上執行Xen,作業系統必須進行顯式地修改(移植)以在Xen上執行(但是提供對使用者應用的相容性)。這使得Xen無需特殊硬體支援,就能達到高效能的虛擬化。

? QEMU

  QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟體。它與Bochs,PearPC近似,但其具有某些後兩者所不具備的特性,如高速度及跨平臺的特性。經由KVM(早期為kqemu加速器,現在kqemu已被KVM取代)這個開源的加速器,QEMU能模擬至接近真實電腦的速度。QEMU有兩種主要運作模式:

  User mode模擬模式,亦即是使用者模式。

  QEMU能引導那些為不同中央處理器編譯的Linux程式。而Wine及Dosemu是其主要目標。

  System mode模擬模式,亦即是系統模式。

  QEMU能模擬整個電腦系統,包括中央處理器及其他周邊裝置。它使得為系統原始碼進行測試及除錯工作變得容易。其亦能用來在一部主機上模擬數部不同虛擬電腦。

1.2 KVM部署與使用

系統環境說明

[root@kvm ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@kvm ~]# uname -r
3.10.0-693.el7.x86_64
[root@kvm ~]# sestatus 
SELinux status:                 disabled
[root@kvm ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@kvm ~]# hostname -I
172.16.1.240 10.0.0.240
# kvm主機記憶體不能低於4GB

1.2.1 安裝KVM虛擬化軟體

安裝依賴包(可以使用本地yum源)

yum install libvirt* virt-* qemu-kvm* -y

安裝軟體說明內容:

libvirt    # 虛擬機器管理
virt       # 虛擬機器安裝克隆
qemu-kvm   # 管理虛擬機器磁碟

啟動服務

[root@kvm ~]# systemctl start libvirtd.service
[root@kvm ~]# systemctl status libvirtd.servic

安裝VNC軟體:

  下載vnc軟體方法,tightvnc官網:http://www.tightvnc.com

  VNC軟體,用於VNC(Virtual Network Computing),為一種使用RFB協議的螢幕畫面分享及遠端操作軟體。此軟體藉由網路,可傳送鍵盤與滑鼠的動作及即時的螢幕畫面。

  VNC與作業系統無關,因此可跨平臺使用,例如可用Windows連線到某Linux的電腦,反之亦同。甚至在沒有安裝客戶端程式的電腦中,只要有支援JAVA的瀏覽器,也可使用。

  安裝VNC時,使用預設安裝即可,無需安裝server端。

 

圖 - vnc軟體

1.2.2 配置第一臺KVM虛擬機器

使用命令

[root@kvm ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /data/clsn.raw,format=raw,size=10 --cdrom /data/CentOS-7-x86_64-DVD-1511.iso --network network=default --graphics vnc,listen=0.0.0.0,port=5900 --noautoconsole

  注意:需要先將映象檔案拷貝到 /data/CentOS-7-x86_64-DVD-1511.iso 。

使用引數說明:

引數

引數說明

--virt-type HV_TYPE

要使用的管理程式名稱 (kvm, qemu, xen, ...)

--os-type

系統型別

--os-variant DISTRO_VARIANT

在客戶機上安裝的作業系統,例如:'fedora18''rhel6''winxp' 等。

-n NAME, --name NAME

客戶機例項名稱

--memory MEMORY

配置客戶機虛擬記憶體大小

--vcpus VCPUS

配置客戶機虛擬 CPU(vcpu) 數量。

--disk DISK

指定儲存的各種選項。

-cdrom CDROM   

光碟機安裝介質

-w NETWORK, --network NETWORK

配置客戶機網路介面。

--graphics GRAPHICS

配置客戶機顯示設定。

虛擬化平臺選項:

-v, --hvm         

這個客戶機應該是一個全虛擬化客戶機

-p, --paravirt    

這個客戶機應該是一個半虛擬化客戶機

--container       

這個客戶機應該是一個容器客戶機

--virt-type HV_TYPE

要使用的管理程式名稱 (kvm, qemu, xen, ...)

--arch ARCH       

模擬 CPU 架構

--machine MACHINE

機器型別為模擬型別

其它選項:

--noautoconsole

不要自動嘗試連線到客戶端控制檯

--autostart

主機啟動時自動啟動域。

--noreboot 

安裝完成後不啟動客戶機。

以上資訊通過 " virt-install --help " 獲得。

   在啟動的同時使用vnc連線

 

   下面就進入到安裝系統的操作,關於系統安裝的方法參考:http://www.cnblogs.com/clsn/p/7489784.html

1.2.3 KVM虛擬機器管理操作

  virsh命令常用引數總結

引數

引數說明

基礎操作

list

檢視虛擬機器列表,列出域

start

啟動虛擬機器,開始一個(以前定義的)非活躍的域

shutdown

關閉虛擬機器,關閉一個域

destroy(危險)

強制關閉虛擬機器,銷燬(停止)域

vncdisplay

查詢虛擬機器vnc埠號

配置管理操作

dumpxml

匯出主機配置資訊

undefine

刪除主機

define

匯入主機配置

domrename

對虛擬機器進行重新命名

掛起與恢復

suspend

掛起虛擬機器

resume

恢復虛擬機器

自啟動管理

autostart

虛擬機器開機啟動

autostart --disable

取消虛擬機器開機啟動

以上引數通過  virsh  --help 獲得。

操作過程:

KVM虛擬機器配置檔案位置

[root@kvm ~]# ll /etc/libvirt/qemu/centos7.xml

修改KVM虛擬機器配置的方法

[root@kvm ~]# virsh edit centos7

   使用該命令修改可以對檔案進行語法校驗。

備份與恢復

備份虛擬機器配置(關機時備份):

[root@kvm ~]# virsh dumpxml centos7  > centos7.xml

刪除虛擬機器配置

# 檢視
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 -     centos7                        關閉
 # 刪除
[root@kvm ~]# virsh undefine centos7 
域 centos7 已經被取消定義
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------

匯入虛擬機器

# 匯入
[root@kvm ~]# virsh define centos7-off.xml 
定義域 centos7(從 centos7-off.xml)
# 檢視
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 -     centos7                        關閉

修改虛擬機器名稱

# 重新命名
[root@kvm ~]# virsh domrename centos7 clsn7
Domain successfully renamed
# 檢視
[root@kvm ~]# virsh list
 Id    名稱                         狀態
----------------------------------------------------
 9     clsn7                          關閉

虛擬機器掛起與恢復

# 掛起虛擬機器
[root@kvm ~]# virsh suspend clsn7
域 clsn7 被掛起
# 檢視狀態
[root@kvm ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 9     clsn7                          暫停

恢復虛擬機器

[root@kvm ~]# virsh resume clsn7 
域 clsn7 被重新恢復

查詢虛擬機器vnc

[root@kvm ~]# virsh vncdisplay clsn7 
:0  
# :0 即 為 5900 埠,以此類推 :1為5901 。

開機自啟動設定

# 設定 libvirtd 服務開機自啟動。
[root@kvm ~]# systemctl is-enabled libvirtd.service 
enabled

   設定宿主機開機虛擬機器在其他

[root@kvm ~]# virsh autostart clsn7 
域 clsn7標記為自動開始
# 實質為建立軟連線
[root@kvm ~]# ll /etc/libvirt/qemu/autostart/clsn7.xml 
lrwxrwxrwx 1 root root 27 1月  22 12:17 /etc/libvirt/qemu/autostart/clsn7.xml -> /etc/libvirt/qemu/clsn7.xml

取消開機自啟動

[root@kvm ~]# virsh autostart --disable clsn7 
域 clsn7取消標記為自動開始

1.3 kvm虛擬機器console登入

1.3.1 CentOS 7.X 版本console登入

配置console登入

在clsn7虛擬機器內操作(該操作僅限centos7):

[root@kvm ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@kvm ~]# reboot
# 115200n8:能顯示虛擬機器的啟動過程

重啟完成後,使用virsh console 連線虛擬機器。

[root@kvm ~]# virsh console clsn7 
連線到域 clsn7
換碼符為 ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64

clsn7 login: root
Password: 
Last login: Mon Jan 22 12:24:48 from 192.168.122.1
[root@clsn7 ~]# w
 12:26:11 up 0 min,  1 user,  load average: 0.09, 0.03, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyS0                     12:26    3.00s  0.02s  0.01s w

1.3.2 CentOS 6.X 版本console登入

使用virsh console連線CentOS 6虛擬主機方法:

  安裝一臺centos6的kvm虛擬機器

virt-install --virt-type kvm --os-type=linux --os-variant rhel6 \
--name clsn6 --memory 1124 --vcpus 1 \
--disk /data/clsn6/clsn-6.raw,format=raw,size=10 \
--cdrom /data/CentOS-6.9-x86_64-bin-DVD1.iso \
--network network=default --graphics vnc,listen=0.0.0.0,port=5901 \
--noautoconsole

  新安裝一臺虛擬機器後,是無法通過virsh console 命令連入虛擬機器中的,這時我們需要開啟虛擬機器的console功能。

  以下操作都在虛擬機器中進行

1、新增ttyS0的許可,允許root登陸

[root@clsn6 ~]# echo "ttyS0" >> /etc/securetty 

2、編輯/etc/grub.conf中加入console=ttyS0

   在該檔案的第16行。kernel選項後新增

[root@clsn6 ~]# sed -i '/\tkernel/s#.*#& console=ttyS0#g' /etc/grub.conf
[root@clsn6 ~]# sync  # 同步配置到 /boot/grub/grub.conf
[root@clsn6 ~]# cat -n  /etc/grub.conf 
     1    # grub.conf generated by anaconda
     2    #
     3    # Note that you do not have to rerun grub after making changes to this file
     4    # NOTICE:  You have a /boot partition.  This means that
     5    #          all kernel and initrd paths are relative to /boot/, eg.
     6    #          root (hd0,0)
     7    #          kernel /vmlinuz-version ro root=/dev/vda3
     8    #          initrd /initrd-[generic-]version.img
     9    #boot=/dev/vda
    10    default=0
    11    timeout=5
    12    splashimage=(hd0,0)/grub/splash.xpm.gz
    13    hiddenmenu
    14    title CentOS 6 (2.6.32-696.el6.x86_64)
    15        root (hd0,0)
    16        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=48532582-c271-4c0a-b55f-395fe16cd8aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
    17        initrd /initramfs-2.6.32-696.el6.x86_64.img

3、編輯/etc/inittab

  在最後一行加入內容 S0:12345:respawn:/sbin/agetty ttyS0 115200

[root@clsn6 ~]# echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >>/etc/inittab

4、以上操作都完成後,重啟虛擬機器

[root@clsn6 ~]# reboot

  以下操作在kvm宿主機上執行

1、檢查虛擬機器的狀態

[root@kvm ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 11    clsn7                          running
 21    clsn6                          running

2、進行連線測試

[root@kvm ~]# virsh console clsn6 
連線到域 clsn6
換碼符為 ^]  # 注:退出virsh console連線的方法,使用組合鍵Ctrl+]即可

CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64

clsn6 login: root
Password: 
Last login: Mon Jan 22 05:44:25 on ttyS0
[root@clsn6 ~]# who
root     ttyS0        2018-01-22 05:50
# 登陸成功,檢視登陸介面為之前設定的ttyS0

1.4 KVM虛擬機器磁碟、快照與克隆

1.4.1 磁碟管理

  KVM qcow2、raw、vmdk等映象格式說明:http://blog.csdn.net/zhengmx100/article/details/53887162

# 建立一塊qcow2的虛擬硬碟(僅測試使用,無實際意義)
[root@kvm data]# qemu-img create -f qcow2 clsn.qcow2 2G
[root@kvm data]# ls -l

檢視當前虛擬機器硬碟資訊

[root@kvm ~]# qemu-img info /data/clsn.raw 
image: /data/clsn.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.1G

raw轉qcow2格式:

# 引數說明
[root@kvm data]# qemu-img  --help |grep convert 
qemu-img convert [-f fmt] [-O output_fmt] filename  output_filename

轉換原有磁碟格式

[root@kvm data]# qemu-img convert -f raw -O qcow2 clsn.raw clsn.qcow2

修改clsn7 虛擬機器配置檔案

[root@kvm data]# virsh edit clsn7 
修改前:
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/data/clsn.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
修改後:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/clsn.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

刪除原磁碟檔案

[root@kvm data]# \rm clsn.raw

啟動虛擬機器

[root@kvm data]# virsh start clsn7 

[root@kvm data]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 22    clsn7                          running

1.4.2 KVM虛擬機器新增硬碟

進入硬碟存放目錄

[root@kvm ~]# cd /data

建立一塊新的硬碟

[root@kvm data]# qemu-img create -f qcow2 clsn7-add01.qcow2 5G 
Formatting 'clsn7-add01.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

檢視建立的硬碟資訊

[root@kvm data]# qemu-img info clsn7-add01.qcow2 
image: clsn7-add01.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

為虛擬機器新增硬碟

[root@kvm data]# virsh attach-disk clsn7 /data/clsn7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
# 成功附加磁碟

引數說明:

引數

引數說明

vdb

第二塊硬碟

--live

熱新增

--subdriver

驅動型別

調整已新增硬碟的大小

[root@kvm data]# virsh --help |grep disk 
    attach-disk                    #附加磁碟裝置
    detach-disk                    #分離磁碟裝置

將已掛載的磁碟解除安裝下來

[root@kvm data]# virsh detach-disk clsn7  vdb 
成功分離磁碟

調整磁碟大小

# 使用引數
[root@kvm data]# qemu-img --help |grep resize
  resize [-q] filename [+ | -]size

   增加1G容量

[root@kvm data]# qemu-img resize clsn7-add01.qcow2 +1G
Image resized.
[root@kvm data]# qemu-img info clsn7-add01.qcow2 
image: clsn7-add01.qcow2
file format: qcow2
virtual size: 6.0G (6442450944 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

重新講磁碟新增到虛擬機器

[root@kvm data]# virsh attach-disk clsn7 /data/clsn7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2

  以下在虛擬機器中操作

格式化磁碟

[root@clsn7 ~]# mkfs.xfs /dev/vdb 

掛載磁碟

[root@clsn7 ~]# df -h |grep /dev/vdb
/dev/vdb        6.0G   33M  6.0G   1% /opt    

使用 xfs_growfs 重新整理磁碟的資訊

[root@clsn7 ~]# xfs_growfs --help 
xfs_growfs: invalid option -- '-'
Usage: xfs_growfs [options] mountpoint

1.4.3 快照管理

  注意:raw格式的磁碟無法建立快照

建立快照

[root@kvm data]# virsh snapshot-create clsn7 
已生成域快照 1516607756

檢視主機快照列表

[root@kvm data]# virsh snapshot-list  clsn7
 名稱               生成時間              狀態
------------------------------------------------------------
 1516607756           2018-01-22 15:55:56 +0800 running
# 注:該名稱為unix時間戳(格林威治時間)

檢視快照資訊

[root@kvm data]# virsh snapshot-info  clsn7 --snapshotname 1516607756

登陸虛擬機器,進行刪除操作

[root@clsn7 /]# ls -1|egrep -v 'proc|sys|run' |rm -rf

還原快照

[root@kvm data]# virsh snapshot-revert clsn7 --snapshotname 1516607756

刪除快照

[root@kvm data]# virsh snapshot-delete  clsn7 --snapshotname 1516607756

快照配置檔案位置

[root@kvm data]# cd  /var/lib/libvirt/qemu/snapshot/
[root@kvm snapshot]# tree
.
└── clsn7
    └── 1516607756.xml

1.4.4 kvm虛擬機器克隆

  複製一個虛擬機器,需修改如 MAC 地址,名稱等所有主機端唯一的配置。

  虛擬機器的內容並沒有改變:virt-clone 不修改任何客戶機系統內部的配置,它只複製磁碟和主機端的修改。所以像修改密碼,修改靜態 IP 地址等操作都在本工具複製範圍內。如何修改此型別的配置,請參考 virt-sysprep。

  克隆常用命令:

[root@kvm ~]# virt-clone --auto-clone -o clsn7 
WARNING  設定圖形裝置埠為自動埠,以避免相互衝突。
正在分配 ‘clsn-clone.ra 4% [-                 ] 1.5 MB/s | 464 MB  01:50:18 ETA

引數說明:

引數

引數說明

--auto-clone  

從原始客戶機配置中自動生成克隆名稱和儲存路徑。

-o ORIGINAL_GUEST,

--original ORIGINAL_GUEST

原始客戶機名稱;必須為關閉或者暫停狀態。

1.5 kvm虛擬機器網路管理

1.5.1 橋接網路配置

1、設定橋接網路

[root@kvm ~]# virsh iface-bridge eth0 br0
使用附加裝置 br0 生成橋接 eth0 失敗
已啟動橋接介面 br0

   檢視網路卡配置檔案

# 檢視 eth0 配置檔案
[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE="br0"
# 檢視 br0 配置檔案
[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="10.0.0.240"
NETMASK="255.255.255.0"
GATEWAY="10.0.0.254"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"

2、修改虛擬機器網路配置

[root@kvm ~]# virsh edit clsn7 
修改前:
    <interface type='network'>
      <mac address='52:54:00:42:bf:bc'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
修改後:
    <interface type='bridge'>
      <mac address='52:54:00:42:bf:bc'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

   檢視宿主機網橋

[root@kvm ~]# brctl show 
bridge name    bridge id        STP enabled    interfaces
br0        8000.000c294d551b    yes        eth0
virbr0     8000.5254006aaa40    yes        virbr0-nic
                                vnet0
                                vnet1

   檢視防火牆規則:

    [root@kvm ~]# iptables -t nat  -nvL
    Chain PREROUTING (policy ACCEPT 195 packets, 24665 bytes)
     pkts bytes target     prot opt in     out     source               destination         

    Chain INPUT (policy ACCEPT 131 packets, 16209 bytes)
     pkts bytes target     prot opt in     out     source               destination         

    Chain OUTPUT (policy ACCEPT 272 packets, 24045 bytes)
     pkts bytes target     prot opt in     out     source               destination         

    Chain POSTROUTING (policy ACCEPT 272 packets, 24045 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
        1   328 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
       29  1740 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
        0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
        3   252 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24 

3、修改kvm虛擬機器網路卡配置檔案

[root@clsn7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.110
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5

測試網路連通性

[root@clsn7 ~]# ping 223.5.5.5 -c1 
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=128 time=94.4 ms

1.6 KVM虛擬機器冷/熱遷移

  在進行遷移之前需要準備一臺與KVM配置相同的機器(KVM02),部署好kvm環境。

1.6.1 虛擬機器冷遷移

  在kvm02中安裝kvm元件

[root@kvm02 ~]# yum install libvirt* virt-* qemu-kvm* -y

  配置橋接網路

[root@kvm02 ~]# virsh iface-bridge eth0 br0
[root@kvm02 ~]# mkdir -p /data

  將虛擬機器關機,匯出配置檔案

[root@kvm data]# virsh dumpxml clsn7 >clsn7.xml

  將虛擬機器檔案傳輸到kvm02上

[root@kvm data]# scp -rp  clsn7.xml clsn.qcow2  10.0.0.201:/data

  匯入配置檔案

[root@kvm02 ~]# virsh define clsn7.xml

  啟動虛擬機器

[root@kvm02 ~]# virsh start clsn7

  檢視虛擬機器狀態

[root@kvm02 ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 5     clsn7                          running

    至此,一次KVM冷遷移就完成了

1.6.2 virt-manager和kvm虛擬機器熱遷移(準備)

  實現kvm虛擬機器熱遷移核心:共享儲存。在這裡使用的時NFS共享儲存,關於nfs的詳情參考:http://www.cnblogs.com/clsn/p/7694456.html

1、安裝virt-manager所需桌面及vnc-server

[root@kvm ~]# yum groupinstall "GNOME Desktop" -y
# vnc-server端
[root@kvm ~]# yum install tigervnc-server -y
# virt-manager需要軟體
[root@kvm ~]# yum install openssh-askpass -y

2、配置vnc服務

複製vnc配置檔案

[root@kvm ~]# vi /usr/lib/systemd/system/vncserver@.services
[root@kvm ~]# \cp /usr/lib/systemd/system/vncserver@.service  /usr/lib/systemd/system/vncserver@\:1.service

修改配置檔案,主要修改<USER>引數。

[root@kvm ~]# egrep -v "^#|^$" /usr/lib/systemd/system/vncserver@\:1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=root
ExecStartPre=-/usr/bin/vncserver -kill %i
ExecStart=/usr/bin/vncserver %i
PIDFile=/root/.vnc/%H%i.pid
ExecStop=-/usr/bin/vncserver -kill %i
[Install]
WantedBy=multi-user.target
# 使用者為root,家目錄為root

官方提供修改方法

# Quick HowTo:
# 1. Copy this file to /etc/systemd/system/vncserver@.service
# 2. Replace <USER> with the actual user name and edit vncserver
#    parameters appropriately
#   ("User=<USER>" and "/home/<USER>/.vnc/%H%i.pid")
# 3. Run `systemctl daemon-reload`
# 4. Run `systemctl enable vncserver@:<display>.service`

設定vnc連線時的密碼,

[root@kvm ~]# vncpasswd 
Password:
Verify:
Would you like to enter a view-only password (y/n)? n  
# y為建立只讀使用者,n為非只讀使用者。

啟動vnc服務,設定開機自啟動

[root@kvm ~]# systemctl start vncserver@\:1.services
[root@kvm ~]# systemctl enable vncserver@\:1.services

檢視密碼檔案及其他配置檔案位置

[root@kvm ~]# ll ~/.vnc/

3、配置NFS儲存

安裝軟體

[root@kvm ~]# yum install nfs-utils rpcbind -y

修改配置檔案

[root@kvm ~]# cat /etc/exports
/data   172.16.1.0/24(rw,sync,all_squash,anonuid=0,anongid=0)

啟動nfs程式

[root@kvm ~]# systemctl restart rpcbind 
[root@kvm ~]# systemctl restart nfs
# 設定開機自啟動
[root@kvm ~]# systemctl enable rpcbind 
[root@kvm ~]# systemctl enable nfs

在kvm02上安裝nfs

[root@kvm02 ~]#  yum install nfs-utils rpcbind -y

   檢視共享資訊

[root@kvm02 ~]# showmount -e 172.16.1.240
Export list for 172.16.1.240:
/data 172.16.1.0/24

   掛載目錄

[root@kvm02 ~]# mount.nfs 172.16.1.240:/data /data
# 加入開機自啟動
[root@kvm02 ~]# echo  'mount.nfs 172.16.1.240:/data /data' >>/etc/rc.local
[root@kvm02 ~]# chmod +x /etc/rc.d/rc.local

1.6.3 KVM虛擬機器熱遷移(實現)

vnc連線KVM宿主機:

 

圖 - 連線地址

 

圖 - 輸入vnc密碼

圖 - 使用vmm 虛擬系統管理器

新增KVM02宿主機

 

圖 - 新增新連線

注:連線上KVM02機器即可

 

圖 - 新增上kvm02主機

 

圖 - 主機新增完成

主機熱遷移

 

圖 - 遷移1

 

圖 - 遷移2,選擇要遷移到目的主機

 

圖 - 遷移過程

 

圖 - 遷移完成

在kvm02上檢視虛擬機器狀態

[root@kvm02 ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 7     clsn7                          running

虛擬機器配置檢視方法:

圖 - clsn7 虛擬機器配置資訊

說明:在熱遷移的過程中可能會引數丟包的情況,一般不會超過1個包。

[C:\~]$ ping 10.0.0.110 -t
來自 10.0.0.110 的回覆: 位元組=32 時間=1ms TTL=64
來自 10.0.0.110 的回覆: 位元組=32 時間=13ms TTL=64
來自 10.0.0.110 的回覆: 位元組=32 時間=11ms TTL=64
請求超時。
來自 10.0.0.110 的回覆: 位元組=32 時間=4ms TTL=64
來自 10.0.0.110 的回覆: 位元組=32 時間<1ms TTL=64
來自 10.0.0.110 的回覆: 位元組=32 時間<1ms TTL=64

  至此,一次熱遷移就完成了

1.7 KVM連結克隆

連結克隆指令碼

#!/bin/bash
# kvm link clone scripts  
# user clsn 
# blog: https://www.nmtui.com
# 2018-02-06
###

# init
if [ $# -ne 2 ]
  then 
    echo "Usage: $0 OLD_VMNAME NEW_VMNAME"
    exit 2
fi
LOG=/var/log/messages
old_vm=$1
new_vm=$2
new_xml="/tmp/${new_vm}.xml"
. /etc/init.d/functions

# dump old xmlfile 
virsh dumpxml $old_vm >$new_xml
old_disk=`awk -F "'" '/source file/{print $2}'  $new_xml`
tmp_dir=`dirname $old_disk`
new_disk=${tmp_dir}/${new_vm}.qcow2

# make link disk 
qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG

# make over xml info 
sed -i '/uuid/d' $new_xml
sed -i '/mac address/d' $new_xml
sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml
sed -i "s#$old_disk#$new_disk#g" $new_xml
sed -i '/source mode/d' $new_xml

# import new xml file
virsh define $new_xml &>> $LOG

# start new vm 
virsh start $new_vm &>> $LOG
if [ $? -eq 0 ]
  then 
   action "vmhost $new_vm start"  /bin/true 
else 
   action "vmhost $new_vm start"  /bin/false
   echo "log info : $LOG"
fi

# END
\rm $new_xml

說明:

1.7.1 手動克隆

第一步:複製虛擬磁碟檔案
第二步:修改xml配置檔案
  1)name
  2)uuid
  3)虛擬磁碟儲存路徑
  4)mac地址

1.7.2指令碼實現思路

1) 備份old_vm的配置檔案,並重定向生成一個新的虛擬機器配置檔案
2)取出old_vm的磁碟路徑
3)建立新的連結磁碟檔案
4) 修改xml配置檔案
5) 匯入新虛擬機器
6)啟動測試

1.8 參考文獻

[1]  https://zh.wikipedia.org/wiki/

[2]  http://virtual.51cto.com/art/201303/386133.htm

[3]  https://virt-manager.org

[4]  https://zh.wikipedia.org/wiki/基於核心的虛擬機器

[5]  https://libvirt.org

[6]  [ kvm ] 四種簡單的網路模型 https://www.cnblogs.com/hukey/p/6436211.html

[7]  https://www.cnblogs.com/xieshengsen/p/6215168.html

[8]  http://wiki.ubuntu.org.cn/Kvm教程

 

相關文章