Hồi đầu năm ngoái, mình đang ngủ ngon thì nhận được cảnh báo lúc 2 giờ sáng: snapshot VM production bị lỗi. Không phải lỗi storage, không phải lỗi KVM — mà là snapshot chụp đúng lúc PostgreSQL đang ghi WAL log, dẫn đến dữ liệu bị corrupt khi restore. VM đó chứa vài chục GB data của khách hàng. Mất gần 4 tiếng để restore từ backup ngày hôm trước và reconcile lại.
Sau sự cố đó mình mới ngồi tìm hiểu nghiêm túc QEMU Guest Agent — thứ mà trước đó mình hay bỏ qua vì nghĩ “VM chạy được là xong”. Hóa ra thiếu nó, mọi backup strategy đều có lỗ hổng tiềm ẩn.
QEMU Guest Agent là gì và tại sao lại quan trọng?
QEMU Guest Agent (qemu-ga) là một daemon chạy bên trong VM, giao tiếp với hypervisor (KVM/QEMU) qua một channel ảo — không phải qua network. Kênh này dùng virtio-serial hoặc ISA serial, nghĩa là nó vẫn hoạt động ngay cả khi VM mất kết nối mạng hoàn toàn.
qemu-ga giải quyết được ba thứ mà không component nào khác thay thế được:
- Quiesced snapshot (snapshot nhất quán): Agent flush disk buffer và freeze filesystem trước khi snapshot chạy. Đây là điểm mấu chốt với database — PostgreSQL, MySQL, hay bất cứ thứ gì đang ghi WAL log liên tục sẽ được flush sạch trước khi ổ cứng bị chụp lại.
- Thông tin guest không cần SSH: IP thật, hostname, OS version, memory usage — lấy trực tiếp qua channel ảo, không phụ thuộc vào network stack của VM.
- Điều khiển từ host: Chạy lệnh trong guest, sync time, shutdown graceful — tất cả từ host mà không cần mở console hay kết nối SSH.
Mình chạy homelab với Proxmox VE quản lý 12 VM và container. Bài học rút ra sau cái đêm 2 giờ sáng đó: bất kỳ VM nào chạy database hoặc ứng dụng stateful đều phải có qemu-ga, không ngoại lệ.
Cài đặt QEMU Guest Agent trên Linux
Không cần nhiều bước — hầu hết distro đều có package sẵn, cài 3 lệnh là xong.
Ubuntu / Debian
sudo apt update
sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
CentOS / RHEL / Rocky Linux / AlmaLinux
sudo dnf install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
Arch Linux
sudo pacman -S qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
Sau khi cài, kiểm tra service:
systemctl status qemu-guest-agent
active (running) là đúng rồi. Còn nếu inactive dù đã start thủ công, 99% là VM chưa có virtio-serial device — phần tiếp theo xử lý cái này.
Cấu hình phía Host với KVM/libvirt
Trước khi làm gì, kiểm tra VM đã có channel device chưa:
virsh dumpxml ten-vm | grep -A5 "channel"
Output trống thì cần thêm channel bằng cách edit XML:
virsh edit ten-vm
Thêm đoạn sau vào trong thẻ <devices>:
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>
Sau đó phải shutdown hoàn toàn VM — không phải reboot, phải tắt hẳn. Libvirt cần cold boot mới khởi tạo được device virtio mới:
virsh shutdown ten-vm
virsh start ten-vm
Test kết nối từ host
# Ping thử guest agent
virsh qemu-agent-command ten-vm '{"execute": "guest-ping"}'
# Lấy thông tin OS của VM
virsh qemu-agent-command ten-vm '{"execute": "guest-get-osinfo"}'
# Lấy danh sách IP không cần SSH
virsh domifaddr ten-vm --source agent
virsh domifaddr --source agent đặc biệt tiện khi VM vừa boot xong mà chưa biết IP — thay vì mở console nhìn bằng mắt hoặc chờ SSH sẵn sàng.
Cài đặt QEMU Guest Agent trên Windows
Windows phức tạp hơn vì cần VirtIO drivers đi kèm. Mình thấy nhiều người cài Windows VM trên KVM xong quên bước này, rồi thắc mắc sao performance kém và backup hay lỗi — VirtIO missing là thủ phạm thường gặp nhất.
Bước 1: Tải VirtIO Drivers ISO
# Trên host, tải ISO từ Fedora project (nguồn chính thức, Red Hat maintain)
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
Bước 2: Attach ISO và cài Guest Agent
Attach ISO vào VM (virt-manager: Add Hardware → CDROM → chọn file ISO). Trong Windows VM, mở CDROM drive và chạy installer:
D:\guest-agent\qemu-ga-x86_64.msi
Cài xong, mở services.msc và tìm QEMU Guest Agent — phải ở trạng thái Running với Startup type là Automatic.
Bước 3: Cài VirtIO Serial driver
Host không detect được agent sau khi cài thì thiếu VirtIO Serial controller là nguyên nhân số một. Cài từ ISO:
# Windows 10/11
D:\vioserial\w10\amd64\vioser.inf
# Windows Server 2022
D:\vioserial\2k22\amd64\vioser.inf
Right-click file .inf → Install → reboot Windows.
Bật QEMU Agent trên Proxmox
Proxmox có sẵn UI cho việc này, không cần edit XML thủ công.
Qua Web UI: Chọn VM → Options → double-click QEMU Guest Agent → tick Enabled → bật thêm Freeze/thaw guest filesystems on backup for consistent snapshots.
Qua CLI trên Proxmox host:
# Bật QEMU Agent cho VM ID 101
qm set 101 --agent enabled=1,fstrim_cloned_disks=1
# Kiểm tra config
qm config 101 | grep agent
Xác nhận snapshot nhất quán đang hoạt động
# Backup với vzdump (Proxmox)
vzdump 101 --mode snapshot --compress zstd
Trong log backup, tìm những dòng này:
INFO: sending freeze command to agent
INFO: agent started fsfreeze
INFO: creating snapshot ...
INFO: sending thaw command to agent
Có đủ 4 dòng đó là Agent đang làm đúng việc — filesystem bị freeze trước snapshot, thaw sau khi xong.
Troubleshoot các lỗi thường gặp
“QEMU guest agent is not running”
Đi theo thứ tự này, từ trong guest ra ngoài host:
- Service trong guest:
systemctl status qemu-guest-agent - Channel device trong VM config:
virsh dumpxml vm-name | grep channel - Socket file trên host:
ls /var/lib/libvirt/qemu/channel/target/
Channel có nhưng agent không connect
# Kiểm tra socket trên host
ls -la /var/lib/libvirt/qemu/channel/target/domain-*/org.qemu.guest_agent.0
# Trong Linux guest, check device
ls /dev/virtio-ports/
# Phải thấy: org.qemu.guest_agent.0
Device không xuất hiện trong guest dù đã add channel vào XML? Cold boot là cách duy nhất — shutdown hẳn rồi start lại, không phải reboot.
Windows: Cài rồi nhưng host không nhận
Mở Device Manager → System Devices, tìm warning icon màu vàng. Gần như chắc chắn là thiếu VirtIO Serial driver. Cài vioserial từ ISO theo hướng dẫn trên, reboot là xong.
Kết luận
Sau cái đêm 2 giờ sáng đó, mình có quy tắc cứng: bất kỳ VM nào tạo ra đều phải cài QEMU Guest Agent trước khi đưa vào production. Không phải option, mà là bắt buộc — đặc biệt nếu VM chạy database, message queue, hay bất cứ thứ gì ghi xuống disk liên tục.
Snapshot không có Agent giống như chụp ảnh người đang chạy — mờ nhòe, không đáng tin. Snapshot với Agent là filesystem bị freeze đúng lúc — data nhất quán, restore sạch sẽ, không có surprise lúc 2 giờ sáng.
Linux thì 3 lệnh là xong. Windows tốn thêm bước cài VirtIO nhưng cũng không quá 10 phút. Đầu tư nhỏ, nhưng đến lúc cần restore thật sự thì mới thấy nó đáng giá đến mức nào.

