KVM/QEMU在線備份(1)

Incremental backup

簡介

最近接到一個調研任務,kvm 虛擬機增量盤的實時備份。主要參考資料來源。[QEMU/KVM磁盤在線備份]
主要思路:同步方式(sync)的四種模式。full,top,none,incremental四種方式的。

  • none 實時I/O備份,該方式主要爲將實時的I/O變化備份,不足,將所有的I/O備份,浪費大量的內存空間,且只備份了I/O的數據,其他數據沒有備份,該方案被放棄。
  • incremental 增量備份。但是無法實現實時備份。
  • 後來又想到另一種方式:在創建的虛擬機的時候,將增量盤掛載到服務器,實現遠程備份。這種方法的缺點,對網絡要求較高,性能,穩定性較高,一旦網絡波動,虛擬機將奔潰。
  • Rsync的遠程實時備份,暫時想到的一個思路,以後研究。rsync有多種遠程上傳方式。做個(標記)。

設備環境

客戶端: Ubuntu18.04
服務端: Ubuntu20.04

qemu 實時備份

備份命令

  • none : real-time backup
virsh qemu-monitor-command DOMAIN '{ "execute" : "drive-backup" , "arguments" : { "device" : "drive-ide0-0-0" , "sync" : "none" , "target" : "/opt/backup/none.img" } }'
  • bitmap : increment backup
virsh qemu-monitor-command DOMAIN '{ "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" }'
virsh qemu-monitor-command DOMAIN --hmp 'info block-jobs'
  • 暫停備份任務
virsh qemu-monitor-command DOMAIN '{ "execute": "block-job-cancel", "arguments": { "device": "drive-ide0-0-0", "force": true } }'
  • 重置備份任務
virsh qemu-monitor-command DOMAIN '{ "execute" : "block-job-pause", "arguments" : { "device" : "drive-virtio-disk0" } }'
  • 停止備份任務
virsh qemu-monitor-command DOMAIN '{ "execute": "block-job-cancel", "arguments": { "device": "drive-virtio-disk0", "force": true } }'

bitmap 命令

  • 創建bitmap
virsh qemu-monitor-command DOMAIN { "execute": "block-dirty-bitmap-add",  "arguments": {"node": "drive0","name": "bitmap0" }}
  • 刪除bitmap
virsh qemu-monitor-command DOMAIN { "execute": "block-dirty-bitmap-remove", "arguments": {"node": "drive0","name": "bitmap0"}}
  • 重置 bitmap node
virsh qemu-monitor-command DOMAIN { "execute": "block-dirty-bitmap-clear",  "arguments": {"node": "drive0","name": "bitmap0"}}

遠程備份

  • 命令
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-ide0-0-0" , "sync" : "incremental", "target" : "iscsi://192.168.1.100:3260/iqn.2019-01.com.iaas/0" } }'

參考資料:
iscsi服務端搭建
iscsi客戶端搭建

  • 客戶端搭建

安裝

apt install open-iscsi

設置服務開機啓動

systemctl  enable  iscsi.service
systemctl  enable  iscsid.service
systemctl  start  iscsi.service
systemctl  start  iscsid.service

iscsi-name

cat  /etc/iscsi/initiatorname.iscsi

設置名稱:

vim /etc/iscsi/initiatorname.iscsi
InitiatorName=name
systemctl  restart  iscsi.service

查找target

iscsiadm  -m  discovery  -t  st  -p  172.26.106.103:3260

登陸target

iscsiadm -m node --targetname iqn.2020-06.wuqiang.iscis -p 172.26.106.103:3260 --login

設置全局單向認證

discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = troila
discovery.sendtargets.auth.password = 123456

重啓服務

/etc/init.d/iscsid force-reload #強制重載
/etc/init.d/iscsid stop			#停止服務
/etc/init.d/iscsid start		#啓動服務
service iscsi restart			#重啓服務
service iscsid restart			#重啓服務
service open-iscsi status #查看狀態
  • 服務端搭建

安裝

apt install targetcli-fb

進入配置頁面

targetcli

相關命令行

  - bookmarks action [bookmark] 
  - cd [path] 
  - clearconfig [confirm] 
  - exit 
  - get [group] [parameter...] 
  - help [topic] 
  - ls [path] [depth] 
  - pwd 
  - refresh 
  - restoreconfig [savefile] [clear_existing] [target] [storage_object] 
  - saveconfig [savefile] 
  - sessions [action] [sid] 
  - set [group] [parameter=value...] 
  - status 
  - version

