shimauma YOROZU memo

学んだこと、やったこと、感じたことのメモ

KVM の VM を Proxmox-VE に移行する

検証用の環境に NAS を追加し、共有ディスクとして利用できるようになったことに伴い これまで KVM で使っていたサーバー環境を Proxmox-VE に移行しました。
その際、 VM の移行に少し試行錯誤をしたので、それを記録として残します。

環境

  • Proxmox-VE 7.4-3
  • 2 台クラスター構成 (当記事にはクラスターは関係ありません)
  • 共有ストレージ ( NAS

VM の移行

KVM 上で稼働している VM の実体のファイル ( 今回は *.qcow2 ファイル ) を sftp 等で Proxmox-ve からアクセスできるストレージ上に upload しておきます。
( デフォルトでは KVM ホスト上の /var/lib/libvirt/images にあります )

ストレージの確認

KVMVM 移行は GUI ではできず、コマンドで実施する必要があります。
Proxmox-ve に ssh でログインし、まずストレージを確認します。

# pvesm status
Name                  Type     Status           Total            Used       Available        %
TerraMaster-VM         nfs     active      5850095616        80206848      5767790592    1.37%
local                  dir     active        98497780         3458864        89989368    3.51%
local-lvm          lvmthin     active       365760512               0       365760512    0.00%

ここでは、 TerraMaster-VM , local, local-lvm というストレージがあります。
当記事では NAS (TerraMaster-VM)を使いますが、ローカルの場合は local, local-lvm と読み替えてください。

VM のイメージファイルは下記の場所にあります。
/mnt/pve/TerraMaster-VM/images/
その下の、tmp 以下に KVMVM ファイルを配置しました。
(※ローカルの場合、/var/lib/vz/images 以下になると思います)

KVM の qcow2 ファイルからの VM の作成

KVM の qcow2 ファイルをベースに VM を作成します。
まず事前に既存 VM 情報を確認しておきます。

# qm list
      VMID NAME                 STATUS     MEM(MB)    BOOTDISK(GB) PID
       100 test01               stopped    4096              50.00 0

次に、コマンドで VM を作成します。 その際に KVMVM ファイルから import します。

※ 2023/05/07 いきなり追記です。 --
--cpu host をつけていないと、 Red Hat 系の v9 以降で kernel panic を起こすようです。 そのため下記コマンド部分を修正しました。

# qm create 101 --name Liberty --ostype l26 \
> --cpu host --sockets 1 --cores 4 \
> --memory 4096 \
> --net0 virtio,bridge=vmbr0 \
> --scsi0 TerraMaster-VM:0,import-from=/mnt/pve/TerraMaster-VM/images/tmp/liberty.qcow2,format=qcow2,discard=on \
> --boot order=scsi0 --scsihw virtio-scsi-pci

Formatting '/mnt/pve/TerraMaster-VM/images/101/vm-101-disk-0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off preallocation=metadata compression_type=zlib size=53687091200 lazy_refcounts=off refcount_bits=16
transferred 0.0 B of 50.0 GiB (0.00%)
transferred 527.4 MiB of 50.0 GiB (1.03%)
...(略)...
transferred 50.0 GiB of 50.0 GiB (100.00%)
scsi0: successfully created disk 'TerraMaster-VM:101/vm-101-disk-0.qcow2,discard=on,size=50G'

コマンドの内容は以下の通りです。

パラメータ名 概要
VMID 101 VM の ID。重複禁止。GUIVM を作ると 100からの連番になる
--name Liberty VM の名前、GUI上での表示で利用される
--ostype l26 OSタイプ. l26 は Linux kernel 2.6-6.x .
その他は qm.conf マニュアル参照(末尾に記載)
--cpu [cputype=]host host と同じCPUタイプをエミュレート
--sockets 1 CPUソケット数
--cores 4 コア数。ただし Hyper-Thread が有効な場合 2 倍する
--memory 4096 メモリ量 (MiB)
--net0 virtio,bridge=vmbr0 ネットワークデバイス。仮想NIC でホストOSとブリッジ
--scsi0 TerraMaster-VM:0, 配置先ストレージ( pvesm status で確認)。
新規qcow2 ファイル作成の場合は :0 を指定
import-from=インポート元qcow2 ファイルパス, インポート元ファイル
format=qcow2, インポート先の形式。指定しないと raw
discard=on 後述の Thin Provisioning 設定用
--boot order=scsi0 ブートデバイス指定
--scsihw virtio-scsi-pci SCSI コントローラーモデル指定

※ cores について
Sockets vs Cores vs vCPUs に以下の記載があり、Hyper-Thread 利用の際は Thread 数を指定。 当環境は 1 Socket , 2 Core, Hyper-Thread on のため 4 としている。
なお、 Socket * core >= vCPU が成り立たない場合エラーで VM が起動しません。

within Proxmox the number of cores equals the number of threads, so if your CPU supports hyper-threading, the cores count is double the physical cores of the CPU

※ format=qcow2 について
format を qcow2 にしておくと Thin Provisioning されるのでは、と期待しましたが残念ながら Thick Provisioning でした。ディスク容量を節約したい場合は後述の手順で Thin Provisioning に変更します。

※ discard=on, virtio-scsi-pci について
VM 内でファイルを削除した場合でも、qcow2 ファイルは解放(縮小)されません。この設定をしておくことにより VM 内での削除情報が qcow2 側に反映可能になります。(縮小にはひと手間必要。後述)


コマンド完了後、GUI 上では VM が表示されており、起動・利用可能になります。
VM 上では NW デバイスが変わったため DHCP 設定になっていました
NW設定のリストアは後述します。

Proxmox-importVM

Thin Provisioning 化(オプション)

せっかく qcow2 形式にしているので、Shrink Qcow2 Disk Files に沿って Thin Provisioning 化して空き容量を確保します。(実施しなくても問題ありません)

手順の流れとしては以下の通りですが、自宅環境なのでいきなり変換だけしています。

  1. VM 起動
  2. VM 上で fstrim -av 実施
  3. VM シャットダウン
  4. qcow2 を バックアップ
  5. qcow2 を Thin Provisioning に変換

VM上で fstrim -av を実施することにより、使われていない領域の開放が可能になります。

# fstrim -av
/boot: 872 MiB (914386944 bytes) trimmed
/: 43 GiB (46159249408 bytes) trimmed

ただ、今回の VM はもともとそれほど使われていない VM だったため、 fstrim は省略しました(テスト的には実施しましたが。。。)
また、 qcow2 のバックアップは cp xxx.qcow2 xxx.qcow2.bk 等で取得しておけば問題ありません。

Thin Provisioning への変換は以下の通りです。(それなりに時間がかかります)

# qemu-img convert -O qcow2 -c vm-101-disk-0.qcow2.bk vm-101-disk-0.qcow2

# ls -l
合計 3683860
-rw-r----- 1 root root  1348576256  5月  7 13:58 vm-101-disk-0.qcow2
-rw-r----- 1 root root 53695545344  5月  7 13:09 vm-101-disk-0.qcow2.bk

-c は圧縮オプションです、よく使う VM にはつけなくてもよいです。
容量が減っていることが確認できます。
後は、 VM を起動して稼働確認を行えば完了です。

NW 設定のリストア

VM の NW 設定が DHCP になっていましたが、下記の手順で復旧させています。
( nmcli を利用した方法です。ディストリビューションにより異なります。)

設定情報の確認

まず、NW情報を確認します。

# nmcli con show
NAME        UUID                                  TYPE      DEVICE
有線接続 1  4433753e-d14e-31bc-b482-36cdb5b3fd0e  ethernet  ens18
enp1s0      01ecfc81-c5a0-4b08-8fe0-99b50ed88d47  ethernet  --

KVM環境では、 enp1s0 だったインターフェースが ens18 に変わり、そのため 「有線接続1」というデフォルトの設定になっています。

NW設定情報のリストア

もとのNW設定に戻すには、 デバイス ens18 に対して、コネクション enp1s0 を適用すればOKですが、 わかりにくいため、 コネクション enp1s0 のインターフェースと名前を ens18 に変えます。

# nmcli con mod enp1s0 connection.interface-name ens18
# nmcli con mod enp1s0 connection.id ens18
# nmcli con show
NAME        UUID                                  TYPE      DEVICE
有線接続 1  4433753e-d14e-31bc-b482-36cdb5b3fd0e  ethernet  ens18
ens18       01ecfc81-c5a0-4b08-8fe0-99b50ed88d47  ethernet  --

変更後、 コネクション ens18 を up させれば NW 設定が旧来のものに戻ります。
※変更時に IP が変わるため、セッションが切断されます。コンソール等から行ったほうが良いです。

# nmcli con up ens18
## ※ここで切断 (コンソールでは  Connection successfully activated..  などと表示されます)

最後に、再度ログインして、不要になったコネクションを削除します。(日本語指定でエラーになるかもしれないと思い、 UUID 指定で消しています)

# nmcli con delete 4433753e-d14e-31bc-b482-36cdb5b3fd0e
接続 '有線接続 1' (4433753e-d14e-31bc-b482-36cdb5b3fd0e) が正常に削除されました。
# nmcli con show
NAME   UUID                                  TYPE      DEVICE
ens18  01ecfc81-c5a0-4b08-8fe0-99b50ed88d47  ethernet  ens18

参考