virt-v2vを使用したVMware ESXiからKVMおよびProxmox VEへの仮想マシン移行・変換ガイド

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

背景:VMwareのライセンス費用が3倍に高騰

BroadcomによるVMware買収後、高額なサブスクリプションモデルへ全面移行したことで、多くの企業でvSphereのライセンス費用が3〜5倍に跳ね上がりました。数十台から数百台のVMを抱えるインフラにおいて、Proxmox VE 8.xやピュアKVMへの移行は今や死活問題となっています。

単に.vmdkファイルを新しいホストへコピーし、qemu-img convertを実行すれば移行完了だと考える方も多いかもしれません。しかし、現実はそれほど単純ではありません。Windowsでは即座にブルースクリーン(BSOD)であるINACCESSIBLE_BOOT_DEVICEが発生し、Linuxではdracut rescueモードへの突入やカーネルパニック(kernel panic)に陥りがちです。

その原因はストレージドライバとチップセットの違いにあります。VMwareはLSI Logic SASまたはPVSCSIコントローラを使用しますが、KVMではVirtIO SCSIを使用することで最高のパフォーマンスを発揮します。initramfsのロード時にカーネルにVirtIOドライバが含まれていない場合、OSは起動直後にルートディスクを見失ってしまいます。

まさにこの問題を完璧に解決してくれるのがvirt-v2vです。このツールはlibguestfsを介してオフラインのディスクイメージに直接介入し、WindowsレジストリへのVirtIOドライバのインジェクションやLinux上でのinitramfsの再構築、VMware Toolsのアンインストール、ディスク形式の変換、さらには新しい仮想マシン構成の作成までを行います。これら一連のプロセスが、たった1つのコマンドで自動的に実行されます。

移行環境の準備

I/Oのボトルネックを防ぐため、最低でもCPU 4コア、メモリ8GB、10GbEネットワークを備えた中間Linuxマシン(変換ホスト)を用意することをお勧めします。小規模なインフラ構成であれば、移行先のProxmox VEノード上で直接実行することも可能です。

Proxmox VEまたはDebian 12へのツール群のインストール:

apt-get update
apt-get install -y virt-v2v libguestfs-tools

RHEL 9またはRocky Linux 9を使用する場合:

sudo dnf install -y virt-v2v guestfs-tools

Windows仮想マシン(Server 2012R2から2022まで)を移行するには、Fedora Project公式のVirtIOドライバISOをダウンロードし、標準ディレクトリに配置しておく必要があります:

mkdir -p /usr/share/virtio-win
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso \
     -O /usr/share/virtio-win/virtio-win.iso

移行作業の実践

ターミナルの履歴に機密情報が残るのを防ぐため、vCenterまたはESXiのパスワードを別ファイルに保存しておきます:

echo "ESXi_Admin_Password_Here" > /root/.esxi_pass
chmod 600 /root/.esxi_pass

重要な注意点:ディスクの断片化や不整合を防ぐため、コマンドを実行する前にVMware側で仮想マシンをシャットダウン(コールドマイグレーション)し、スナップショットを完全に削除しておいてください。

1. KVM / libvirtへの直接変換

以下のコマンドは、スタンドアロンのESXiからVM db-master-01を直接取得してqcow2形式に変換し、libvirtのストレージプールdefaultに自動登録します:

virt-v2v -ic esx://[email protected]/?no_verify=1 \
         --password-file /root/.esxi_pass \
         db-master-01 \
         -o libvirt \
         -os default \
         -of qcow2

vCenterクラスタから取得する場合は、接続文字列をvpx://[email protected]/Datacenter/Cluster/esxi-node-01?no_verify=1のような形式に変更します。

2. Proxmox VEへの仮想マシンの変換とインポート

ProxmoxはディスクをVM IDおよび個別のストレージボリュームとして管理します。標準的なワークフローは、一時ディレクトリへのディスクエクスポート、VMテンプレート(枠組み)の作成、LVM-ThinやZFSへのディスクインポート、ブート設定の4ステップで構成されます。

