中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QEMU/KVM磁盤在線備份

發布時間:2020-06-10 15:45:48 來源:網絡 閱讀:2841 作者:小慢哥 欄目:云計算

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-disk0drive-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)就行

17. 參考文檔

# 作者最初的想法
http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg03035.html

# 官方文章
qcow2介紹:https://chromium.googlesource.com/external/qemu/+/v2.12.0/docs/interop/qcow2.txt
bitmap介紹:https://chromium.googlesource.com/external/qemu/+/v2.12.0/docs/interop/bitmaps.rst
qmp使用:https://qemu.weilnetz.de/doc/qemu-qmp-ref.html
qemu使用:https://qemu.weilnetz.de/doc/qemu-doc.html

# 關于qemu磁盤備份的文章
2011年:https://www.linux-kvm.org/images/b/b6/2011-forum-LiveBackup.pdf
2015年:http://events17.linuxfoundation.org/sites/events/files/slides/kvm2015_rh_light_44_vfinal.pdf
2016年:https://www.linux-kvm.org/images/6/65/02x08B-Max_Reitz-Backups_with_QEMU.pdf
2017年:https://www.linux-kvm.org/images/e/e6/Kvm-forum2017_backup.pdf
2018年:https://events.linuxfoundation.org/wp-content/uploads/2017/12/2018-libvirt-incremental-backup-expanded._Eric-Blake.pdf
2018年:https://archive.fosdem.org/2018/schedule/event/vai_qemu_live_dev_operations/attachments/slides/2391/export/events/attachments/vai_qemu_live_dev_operations/slides/2391/Live_Block_Device_Operations_in_QEMU_FOSDEM2018.pdf

# iscsi
http://atodorov.org/blog/2015/04/07/how-to-configure-iscsi-target-on-red-hat-enterprise-linux-7/
http://linux-iscsi.org/wiki/Targetcli

QEMU磁盤的在線備份,是“打包”方案的一種具體實現,可實現基于時間點的備份,同時支持本地與遠程2種備份方式,并可指定備份文件進行恢復

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平度市| 瑞金市| 昌江| 横峰县| 修水县| 交口县| 汶上县| 海林市| 天全县| 阿拉善左旗| 芮城县| 娄底市| 富民县| 和林格尔县| 江都市| 玉山县| 德安县| 佳木斯市| 梁山县| 巢湖市| 井研县| 长顺县| 曲麻莱县| 佛坪县| 保康县| 诸暨市| 阿合奇县| 台湾省| 资源县| 玉山县| 正蓝旗| 林芝县| 青岛市| 三穗县| 抚松县| 罗定市| 武强县| 封丘县| 桐梓县| 奉化市| 宁德市|