kvm 快照

針對libvirt虛擬機主要有兩類的快照:內部和外部,它們每一個都有它們的優勢和劣勢。

內部快照:在你快照後文件還是一個鏡像文件,virt-manager提供了一個圖形工具去管理內部快照。下面是幾個內部快照的限制。

  1. 僅支持qcow2格式。
  2. 當快照時,虛擬機是暫停的。
  3. 不支持LVM存儲沲。

外部快照:是基於寫時複製的概念,當創建快照時,源鏡象變成只讀和新一個磁盤鏡像層被自動創建。(不支持圖形界面管理)

只介紹幾個常用的磁盤格式:

  • raw: 由於這個格式沒有附加的源數據源層,因此它有非常小的負載,有着較高的性能優勢 。當然它缺少了個比如內部快照、壓縮和其它特性。假如你運行高度的I/0密集應用,強烈建議採用這種格式 。
  • qcow2:這是專門給虛擬化,像雲這些設計的。支持快照(內部和外部),壓縮、加密等。也支持按需分配和預先分配的方式。

可以使用以下兩種方式去看下VM disk 鏡像的格式。

第一種方式:
$ sudo  file disk1
disk1: QEMU QCOW Image (v3), 1073741824 bytes

$ sudo  file disk2
diskd: data
第二種方式:
$ sudo  qemu-img info disk1
image: disk1
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

磁盤格式轉換:

RAW to QCOW2:
$ qemu-img convert -f raw -O qcow2 vm_disk1.img vm_disk1.qcow2
QCOW2 to RAW:
$ qemu-img convert -f qcow2 -O ram vm_disk2.qcow2 vm_disk2.img

內部快照:

下面我們主要介紹創建、刪除、和還原(內部快照)。
僅僅qcow2的磁盤支持內部快照。如果不是這個格式 話使用qemu-img命令進行轉換。

在這裏我們使用的虛擬機CentOS_01來做內部快照的案例。

(1)校驗我們用的主機鏡像信息

$ sudo  virsh snapshot-list CentOS_01
 Name               Creation Time           State
-------------------------------------------------

(2)創建內部快照,我們這裏列出和快照相關的命令簡單介紹。

snapshot-create: 基於xml文件創建快照。
snapshot-create-as: 從創建的指令中創建快照。
snapshot-current: 獲得或者設置當前快照。
snapshot-delete:刪除一個域的快照。
snapshot-dumpxml:備份一個域的快照。
snapshot-edit:編輯快照。
snapshot-info:獲取一個快照的信息。
snapshot-list: 列出這個域的快照。
snapshot-parent: 獲取這個快照的父快照。
snapshot-revert: 還原快照。

創建內部快照的簡單示例:

$ sudo vrish snapshot-create CentOS_01

(3)使用定義的名字和描述來創建快照。

$ sudo virsh snpahsot-create-as CentOS_01 --name "Snapshot 1" --description"Frist snapshot" --atomic

我們在創建快照時,強烈建議使用--atomic,這就相當於Mysql的事務一樣。

(4)校驗剛纔我們創建的快照。

$ sudo virsh snapshot-list CentOS_01
 Name               Creation Time           State
----------------------------------------------------
 snapshot1          2015-08-19 08:41:23 +0530 running

(5)我們執行第三步創建多個快照,看下父子關係等。和怎麼還原,創建好後結果應該如下:

$ sudo  virsh snapshot-list CentOS_01 --parenet
 Name               Creation Time             State         Parent
--------------------------------------------------------------------
 Snapshot1          2015-08-19 09:00:13 +0530 running       (null)
 Snapshot2          2015-08-19 09:00:43 +0530 running      Snapshot1
 Snapshot3          2015-08-19 09:01:00 +0530 shutoff      Snapshot2

也可以使用--tree的選項,來顯示快照的間的關係 。
$ sudo virsh snaphshot-list CentOS_01 --tree

我們也可以使用qemu-img來快照硬盤的詳細信息。

$ sudo  qemu-img info /var/lib/libvirt/qemu/vmdisk1.qcow2
image: /var/lib/libvirt/qemu/vmdisk1.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 1.6G
cluster_size: 65536
Snapshot list:
ID    TAG               VM SIZE            DATE    VM CLOCK
1     1439951249        220M 2015-08-19 07:57:29   00:09:36.885
2     Snapshot1         204M 2015-08-19 09:00:13   00:01:21.284
3     Snapshot2         204M 2015-08-19 09:00:43   00:01:47.308
4     Snapshot3            0 2015-08-19 09:01:00   00:00:00.000
Format specific information:

我們也可以使用check選項來校驗我們的磁盤信息。
$ sudo qemu-img check /var/lib/libvirt/qemu/vmdisk1.qcow2

還原內部快照:

還原快照的命令格式如下:
$ sudo virsh snapshot-revert <vm-name> --snapshotname "Snapshot1"

刪除內部快照:

$ sudo  virsh snapshot-list CentOS_01
 Name               Creation Time             State