創建存儲結構

創建物理磁盤存儲

cd backstores/block
create lun1 /dev/loop10

創建文件存儲

cd /backstores/fileio/
create lun1 /opt/fileio.img

創建內存存儲

cd ../ramdisk 
create rd0 10MB

查看創建好的存儲資源

/backstores> ls
o- backstores ........................................................................................................... [...]
  o- block .............................................................................................. [Storage Objects: 1]
  | o- lun1 ...................................................................... [/dev/loop10 (50.0GiB) write-thru activated]
  |   o- alua ................................................................................................. [ALUA Groups: 1]
  |     o- default_tg_pt_gp .................................................................... [ALUA state: Active/optimized]
  o- fileio .............................................................................................. [Storage Objects: 1]
  | o- lun1 ................................................................... [fileio.img (20.0GiB) write-back deactivated]
  |   o- alua ................................................................................................. [ALUA Groups: 1]
  |     o- default_tg_pt_gp .................................................................... [ALUA state: Active/optimized]
  o- pscsi ................................................................................................ [Storage Objects: 0]
  o- ramdisk .............................................................................................. [Storage Objects: 0]

創建iscsi目標

cd /iscsi/
create #自動創建用戶
create iqn.2020-06.iscsi:sn.20200623 #創建指定用戶

關聯後端存儲

cd iqn.2020-06.iscsi:sn.20200623/tpg1/luns/
create /backstores/block/lun1  #爲後端存儲路徑

配置ACL(訪問控制列表)

cd ../acls
create iqn.2020-06.wuqiang.iscis #客戶端用戶名

配置CHAP認證-全局單向認證

cd /iscsi/
get discovery_auth  #查看配置信息
set discovery_auth enable=1
set discovery_auth userid=troila
set discovery_auth password=123456
get discovery_auth enable userid password #查看是否與設置的相同

保存退出

exit

其他

創建硬盤

dd if=/dev/vda5 of=/opt/block.img bs=1G count=50 #創建
sudo losetup /dev/loop10 /opt/block.img #掛載爲設備 /dev/loop10
fdisk /dev/loop10 #創建邏輯分區
mkfs -t ext4 /dev/loop10 #格式化

創建文件

dd if=/dev/vda5 of=/opt/file.img bs=1G count=20 #創建
mkfs -t ext4 /opt/file.img #格式化

查看block信息

