なにかの技術メモ置き場

なにかの技術メモ置き場

@インフラエンジニア

KVM環境の移行

概要

CentOS7上に構築したKVM環境をCentOS8上に移行する。
ゲストマシンの移行も含む。

概念図

f:id:none06:20200421094133p:plain

環境

方式図

f:id:none06:20200421094140p:plain

構成

用途 ホスト名 OS QEMU libvirt
移行元マシン kvm01 CentOS 7.7.1908 2.12 4.5
移行先マシン kvm01 CentOS 8.1.1911 2.12 4.5
ゲストマシン guest01~05 割愛 - -
データ移行用NAS file01 割愛 - -

前提

・移行元マシンと移行先マシンのホスト名は同一とする。
※図では表現できていないが、実際はハードウェアは1台しかなく、OSから丸ごと入れ替えている。
・移行先マシンへのCentOS8のインストール手順は割愛する。
・移行先マシンのOS設定はKVM関連のみ記載する。

操作

移行元マシンでの作業

ゲストマシンを停止する。

[root@kvm01 ~]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 1     guest01                        実行中
 2     guest02                        実行中
 3     guest03                        実行中
 -     guest04                        シャットオフ
 -     guest05                        シャットオフ
[root@kvm01 ~]# for id in $(virsh list --all | awk '{print $1}' | grep -v Id | grep -v "-" | grep -v "^$")
> do
> virsh shutdown $id
> done
ドメイン 1 はシャットダウン中です

ドメイン 2 はシャットダウン中です

ドメイン 3 はシャットダウン中です
[root@kvm01 ~]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     guest01                        シャットオフ
 -     guest02                        シャットオフ
 -     guest03                        シャットオフ
 -     guest04                        シャットオフ
 -     guest05                        シャットオフ

データ移行用にNASを使用することとする。

[root@kvm01 ~]# df -t nfs
ファイルシス            1K-ブロック       使用    使用可 使用% マウント位置
file012:/nfs             3876309120 3017697280 858611840   78% /nfs

ゲストマシンの定義ファイルをバックアップする。

[root@kvm01 ~]# cd /etc/libvirt/
[root@kvm01 libvirt]# ls -l
合計 196
drwxr-xr-x 2 root root     6  3月 17 22:52 hooks
-rw-r--r-- 1 root root   450  2月  5 02:02 libvirt-admin.conf
-rw-r--r-- 1 root root   547  2月  5 02:02 libvirt.conf
-rw-r--r-- 1 root root 16529  3月 17 22:51 libvirtd.conf
-rw-r--r-- 1 root root  1175  2月  5 02:02 lxc.conf
drwx------ 2 root root  4096  3月 17 22:41 nwfilter
-rw------- 1 root root 12288  3月 17 22:51 passwd.db
drwx------ 4 root root  4096  3月 20 07:00 qemu
-rw-r--r-- 1 root root  2169  2月  5 02:02 qemu-lockd.conf
-rw-r--r-- 1 root root  2465  3月 17 22:51 qemu-sanlock.conf
-rw-r--r-- 1 root root 30306  3月 17 22:51 qemu.conf
drwx------ 2 root root     6  3月 12 01:41 secrets
drwxr-xr-x 3 root root  4096  3月 14 09:23 storage
-rw-r--r-- 1 root root  3202  2月  5 02:02 virtlockd.conf
-rw-r--r-- 1 root root  3247  2月  5 02:02 virtlogd.conf
[root@kvm01 libvirt]# ls -l qemu
合計 80
drwxr-xr-x 2 root root  113  3月 18 23:44 autostart
-rw------- 1 root root 3700  3月 12 22:52 guest01.xml
-rw------- 1 root root 3700  3月 13 00:07 guest02.xml
-rw------- 1 root root 3700  3月 12 22:52 guest03.xml
-rw------- 1 root root 3700  3月 17 23:24 guest04.xml
-rw------- 1 root root 3818  3月 12 22:57 guest05.xml
drwx------ 3 root root   42  3月 14 09:19 networks
[root@kvm01 libvirt]# tar czvf /nfs/_etc_libvirtd_qemu.tgz qemu
qemu/
qemu/networks/
qemu/networks/autostart/
qemu/networks/default.xml
qemu/autostart/
qemu/autostart/guest03.xml
qemu/autostart/guest02.xml
qemu/autostart/guest01.xml
qemu/guest05.xml
qemu/guest03.xml
qemu/guest01.xml
qemu/guest02.xml
qemu/guest04.xml
[root@kvm01 libvirt]# ls -l /nfs/_etc_libvirtd_qemu.tgz
-rw-r--r-- 1 root root 4569  3月 25 00:55 /nfs/_etc_libvirtd_qemu.tgz

