KVM (Kernel-based Virtual Machine) là giải pháp ảo hóa cấp nhân kernel tích hợp sẵn trong nhân Linux, tận dụng khả năng hỗ trợ ảo hóa phần cứng (Intel VT-x / AMD-V) để cung cấp hiệu năng gần như gốc. Khác với các nền tảng ảo hóa người dùng như VirtualBox hay VMware Workstation, KVM vận hành như một module kernel, biến hệ thống Linux thành một hypervisor đầy đủ chức năng.
Nguyên lý hoạt động
Mỗi máy ảo KVM tương ứng với một tiến trình qemu-system-x86_64 chạy trên host — nơi mỗi vCPU được ánh xạ thành một luồng Linux riêng biệt. Cơ chế lập lịch của nhân Linux (CFS) đảm nhiệm phân bổ CPU thời gian thực cho các vCPU, đồng thời kiểm soát tài nguyên thông qua cgroups. Các thiết bị phần cứng (NIC, disk, GPU) được mô phỏng bởi QEMU hoặc chuyển tiếp trực tiếp (PCI passthrough), trong khi giao tiếp I/O giữa guest và VMM được tối ưu hóa qua các driver virtio — chuẩn nửa-ảo hóa nhẹ, hiệu năng cao, yêu cầu hỗ trợ từ phía hệ điều hành guest.
Cài đặt và cấu hình cơ bản
KVM không cần cài đặt riêng biệt vì đã có mặt trong nhân Linux từ phiên bản 2.6.20. Các thành phần phụ trợ cần thiết bao gồm:
qemu-kvm: Công cụ mô phỏng phần cứnglibvirt: Thư viện trừu tượng hóa API quản lý máy ảovirt-manager: Giao diện đồ họa dựa trên GTKvirsh: Công cụ dòng lệnh chính thức
Để kích hoạt KVM, kiểm tra hỗ trợ phần cứng:
egrep -c '(vmx|svm)' /proc/cpuinfo && lsmod | grep kvm
Nếu kết quả trả về số > 0 và các module kvm_intel hoặc kvm_amd hiện diện, hệ thống đã sẵn sàng.
Các mô hình mạng phổ biến
KVM hỗ trợ ba kiến trúc mạng chủ yếu:
- NAT (default): Máy ảo chia sẻ địa chỉ IP của host thông qua bộ định tuyến ảo
virbr0. Phù hợp cho môi trường phát triển cục bộ. - Bridge: Máy ảo kết nối trực tiếp vào mạng vật lý thông qua cầu mạng (bridge) như
br0, nhận địa chỉ IP từ DHCP server hoặc cấu hình tĩnh. Được ưa chuộng trong môi trường sản xuất. - Host-only: Tạo mạng nội bộ riêng biệt giữa host và các máy ảo, không kết nối ra ngoài. Thường dùng cho kiểm thử an toàn hoặc lab隔離.
Tạo máy ảo bằng virsh và virt-install
Dưới đây là quy trình triển khai máy ảo CentOS 7 với cấu hình bridge và VNC:
# Tạo ổ đĩa qcow2 hỗ trợ snapshot và nén
qemu-img create -f qcow2 /var/lib/libvirt/images/webserver-01.qcow2 30G
# Triển khai máy ảo
virt-install \
--name webserver-01 \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/webserver-01.qcow2,format=qcow2,bus=virtio \
--cdrom /var/lib/libvirt/isos/CentOS-7-x86_64-Minimal-2009.iso \
--os-variant centos7.0 \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0,port=5910,password=secret123 \
--noautoconsole \
--import
Sau khi hoàn tất cài đặt, truy cập qua VNC client tại <host_ip>:5910.
Tự động hóa triển khai máy ảo
Thay vì lặp lại các bước thủ công, ta có thể xây dựng kịch bản tạo máy ảo theo mẫu (template-based provisioning). Ví dụ: sử dụng script Python để thay thế các placeholder trong file XML định nghĩa máy ảo:
#!/usr/bin/env python3
import sys, xml.etree.ElementTree as ET
from datetime import datetime
def generate_vm_config(template_path, name, ip_addr, vnc_port):
tree = ET.parse(template_path)
root = tree.getroot()
# Cập nhật tên máy ảo
name_elem = root.find('name')
if name_elem is not None:
name_elem.text = name
# Xóa UUID để libvirt sinh mới tự động
uuid_elem = root.find('uuid')
if uuid_elem is not None:
root.remove(uuid_elem)
# Cập nhật địa chỉ IP trong cấu hình mạng
for interface in root.findall('.//interface'):
mac_elem = interface.find('mac')
if mac_elem is not None:
interface.remove(mac_elem)
# Cập nhật cổng VNC
graphics = root.find('devices/graphics[@type="vnc"]')
if graphics is not None:
graphics.set('port', str(vnc_port))
graphics.set('autoport', 'no')
# Lưu cấu hình mới
output_path = f'/etc/libvirt/qemu/{name}.xml'
tree.write(output_path, encoding='utf-8', xml_declaration=True)
print(f"✅ Đã tạo cấu hình: {output_path}")
return output_path
if __name__ == '__main__':
if len(sys.argv) != 5:
print("Sử dụng: ./gen-vm.py <template.xml> <tên> <ip> <cổng_vnc>")
sys.exit(1)
generate_vm_config(*sys.argv[1:])
Sau đó, chạy:
python3 gen-vm.py /etc/libvirt/qemu/template.xml app-server-02 192.168.100.22 5911
Quản lý vòng đời máy ảo
Các thao tác cơ bản với virsh:
virsh list --all: Liệt kê toàn bộ máy ảo (đang chạy + tắt)virsh start app-server-02: Khởi độngvirsh shutdown app-server-02: Tắt mềm (gửi tín hiệu ACPI)virsh destroy app-server-02: Tắt cứng (kill tiến trình)virsh console app-server-02: Kết nối terminal serial (yêu cầu cấu hìnhconsole=ttyS0trong GRUB)virsh edit app-server-02: Chỉnh sửa cấu hình XML trực tiếp
Quản lý tài nguyên động
Một số tài nguyên có thể điều chỉnh mà không cần tắt máy:
- Bộ nhớ: Dùng
virsh setmemnếu bật tính năng ballooning trong guest (cần càiqemu-guest-agent) - CPU: Thay đổi số vCPU online bằng
virsh setvcpus --live(tùy thuộc vào kernel và guest OS) - Ổ đĩa: Gắn/rút ổ đĩa nóng với
virsh attach-disk/detach-disk
Với các thay đổi cấu trúc (RAM tối đa, số vCPU tối đa), cần chỉnh sửa XML qua virsh edit và khởi động lại.
Snapshot và clone
Snapshot giúp lưu trạng thái nhất thời của máy ảo:
# Tạo snapshot tức thì
virsh snapshot-create-as webserver-01 pre-update-$(date +%Y%m%d)
# Khôi phục về trạng thái trước đó
virsh snapshot-revert webserver-01 pre-update-20240520
# Xóa snapshot
virsh snapshot-delete webserver-01 pre-update-20240520
Clone máy ảo (phải tắt trước):
virt-clone \
--original webserver-01 \
--name webserver-02 \
--file /var/lib/libvirt/images/webserver-02.qcow2 \
--auto-clone
Di chuyển máy ảo (Live Migration)
Di chuyển máy ảo đang chạy giữa hai host KVM mà không gián đoạn dịch vụ:
# Yêu cầu:
# - Cùng kiến trúc CPU (hoặc bật tính năng CPU compatibility)
# - Storage chia sẻ qua NFS/GPFS/ISCSI
# - Libvirt daemon cấu hình lắng nghe qua TCP/SSH
# - SSH key-based auth giữa hai host
virsh migrate \
--live \
--persistent \
--undefinesource \
webserver-01 \
qemu+ssh://user@192.168.10.22/system \
--verbose
Quản trị qua giao diện web
WebVirtCloud là nền tảng quản trị KVM mã nguồn mở, cung cấp dashboard trực quan tương tự VMware vCenter. Cài đặt nhanh trên CentOS Stream 8:
dnf install -y epel-release nginx supervisor git python3-virtualenv python3-devel libvirt-devel gcc
git clone https://github.com/retspen/webvirtcloud /srv/webvirtcloud
cd /srv/webvirtcloud
virtualenv -p python3 /srv/envs/wvc
source /srv/envs/wvc/bin/activate
pip install -r conf/requirements.txt
python manage.py migrate
cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/
systemctl enable --now nginx supervisord
Truy cập tại https://<host_ip> với tài khoản mặc định admin/admin.