So sánh các phương án di chuyển máy ảo từ VirtualBox sang KVM/Proxmox
2 giờ sáng, PagerDuty réo inh ỏi. Một database chạy tạm trên VirtualBox của máy trạm dev đột ngột sập do máy host hỏng nguồn. Nhiệm vụ đặt ra: chuyển gấp toàn bộ máy ảo 80GB này lên cụm Proxmox VE production. Bạn sẽ có 3 lựa chọn kỹ thuật:
- Phương án 1: Export sang OVA/OVF rồi import lại. VirtualBox đóng gói toàn bộ máy ảo thành file nén
.ova. Sau đó bạn giải nén trên Proxmox để lấy disk image. - Phương án 2: Clone ổ đĩa qua mạng bằng Clonezilla hoặc Veeam Agent. Bạn cắm ISO cứu hộ ở cả hai đầu, mở cổng mạng và stream dữ liệu block-by-block.
- Phương án 3: Convert file ổ đĩa trực tiếp bằng qemu-img. Chỉ copy đúng file
.vdi, dùng lệnh chuyển sang định dạng QCOW2 hoặc RAW rồi map vào VM mới.
Đánh giá thực tế từng giải pháp
Lúc hệ thống đang gián đoạn, mỗi phút downtime đều quy ra tiền. Dưới đây là phân tích thực tế giữa các cách:
1. Export OVA/OVF
- Điểm cộng: Thao tác đồ họa trực quan. Export giữ nguyên dung lượng RAM và số core vCPU.
- Điểm trừ: Rất chậm. VirtualBox mất 25 phút để nén ổ đĩa 80GB thành file OVA. Tiếp đó, bạn tốn thêm 15 phút rsync file qua mạng và giải nén tar. Tổng thời gian ngốn gần 45 phút chỉ cho khâu trung gian dữ liệu.
2. Dùng Clonezilla hoặc Agent qua mạng
- Điểm cộng: Không lo xung đột cấu trúc file ảo hóa giữa Oracle và QEMU.
- Điểm trừ: Setup rườm rà. Bạn phải cấu hình IP tĩnh cho cả hai bên trong môi trường live ISO. Nếu mạng LAN nghẽn hoặc máy nguồn ngắt kết nối giữa chừng, toàn bộ tiến trình phải chạy lại từ đầu.
3. Convert trực tiếp bằng qemu-img
- Điểm cộng: Tốc độ nhanh nhất. Quá trình convert file VDI 80GB (dung lượng thực 30GB) sang QCOW2 chỉ mất khoảng 3 đến 5 phút trên ổ NVMe. Định dạng QCOW2 hỗ trợ snapshot nhanh và cấp phát dung lượng động (thin provisioning).
- Điểm trừ: Bạn chỉ giữ được ổ đĩa. Cấu hình card mạng, chuẩn boot UEFI/SeaBIOS và controller ổ cứng phải khai báo thủ công trên Proxmox.
Lựa chọn giải pháp: Tại sao nên ưu tiên qemu-img?
Với các ca migration gấp, convert file disk trực tiếp luôn là đường ngắn nhất. Bạn tách rời hoàn toàn lớp ảo hóa VirtualBox cũ, loại bỏ nguy cơ kéo theo driver rác của Oracle Guest Additions sang host mới.
Trong homelab 3 node Proxmox chạy Ceph của mình, toàn bộ workflow import từ VMware hay VirtualBox đều chuẩn hóa qua qemu-img và qm importdisk. Cách này vừa script hóa được bằng bash, vừa kiểm soát chính xác từng thông số phần cứng.
Các bước triển khai chi tiết
Bước 1: Tắt máy ảo và chuyển file VDI lên server
Tắt hẳn máy ảo trên VirtualBox bằng lệnh ACPI Shutdown hoặc Power Off. Tuyệt đối không dùng Save State vì RAM snapshot sẽ làm hỏng tính toàn vẹn của filesystem.
Dùng rsync để đẩy file VDI sang Proxmox. Cờ --sparse đặc biệt quan trọng, giúp bỏ qua các block trống để tiết kiệm băng thông mạng:
rsync -avP --sparse /home/dev/VirtualBox\ VMs/app-db/app-db.vdi [email protected]:/var/lib/vz/dump/
Trên mạng LAN 1Gbps, một file VDI chứa 30GB dữ liệu thực tế sẽ mất khoảng 4 đến 5 phút để copy xong.
Bước 2: Chuyển đổi VDI sang QCOW2
SSH vào node Proxmox. Đầu tiên, hãy đọc cấu trúc file nguồn:
qemu-img info /var/lib/vz/dump/app-db.vdi
Tiếp theo, convert sang QCOW2. Lưu ý: không dùng cờ -c (nén) cho đĩa chạy production, vì đĩa nén sẽ làm giảm hiệu năng I/O ngẫu nhiên (random IOPS):
qemu-img convert -p -f vdi -O qcow2 /var/lib/vz/dump/app-db.vdi /var/lib/vz/images/app-db.qcow2
Cờ -p hiển thị thanh tiến trình trực quan, giúp bạn theo dõi sát sao thời gian hoàn thành.
Bước 3: Tạo VM và nạp đĩa trên Proxmox
Tạo một máy ảo mới (ví dụ VM ID 105) qua Web UI hoặc CLI. Thiết lập cấu hình tương đương máy cũ (4 vCPU, 8GB RAM). Xóa ổ cứng mặc định mà wizard tạo ra.
Chạy lệnh import đĩa vào storage pool (ví dụ local-lvm):
# Nạp disk vào VM 105
qm importdisk 105 /var/lib/vz/images/app-db.qcow2 local-lvm
# Gắn đĩa vào bus SATA thay vì VirtIO để tránh lỗi boot ban đầu
qm set 105 --sata0 local-lvm:vm-105-disk-0
qm set 105 --boot order=sata0
Bước 4: Xử lý lỗi driver VirtIO (Tránh lỗi màn hình xanh và Kernel Panic)
Đây là vấn đề 90% kỹ sư gặp phải khi migrate. Máy ảo cũ chạy trên VirtualBox vốn chỉ nạp driver SATA/IDE chuẩn. Nếu bạn gắn thẳng disk vào controller VirtIO SCSI, máy sẽ sập ngay lập tức.
Windows sẽ báo lỗi màn hình xanh INACCESSIBLE_BOOT_DEVICE. Trong khi đó, Linux sẽ dừng ở dracut Emergency Shell hoặc quăng lỗi kernel panic: Unable to mount root fs do initramfs thiếu module VirtIO.
Cách 1: Xử lý trên Windows Server / Windows 10/11
- Giữ ổ boot ở bus SATA (hoặc IDE). Windows có sẵn driver generic nên sẽ boot vào màn hình đăng nhập bình thường.
- Tải ISO VirtIO chính thức từ Fedora/Red Hat (
virtio-win.iso) và mount vào ổ CD-ROM ảo của VM. - Tạo một ổ cứng phụ dung lượng 1GB, chọn bus VirtIO SCSI.
- Khởi động Windows. Mở Device Manager, bạn sẽ thấy thiết bị SCSI Controller báo chấm than vàng. Nhấp chuột phải, chọn Update driver và trỏ đường dẫn vào ổ đĩa CD VirtIO.
- Cài đặt đồng thời
qemu-guest-agentnằm trong đĩa ISO để Proxmox nhận diện IP mạng và quản lý shutdown mượt mà. - Tắt VM, xóa ổ phụ 1GB. Chuyển ổ đĩa chính từ
sata0sangscsi0(VirtIO SCSI Single, kích hoạtDiscardvàSSD Emulation). Bật máy lại để hưởng trọn vẹn hiệu năng đọc ghi native.
Cách 2: Xử lý trên Linux (Debian, Ubuntu, RHEL, Rocky)
Khởi động Linux qua bus SATA. Đăng nhập root và bổ sung module VirtIO vào initramfs trước khi đổi controller.
Trên Ubuntu / Debian, thêm các module vào file cấu hình:
# Thêm driver VirtIO vào danh sách nạp sớm
cat <<EOF >> /etc/initramfs-tools/modules
virtio
virtio_ring
virtio_pci
virtio_scsi
virtio_blk
EOF
# Rebuild lại initramfs cho toàn bộ kernel
update-initramfs -u -k all
Trên RHEL / CentOS / Rocky Linux, dùng dracut để nạp cưỡng bức driver:
dracut --force --add-drivers "virtio virtio_pci virtio_ring virtio_scsi virtio_blk" /boot/initramfs-$(uname -r).img $(uname -r)
Rebuild xong, hãy tắt VM. Vào phần Hardware trên Proxmox, detach ổ đĩa sata0 rồi re-attach lại dưới dạng scsi0 với controller VirtIO SCSI Single. Máy sẽ boot thẳng vào OS chỉ trong vài giây, throughput ổ đĩa có thể tăng gấp 3 đến 4 lần so với controller SATA cũ.