virsh qemu-monitor-command DOMAIN --hmp info block
drive-ide0-0-0 (#block971): /opt/qcow2/wuqiang-151-extra.qcow2 (backup-top)
    Attached to:      ide0-0-0
    Cache mode:       writeback
    Backing file:     /opt/qcow2/wuqiang-151-extra.qcow2 (chain depth: 2)

drive-ide0-0-0 爲 塊信息名稱

qemu4.2.0

編譯

卸載之前安裝的qemu

apt remove qemu*

源碼路徑:

https://download.qemu.org/

ubuntu編譯

wget https://download.qemu.org/qemu-4.2.0.tar.xz
tar xvf qemu-4.2.0.tar.xz
cd qemu-4.2.0
./configure --prefix=/usr --target-list=x86_64-softmmu --enable-guest-agent --enable-libusb --enable-spice --enable-libiscsi 
make && make install

檢測:

virsh
version

輸出爲如下所示:Running hypervisor: QEMU 4.2.0 則,安裝成功

Compiled against library: libvirt 4.0.0
Using library: libvirt 4.0.0
Using API: QEMU 4.0.0
Running hypervisor: QEMU 4.2.0

注意:

./configure 配置完成之後,輸出配置列表注意查看:agent,libiscsi,libusb,kvm,spice是否顯示yes。

qemu-monitor使用

進入monitor

qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -hda vm-img-path -boot c -vnc :1 -monitor stdio

dirve_backup介紹

help drive_backup
drive_backup [-n] [-f] [-c] device target [format] -- initiates a point-in-time
                        copy for a device. The device's contents are
                        copied to the new image file, excluding data that
                        is written after the command is started.
                        The -n flag requests QEMU to reuse the image found
                        in new-image-file, instead of recreating it from scratch.
                        The -f flag requests QEMU to copy the whole disk,
                        so that the result does not need a backing file.
                        The -c flag requests QEMU to compress backup data
                        (if the target format supports it).

樣例:

drive_backup -f ide0-hd0 /opt/qcow2/151_backup.qcow2 qcow2

查看備份任務:

info block-jobs

查看device:

info block

任務取消:

block_job_cancel [-f] device -- stop an active background block operation (use -f
                         if you want to abort the operation immediately
                         instead of keep running until data is in sync)
block_job_cancel ide0-hd0

libvirt4.5

gmp

wget https://gmplib.org/download/gmp/gmp-6.0.0.tar.xz
tar xvf gmp-6.0.0.tar.xz
cd gmp-6.0.0/
./configure && make && make install

nettle-3.4

wget ftp.gnu.org/gnu/nettle/nettle-3.4.tar.gz
tar xvf nettle-3.4.tar.gz
cd nettle-3.4 && mkdir build && cd build/
../configure --prefix=/usr --disable-openssl --enable-shared --enable-mini-gmp
make && make install

libgnutls-3.5.18

wget https://ftp.gnutls.org/gcrypt/gnutls/v3.5/gnutls-3.5.18.tar.xz
tar xvf gnutls-3.5.18.tar.xz
cd gnutls-3.5.18
./configure --enable-shared --with-included-libtasn1 --with-included-unistring --without-p11-kit  && make && make install

libvirt4.5

wdget https://libvirt.org/sources/libvirt-4.5.0.tar.xz
tar xvf libvirt-4.5.0.tar.xz
cd libvirt-4.5.0
./autogen.sh
./configure --prefix=/usr --without-apparmor-profiles --with--storage-iscsi --with-bash-completion --with-readline --with-remote
make && make install

依賴庫下載

apt install libgmp-dev
apt install nettle-dev
apt install libnl-3-dev
apt install libnl-route-3-dev
apt install libxml2-dev
apt install libyajl-dev
apt install xsltproc
apt install libdevmapper-dev
apt install libpciaccess-dev
apt install uuid-dev
apt install libreadline-dev
apt install bash-completion

錯誤處理

1.錯誤一

virsh: /usr/lib/x86_64-linux-gnu/libvirt.so.0: version `LIBVIRT_4.4.0' not found (required by virsh)
virsh: /usr/lib/x86_64-linux-gnu/libvirt.so.0: version `LIBVIRT_4.5.0' not found (required by virsh)
virsh: /usr/lib/x86_64-linux-gnu/libvirt.so.0: version `LIBVIRT_PRIVATE_4.5.0' not found (required by virsh)

解決方案

cd /usr/lib/x86_64-linux-gnu/
rm -rf libvirt.so.0*

2.錯誤二

virsh: /usr/lib/libvirt.so.0: version `LIBVIRT_PRIVATE_4.0.0' not found (required by /usr/lib/x86_64-linux-gnu/libvirt-lxc.so.0)
virsh: /usr/lib/libvirt.so.0: version `LIBVIRT_PRIVATE_4.0.0' not found (required by /usr/lib/x86_64-linux-gnu/libvirt-qemu.so.0)

解決方案:

rm -rf libvirt-lxc.so.0*
rm -rf libvirt-qemu.so.0*

日誌模塊

vim /etc/libvirt/libvirtd.conf
log_level = 3 #設置日誌級別
log_outputs="3:file:/var/log/libvirt/libvirtd.log" #日誌輸出文件
/etc/init.d/libvirtd restart #重啓服務

相關錯誤:

.so.0: version `LIBVIRT_PRIVATE_4.0.0' not found (required by /usr/lib/x86_64-linux-gnu/libvirt-lxc.so.0)
virsh: /usr/lib/libvirt.so.0: version `LIBVIRT_PRIVATE_4.0.0' not found (required by /usr/lib/x86_64-linux-gnu/libvirt-qemu.so.0)

解決方案:

rm -rf libvirt-lxc.so.0*
rm -rf libvirt-qemu.so.0*

日誌模塊

vim /etc/libvirt/libvirtd.conf
log_level = 3 #設置日誌級別
log_outputs="3:file:/var/log/libvirt/libvirtd.log" #日誌輸出文件
/etc/init.d/libvirtd restart #重啓服務

virt-manager創建虛擬機

相關錯誤:USB redirection is not supported by this version of QEMU
解決方案:移除USB redirection1,USB redirection2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章