------------------------------------------------------
 Snapshot1          2015-08-19 09:00:13 +0530 running
 Snapshot2          2015-08-19 09:00:43 +0530 running
 Snapshot3          2015-08-19 09:01:00 +0530 shutoff
 snapshot4          2015-08-19 10:17:00 +0530 shutoff
$ sudo  virsh snapshot-delete CentOS_01 Snapshot2
Domain snapshot Snapshot2 deleted
$ sudo  virsh snapshot-list CentOS_01
 Name               Creation Time             State
------------------------------------------------------
 Snapshot1          2015-08-19 09:00:13 +0530 running
 Snapshot3          2015-08-19 09:00:43 +0530 running
 snapshot4          2015-08-19 10:17:00 +0530 shutoff

使用vrit-manager管理快照(略)

外部快照:

幾乎所有格式的磁盤的鏡像都支持外部快照。

創建外部快照:

(1)查看我們要使用做實驗的虛擬機詳細信息。

$ sudo  virsh domblklist Win7_01 --details
Type     Device   Target   Source
------------------------------------------------
file     disk     vda      /vmstore1/win7_01.img

(2)檢查我們想要做快照的虛擬機是否在運行狀態 。

$ sudo  virsh list 
 Id  Name                         State
-----------------------------------------
 4   Win7_01                      running

無論主機是否在運行狀態或者是離線狀態,我們都可以經主機創建外部快照。

(3)創建快照

$ sudo  virsh snapshot-create-as win7_01 snapshot1 "My First Snapshot" --disk-only --atomic
--disk-only參數是指僅僅對磁盤做快照。
--atomic: 這往往是保證數據的完整性,證明要麼失敗要麼成功,不會停留在中間狀態 。造成數據的不一致。

(4)上面的快照僅是磁盤的狀態 ,不包括內存的。

$ sudo virsh snapshot-info win7_01 snapshot1

(5) 現在列出我們剛纔的虛擬機的關聯的磁盤。

$ sudo virsh domblklist win7_01
從上面的結果我們可以看到,我們磁盤的源改變了。

(6)我們來查看我們的源磁盤信息。

$ qemu-img info /vmstore1/win7_01.snapshot1
image: /vmstore1/win7_01.snapshot1
file format: qcow2
virtual size: 19G (20401094656 bytes)
disk size: 1.6M
cluster_size: 65536
backing file: /vmstore1/win7_01.img
backing file format: raw

從以上的信息我們看到backing file是指向/vmstore1/win7_01.img

(7)以上的信息表明了我們的新鏡像/vmstore1/win7_01.snapshot1目前是可讀寫的,它的源鏡像是/vmstore1/win7_01.img 。

vmstore1/win7_01.img = is backing file (original disk )
/vmstore1/win7_01.snapshot1 = is newly created overlay image where now all the writes are happening

(8)現在我們創建第二個快照,這次創建時,我們把它保存在不同的地方 。默認快照和磁盤是在相同的存儲沲裏面的。

$ sudo  virsh snapshot-create-as Win7_01 snapshot2 "Second snapshot" --disk-only --diskspec vda, snapshot=external, file=/snapshot_store/win7_01.snapshot2 --atomic
以上--diskspec這個選項是創建快照在別的位置。 這個選項要按照如下格式 :disk[,snapshot=type][,driver=type][,file=name] format.

(9)配置第三個快照

$ sudo  virsh snapshot-create-as Win7_01 snapshot3 "Third Snapshot" --disk-only --quiesce
       Domain snapshot snapshot3 created
  • quiesce: Quiesce是一個文件系統凍結的機制。它使文件系統能夠進行一致的狀態。假如沒有這個選項的話,這個塊照將不會包含髒數據。也就是說,在快照期間,可能會導致鏡像的錯誤。需要使用該功能的話,qemu-agent也需要安裝。要不然會報如下錯誤。
  • error: Guest agent is not responding: Guest agent not available for now

讓我們看一下,各個快照 之間的鏈是怎麼樣的一個形式。

1. 列出虛擬機關聯的所有快照 。

$ sudo  virsh snapshot-lsit Win7_01
 Name              Creation Time           State
----------------------------------------------------------
 snapshot1         2015-08-21 10:21:38 +0530 disk-snapshot
 snapshot2         2015-08-21 11:51:04 +0530 disk-snapshot
 snapshot3         2015-08-21 11:55:23 +0530 disk-snapshot

2. 檢查對於當前磁盤而言,哪一個是活動的磁盤快照 。

$ sudo  virsh domblklist Win7_01
Target   Source
------------------------------------------------
vda      /snapshot_store/win7_01.snapshot3

(3) 使用以下命令進行查看各個間的關係。

$ qemu-img info --backing-chain /snapshot_store/win7_01.snapshot3| grep backing
backing file: /snapshot_store/win7_01.snapshot2
backing file format: qcow2
backing file: /vmstore1/win7_01.snapshot1
backing file format: qcow2
backing file: /vmstore1/win7_01.img
backing file format: raw

也可以看下面的圖進行理解它們之間的關係。

從外部快照進行還原

外部快照可以在主機活動或離線狀態創建,但是卻沒有什麼內建的特去還原和刪除快照。假如你使用virsh 還原外部快照的話。那麼將會報錯。