ゲストマシンのイメージをバックアップする。

[root@kvm01 libvirt]# cd /var/lib/libvirt/images/
[root@kvm01 images]# ls -l
合計 68723664
-rw------- 1 root root  1783431168  3月 25 00:51 guest01.img
-rw------- 1 qemu qemu  2277572608  3月 13 02:00 guest02.img
-rw------- 1 root root  3178430464  3月 25 00:51 guest03.img
-rw------- 1 root root  3168796672  3月 25 00:51 guest04.img
-rw------- 1 root root  1756889088  3月 25 00:51 guest05.img

# なぜrootとqemuが混在しているんだ・・・

[root@kvm01 images]# cp -p *.img /nfs/
[root@kvm01 images]# for node in $(ls *.img); do ls -l $node /nfs/$node; done
-rw------- 1 root root 1783431168  3月 25 00:51 /nfs/guest01.img
-rw------- 1 root root 1783431168  3月 25 00:51 guest01.img
-rw------- 1 qemu qemu 2277572608  3月 13 02:00 /nfs/guest02.img
-rw------- 1 qemu qemu 2277572608  3月 13 02:00 guest02.img
-rw------- 1 root root 3178430464  3月 25 00:51 /nfs/guest03.img
-rw------- 1 root root 3178430464  3月 25 00:51 guest03.img
-rw------- 1 root root 3168796672  3月 25 00:51 /nfs/guest04.img
-rw------- 1 root root 3168796672  3月 25 00:51 guest04.img
-rw------- 1 root root 1756889088  3月 25 00:51 /nfs/guest05.img
-rw------- 1 root root 1756889088  3月 25 00:51 guest05.img

今さらながらバージョン確認。

[root@kvm01 images]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

さらば!

[root@kvm01 images]# systemctl poweroff

移行先マシンでの作業

CentOS8をインストールする。
※手順は割愛

バージョン確認。