# ステップ1:ESXiからVMを抽出し、ローカルのqcow2ファイルへ変換
virt-v2v -ic esx://[email protected]/?no_verify=1 \
         --password-file /root/.esxi_pass \
         app-server \
         -o local \
         -os /mnt/scratch \
         -of qcow2

# ステップ2:Proxmox上にID 105の新しい仮想マシン枠を作成
qm create 105 --name app-server --memory 8192 --cores 4 --net0 virtio,bridge=vmbr0

# ステップ3:仮想ディスクをストレージlocal-lvmにインポート
qm importdisk 105 /mnt/scratch/app-server-sda local-lvm

# ステップ4:ディスクをvirtio-scsi-pciコントローラにアタッチし、ブート順序を設定
qm set 105 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-105-disk-0,discard=on,ssd=1
qm set 105 --boot order=scsi0

3. Bashスクリプトによる一括移行の自動化

週末のメンテナンスウィンドウで30台の仮想マシンを移行する必要がある場合、順次実行スクリプトを使用することで、コマンド入力にかかる膨大な時間を節約し、人為的ミスを最小限に抑えられます。

#!/usr/bin/env bash
set -euo pipefail

ESXI_IP="192.168.10.50"
PASS_FILE="/root/.esxi_pass"
OUTPUT_DIR="/mnt/scratch"
LIST_FILE="migration_vms.txt"

while IFS= read -r vm || [[ -n "$vm" ]]; do
    [[ -z "$vm" || "$vm" =~ ^# ]] && continue
    
    echo "[$(date +'%H:%M:%S')] 移行中: $vm..."
    
    if virt-v2v -ic "esx://root@${ESXI_IP}/?no_verify=1" \
                 --password-file "$PASS_FILE" \
                 "$vm" \
                 -o local \
                 -os "$OUTPUT_DIR" \
                 -of qcow2; then
        echo "[SUCCESS] 完了: $vm" >> migration.log
    else
        echo "[FAILED] エラー発生: $vm、詳細はログを確認してください" >> migration.log
    fi
done < "$LIST_FILE"

ESXi上の正確なVM名を記述したmigration_vms.txtファイルを作成します:

billing-api
auth-service
redis-cluster-01

移行後の確認と事後処理

1Gbpsのネットワーク経由で100GBのディスクを転送する場合、約18〜25分かかります。別のターミナルタブを開いて、ディスクスループットとファイル書き込みの進行状況を監視しておきましょう:

# ディスク書き込みスループットをリアルタイムで監視
iostat -mh 2

# 生成中のファイルサイズを確認
watch -n 3 "ls -lh /mnt/scratch"

qm start 105またはvirsh start web-production-01で新しい仮想マシンを起動したら、直ちにVNCコンソールを開いてカーネルのロードプロセスを確認します。OSにログインできたら、次の3つのポイントを確実に処理してください:

  • Linuxでのネットワークインターフェース名の変更: VMwareではネットワークカード名がens192やens160になるのが一般的ですが、KVMのVirtIOカードではens18やeth0として認識されます。ip linkコマンドで確認し、/etc/netplan/または/etc/network/interfacesの設定ファイルを修正してください。修正しないとVMが通信できなくなります。
  • Windowsドライバの確認: devmgmt.msc(デバイスマネージャー)を開き、「記憶域コントローラー」にRed Hat VirtIO SCSI controllerが正しく表示され、黄色の感嘆符(!)の付いたデバイスが残っていないことを確認します。
  • 古いサービスのクリーンアップ: 不要なバックグラウンドサービスの実行を防ぐため、VMware Toolsを完全にアンインストールします。Linuxの場合はapt purge open-vm-toolsを実行し、Windowsの場合は「プログラムと機能」からアンインストールした後に最終再起動を行ってください。
Share: