KVM 仮想環境に使っているストレージが使用不能になる障害を踏まえ、 KVM 仮想マシン を同じネットワーク内のMac Proへ rsync を使って、定期的に バックアップ する仕組みを組みました。
QEMU KVM仮想マシンの現状確認
以前、普段仕事で使っているUbuntu 18.04デスクトップ機に、KVM / QEMUによる仮想開発環境を構築しました。
更にその後、仮想ディスクのプール先に使用していたストレージをSSDへ入れ替え、
快適に使っていたのもつかの間、数ヶ月後にはSSDは爆熱状態でもう認識されなくなりました。
換装前のHDDを再び現役に戻しつつ、今後に備えてKVM仮想マシンの定期的なバックアップを思い立ったというのが、事の次第です。
バックアップ対象を確認
KVM仮想マシンはその設定を記したXMLファイルと、仮想ディスクファイルにより構成されており、前者は virsh dumpxml でエクスポートすることも出来るのですが、今回は格納されているディレクトリ /etc/libvirt/qemu/ を丸ごとバックアップすることにします。
|
1 2 3 4 5 6 |
$ ls -l /etc/libvirt/qemu -rw------- 1 root root 4037 Jul 6 2022 apa3.xml -rw------- 1 root root 2229 Jul 6 2022 dbase1.xml drwxr-xr-x 3 root root 4096 May 3 2022 networks -rw------- 1 root root 4282 Aug 26 2021 plasma.xml -rw------- 1 root root 4148 Jul 5 2021 xampp1.xml |
仮想ディスクはデフォルトの格納ディレクトリ /var/lib/libvirt/images/ に加えて、前回の構築時にシステムとは別のストレージにプールを追加して以降は、専らこちらに仮想ディスクを置いています(そして今回死んだSSDがこのストレージというわけです)。
|
1 2 3 4 5 6 7 |
$ ls -l /var/lib/libvirt/images/ 合計 0 $ ls -l /str500/kvm/ -rw------- 1 root root 10739318784 Feb 16 17:32 apa3.qcow2 -rw------- 1 root root 6083051520 Feb 16 17:33 dbase1-sda -rw------- 1 root root 32217432064 Feb 14 12:33 plasma.qcow2 -rw------- 1 root root 21478375424 Jul 5 2022 xampp1.qcow2 |
バックアップ先はMacPro
バックアップ先に選んだのは、同じネットワーク内にいる「岡持ち」Mac Pro (Mid 2010)です(関連記事はこちら)。4基あるSSDのうちの1つに適当な名前で新規フォルダを作成して、バックアップ先としました。
|
1 2 3 4 5 6 7 8 9 |
$ cd /Volumes/Macintosh\ HD\ 3 $ mkdir kvm_backup $ mkdir kvm_backup/xml $ mkdir kvm_backup/img $ pwd /Volumes/Macintosh HD 3 $ ls -l kvm_backup drwxrwxr-x 6 user admin 192 Jul 6 2022 img drwxr-xr-x 7 user admin 224 Jul 6 2022 xml |
Macのボリューム名には半角スペースが含まれているので、この処理方法を確認しておきます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo rsync -avh --delete --progress /etc/libvirt/qemu/ user@macpro.local:"/Volumes/Macintosh\ HD\ 3/kvm_backup/xml/" ./ apa3.xml 4.04K 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=7/9) dbase1.xml 2.23K 100% 2.13MB/s 0:00:00 (xfr#2, to-chk=6/9) plasma.xml 4.28K 100% 4.08MB/s 0:00:00 (xfr#3, to-chk=5/9) xampp1.xml 4.15K 100% 3.96MB/s 0:00:00 (xfr#4, to-chk=4/9) networks/ networks/default.xml 576 100% 562.50kB/s 0:00:00 (xfr#5, to-chk=2/9) networks/autostart/ networks/autostart/default.xml -> /etc/libvirt/qemu/networks/default.xml sent 15.82K bytes received 158 bytes 31.96K bytes/sec total size is 15.31K speedup is 0.96 |
パスを直接記述する場合は、半角スペース前をバックスラッシュで逃がし、パス全体をクォーテーションで囲むと、意図したように解釈してもらえました。
実際バッチファイルを組む場合には、パス文字列を変数に入れてき、 rsync コマンドにはその変数を渡しますが、その際の対処は少し異なりました(後述)。
動いている仮想マシンはいないか
バックアップに際しては、仮想マシンが全て停止していることが安全確実。
普段、PCの電源を入れたままで帰るので、元々、夜になったら自動的に全てシャットダウンするよう、次のコマンドを cron に登録していました。
|
1 |
$ for i in $(/usr/bin/virsh list | grep running | awk '{print $2}'); do /usr/bin/virsh shutdown $i; done |
さらに、 virsh list コマンドは稼働中の仮想マシン有無により、その結果が次のように異なることから、
|
1 2 3 4 5 6 7 8 9 10 11 |
## 稼働中の仮想マシンがあるとき $ virsh list Id Name State ---------------------------------------------------- 1 apa3 running 2 dbase1 running ## 全て停止しているとき $ virsh list Id Name State ---------------------------------------------------- |
バックアップの実行前に以下の要領で、全仮想マシンの停止確認を行なうようにします。
|
1 2 3 4 |
if virsh list | grep running; then echo "Running VM found, Batch aborted." exit 1 fi |
rootアカウントのssh鍵認証
バッチファイルによるrsyncの自動実行に欠かせないのがsshの鍵認証。 ssh-keygen コマンドでrootユーザの鍵を作成し、バックアップ先のMac Proの ~/.ssh/authorized_keys に追加しておきます。
|
1 2 3 |
$ sudo -i # ssh-keygen -t rsa -b 4096 # scp ~/.ssh/id_rsa.pub user@macpro.local:~/.ssh/id_rsa.pub.ubuntu.root |
バッチファイルの組み立て
その他、簡単なネットワーク疎通確認などを加え、以下のようにバッチファイルが組み上がりました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/bash # backup_kvm.sh : BACKUP LOCAL KVM TO REMOTE VIA RSYNC ## VARS SRCx="/etc/libvirt/qemu/" SRCi="/str500/kvm/" RMT="macpro.local" #DSTx="user@$RMT:'/Volumes/Macintosh\ HD\ 3/kvm_backup/xml/'" #DSTi="user@$RMT:'/Volumes/Macintosh\ HD\ 3/kvm_backup/img/'" DSTx="user@$RMT:'/Volumes/Macintosh HD 3/kvm_backup/xml/'" DSTi="user@$RMT:'/Volumes/Macintosh HD 3/kvm_backup/img/'" OPT="-avh --delete" #OPT="-avh --delete --dry-run --progress" ## CONFIRM NO RUNNING VMs echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] Batch Start" if virsh list | grep running; then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] Running VM found, Batch aborted." exit 1 fi ## TEST SRC DIR if [ ! -d $SRCx ]; then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] $SRCx MISSING, Batch aborted." exit 1 fi if [ ! -d $SRCi ]; then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] $SRCi MISSING, Batch aborted." exit 1 fi ## PING REMOTE if ! ping -c 1 $RMT &> /dev/null; then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] $RMT NOT FOUND, Batch aborted." exit 1 fi ## RSYNC rsync $OPT $SRCx "$DSTx" rsync $OPT $SRCi "$DSTi" ## END BATCH echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] Batch End" |
ここで前述のMac Pro内の半角スペースを含むパスの取り扱いでは、まず変数の中へはバックスラッシュで逃がさずに記述し、 rsync へ渡す変数をクォーテーションで囲む必要がありました。
cronへ登録して定期実行
これを夜間実行するよう、 cron へ登録します。
|
1 |
02 20 * * 1-5 root /root/backup_kvm.sh > /var/log/backup_kvm.log 2>&1 |
実行結果はログファイルに上書き出力されるので、前回の実行結果を確認することができます。
|
1 2 3 4 5 6 7 8 9 10 |
[2023/02/17(金) 22:33:01] Batch Start sent 296 bytes received 20 bytes 632.00 bytes/sec total size is 15.31K speedup is 48.45 apa3.qcow2 dbase1-sda sent 333.36M bytes received 1.45M bytes 994.98K bytes/sec total size is 70.52G speedup is 210.62 [2023/02/17(金) 22:38:38] Batch End |




