KVM の VM を Proxmox-VE に移行する
検証用の環境に NAS を追加し、共有ディスクとして利用できるようになったことに伴い
これまで KVM で使っていたサーバー環境を Proxmox-VE に移行しました。
その際、 VM の移行に少し試行錯誤をしたので、それを記録として残します。
環境
VM の移行
KVM 上で稼働している VM の実体のファイル ( 今回は *.qcow2 ファイル ) を sftp 等で Proxmox-ve からアクセスできるストレージ上に upload しておきます。
( デフォルトでは KVM ホスト上の /var/lib/libvirt/images
にあります )
ストレージの確認
KVM の VM 移行は 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
以下に KVM の VM ファイルを配置しました。
(※ローカルの場合、/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 を作成します。 その際に KVM の VM ファイルから import します。
※ 2023/05/07 いきなり追記です。 --
--cpu host
をつけていないと、 Red Hat 系の v9 以降で kernel panic を起こすようです。 そのため下記コマンド部分を修正しました。
- Kernel panic installing rocky or almalinux
- Building Red Hat Enterprise Linux 9 for the x86-64-v2 microarchitecture level
# 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。重複禁止。GUI で VM を作ると 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設定のリストアは後述します。
Thin Provisioning 化(オプション)
せっかく qcow2 形式にしているので、Shrink Qcow2 Disk Files に沿って 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