KVM ảo hóa trên Linux: Triển khai, quản lý và tự động hóa máy ảo

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ứng
  • libvirt: Thư viện trừu tượng hóa API quản lý máy ảo
  • virt-manager: Giao diện đồ họa dựa trên GTK
  • virsh: 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 động
  • virsh 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ình console=ttyS0 trong 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 setmem nếu bật tính năng ballooning trong guest (cần cài qemu-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.

Thẻ: kvm qemu libvirt virsh linux-vm

Đăng vào ngày 18 tháng 5 lúc 15:56