針對libvirt虛擬機主要有兩類的快照:內部和外部,它們每一個都有它們的優勢和劣勢。
內部快照:在你快照後文件還是一個鏡像文件,virt-manager提供了一個圖形工具去管理內部快照。下面是幾個內部快照的限制。
- 僅支持qcow2格式。
- 當快照時,虛擬機是暫停的。
- 不支持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 "Snapshot
1"
刪除內部快照:
$ 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
我們在合併和刪除快照的任務時,不需要把虛擬機停機。