KVM+NFSでライブマイグレーション環境を構築する

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回は前回構築したKVM環境を拡張していきたいと思います。
KVMをもう1台作成し2台とし、さらにNFSを1台構築。ライブマイグレーション環境を作成していきたいと思います。
KVMを構築した記事は以下となります。

https://qiita.com/ohtsuka-shota/items/b0698f33f3afcdad8259

# HWスペック
## KVM
Processorsにhostがあることは私の環境ではマストになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2188b3a2-f499-3713-83a3-892cf1255c0c.png)

## NFS
こちら側はProcessorsにhostsという記載がなくても問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/124fbc9d-cad0-304d-fc1f-a2d1af978533.png)

# 環境イメージ
KVMのホスト（kvm01とkvm02）の/var/lib/libvirt/imagesをNFSの/home/kvm-nfsディレクトリにマウント。/var/lib/libvirt/imagesに作成されるファイルをKVM双方で共有します。
KVM間でVMが無停止で移動できるような環境を作ります。
![kvm-ページ4.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4f2528e4-1300-bd4f-341e-010a7c29ab61.png)


# 構築
## NFSサーバ周りの設定を行う
以下のコマンドを実行してNFSサーバとして必要なアプリをインストールします。
```
root@kvm-nfs:~# apt update
root@kvm-nfs:~# apt upgrade -y
root@kvm-nfs:~# apt -y install nfs-kernel-server
```
/home/kvm-nfsをNFS用のディレクトリとして作成しエクスポートします。
エクスポート後、NFSをリスタートします。
```
root@kvm-nfs:~# cp -p /etc/exports /etc/exports.org
root@kvm-nfs:~# vi /etc/exports
root@kvm-nfs:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
/home/kvm-nfs 192.168.2.0/24(rw,no_root_squash)
root@kvm-nfs:~# mkdir /home/kvm-nfs
root@kvm-nfs:~# cd /home/
root@kvm-nfs:/home# chmod 777 kvm-nfs
root@kvm-nfs:/home# exportfs -a
exportfs: /etc/exports [2]: Neither 'subtree_check' or 'no_subtree_check' specified for export "192.168.2.0/24:/home/kvm-nfs".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 1.0.x
root@kvm-nfs:~# systemctl restart nfs-server
root@kvm-nfs:~# systemctl enable nfs-server
```
KVM側でNFSのクライアントとなるためのアプリケーションをインストールします。またrootでssh出来るように設定を行います。
```
root@kvm02:~# apt install -y nfs-common
root@kvm02:~# passwd root
New password:
Retype new password:
passwd: password updated successfully
root@kvm02:~# vi /etc/ssh/sshd_config
root@kvm02:~# tail -n5 /etc/ssh/sshd_config
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
permitRootLogin yes
root@kvm02:~# systemctl restart sshd
```
cockpitにログインします。
![image (94).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ba65ebcd-c03d-593c-2c13-6db775f44a75.png)
画面左のストレージタブを押下し、NFSマウントに表示されている+マークを押下します。
![image (95).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/75e696b9-4598-3e09-1c42-cada269bd6b4.png)
以下のように設定を入れて、追加するを押下します。
![image (96).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3e60746d-cc25-0a15-8f45-6783fae4d85c.png)
cockpitで以下のように表示されていればOKです。
![image (97).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7ce09a7b-4a09-6f11-f34b-85b9dfd508c5.png)
コマンドからもマウントが出来ていることが確認できます。
```
root@kvm02:~# df -m
Filesystem                        1M-blocks  Used Available Use% Mounted on
tmpfs                                  2000     2      1999   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv     24015 14548      8222  64% /
tmpfs                                  9999     0      9999   0% /dev/shm
tmpfs                                     5     0         5   0% /run/lock
tmpfs                                  9999     0      9999   0% /run/qemu
/dev/sda2                              1946   129      1699   8% /boot
tmpfs                                  2000     1      2000   1% /run/user/1000
tmpfs                                  2000     1      2000   1% /run/user/0
192.168.2.110:/home/kvm-nfs           15011  2887     11340  21% /var/lib/libvirt/images
```
上記一連の流れをkvm01側でも実行します。
kvm01で本当にファイルが共有できているか確認します。test.txtをNFSにマウントした/var/lib/libvirt/images配下に作成します。
```
root@kvm01:~# cd /var/lib/libvirt/images
root@kvm01:/var/lib/libvirt/images# touch test.txt
root@kvm01:/var/lib/libvirt/images# ls
test.txt
```
NFS側でも上記で作成したファイルが確認できます。共有できていそうですね。
```
root@kvm-nfs:~# cd /home/kvm-nfs/
root@kvm-nfs:/home/kvm-nfs# ls
test.txt
```