$ sudo  virsh snapshot-revert Win7_01 --snapshotname "snapshot3"
error: unsupported configuration: revert to external snapshot not supported yet

我們可以手動的還原:

(1)查看我們已經有的快照 。

$ sudo  virshj snapshot-list Win7_01
 Name               Creation Time           State
------------------------------------------------------------
 snapshot1          2015-08-21 10:21:38 +0530 disk-snapshot
 snapshot2          2015-08-21 11:51:04 +0530 disk-snapshot
 snapshot3          2015-08-21 11:55:23 +0530 disk-snapshot

假如我們想還原snapshot2的話,首先我們是需要關閉虛擬機,和編輯指向snapshot2磁盤的XML文件。

(1) # virsh snapshot-dumpxml Win7_01 --snapshotname snapshot2 | grep 'source file' | helad -1
  <source file='/snapshot_store/win7_01.snapshot2'/>

(2) 從上面我們可以看到,快照 snapshot2關聯的文件是,/snapshot_store/win7_01.snapshot2文件,校驗它的完整性。

#qemu-img check /snapshot_store/win7_01.snapshot2
No errors were found on the image.
46/311296 = 0.01% allocated, 32.61% fragmented, 0.00% compressed clusters
Image end offset: 3670016

如果上面檢測報錯誤的話,我們可以使用-r leaks/all參數來進行修復。但不能保證一定能夠修復好。

(3)現在我們去操作XML文件,我們可以從XML文件/snapshot_store/win7_01.snapshot2中添加或者移除磁盤。編輯和修改磁盤的路徑。可以使用virt-xml命令。

$ sudo  virt-xml Win7_01 --remove-device --disk target-=vda
$ sudo  vir-xml --add-device --disk /snapshot_store/win7_01.snapshot2,format=qcow2, bus=virtio

(4)上面的命令我們添加了win7_01.snapshot2作爲我們的啓動盤。通過以下的命令進行校驗

$ sudo  virsh domblklist Win7_01
Target   Source
------------------------------------------------
vda      /snapshot_store/win7_01.snapshot2

(5)然後開啓虛擬機,回到我們以前的snapshot2的狀態了。

刪除外部快照

刪除快照也是一個特別麻煩的流程,我們需要手工的把原先的基本層 進行合併後,才能刪除快照。針對兩並快照 ,有兩種方式:
blockcommit: 合併基本層的數據,這樣的方式是比較快的。因爲這相當於把後面的快照文件往基本的鏡像文件裏面去合併。
blockpull: 使用這種機制恰恰和上面的那種方式相反,會比較慢一點。這個合併的文件須是qcow2文件。

使用blcokcommit合併外部的快照:

(1)列出當前使用的活動磁盤。

$ sudo  virsh domblklist VM1
Target   Source
----------------------------
hda      /vmstore1/vm1.snap4

(2)現在列舉了出後備的文件鏈/vmstore1/vm1.snap4

#qemu-img info --backing-chain /vmstore1/vm1.snap4 | grep  backing
backing file: /vmstore1/vm1.snap3
backing file format: qcow2
backing file: /vmstore1/vm1.snap2
backing file format: qcow2
backing file: /vmstore1/vm1.snap1
backing file format: qcow2
backing file: /vmstore1/vm1.img
backing file format: raw

3.現在合併所有的快照 鏡像到基本的鏡像。

#virsh blockcommit VM1 hda --verbose --pivot --active
Block Commit: [100 %]
Successfully pivoted

4. 現在檢查當前活動的磁盤快設備。

$ sudo  virsh domblklist VM1
Target   Source
--------------------------
hda      /vmstore1/vm1.img

雖說我們合併完成了,但是我們查看該虛擬機的快照 時,仍然有4個快照 。如下圖所示:

$ sudo  virsh snapshot-list VM1
Name                Creation Time             State
-----------------------------------------------------
 snap1              2015-08-22 09:10:56 +0530 shutoff
 snap2              2015-08-22 09:11:03 +0530 shutoff
 snap3              2015-08-22 09:11:09 +0530 shutoff
 snap4              2015-08-22 09:11:17 +0530 shutoff

移除快照使用如下命令:

$ sudo  virsh snapshot-delete VM1 snap1 --children --metadata
$ sudo  virsh snapshot-list VM1
Name               Creation Time           State
------------------------------------------------------------

使用blockpull的方式合併外部快照。

(1)列出當前活動的磁盤。
$ sudo  virsh domblklist VM2
Target   Source
----------------------------
hda      /vmstore1/vm2.snap1

(2)現在列出支持的文件鏈/vmstore1/vm1.snap4:

$ sudo qemu-img info --backing-chain /vmstore1/vm2.snap1 | grep  backing
backing file: /vmstore1/vm1.img
backing file format: raw

(3)合併基本的鏡像到快照的鏡像。

$ sudo virsh blockpull VM2 --path /vmstore1/vm2.snap1 --wait --verbose
Block Pull: [100 %]
Pull complete

(4)現在移除基本的鏡像文件

$ sudo virsh snapshot-delete VM1 snap1 --metadata
我們在合併和刪除快照的任務時,不需要把虛擬機停機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章