Skip to content

libvirt

libvirt là lớp quản lý ảo hóa chạy ở userspace, cung cấp một API và bộ công cụ thống nhất để tạo, cấu hình và điều khiển máy ảo trên nhiều hypervisor. Trang này trình bày vai trò của libvirt, kiến trúc, các khái niệm chính (domain, storage pool, network) và các lệnh virsh cơ bản. Phần KVM và QEMU nằm ở KVM & QEMU.

Vai trò

Chạy VM bằng QEMU thuần nghĩa là tự viết dòng lệnh dài cho từng VM, tự theo dõi tiến trình, tự dựng mạng và đĩa. libvirt gom các việc này lại:

  • Mô tả VM bằng XML: một file khai báo (domain XML) thay cho dòng lệnh QEMU. libvirt dịch file này thành tham số QEMU khi khởi động VM.
  • Quản lý vòng đời: define, start, shutdown, suspend, snapshot, migrate, kèm tự khởi động VM theo host.
  • Quản lý tài nguyên đi kèm: đĩa (storage pool), mạng ảo (virtual network), thiết bị host (PCI, USB) dùng cho passthrough.
  • API ổn định: ngôn ngữ C, kèm binding cho Python, Go và nhiều ngôn ngữ khác. Các nền tảng như OpenStack Nova và oVirt dùng API này.
  • Cô lập mức host: gán nhãn riêng cho từng VM qua sVirt (SELinux hoặc AppArmor) và áp dụng cgroups cho tiến trình QEMU.

libvirt không thay thế KVM hay QEMU. KVM vẫn chạy vCPU trong kernel, QEMU vẫn là VMM tạo VM. libvirt chỉ khởi động và điều khiển QEMU từ bên ngoài.

Kiến trúc

libvirt architecture: tools call the libvirt API, the daemon drives QEMU processes that run guests through KVM

Công cụ hoặc ứng dụng gọi libvirt API. Daemon của libvirt nhận yêu cầu, chuyển cho driver tương ứng với hypervisor. Với QEMU/KVM, driver sinh dòng lệnh QEMU từ domain XML, khởi động một tiến trình QEMU cho mỗi VM và điều khiển tiến trình đó qua socket QMP. Ngoài QEMU/KVM, libvirt còn có driver cho LXC, Xen, VirtualBox, VMware ESX, Hyper-V và một số hypervisor khác, nên cùng một bộ công cụ dùng được cho nhiều loại.

Về daemon, libvirt có hai kiểu triển khai:

Kiểu Daemon Ghi chú
Monolithic libvirtd Một daemon chứa mọi driver, bản cũ và vẫn được hỗ trợ
Modular virtqemud, virtnetworkd, virtstoraged, virtnodedevd, ... Mỗi nhóm chức năng một daemon, virtproxyd giữ tương thích cho kết nối từ xa

Bản phân phối nào dùng kiểu nào tùy phiên bản libvirt và cách đóng gói, nên cần kiểm tra service thực tế trên máy (systemctl list-units 'virt*').

Kết nối và URI

Mọi công cụ kết nối tới libvirt qua một URI:

URI Ý nghĩa
qemu:///system Daemon hệ thống của host, chạy bằng root. VM sống độc lập với phiên đăng nhập, dùng cho server
qemu:///session Daemon theo từng user, không cần root. Mạng và đĩa bị giới hạn hơn (không có bridge hệ thống)
qemu+ssh://user@host/system Điều khiển libvirt trên máy khác qua SSH

virsh chạy với quyền root mặc định kết nối qemu:///system. User thường cần thuộc nhóm libvirt hoặc chỉ định URI rõ ràng (virsh -c qemu:///system), nếu không virsh sẽ rơi vào qemu:///session, và đây là nguyên nhân thường gặp khi không thấy VM đã tạo.

Domain XML

Trong libvirt, một VM được gọi là domain. File domain XML của VM trên qemu:///system nằm ở /etc/libvirt/qemu/<tên>.xml. Không sửa trực tiếp file này, dùng virsh edit <tên> để libvirt kiểm tra cú pháp. Ví dụ tối thiểu cho VM x86 dùng KVM:

<domain type='kvm'>
  <name>demo</name>
  <memory unit='GiB'>2</memory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64' machine='q35'>hvm</type>
    <boot dev='hd'/>
  </os>
  <cpu mode='host-passthrough'/>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/demo.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
    <console type='pty'/>
  </devices>
</domain>

Các phần tử tương ứng với tham số QEMU trong ví dụ ở KVM & QEMU:

Domain XML Tham số QEMU tương đương
type='kvm' -accel kvm
<cpu mode='host-passthrough'/> -cpu host
<memory>, <vcpu> -m, -smp
<disk> với bus='virtio' -drive ...,if=virtio
<interface> với model type='virtio' -netdev ... -device virtio-net-pci

Domain XML còn mô tả CPU pinning, hugepage, NUMA và passthrough thiết bị PCI. Các phần này được dùng trong Real-time KVM tuning và vRAN trên VM.

Storage pool và virtual network

libvirt quản lý đĩa và mạng như các đối tượng riêng, để domain XML chỉ cần tham chiếu theo tên.

  • Storage pool là nơi chứa đĩa VM, kiểu có thể là thư mục (dir), LVM, NFS, iSCSI hoặc Ceph. Mỗi file hoặc volume trong pool là một volume. Pool mặc định của host thường là thư mục /var/lib/libvirt/images.
  • Virtual network là mạng ảo do libvirt dựng. Mạng default (nếu có) là NAT qua bridge virbr0, DHCP và DNS do dnsmasq cấp, đủ để VM ra ngoài nhưng host ngoài không vào được VM. Muốn VM nằm cùng lớp mạng với host thì dùng bridge (<interface type='bridge'>) hoặc macvtap.

Lệnh virsh cơ bản

virsh là công cụ dòng lệnh chính. Các lệnh thường dùng:

Mục đích Lệnh
Liệt kê VM (kể cả VM đang tắt) virsh list --all
Đăng ký VM từ file XML virsh define demo.xml
Khởi động, tắt êm, tắt cưỡng bức virsh start demo, virsh shutdown demo, virsh destroy demo
Xóa định nghĩa VM virsh undefine demo
Xem hoặc sửa XML virsh dumpxml demo, virsh edit demo
Vào console serial virsh console demo (thoát bằng Ctrl + ])
Xem địa chỉ IP của VM virsh domifaddr demo
Tự khởi động cùng host virsh autostart demo
Snapshot virsh snapshot-create-as demo snap1, virsh snapshot-list demo
Liệt kê pool và mạng virsh pool-list --all, virsh net-list --all

virsh destroy chỉ dừng tiến trình QEMU (tương đương rút nguồn), không xóa VM. Xóa định nghĩa VM dùng virsh undefine.

Công cụ đi kèm

  • virt-install: tạo VM mới từ dòng lệnh, tự sinh domain XML và đĩa.
  • virt-manager: giao diện đồ họa, hữu ích khi làm quen domain XML vì có thể xem lại XML đã sinh.
  • virt-viewer: mở console đồ họa (SPICE hoặc VNC) của VM.
  • virt-xml: sửa domain XML bằng tham số dòng lệnh, tiện cho script.

Tạo VM bằng virt-install:

virt-install --name demo --memory 2048 --vcpus 2 \
    --cpu host-passthrough \
    --disk size=20,format=qcow2,bus=virtio \
    --cdrom ubuntu.iso --os-variant ubuntu24.04 \
    --network network=default

Cài đặt và kiểm tra

Các gói và tên gói khác nhau giữa bản phân phối. Trên Debian và Ubuntu:

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst
sudo usermod -aG libvirt,kvm "$USER"          # đăng nhập lại để nhóm có hiệu lực
virsh -c qemu:///system list --all
virt-host-validate qemu                       # kiểm tra KVM, cgroups, IOMMU

virt-host-validate kiểm tra các điều kiện nền tảng giống mục "Kiểm tra máy có KVM" trong KVM & QEMU. Nếu máy không có /dev/kvm (ví dụ VM cloud chưa bật nested virtualization), libvirt vẫn chạy được domain kiểu qemu dùng TCG, nhưng chậm.

Phạm vi áp dụng của libvirt

Nhu cầu Gợi ý
Thử nhanh một kernel hoặc image, kiểm thử embedded QEMU thuần, một dòng lệnh
Nhiều VM cần chạy lâu dài, tự khởi động, snapshot, quản lý tập trung libvirt
VM real-time cần pinning, hugepage, NUMA, passthrough có khai báo rõ libvirt (domain XML) hoặc QEMU thuần nếu muốn kiểm soát từng tham số
Tự động hóa, tích hợp với OpenStack hoặc script libvirt API
VM cực nhẹ, khởi động nhanh Firecracker hoặc Cloud Hypervisor, xem Sandbox & micro-VM

Tài liệu tham khảo