KVM ( 7 ) ~ 仮想マシンのバックアップ/複製 ~

July 21, 2019

今回やること

KVM 上で運用している仮想マシンのバックアップ及び複製を行います。 万が一ハードウェアレベルもしくは OS レベルで何らかの問題が発生した際に、同じシステムを運用する仮想サーバーを複製しておく、バックアップを取得しておき、特定のタイミングにリストアする、といった事は重要になります。 今回は virsh のサブコマンドを使用し、バックアップの取得や、仮想マシンの複製を行なっていきましょう。

仮想マシンのバックアップ

基本的には仮想イメージファイル及び設定ファイル (XML) のバックアップさえあれば大丈夫です。 リストア時は異なる物理ホスト上で行います。

1. 仮想マシンを停止
$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     AmazonLinux2-MySQL             running
 12    AmazonLinux2-Web               running
 14    AmazonLinux2-Blog-1            running
 16    Piyo                           running
 -     AmazonLinux2                   shut off

$ sudo virsh shutdown AmazonLinux2-Blog-1
Domain AmazonLinux2-Blog-1 is being shutdown

$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     AmazonLinux2-MySQL             running
 12    AmazonLinux2-Web               running
 16    Piyo                           running
 -     AmazonLinux2                   shut off
 -     AmazonLinux2-Blog-1            shut off
2. 設定ファイル (XML) のバックアップ
$ virsh dumpxml AmazonLinux2-Blog-1 > ./VM_Backup/AmazonLinux2-Blog-1/AmazonLinux2-Blog-1.xml
3. 仮想イメージのバックアップ
$ cp -p /var/lib/libvirt/images/al2-blog-1.qcow ../VM_Backup/AmazonLinux2-Blog-1/
$ sudo cp -p /home/yuki/seedconfig/seed.iso VM_Backup/AmazonLinux2-Blog-1/

仮想マシンのリストア

KVM により仮想化環境を構築している別の物理ホストに、先にバックアップした仮想イメージファイル及び設定ファイルをコピーし、リストアを行います。 つまり、ここからはバックアップを行なったマシンとは異なるマシンでの作業となります。

1. バックアップした仮想イメージをリストア
$ sudo cp -p al2-blog-1.qcow /var/lib/libvirt/images/
$ cp -p seed.iso /home/yuki/seedconfig/seed.iso
2. バックアップした設定ファイルのリストア
cp -p AmazonLinux2-Blog-1.xml /etc/libvirt/qemu/
3. リストアした設定ファイルを KVM に反映
$ virsh define /etc/libvirt/qemu/AmazonLinux2-Blog-1.xml
Domain AmazonLinux2-Blog-1 defined from /etc/libvirt/qemu/AmazonLinux2-Blog-1.xml
4. 仮想マシンの起動
$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     AmazonLinux2-Blog-1            shut off

$ virsh start AmazonLinux2-Blog-1
Domain AmazonLinux2-Blog-1 started

$ virsh console AmazonLinux2-Blog-1
Connected to domain AmazonLinux2-Blog-1
Escape character is ^]

Amazon Linux 2
Kernel 4.14.128-112.105.amzn2.x86_64 on an x86_64

amazonlinux2_home login: ec2-user
Password: 
Last login: Sun Jul 21 06:03:12 on ttyS0

       __|  __|_ )
       _|  (    /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/```
<!-- /wp:shortcode -->

<!-- wp:html -->
  

<!-- /wp:html -->

<!-- wp:heading -->
### 仮想マシンのクローン
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>次は仮想マシーンのクローンです。これは virt-clone コマンドで行います。  

まずはクローン元の仮想マシンを shutdown します。</p>
<!-- /wp:paragraph -->

<!-- wp:shortcode -->
```bash
$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     AmazonLinux2-Blog-1            running

$ virsh shutdown AmazonLinux2-Blog-1
Domain AmazonLinux2-Blog-1 is being shutdown

次に、以下のコマンドでクローンを作成します。

$ virt-clone -o AmazonLinux2-Blog-1 -n AmazonLinux2-Blog-2 -f /var/lib/libvirt/images/al2-blog-2.qcow2
Error setting up logfile: No write access to directory /home/yuki/.cache/virt-manager
Allocating 'al2-blog-2.qcow2'                                                                                                                                                                                          |  25 GB  00:00:03

Clone 'AmazonLinux2-Blog-2' created successfully.

$ virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     AmazonLinux2-Blog-1            shut off
 -     AmazonLinux2-Blog-2            shut off
<!-- /wp:shortcode -->

<!-- wp:paragraph -->
<p>ここで、新しく作成された仮想マシンの MAC アドレスを控えておきます。</p>
<!-- /wp:paragraph -->

<!-- wp:shortcode -->
```bash
$ virsh dumpxml AmazonLinux2-Blog-2 | grep "mac address"
<mac address='52:54:00:d2:26:03'/>

で、クローン先の仮想マシンにコンソール接続し、/etc/udev/rules.d/70-persistent-net.rules/etc/sysconfig/network-scripts/ifcfg-eth0 を編集しましょう。

$ cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:d2:26:03", NAME="eth0"

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
HWADDR=52:54:00:d2:26:03
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

最後に network.service を再起動させると、IP アドレスが DHCP により取得できます。

$ sudo systemctl restart network
$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.26  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::5054:ff:fed2:2603  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:d2:26:03  txqueuelen 1000  (Ethernet)
        RX packets 765  bytes 121487 (118.6 KiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 194  bytes 63468 (61.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 © 2022, Dealing with Ambiguity