[root@kvm01 ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

パッケージを最新化する。

[root@kvm01 ~]# dnf -y update

QEMU/KVMlibvirtvirt-installをインストールする。

[root@kvm01 ~]# dnf -y install qemu-kvm libvirt virt-install

サービスを起動しつつ、自動起動を有効化する。

[root@kvm01 ~]# systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:libvirtd(8)
           https://libvirt.org
[root@kvm01 ~]# systemctl enable --now libvirtd
[root@kvm01 ~]# systemctl status libvirtd.service --no-pager
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-03-25 02:36:26 JST; 10s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 4135 (libvirtd)
    Tasks: 19 (limit: 32768)
   Memory: 22.2M
   CGroup: /system.slice/libvirtd.service
           tq4135 /usr/sbin/libvirtd
           tq4341 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/ …
           mq4342 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/ …

 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq-dhcp[4341]: DHCP, sockets bound exclusively to interface virbr0
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: reading /etc/resolv.conf
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: using nameserver 2404:1a8:7f01:b::3#53
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: using nameserver 2404:1a8:7f01:a::3#53
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: using nameserver 172.16.0.2#53
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: using nameserver 172.16.0.1#53
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: using nameserver 10.0.0.254#53
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: read /etc/hosts - 2 addresses
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq[4341]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
 3月 25 02:36:27 kvm01.tmpdomain.local dnsmasq-dhcp[4341]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.

データ移行用NASをマウントした。

[root@kvm01 ~]# df -t nfs
ファイルシス            1K-ブロック       使用    使用可 使用% マウント位置
file012:/nfs             3876309120 3086422400 789886720   80% /nfs

ゲストマシンのイメージをリストアする。

[root@kvm01 ~]# cd /var/lib/libvirt/images/
[root@kvm01 images]# ls -l
合計 0
[root@kvm01 images]# cp -p /nfs/*.img ./
[root@kvm01 images]# for node in $(ls *.img); do ls -l $node /nfs/$node; done
-rw-------. 1 root root 1783431168  3月 25 00:51 /nfs/guest01.img
-rw-------. 1 root root 1783431168  3月 25 00:51 guest01.img
-rw-------. 1 qemu qemu 2277572608  3月 13 02:00 /nfs/guest02.img
-rw-------. 1 qemu qemu 2277572608  3月 13 02:00 guest02.img
-rw-------. 1 root root 3178430464  3月 25 00:51 /nfs/guest03.img
-rw-------. 1 root root 3178430464  3月 25 00:51 guest03.img
-rw-------. 1 root root 3168796672  3月 25 00:51 /nfs/guest04.img
-rw-------. 1 root root 3168796672  3月 25 00:51 guest04.img
-rw-------. 1 root root 1756889088  3月 25 00:51 /nfs/guest05.img
-rw-------. 1 root root 1756889088  3月 25 00:51 guest05.img

ゲストマシンの定義ファイルをリストアする。

[root@kvm01 images]# cd /etc/libvirt/
[root@kvm01 libvirt]# ls -l
合計 76
-rw-r--r--. 1 root root   450  2月  5 07:06 libvirt-admin.conf
-rw-r--r--. 1 root root   547  2月  5 07:06 libvirt.conf
-rw-r--r--. 1 root root 16529  2月  5 07:06 libvirtd.conf
drwx------. 2 root root  4096  3月 25 02:36 nwfilter
drwx------. 3 root root    22  3月 25 02:33 qemu
-rw-r--r--. 1 root root  2169  2月  5 07:06 qemu-lockd.conf
-rw-r--r--. 1 root root 30294  2月  5 07:06 qemu.conf
drwx------. 2 root root     6  3月 25 02:36 secrets
-rw-r--r--. 1 root root  3202  2月  5 07:06 virtlockd.conf
-rw-r--r--. 1 root root  3247  2月  5 07:06 virtlogd.conf
[root@kvm01 libvirt]# ls -lR qemu
qemu:
合計 0
drwx------. 3 root root 42  3月 25 02:36 networks

qemu/networks:
合計 4
drwx------. 2 root root  25  3月 25 02:33 autostart
-rw-------. 1 root root 576  3月 25 02:36 default.xml

qemu/networks/autostart:
合計 0
lrwxrwxrwx. 1 root root 14  3月 25 02:33 default.xml -> ../default.xml
[root@kvm01 libvirt]# tar zxvf /nfs/_etc_libvirtd_qemu.tgz qemu
-bash: tar: コマンドが見つかりません

え?どうしてそういうことするのCentOS8・・・

[root@kvm01 libvirt]# dnf -y install tar
[root@kvm01 libvirt]# tar zxvf /nfs/_etc_libvirtd_qemu.tgz qemu
qemu/
qemu/networks/
qemu/networks/autostart/
qemu/networks/default.xml
qemu/autostart/
qemu/autostart/guest03.xml
qemu/autostart/guest02.xml
qemu/autostart/guest01.xml
qemu/guest05.xml
qemu/guest03.xml
qemu/guest01.xml
qemu/guest02.xml
qemu/guest04.xml
[root@kvm01 libvirt]# ls -lR qemu
qemu:
合計 80
drwxr-xr-x. 2 root root  113  3月 18 23:44 autostart
-rw-------. 1 root root 3700  3月 12 22:52 guest01.xml
-rw-------. 1 root root 3700  3月 13 00:07 guest02.xml
-rw-------. 1 root root 3700  3月 12 22:52 guest03.xml
-rw-------. 1 root root 3700  3月 17 23:24 guest04.xml
drwx------. 3 root root   42  3月 14 09:19 networks

qemu/autostart:
合計 0
lrwxrwxrwx. 1 root root 27  2月 29 00:40 guest01.xml -> /etc/libvirt/qemu/guest01.xml
lrwxrwxrwx. 1 root root 27  2月 29 01:19 guest03.xml -> /etc/libvirt/qemu/guest03.xml
lrwxrwxrwx. 1 root root 27  2月 29 00:40 guest05.xml -> /etc/libvirt/qemu/guest02.xml

qemu/networks:
合計 4
drwx------. 2 root root  25  3月 13 23:54 autostart
-rw-------. 1 root root 576  3月 14 09:19 default.xml

qemu/networks/autostart:
合計 0
lrwxrwxrwx. 1 root root 14  3月 25 02:33 default.xml -> ../default.xml
[root@kvm01 libvirt]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
[root@kvm01 libvirt]# cd qemu

ゲストマシンを再定義する。

[root@kvm01 qemu]# for node in $(ls *.xml); do virsh define $node; done
ドメイン guest01 が guest01.xml から定義されました

ドメイン guest02 が guest02.xml から定義されました

ドメイン guest03 が guest03.xml から定義されました

ドメイン guest04 が guest04.xml から定義されました

ドメイン guest05 が guest05.xml から定義されました
[root@kvm01 qemu]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     guest01                          シャットオフ
 -     guest02                          シャットオフ
 -     guest03                          シャットオフ
 -     guest04                          シャットオフ
 -     guest05                          シャットオフ

テスト起動。1台だけ。
移行前後でネットワークインターフェースの名称を変えていたりすると起動に失敗する。

[root@kvm01 qemu]# virsh start guest01
ドメイン guest01 が起動されました
[root@kvm01 qemu]# virsh list
 Id    名前                         状態
----------------------------------------------------
 2     guest01                          実行中
[root@kvm01 qemu]# virsh console guest01
ドメイン guest01 に接続しました
エスケープ文字は ^] です
[  OK  ] Started firewalld - dynamic firewall daemon.
・・・