## CUIでライブマイグレーションを行う
/var/lib/libvirt/imagesにubuntuのISOをダウンロードします。
```
root@kvm01:~# cd /var/lib/libvirt/images
root@kvm01:/var/lib/libvirt/images# wget https://releases.ubuntu.com/22.04.1/ubuntu-22.04.1-live-server-amd64.iso
root@kvm01:/var/lib/libvirt/images# ls
test.txt  ubuntu-22.04.1-live-server-amd64.iso
```
これを使ってcockpit経由でVMを立ち上げます。
![image (98).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5058de22-1be8-a0e2-7b6c-948d8ff62b85.png)
![image (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7506cf63-d717-1477-ebe1-42aa03073d6e.png)
![image (100).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6bd9ad37-7483-1394-6090-594f6fdc02aa.png)
起動完了。sshも出来ることが確認できました。
![image - 2023-11-05T151825.849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/49b6f068-60ce-8fea-a2f2-d85b38e61da1.png)
作成したVM用のqcow2が出来ていることも確認できます。
```
root@kvm01:/var/lib/libvirt/images# ls -ltr
total 5233528
-rw-r--r-- 1 libvirt-qemu kvm   1474873344 Aug  9  2022 ubuntu-22.04.1-live-server-amd64.iso
-rw-r--r-- 1 root         root           0 Nov  5 03:23 test.txt
-rw------- 1 libvirt-qemu kvm  10739318784 Nov  5 03:58 nfs-vm.qcow2
```
ライブマイグレーションを実行するためにKVMホスト双方の鍵を交換する必要があります。
kvm01側で以下を実行。鍵を作成し、kvm02へ共有しています。
```
root@kvm01:~# cd .ssh/
root@kvm01:~/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):password
Enter same passphrase again:password
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:3yUMg1Wxr5UzNhzLB4Od2hvpLeF/3lKDYodNSU6ux9Q root@kvm01
The key's randomart image is:
+---[RSA 3072]----+
|          ..o.   |
|         o   * . |
|        . o B O  |
|           + % E |
|        S   @ ^ .|
|         . * # @.|
|          o * =.o|
|              .oo|
|               o=|
+----[SHA256]-----+
root@kvm01:~/.ssh# ssh-copy-id root@192.168.2.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.101 (192.168.2.101)' can't be established.
ED25519 key fingerprint is SHA256:n94qaYmKdNQISHZiZDQ4TbJGzyHKNKVWehHzgWi3EjE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.101's password:
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'root@192.168.2.101'"
and check to make sure that only the key(s) you wanted were added.
```
kvm02に鍵を渡せているかを確認するため実際に鍵を使ってsshしてみます。login出来ていればOKです。
これをkvm02側でも実行します。
```
root@kvm01:~/.ssh# ssh root@192.168.2.101
Enter passphrase for key '/root/.ssh/id_rsa':
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-88-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
  System information as of Sun Nov  5 04:06:32 AM UTC 2023
  System load:  0.16015625         Processes:               165
  Usage of /:   60.6% of 23.45GB   Users logged in:         0
  Memory usage: 1%                 IPv4 address for br0:    192.168.2.101
  Swap usage:   0%                 IPv4 address for virbr0: 192.168.122.1
 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.
   https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
Web console: https://kvm02:9090/ or https://192.168.2.101:9090/
Last login: Sat Nov  4 16:58:42 2023 from ::ffff:192.168.2.65
```
/root/.ssh/authorized_keysに先方のkvmホストの鍵が存在することを確認します。
```
root@kvm01:~/.ssh# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCYq0MaWbhUANHQ4UZ8bzFZIyNm3boyM8rLUlmqX7XuT2HuU6C76f/U4NOx0cQux2o7/HBZpGPbEp2W33Dtb9NDSvvjg21jOeSCDtv2PCH+d0PL3GQnZY1Klnpimbj0Ox6li4yagRHD91OAI4nmUukq+02sguDaRuG4gVJIHCo7LePuiLOLF0VpSDe33T2f+rGj3QUwJ/9Ddan4nwEFWgqQVx+w2Yh1Z9ZhOaKGXGa2tZyPp5BoEre3uof+4hxcbJOUbQ5ZWSPW5zk7Mx1tzuuY62PWVAHtWHLCYYnUto7XWrMD4UqBHaXvHYxJGKDJJN892lDP/nzD0voOIZJnLgc3QaJPjYCjGfLqffu5JTvqkmQQYnphmJ2lWOowjPs9WaIfekxvGsZmmtDd9o4SXtRoQw0pcjnjDDizAMcZsb2qtjiLFm1XGBAWEr9P4h0F+ePgsw1GQL3iypS5bzqsXgW8rYE1OT2LpxjzInUr3mc/fACS/tiELZTEo6HD6uajs0U= root@kvm02
```
さらに、/etc/hostsを編集し名前解決を出来るようにします。NFSは名前解決できなくても問題ありませんので、今回は設定しておりません。この設定もKVMホスト双方で行います。
```
root@kvm01:~/.ssh# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 kvm01
192.168.2.100 kvm02
```
※名前解決できるようにしておかないとライブマイグレーションを行う際に以下のようなエラーが出てしまいます。IPアドレスで指定しているんですけどね…
```
root@kvm02:~# virsh migrate --live nfs-vm qemu+ssh://192.168.2.100/system
Enter passphrase for key '/root/.ssh/id_rsa':
error: Unable to resolve address 'kvm01' service '49152': Name or service not known
```
さらに/etc/ssh/sshd_configのPasswordAuthenticationをyesに変更します。これもkvm双方で実施します。
※どっかの英語のサイトに書いていましたが、おそらくいらないです。
```
root@kvm01:~# vi /etc/ssh/sshd_config
root@kvm01:~# cat /etc/ssh/sshd_config | grep -i PasswordAuthentication
PasswordAuthentication yes
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication
root@kvm01:~# systemctl restart sshd
```
ここまで設定を入れたらCUIでライブマイグレーションを行っていきたいと思います。
virsh listの出力結果がmigrate以後出力されておりませんから、kvm01からkvm02に移動したことがわかります。
```
root@kvm01:~# virsh list
 Id   Name     State
------------------------
 13   nfs-vm   running
 
root@kvm01:~# virsh migrate --live nfs-vm qemu+ssh://192.168.2.101/system 
Enter passphrase for key '/root/.ssh/id_rsa':

root@kvm01:~# virsh list
 Id   Name   State
--------------------
```
kvm02でも同様に確認してみます。
```
root@kvm02:~# virsh list
 Id   Name     State
------------------------
 1    nfs-vm   running

root@kvm02:~# virsh migrate --live nfs-vm qemu+ssh://192.168.2.100/system
Enter passphrase for key '/root/.ssh/id_rsa':

root@kvm02:~# virsh list
 Id   Name   State
--------------------
```

## GUIでもライブマイグレーションを行う
cockpitでもライブマイグレーションを行えるようにしたいと思います。
※結論から先に記載しますが、今の状態だと失敗しますので少し修正が必要です。
まずcockpitの左にあるホストが記載されているタブを押下して、新しいホストの追加を押下します。
![image - 2023-11-05T152818.720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/dbc61dff-293b-8750-f3d9-5e7ad935f860.png)
相手のホストのIPアドレスとユーザ名を入力し追加するを押下します。
![image - 2023-11-05T152821.405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7ffcd08e-3f4d-ea33-7bd3-eb3374ef2dd8.png)
追加が出来ました。
![image - 2023-11-05T152823.775.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/43cedf29-38ca-385e-a7b3-cd8983ce55fc.png)
cockpitでライブマイグレーションを実行するためには仮想マシンからマイグレーションしたいVMの3点を選択し、移行を押下します。
![image - 2023-11-05T153017.598.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9efdf658-e101-6209-8e3c-111b5fb9ec98.png)
以下のような画面が表示されるので"qemu+ssh://192.168.2.101/system"と入力し、移行を押下します。
![image - 2023-11-05T153020.011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/738c7cfa-b821-3169-fcc5-a900e6248d2f.png)
すると以下のようなエラーが出てしまいます。
これはid_rsaを作成した際にパスフレーズを設定しまったことによります。ライブマイグレーション実行時、cockpitだとパスワードをCUIの時のように入力することができないためです。
```
Cannot recv data: Permission denied, please try again. Permission denied, please try again. root@192.168.2.101: Permission denied (publickey,password).: Connection reset by peer
```
これを解消するためにKVM双方で以下のコマンドを実行。パスフレーズを削除しました。
```
root@kvm01:~# ssh-keygen -p -f ~/.ssh/id_rsa
Enter old passphrase:
Key has comment 'root@kvm01'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
```
改めてcockpit経由でライブマイグレーションを行います。
![image - 2023-11-05T153451.915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ade6c3bb-b227-56c8-718a-754e5e35d253.png)
![image - 2023-11-05T153455.498.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/806d3541-143c-07ed-0dc2-2401dcee50b1.png)
今度はエラーが出力されず画面からライブマイグレーションしたVMが消えていることがわかります。
![image - 2023-11-05T153500.943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cfb91ceb-b243-de70-5c88-e7e441059ac7.png)
kvm02側で表示されています。cockpit経由のライブマイグレーションも行えました。
![image - 2023-11-05T153504.077.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b5bc2a89-a6b1-9b7a-cdb0-76ac4e93326c.png)