So sánh 3 cách cứu hộ máy ảo KVM/Proxmox khi mất boot
Ai vận hành KVM hay Proxmox VE cũng từng gặp sự cố oái oăm: vừa nâng cấp kernel xong thì VM dính kernel panic, chỉnh nhầm UUID trong /etc/fstab khiến máy kẹt ở emergency mode, hoặc quên bẵng mật khẩu root của máy ảo dựng từ 6 tháng trước. Khi VM mất kết nối mạng và không thể SSH, bạn bắt buộc phải can thiệp trực tiếp vào disk image.
Dưới đây là 3 hướng xử lý phổ biến nhất:
- Cách 1: Gắn ISO cứu hộ (SystemRescue, Ubuntu Live CD) rồi boot qua VNC/Console. Cách này quen thuộc với người mới nhưng tốn thời gian.
- Cách 2: Dùng
qemu-nbdmount disk image (qcow2/raw) lên máy host. Bạn có thể đọc ghi file từ terminal của host nhưng tiềm ẩn rủi ro xung đột LVM. - Cách 3: Dùng bộ công cụ
libguestfs(gồmguestfish,virt-edit,virt-customize,guestmount). Công cụ này khởi chạy một appliance kernel cô lập để thao tác trực tiếp lên ổ đĩa ảo. Nhanh và an toàn.
So sánh chi tiết ưu và nhược điểm
1. Gắn file ISO cứu hộ
Ưu điểm lớn nhất là giao diện quen thuộc. Bạn thao tác chroot hệt như trên server vật lý.
Nhược điểm:
- Tốn từ 5-10 phút để tải ISO, gắn vào phần cứng ảo rồi chỉnh boot order.
- Phải mở noVNC Console gõ lệnh thủ công. Thao tác trên console thường bị lag và trễ phím.
- Khó tự động hóa qua bash script khi cần xử lý đồng loạt 20-30 VM.
2. Mount ổ đĩa ảo bằng qemu-nbd
Ưu điểm: Thao tác ngay trên host shell mà không cần khởi động VM.
Nhược điểm:
- Rất dễ đụng độ LVM Volume Group (VG) nếu cả Host và Guest cùng đặt tên mặc định như
pvehayubuntu-vg. - Nguy cơ lỗi filesystem nếu kernel host ghi đè partition table không tương thích.
- Quy trình rườm rà: nbd connect, map partition, mount, sửa file, unmount rồi ngắt kết nối.
3. Bộ công cụ libguestfs
Ưu điểm:
- Chạy độc lập trên host. Không cần bật VM và không phụ thuộc vào trạng thái hypervisor.
- Tự động nhận diện LVM, software RAID, phân vùng mã hóa LUKS cùng hầu hết filesystem thông dụng (ext4, XFS, Btrfs, NTFS).
- An toàn cao. Libguestfs tạo một QEMU appliance mini tạm thời chạy ở quyền cách ly, không lo can thiệp nhầm vào kernel của host.
- Tốc độ vượt trội: đổi pass, sửa file config hoặc copy dữ liệu chỉ mất 1 dòng lệnh trong vài giây.
Nhược điểm:
- Gói cài đặt kéo theo nhiều gói phụ thuộc (QEMU mini kernel, supermin) chiếm khoảng 300MB – 500MB dung lượng.
- Bắt buộc VM phải TẮT HOÀN TOÀN (STOPPED). Thao tác khi VM đang chạy sẽ gây hỏng dữ liệu.
Tại sao libguestfs giúp tiết kiệm hàng giờ troubleshooting?
Trong hệ thống lab Proxmox gồm 12 node và gần 50 VM, việc test nâng cấp OS hay chỉnh sửa cấu hình mạng diễn ra hàng ngày. Trước đây, mỗi lần VM lỗi boot, quy trình mount ISO và vào console xử lý thường ngốn từ 10 đến 15 phút cho mỗi máy.
Chuyển sang libguestfs, toàn bộ thao tác thu gọn lại trong đúng một lệnh CLI trên host node. Thời gian xử lý giảm xuống còn dưới 30 giây. Hiệu quả rõ rệt nhất khi bạn cần sửa hàng loạt VM cùng lúc.
Các bước triển khai và xử lý sự cố thực tế
Bước 1: Cài đặt libguestfs
Trên Proxmox VE hoặc Debian/Ubuntu:
apt-get update
apt-get install -y libguestfs-tools
Trên RHEL, Rocky Linux hoặc AlmaLinux 8/9:
dnf install -y libguestfs-tools
Mẹo xử lý lỗi kernel trên Debian/Ubuntu: Nếu gặp thông báo supermin: error: failed to find a suitable kernel do kernel bị siết quyền đọc, hãy chạy lệnh:
chmod 0644 /boot/vmlinuz-*
Bước 2: Tìm đường dẫn ổ đĩa của máy ảo
Đầu tiên, kiểm tra chắc chắn VM đã tắt (status: stopped). Trên Proxmox VE, disk image thường nằm ở một trong các định dạng sau:
- Storage ZFS:
/dev/zvol/rpool/data/vm-100-disk-0 - Storage LVM-Thin:
/dev/pve/vm-100-disk-0 - Storage Directory (Qcow2/Raw):
/var/lib/vz/images/100/vm-100-disk-0.qcow2
Bước 3: 4 kịch bản cứu hộ phổ biến nhất
1. Đổi mật khẩu root trong 5 giây
Dùng virt-customize đặt lại mật khẩu mới cho user root mà không cần khởi động hệ điều hành:
virt-customize -a /var/lib/vz/images/100/vm-100-disk-0.qcow2 --root-password password:MatKhauMoi@2026
Để tạo thêm một user quản trị dự phòng có quyền sudo:
virt-customize -a /var/lib/vz/images/100/vm-100-disk-0.qcow2 \
--run-command 'useradd -m -s /bin/bash rescueadmin' \
--password rescueadmin:password:AdminPass@2026 \
--run-command 'usermod -aG sudo rescueadmin'
2. Sửa file cấu hình hỏng bằng virt-edit
Kịch bản thường gặp: bạn gắn thêm ổ cứng thứ hai, khai báo nhầm UUID trong /etc/fstab khiến Linux từ chối boot. Lệnh virt-edit sẽ mở trực tiếp file đó bằng trình soạn thảo (nano hoặc vi) trên host:
virt-edit -a /var/lib/vz/images/100/vm-100-disk-0.qcow2 /etc/fstab
Chỉ cần xóa hoặc sửa lại dòng lỗi rồi lưu file. Dữ liệu trên ổ ảo sẽ tự động đồng bộ ngay.
3. Xem log boot và trích xuất dữ liệu khẩn cấp
Đọc nhanh 50 dòng log cuối cùng để tìm nguyên nhân crash:
virt-cat -a /var/lib/vz/images/100/vm-100-disk-0.qcow2 /var/log/syslog | tail -n 50
Nếu hệ điều hành hỏng nặng và cần lấy source code hoặc database ra ngoài gấp, hãy mount toàn bộ filesystem vào thư mục tạm trên host:
mkdir -p /mnt/vm_rescue
guestmount -a /var/lib/vz/images/100/vm-100-disk-0.qcow2 -i --ro /mnt/vm_rescue
Ghi chú: Flag -i (inspector) tự động mount đúng cấu trúc thư mục root, còn --ro (read-only) bảo vệ toàn vẹn dữ liệu gốc. Giờ bạn có thể dùng rsync hoặc cp để kéo dữ liệu về an toàn.
Sau khi sao lưu xong, hãy unmount thư mục:
guestunmount /mnt/vm_rescue
4. Vào shell tương tác cứu hộ với virt-rescue
Khi cần build lại initramfs hoặc cài lại GRUB bootloader, bạn mở môi trường cứu hộ tương tác:
virt-rescue -a /var/lib/vz/images/100/vm-100-disk-0.qcow2
Hệ thống sẽ cấp một shell cứu hộ. Tại đây bạn tiến hành chroot và sửa chữa:
# Gõ các lệnh sau trong shell virt-rescue:
mount /dev/sda1 /sysroot
chroot /sysroot
update-initramfs -u -k all
update-grub
exit
Hai nguyên tắc an toàn cần nhớ
- Không bao giờ chạy libguestfs trên VM đang bật: Việc cả hypervisor lẫn libguestfs cùng ghi vào một file image sẽ làm hỏng partition table và gây mất dữ liệu vĩnh viễn.
- Tạo snapshot trước khi sửa: Dù thao tác qua CLI rất tiện, hãy tạo nhanh một snapshot trên Proxmox (hoặc copy file qcow2 dự phòng) trước khi chạy các lệnh can thiệp sâu.