CentOS Linux 8 (Core)
Kernel 4.18.0-147.5.1.el8_1.x86_64 on an x86_64

guest01 login:
[root@kvm01 qemu]#

あ、libvirt関連の設定ファイル移行し忘れてた。仕方ないので再設定する。

[root@kvm01 qemu]# cp -p /etc/sysconfig/libvirt-guests{,_$(date +%Y%m%d)}
[root@kvm01 qemu]# ls -l /etc/sysconfig/libvirt-guests*
-rw-r--r--. 1 root root 2297  2月  5 07:06 /etc/sysconfig/libvirt-guests
-rw-r--r--. 1 root root 2297  2月  5 07:06 /etc/sysconfig/libvirt-guests_20200325
[root@kvm01 qemu]# vi /etc/sysconfig/libvirt-guests
割愛。変更箇所はdiff結果を参照。
[root@kvm01 qemu]# diff /etc/sysconfig/libvirt-guests{,_$(date +%Y%m%d)}
15c15
< START_DELAY=30
---
> #START_DELAY=0
25c25
< ON_SHUTDOWN=shutdown
---
> #ON_SHUTDOWN=suspend
31c31
< PARALLEL_SHUTDOWN=0
---
> #PARALLEL_SHUTDOWN=0
38c38
< SHUTDOWN_TIMEOUT=60
---
> #SHUTDOWN_TIMEOUT=300

設定値は肌感覚。
反映。

[root@kvm01 qemu]# systemctl restart libvirtd

最後に、ゲストマシンの自動起動設定の移行確認。ホストマシンをリブートする。

[root@kvm01 qemu]# systemctl reboot

リブート完了後、再ログインしてゲストマシンの状態を確認。

[root@kvm01 ~]# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 1     guest01                        実行中
 2     guest02                        実行中
 3     guest03                        実行中
 -     guest04                        シャットオフ
 -     guest05                        シャットオフ

OK!

メモ

バージョン確認方法。

[root@kvm01 ~]# virsh version
コンパイル時に使用したライブラリ: libvirt 4.5.0
使用中のライブラリ: libvirt 4.5.0
使用中の API: QEMU 4.5.0
実行中のハイパーバイザー: QEMU 2.12.0
[root@kvm01 ~]# virsh version --daemon
コンパイル時に使用したライブラリ: libvirt 4.5.0
使用中のライブラリ: libvirt 4.5.0
使用中の API: QEMU 4.5.0
実行中のハイパーバイザー: QEMU 2.12.0
デーモンに対して実行中: 4.5.0

参考サイト

TBD