今回やること
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