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à
ens192hoặcens160. KVM sẽ nhận diện card VirtIO làens18hoặceth0. Kiểm tra bằng lệnhip linkrồ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 đúngRed Hat VirtIO SCSI controllervà 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.

