2021-05-12 14:32:11
QEMU/KVM磁碟線上備份
QEMU/KVM磁碟的線上完整及增量備份,是“打包”方案的一種具體實現,可實現基於時間點的備份,同時支援本地與遠端2種備份方式,並可指定備份檔案進行恢復。
tag: qemu, kvm, disk, live, backup, incremental, bitmap
小慢哥的原創文章,歡迎轉載
目錄
? 1. 本文緣由
? 2. 最終能實現什麼
? 3. 環境說明
? 4. 常用命令一覽
? 5. 磁碟線上備份的4種方式
? 6. 查詢磁碟對應的裝置名
? 7. 什麼是bitmap
? 8. 建立與查詢bitmap
? 9. 基於bitmap做增量備份
? 10. 刪除bitmap
? 11. 重置bitmap
? 12. 備份邏輯
? 13. 遠端備份
? 14. 備份任務管理
? 15. 事件檢視
? 16. 備份鏈、資料恢復、合併
? 17. 參考文件
1. 本文緣由
在虛擬化底層技術中,儲存是重中之重,沒有人願意丟資料。因此備份就顯得尤為重要
根據備份的實現方案可分為2類:
? 副本:可以單純從後端儲存上直接實現,而無需計算層面的幫助,比如Ceph可以做多副本,本地盤檔案形式可以通過DRBD技術做實時同步。副本方案提高了儲存的整體可靠性
? 打包:表示對磁碟資料進行定期打包匯出,當需要恢復的時候,可以指定備份檔案來恢復
副本與打包是互補的,副本無法根據時間點來做備份恢復,而打包也沒有宕機前一刻的資料。本文闡述的所有內容,均是“打包”
2. 最終能實現什麼
經過調研和測試,最終本文的內容,可以實現如下幾大功能:
? 線上完整備份、線上增量備份
? 事件檢視
? 任務管理
? 不限儲存形式,可以是本地盤qcow2、raw,也可以是ceph rbd等各種形式
? 遠端備份
3. 環境說明
本文所有內容,除特殊說明,均是基於以下環境
? 作業系統:CentOS 7.5 x86_64
? qemu:基於ovirt-4.3 yum源的qemu-2.12.0
? libvirt:基於centos-update yum源的libvirt-4.5.0
4. 常用命令一覽
獲取磁碟裝置名
# 通過qmp檢視
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'
# 通過hmp檢視
virsh qemu-monitor-command DOMAIN --hmp 'info block'
--pretty
表示將輸出的json進行換行格式化展示,否則只有一行,該引數和--hmp
互斥
備份命令
# 完整備份(包含backing file):“full”
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "full" , "target" : "/opt/backup/full.img" } }'
# 完整備份(不包含backing file,僅備份當前檔案):“top”
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "top" , "target" : "/opt/backup/top.img" } }'
# 實時匯出新IO:“none”
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "none" , "target" : "/opt/backup/none.img" } }'
# 增量備份:“bitmap”
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }'
# 增量備份:“bitmap”,通過iscsi遠端匯出
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "iscsi://192.168.1.100:3260/iqn.2019-01.com.iaas/0" } }'
bitmap操作
# 建立非持久bitmap(qemu >= 2.4)
virsh qemu-monitor-command DOMAIN '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}'
# 建立持久bitmap(qemu >= 2.10)
virsh qemu-monitor-command DOMAIN '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmapY", "persistent": true}}'
# 刪除bitmap
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-dirty-bitmap-remove", "arguments" : { "node" : "drive-virtio-disk0", "name" : "bitmap0" } }'
# 重置bitmap
virsh qemu-monitor-command DOMAIN '{ "execute": "block-dirty-bitmap-clear", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}'
# 查詢虛擬機器所有磁碟的塊資訊,含bitmap
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'
# 查詢虛擬機器指定磁碟的bitmap(查詢第一塊磁碟使用[0],第二塊用[1],以此類推)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }' | jq .return[0] | sed -n '/dirty-bitmaps/,/]/p'
事件監聽
# 始終監聽事件
virsh qemu-monitor-event DOMAIN --timestamp --loop
# 當收到特定事件後停止監聽
virsh qemu-monitor-event DOMAIN --event BLOCK_JOB_COMPLETED
備份任務管理
# 通過qmp檢視執行中的任務
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block-jobs" }'
# 通過hmp檢視執行中的任務
virsh qemu-monitor-command DOMAIN --hmp 'info block-jobs'
# 停止備份任務
virsh qemu-monitor-command DOMAIN '{ "execute": "block-job-cancel", "arguments": { "device": "drive-virtio-disk0", "force": true } }'
# 暫停備份任務
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-pause", "arguments" : { "device" : "drive-virtio-disk0" } }'
# 恢復已暫停的備份任務
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-resume", "arguments" : { "device" : "drive-virtio-disk0" } }'
5. 磁碟線上備份的4種方式
? full:完整備份,會將指定磁碟及其鏈上的所有母盤(backing file),合併輸出到本地
? top:僅備份當前磁碟,而不包含backing file。此項僅對本地盤有效,對於ceph rbd,top和full的效果一樣都是完整備份
? none:new I/O,即從執行備份命令起,一旦有IO變化,就會實時匯出有變化的資料,直到虛擬機器關機或者手工停止job才會停止。僅支援qcow2格式的塊裝置,不支援raw格式(注意,這裡指的是qcow2格式,而並非要求qcow2本地盤)
? incremental:指定dirty bitmap進行備份,目前qemu的增量備份就是指基於dirty bitmap的備份
上述4種備份是互斥的:任意一種備份job執行中,都無法執行其他型別的備份,也無法再開啟同種備份的新job
full、top、none這三種備份的操作方法非常簡單,在前面“常用命令一覽”中已經提到,不再贅述,而增量備份會稍微複雜點,本文的重點將放在增量備份上
6. 查詢磁碟對應的裝置名
由於qemu不支援一鍵備份所有磁碟,因此無論有幾塊盤,必須先找到要備份的磁碟裝置名
可通過qmp或者hmp查詢裝置名,qmp是qemu原生方法,hmp是為了簡化qmp的使用而增加的一層翻譯器(其中的h就是human,表示友好可讀),hmp雖然好用,但不確定其能否支援所有qmp功能,因此這裡只是簡單演示下hmp的使用,之後主要還是通過qmp進行操作
# 通過qmp檢視
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'
# 通過hmp檢視
virsh qemu-monitor-command DOMAIN --hmp 'info block'
輸出中的drive-virtio-disk0
、drive-virtio-disk1
就是裝置名
關於qmp和hmp的詳細使用,詳見筆者的另一篇文章《基於QMP實現對qemu虛擬機器進行互動》
https://mp.weixin.qq.com/s/HUo0HO6Sl9xn5-FWiexXoA
7. 什麼是bitmap
本文將重點講解bitmap備份
在qemu裡,“增量備份”指的就是基於dirty bitmap的incremental備份方式。請注意,這裡提到了2個詞,dirty bitmap和incremental,接下來,要詳細講解:什麼是bitmap、bitmap怎麼用、有哪些特性與注意事項,只有了解清楚bitmap,才能做好增量備份
什麼是bitmap
通過dirty bitmap可以實現qemu磁碟的線上增量備份,而無需建立一長串的快照
qemu的增量備份通常來說就是指通過dirty bitmap實現的備份
dirty bitmap是qemu實現的,跟蹤需要在下次進行增量備份的資料
? v2.4開始,支援dirty bitmap,但這時的bitmap只是記錄在qemu的模擬器記憶體中,並沒有記錄在底層塊裝置中(底層塊裝置指ceph rbd、本地盤qcow2等),這種bitmap稱為in-memory bitmap,筆者習慣叫做非持久bitmap
? v2.10開始,qemu開始支援persistent dirty bitmap,筆者習慣叫做持久bitmap
bitmap、dirty bitmap、persistent dirty bitmap區別
? bitmap:是qemu支援的一個高階功能,直到本文編寫完成時(v3.1.0),bitmap只有一種型別,就是dirty bitmap
? dirty bitmap:是bitmap的一種型別,也是唯一的型別,因此dirty bitmap和bitmap是一回事。由於dirty bitmap是記錄在記憶體中而非磁碟上,因此可以支援任意型別的底層磁碟,比如本地盤、ceph rbd,也支援任意格式的磁碟格式,比如qcow2、raw等等。
? persistent dirty bitmap:是dirty bitmap的改進版,因為dirty bitmap是記錄在記憶體中的,當qemu虛擬機器關機後,dirty bitmap就消失了,就會導致需要重新做一次完整備份。persistent dirty bitmap是v2.10開始才支援
持久bitmap僅支援qcow2,不支援raw格式(例如本地盤raw檔案或者ceph-rbd)
bitmap的名稱
? 對於節點是唯一的,但附加到不同節點的bitmap可以共用相同的名稱。對於同一節點,持久bitmap和非持久bitmap的名稱也不能衝突)
? 為qemu內部使用而建立的bitmap可能是匿名的,沒有名稱。但使用者建立的bitmap肯定不是匿名的。每個節點可以有任意數量的bitmap
? 使用者建立的bitmap名稱不能是空(即"")
基於bitmap做增量備份的工作原理
? 首先,在虛擬機器啟動狀態下,針對虛擬機器某個磁碟(稱為node),打上bitmap,此時bitmap存在qemu記憶體中,並且bitmap的count屬性為0
? 其次,當磁碟資料有變化的時???,bitmap會將變化記錄下來,可以看到count不斷遞增(不會超過磁碟virtual size)
? 最後,指定bitmap做備份時候,qemu會根據bitmap記錄,匯出對應的增量資料到本地或遠端
8. 建立與查詢bitmap
# 建立非持久bitmap(qemu >= 2.4)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}'
# 建立持久bitmap(qemu >= 2.10)
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap1", "persistent": true}}'
# 查詢虛擬機器的所有磁碟的bitmap
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'
# 查詢虛擬機器第一塊磁碟的bitmap
virsh qemu-monitor-command DOMAIN--pretty '{ "execute": "query-block" }' | jq .return[0] | sed -n '/dirty-bitmaps/,/]/p'
# 查詢虛擬機器第二塊磁碟的bitmap
virsh qemu-monitor-command DOMAIN--pretty '{ "execute": "query-block" }' | jq .return[1] | sed -n '/dirty-bitmaps/,/]/p'
9. 基於bitmap做增量備份
# 備份
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }'
# 在備份過程中,可以檢視任務
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block-jobs" }'
10. 刪除bitmap
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "block-dirty-bitmap-remove", "arguments" : { "node" : "drive-virtio-disk0", "name" : "bitmap0" } }'
11. 重置bitmap
重置bitmap就是將bitmap的count值置為0,重新跟蹤磁碟變化
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-clear", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}'
12. 備份邏輯
到這裡,已經知道如何做完整備份和增量備份了,但如何把二者結合起來呢?
“等下,結合什麼,先做完整備份,然後建立bitmap,過段時間後做增量備份,不行嗎”
“真要這麼簡單就好了,但你漏了一個關鍵點,在開機狀態下,磁碟的資料可能實時變化,當你還在做完整備份的過程中,磁碟資料可能已經變化了,然後你再建立bitmap,已經太遲了”
“那我就先建立bitmap,然後再做完整備份,這樣就不會缺少資料了吧”
“看起來可以,但從理論上來說,也是不行的,你看,分別執行2條QMP命令,先執行bitmap的建立,再執行完整備份,雖然建立bitmap是毫秒級完成的,但若磁碟IO變化很快,毫釐之間,也有可能產生資料的變化”
“那怎麼辦”
“接著往下看就知道了”
虛擬機器啟動前就確定要備份
若虛擬機器第一次啟動之前,就確定要備份磁碟,那麼可以paused狀態啟動虛擬機器,這樣可以保證磁碟IO不會變化,就沒有上面的那麼多擔心了,具體操作如下:
1?? 以paused狀態啟動虛擬機器(virsh start DOMAIN --paused)
2?? 對磁碟進行完整備份("sync":"top")
3?? 對磁碟建立bitmap(block-dirty-bitmap-add)
4?? 恢復虛擬機器狀態(virsh resume DOMAIN)
5?? 接下來可以做incremental備份("sync":"incremental")
範例如下
virsh start DOMAIN --paused
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "top" , "target" : "/opt/backup/top.img" } }'
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-dirty-bitmap-add", "arguments": {"node": "drive-virtio-disk0","name": "bitmap0"}}'
virsh resume DOMAIN
# ...執行一段時間...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }'
# ...又執行一段時間...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.1.qcow2" } }'
虛擬機器執行過程中確定要備份
如果是虛擬機器已經執行一段時間了,才決定做備份,就需要用到QMP的“事務”
1?? 以事務方式對磁碟建立bitmap(block-dirty-bitmap-add)及對磁碟做完整備份("sync":"top")
2?? 接下來可以做incremental備份("sync":"incremental")
QMP部分功能支援事務性(事務的目的是當其中一件事失敗後,會自動回滾,保證資料一致性,但這裡也可用於保證建立bitmap和開始備份之間沒有缺少資料),因此上述1??通過事務操作
{ "execute": "transaction",
"arguments": {
"actions": [
{"type": "block-dirty-bitmap-add",
"data": {"node": "drive-virtio-disk0", "name": "bitmap0"} },
{"type": "drive-backup",
"data": {"device": "drive-virtio-disk0", "target": "/path/to/full_backup.img", "sync": "top"} }
]
}
}
範例如下
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "transaction", "arguments": { "actions": [ { "type": "block-dirty-bitmap-add", "data": {"node":"drive-virtio-disk0", "name":"bitmap0"}}, { "type": "drive-backup", "data": {"device": "drive-virtio-disk0", "target": "/opt/backup/top.img","sync":"top" }} ]} }'
# ...執行一段時間...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.0.qcow2" } }'
# ...又執行一段時間...
virsh qemu-monitor-command DOMAIN --pretty '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "/opt/backup/inc.1.qcow2" } }'
如果之前已經建立過bitmap,此刻想忽略bitmap,重新做一次完整備份,並重置bitmap(用於接下來的增量備份),則可以
{ "execute": "transaction",
"arguments": {
"actions": [
{"type": "block-dirty-bitmap-clear",
"data": {"node": "drive-virtio-disk0", "name": "bitmap0"} },
{"type": "drive-backup",
"data": {"device": "drive-virtio-disk0", "target": "/path/to/new_full_backup.img", "sync": "top"} }
]
}
}
13. 遠端備份
經測試,qemu僅支援一種遠端備份方法:iscsi,方法就是在drive-backup的target裡使用iscsi的格式即可:
# target內容
格式 iscsi://[<username>[%<password>]@]<host>[:<port>]/<target-iqn-name>/<lun>
例子 iscsi://192.168.1.100:3260/iqn.2019-01.com.iaas/0
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "incremental" , "bitmap" : "bitmap0" , "target" : "iscsi://192.168.1.100:3260/iqn.2019-01.com.iaas/0" } }'
14. 備份任務管理
如果遲遲沒有收到事件,要如何檢視備份任務是否還在進行中呢,或者想中斷備份,又如何操作呢
檢視備份任務
# 通過qmp檢視
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block-jobs" }'
# 通過hmp檢視
virsh qemu-monitor-command DOMAIN --hmp 'info block-jobs'
輸出
# 通過qmp檢視,有任務時候的輸出
{
"return": [
{
"auto-finalize": true,
"io-status": "ok",
"device": "drive-virtio-disk1",
"auto-dismiss": true,
"busy": true,
"len": 1073741824,
"offset": 2424832,
"status": "running",
"paused": false,
"speed": 0,
"ready": false,
"type": "backup"
},
{
"auto-finalize": true,
"io-status": "ok",
"device": "drive-virtio-disk0",
"auto-dismiss": true,
"busy": true,
"len": 21474836480,
"offset": 163840000,
"status": "running",
"paused": false,
"speed": 0,
"ready": false,
"type": "backup"
}
],
"id": "libvirt-45"
}
# 通過qmp檢視,無任務時候的輸出
{
"return": [
],
"id": "libvirt-360"
}
# 通過hmp檢視,有任務時候的輸出
Type backup, device drive-virtio-disk1: Completed 20185088 of 1073741824 bytes, speed limit 0 bytes/s
Type backup, device drive-virtio-disk0: Completed 181403648 of 21474836480 bytes, speed limit 0 bytes/s
# 通過hmp檢視,無任務時候的輸出
No active jobs
停止備份任務
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "block-job-cancel", "arguments": { "device": "drive-virtio-disk1", "force": true } }'
如果不帶force引數,則預設為false,在false情況下當任務處於暫停狀態時無法停止
輸出
{"return":{},"id":"libvirt-5880"}
同時收到事件
2019-02-03 13:02:58.535+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"aborting","id":"drive-virtio-disk1"}
2019-02-03 13:02:58.541+0000: event BLOCK_JOB_CANCELLED for domain DOMAIN: {"device":"drive-virtio-disk1","len":2147483648,"offset":29687808,"speed":0,"type":"backup"}
2019-02-03 13:02:58.541+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"concluded","id":"drive-virtio-disk1"}
2019-02-03 13:02:58.541+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"null","id":"drive-virtio-disk1"}
? 根據官方文件,JOB_STATUS_CHANGE事件是從qemu-3.0才出現的,但在qemu-2.12時就能看到了(2.9看不到),尚未深究
? 因此,若qemu是2.12,當收到JOB_STATUS_CHANGE事件,應當不予理會,後面不再贅述
暫停備份任務
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-pause", "arguments" : { "device" : "drive-virtio-disk0" } }'
輸出
{"return":{},"id":"libvirt-5882"}
同時收到事件(假設之前任務處於running狀態)
2019-01-22 02:42:55.503+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"paused","id":"drive-virtio-disk0"}
恢復已暫停的備份任務
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-resume", "arguments" : { "device" : "drive-virtio-disk0" } }'
輸出
{"return":{},"id":"libvirt-5999"}
同時收到事件
2019-01-22 02:46:04.928+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"running","id":"drive-virtio-disk0"}
15. 事件檢視
監聽事件
在備份操作前,可以另外再開一個shell視窗,實時監聽qmp的事件
# 始終監聽事件
virsh qemu-monitor-event DOMAIN --timestamp --loop
# 當收到特定事件後停止監聽
virsh qemu-monitor-event DOMAIN --event BLOCK_JOB_COMPLETED
開始備份時會收到的事件
2019-01-29 03:14:54.516+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"created","id":"drive-virtio-disk0"}
2019-01-29 03:14:54.516+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"running","id":"drive-virtio-disk0"}
備份完成時收到的事件
2019-01-24 06:25:21.629+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"created","id":"drive-virtio-disk0"}
2019-01-24 06:25:21.629+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"running","id":"drive-virtio-disk0"}
2019-01-24 06:26:34.935+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"waiting","id":"drive-virtio-disk0"}
2019-01-24 06:26:34.935+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"pending","id":"drive-virtio-disk0"}
2019-01-24 06:26:34.935+0000: event BLOCK_JOB_COMPLETED for domain DOMAIN: {"device":"drive-virtio-disk0","len":21474836480,"offset":21474836480,"speed":0,"type":"backup"}
2019-01-24 06:26:34.935+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"concluded","id":"drive-virtio-disk0"}
2019-01-24 06:26:34.935+0000: event JOB_STATUS_CHANGE for domain DOMAIN: {"status":"null","id":"drive-virtio-disk0"}
? 重點看上面的BLOCK_JOB_COMPLETED事件,該事件從qemu-1.1就已經出現的
? 遺憾的是,事件內容並不詳細,無法識別出是full、top、none還是bitmap,也看不到備份產生的檔案路徑
16. 備份鏈、資料恢復、合併
其實,本章節應該放到本文最後面,但本文篇幅較多,放後面擔心容易被遺漏
備份鏈
經過增量備份後,會形成一條備份鏈:full.qcow2 <- inc.0.qcow2 <- inc.1.qcow2 <- inc.2.qcow2
資料恢復
當需要使用備份進行資料恢復時候,就可以使用該鏈上的檔案進行恢復,比如要恢復到inc.1.qcow2的末尾,那麼有2種方案:保持鏈、合併
? 保持鏈
1?? 將full.qcow2、inc.0.qcow2、inc.1.qcow2拷貝到目標宿主機上
2?? 通過qemu-img rebase -u來確保鏈的順序
3?? 虛擬機器xml裡指定inc.1.qcow2
? 合併
1?? 將full.qcow2、inc.0.qcow2、inc.1.qcow2合併成為一個qcow2
# 將inc.1.qcow2合併到inc.0.qcow2
qemu-img commit inc.1.qcow2
# 將inc.0.qcow2合併到full.qcow2
qemu-img commit inc.0.qcow2
2?? 然後xml裡指定這個合併好的qcow2(即full.qcow2)就行
相關文章