Hướng dẫn sử dụng virt-v2v chuyển đổi máy ảo VMware ESXi sang KVM và Proxmox VE

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

Bối cảnh: Khi hóa đơn VMware tăng gấp 3 lần

Sau khi Broadcom thâu tóm VMware và chuyển toàn bộ sang mô hình thuê bao đắt đỏ, chi phí bản quyền vSphere của nhiều doanh nghiệp tăng vọt từ 3 đến 5 lần. Với hạ tầng hàng chục đến hàng trăm VM, phương án di tản sang Proxmox VE 8.x hoặc KVM thuần trở thành ưu tiên sống còn.

Nhiều người nghĩ chỉ cần copy file .vmdk sang host mới, chạy qemu-img convert là xong. Thực tế không đơn giản như vậy. Windows sẽ dính ngay màn hình xanh INACCESSIBLE_BOOT_DEVICE, còn Linux dễ rơi vào dracut rescue hoặc kernel panic.

Nguyên nhân đến từ driver lưu trữ và chipset. VMware dùng controller LSI Logic SAS hoặc PVSCSI, còn KVM đạt hiệu năng cao nhất với VirtIO SCSI. Nếu kernel không có sẵn driver VirtIO lúc nạp initramfs, hệ điều hành sẽ mất dấu ổ cứng gốc ngay khi khởi động.

Đây chính là việc virt-v2v giải quyết tốt nhất. Công cụ này can thiệp trực tiếp vào disk image offline qua libguestfs: tiêm driver VirtIO vào Windows Registry hoặc rebuild initramfs trên Linux, gỡ VMware Tools, convert định dạng đĩa và tạo sẵn cấu hình máy ảo mới. Toàn bộ quy trình diễn ra tự động chỉ với một câu lệnh.

Chuẩn bị môi trường chuyển đổi

Bạn cần một máy Linux trung gian (conversion host) cấu hình tối thiểu 4 core CPU, 8GB RAM và mạng 10GbE để tránh nghẽn I/O. Nếu hạ tầng gọn nhẹ, bạn có thể chạy trực tiếp ngay trên một node Proxmox VE đích.

Cài đặt bộ công cụ trên Proxmox VE hoặc Debian 12:

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

Nếu dùng RHEL 9 hoặc Rocky Linux 9:

sudo dnf install -y virt-v2v guestfs-tools

Để migrate máy ảo Windows (từ Server 2012R2 đến 2022), bạn bắt buộc phải tải ISO driver VirtIO chính thức từ Fedora Project về thư mục chuẩn:

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

Thực hiện chuyển đổi thực tế

Lưu mật khẩu vCenter hoặc ESXi ra file riêng để tránh lộ thông tin nhạy cảm trong lịch sử terminal:

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

Lưu ý quan trọng: hãy tắt nguồn máy ảo trên VMware (cold migration) và xóa sạch snapshot trước khi chạy lệnh để tránh phân mảnh đĩa.

1. Chuyển đổi trực tiếp sang KVM / libvirt

Lệnh sau kéo VM db-master-01 trực tiếp từ ESXi độc lập, convert sang qcow2 và tự đăng ký vào storage pool default của libvirt:

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

Trường hợp kéo từ cụm vCenter, bạn đổi chuỗi kết nối sang dạng vpx://[email protected]/Datacenter/Cluster/esxi-node-01?no_verify=1.

2. Chuyển đổi máy ảo đưa vào Proxmox VE

Proxmox quản lý disk theo VM ID và storage volume riêng biệt. Luồng xử lý chuẩn gồm 4 bước: xuất disk ra thư mục tạm, tạo khung máy ảo, import disk vào LVM-Thin/ZFS và cấu hình boot.

# Bước 1: Trích xuất và convert VM từ ESXi ra file qcow2 cục bộ
virt-v2v -ic esx://[email protected]/?no_verify=1 \
         --password-file /root/.esxi_pass \
         app-server \
         -o local \
         -os /mnt/scratch \
         -of qcow2

# Bước 2: Tạo khung máy ảo mới với ID 105 trên Proxmox
qm create 105 --name app-server --memory 8192 --cores 4 --net0 virtio,bridge=vmbr0

# Bước 3: Import đĩa ảo vào storage local-lvm
qm importdisk 105 /mnt/scratch/app-server-sda local-lvm

# Bước 4: Gắn đĩa vào controller virtio-scsi-pci và kích hoạt boot order
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. Tự động hóa di chuyển hàng loạt bằng Bash Script

Khi cần chuyển 30 máy ảo trong đợt bảo trì cuối tuần, script chạy tuần tự sẽ tiết kiệm hàng giờ gõ lệnh và giảm thiểu nhầm lẫn.

#!/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')] Đang migrate: $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] Xong $vm" >> migration.log
    else
        echo "[FAILED] Lỗi ở $vm, xem log chi tiết" >> migration.log
    fi
done < "$LIST_FILE"

Tạo file migration_vms.txt chứa tên chính xác của các VM trên ESXi:

billing-api
auth-service
redis-cluster-01

Kiểm tra và xử lý hậu kỳ

Một đĩa 100GB qua mạng 1Gbps mất khoảng 18 đến 25 phút để transfer. Mở thêm một tab terminal để theo dõi throughput đĩa và tiến độ ghi file:

# Theo dõi throughput ghi đĩa theo thời gian thực
iostat -mh 2

# Kiểm tra dung lượng file đang sinh ra
watch -n 3 "ls -lh /mnt/scratch"

Sau khi bật máy ảo mới bằng qm start 105 hoặc virsh start web-production-01, hãy mở ngay VNC console để kiểm tra quá trình nạp kernel. Khi vào được OS, cần xử lý dứt điểm 3 điểm sau:

  • Đổi tên interface mạng trên Linux: VMware thường đặt tên card mạng là ens192 hoặc ens160. KVM sẽ nhận diện card VirtIO là ens18 hoặc eth0. Kiểm tra bằng lệnh ip link rồi sửa lại file cấu hình trong /etc/netplan/ hoặc /etc/network/interfaces, nếu không VM sẽ mất mạng.
  • Kiểm tra driver Windows: Mở devmgmt.msc, xác nhận mục Storage controllers hiện đúng Red Hat VirtIO SCSI controller và không còn thiết bị nào mang dấu chấm than vàng.
  • Dọn dẹp service cũ: Gỡ hoàn toàn VMware Tools để tránh service chạy ngầm vô ích. Với Linux, chạy apt purge open-vm-tools; với Windows, gỡ qua Programs and Features rồi reboot một lần cuối.
Share: