VirtualBox, VMware, Vagrant, KVM — Chọn cái nào?
Khi mới bắt đầu với ảo hóa trên Linux, mình đã lần lượt thử qua VirtualBox, rồi Vagrant để quản lý VM cho dev, rồi mới chuyển sang KVM. Mỗi thứ có chỗ đứng riêng — nhưng nếu muốn chạy VM ổn định trên server Ubuntu thật sự, KVM là thứ duy nhất đáng dùng lâu dài.
Breakdown nhanh từng tool:
- VirtualBox: dễ dùng, có GUI, nhưng hiệu năng kém hơn, không phù hợp production
- Vagrant: tool để quản lý VM, không phải hypervisor — nó gọi VirtualBox hoặc KVM phía dưới. Tiện cho dev workflow, không phải cho server thật
- VMware Workstation/ESXi: mạnh, nhưng tốn tiền license
- KVM: hypervisor type-1 tích hợp thẳng vào Linux kernel, hiệu năng gần bằng bare-metal, miễn phí hoàn toàn
Blog này đã có bài về Vagrant — phù hợp khi cần spin up môi trường dev nhanh. Bài này khác hẳn: KVM như nền tảng ảo hóa thực thụ để chạy workload production.
Ưu và nhược điểm thực tế của KVM
Điểm mạnh
- Hiệu năng cao: KVM là Type-1 hypervisor — VM chạy trực tiếp trên phần cứng thông qua CPU virtualization extension (Intel VT-x / AMD-V). Benchmark thực tế: overhead thường dưới 5% so với bare-metal
- Tích hợp kernel: Từ Linux 2.6.20, KVM đã là một phần của kernel chính thức. Không cần cài driver ngoài, không lo compatibility vặt
- Hệ sinh thái rộng: libvirt, virt-manager, virsh — và cả Proxmox VE (hypervisor mặc định của rất nhiều homelab + SME data center) đều build trên KVM
- Live migration: Di chuyển VM đang chạy sang host khác mà không downtime — tính năng enterprise có sẵn, miễn phí hoàn toàn
Điểm yếu
- Không có GUI sẵn (trên headless server): Phải dùng virsh qua CLI, hoặc cài thêm virt-manager trên máy client kết nối từ xa
- Cần hardware hỗ trợ virtualization: CPU phải có Intel VT-x hoặc AMD-V. Hầu hết máy hiện đại đều có, nhưng cần enable trong BIOS nếu chưa bật
- Networking bridge phức tạp ban đầu: Lần đầu setup, mình mất gần 2 tiếng để hiểu tại sao VM không ra được internet — mấu chốt là thứ tự cấu hình bridge và physical interface
Khi nào nên chọn KVM thay vì giải pháp khác?
Mình đang chạy homelab với Proxmox VE (build trên KVM) — 12 VM và container, dùng làm playground để test mọi thứ trước khi đưa lên production. KVM là lựa chọn đúng khi:
- Bạn cần chạy VM 24/7 trên server Ubuntu (VPS, dedicated server, homelab)
- Workload cần hiệu năng thực sự — database, compile server, CI/CD runner
- Muốn tự quản lý mà không phụ thuộc cloud provider
- Cần isolation mạnh hơn Docker (mỗi VM có kernel riêng, tách biệt hoàn toàn)
Chỉ cần môi trường dev local để test code? Vagrant + VirtualBox vẫn đủ dùng và nhanh hơn để setup.
Hướng dẫn cài đặt KVM trên Ubuntu
Bước 1: Kiểm tra CPU có hỗ trợ virtualization không
Trước khi cài bất cứ thứ gì, kiểm tra CPU:
# Kiểm tra Intel VT-x hoặc AMD-V
egrep -c '(vmx|svm)' /proc/cpuinfo
# Nếu output > 0 là OK
# vmx = Intel VT-x, svm = AMD-V
Kết quả là 0? Vào BIOS bật Intel Virtualization Technology (hoặc AMD-V/SVM). Đang chạy trong VM khác (nested virtualization) thì cần enable nested VM support ở host trước.
Kiểm tra thêm bằng kvm-ok:
sudo apt install -y cpu-checker
sudo kvm-ok
# Output mong đợi:
# INFO: /dev/kvm exists
# KVM acceleration can be used
Bước 2: Cài đặt KVM và các package cần thiết
sudo apt update
sudo apt install -y \
qemu-kvm \
libvirt-daemon-system \
libvirt-clients \
bridge-utils \
virtinst \
virt-manager
Giải thích từng package:
qemu-kvm: QEMU với KVM acceleration — engine thực sự chạy VMlibvirt-daemon-system: daemon quản lý VM (libvirtd)libvirt-clients: bộ tool CLI (virsh, virsh-list…)bridge-utils: tạo bridge network cho VMvirtinst: cung cấp lệnhvirt-installđể tạo VM từ CLIvirt-manager: GUI quản lý VM (optional, dùng khi có desktop)
Bước 3: Thêm user vào group libvirt
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG kvm $(whoami)
# Logout và login lại để group có hiệu lực
# Hoặc dùng lệnh này để apply ngay mà không cần logout:
newgrp libvirt
Kiểm tra libvirtd đang chạy:
sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd
# Kiểm tra connection
virsh -c qemu:///system list
Bước 4: Tạo VM đầu tiên bằng virt-install
Tải ISO xong, dùng virt-install để khởi tạo VM từ command line:
# Download ISO Ubuntu 22.04 LTS (kiểm tra version mới nhất tại releases.ubuntu.com)
wget -P /var/lib/libvirt/images/ \
https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso
# Tạo VM với virt-install
sudo virt-install \
--name ubuntu-test \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu-test.qcow2,size=20,format=qcow2 \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.5-live-server-amd64.iso \
--network network=default \
--os-variant ubuntu22.04 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
VM sẽ boot từ ISO. Kết nối vào màn hình cài đặt qua VNC client (port 5900 mặc định):
# Xem port VNC của VM
virsh vncdisplay ubuntu-test
# Ví dụ output: :0 (tức là port 5900)
Các lệnh virsh thường dùng hàng ngày
Đây là bộ lệnh mình dùng gần như mỗi ngày — bookmark lại cho tiện:
# Liệt kê tất cả VM (đang chạy và đã tắt)
virsh list --all
# Bật / tắt / restart VM
virsh start ubuntu-test
virsh shutdown ubuntu-test # graceful shutdown
virsh destroy ubuntu-test # force stop (tương đương rút điện)
virsh reboot ubuntu-test
# Xem thông tin chi tiết VM
virsh dominfo ubuntu-test
# Snapshot — cực kỳ hữu ích trước khi thử nghiệm gì đó
virsh snapshot-create-as ubuntu-test snap-before-update
virsh snapshot-list ubuntu-test
virsh snapshot-revert ubuntu-test snap-before-update
# Clone VM
virt-clone \
--original ubuntu-test \
--name ubuntu-clone \
--file /var/lib/libvirt/images/ubuntu-clone.qcow2
# Xóa VM hoàn toàn (bao gồm disk)
virsh undefine ubuntu-test --remove-all-storage
Cấu hình networking: Bridge vs NAT
Mặc định KVM dùng NAT network (virbr0) — VM ra được internet nhưng không accessible từ ngoài vào. Trên homelab hay server production, thường cần VM có IP trực tiếp trên LAN như máy vật lý. Đó là lúc cần bridge network.
Tạo bridge trên Ubuntu 22.04 với Netplan:
# /etc/netplan/01-bridge.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: false
bridges:
br0:
interfaces: [eno1]
dhcp4: true
parameters:
stp: false
forward-delay: 0
sudo netplan apply
# Tạo VM dùng bridge network
sudo virt-install \
--name ubuntu-prod \
--network bridge=br0 \
# ... các option khác
Cảnh báo từ kinh nghiệm thật: lần đầu làm bước này, mình mất SSH vào server vì cấu hình sai bridge. Bài học đắt giá — test trên VM không quan trọng trước, hoặc đảm bảo có console access trực tiếp vào server trước khi đụng vào network config.
Tổng kết
KVM không phải thứ dễ setup nhất — VirtualBox thắng khoản đó. Nhưng đó không phải tiêu chí chọn hypervisor cho production. 6 tháng chạy KVM, từ homelab 12 VM đến VPS thật, hiệu năng chưa bao giờ là vấn đề cần bàn.
Quen virsh rồi, bước tiếp theo là chọn web UI. Cockpit + plugin máy ảo nhẹ và đủ dùng cho server đơn. Muốn cluster management đầy đủ — Proxmox VE là câu trả lời, nhưng đó là chủ đề của một bài khác.

