こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
今回は前回構築したKVM環境を拡張していきたいと思います。
KVMをもう1台作成し2台とし、さらにNFSを1台構築。ライブマイグレーション環境を作成していきたいと思います。
KVMを構築した記事は以下となります。
HWスペック
KVM
Processorsにhostがあることは私の環境ではマストになります。
NFS
こちら側はProcessorsにhostsという記載がなくても問題ありません。
環境イメージ
KVMのホスト(kvm01とkvm02)の/var/lib/libvirt/imagesをNFSの/home/kvm-nfsディレクトリにマウント。/var/lib/libvirt/imagesに作成されるファイルをKVM双方で共有します。
KVM間でVMが無停止で移動できるような環境を作ります。
構築
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にログインします。
画面左のストレージタブを押下し、NFSマウントに表示されている+マークを押下します。
以下のように設定を入れて、追加するを押下します。
cockpitで以下のように表示されていればOKです。
コマンドからもマウントが出来ていることが確認できます。
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を立ち上げます。
起動完了。sshも出来ることが確認できました。
作成した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の左にあるホストが記載されているタブを押下して、新しいホストの追加を押下します。
相手のホストのIPアドレスとユーザ名を入力し追加するを押下します。
追加が出来ました。
cockpitでライブマイグレーションを実行するためには仮想マシンからマイグレーションしたいVMの3点を選択し、移行を押下します。
以下のような画面が表示されるので"qemu+ssh://192.168.2.101/system"と入力し、移行を押下します。
すると以下のようなエラーが出てしまいます。
これは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経由でライブマイグレーションを行います。
今度はエラーが出力されず画面からライブマイグレーションしたVMが消えていることがわかります。
kvm02側で表示されています。cockpit経由のライブマイグレーションも行えました。