Đã một lúc lâu kể từ khi tôi gặp vấn đề lớn với KVM. Thôi thì, để công bằng, tôi không dùng nó rộng rãi trong vài năm qua. Nhưng gần đây, tôi có một đợt hoạt động với công nghệ ảo hóa này, và năng suất đi kèm với một chút rắc rối.
Như đã xảy ra, tôi thử khởi chạy một virtual machine - không gì đặc biệt, chỉ kvm xyz và những gì. Tôi nhận được thông báo lỗi sau: Could not access KVM kernel module: Permission denied. Và như vậy, hướng dẫn nhỏ này bắt đầu, chỉ ra tất cả những điều khác nhau bạn có thể làm để kiểm tra xem có thể sai ở đâu, và cách giải quyết. Theo chân mình nhé.
Vấn đề chi tiết hơn
Thông báo lỗi đầy đủ:
Could not access KVM kernel module: Permission denied
qemu-system-x86_64: failed to initialize KVM: Permission denied
Điều này chỉ ra rằng - nhiều khả năng - thành phần userspace của KVM không thể truy cập driver KVM. Điều này thường xuất phát từ permission không đúng.
Giải pháp
Điều đầu tiên bạn muốn làm là kiểm tra user của bạn có phải thành viên của group KVM và libvirt không. Khi đã làm thay đổi này, bạn sẽ cần launch một shell mới để thay đổi group membership có hiệu lực. Cách đơn giản nhất là re-login vào user session.
sudo usermod -G -a kvm "username"
sudo usermod -G -a libvirtd "username"
Permission device node
Thêm vào đó, bạn muốn kiểm tra permission trên device /dev/kvm. Permission mặc định đúng nên là 660 và ownership root:kvm cho device file. Như bạn thấy, nếu bạn không phải root hoặc thành viên group kvm, bạn sẽ không có quyền truy cập.
ls -ld /dev/kvm
crw-rw---- 1 root kvm 10, 232 May 27 10:43 /dev/kvm
Udev rules
Một điều khác bạn có thể muốn kiểm tra là xem udev rule đúng có ở chỗ không. Nếu bạn thắc mắc, udevd là service quản lý device file system, thiết lập permission đúng cho các entry dưới /dev. Thông thường, khi bạn cài phần mềm KVM, một trong các gói trong bundle sẽ cung cấp rule cần thiết. Nếu rule này không có, và đã có bug trước đây, bạn có thể muốn tự tạo rule.
Dưới /etc/udev/rules.d/, tạo file tên XX-kvm.rules. XX đại diện cho một số, quyết định thứ tự lexical mà rule sẽ được parse và execute, tương tự rule GRUB2. Trong một số trường hợp, thứ tự của các rule khác nhau có thể quan trọng. Nếu bạn không chắc, và không có gì bạn biết phụ thuộc vào chức năng KVM để chạy, bạn có thể dùng 99-kvm.rules.
Bên trong file này, thêm dòng sau:
KERNEL=="kvm", GROUP="kvm", MODE="0660"
Chúng ta có gì ở đây? Nếu bạn ở phiên bản TL;DR về cách viết udev rule, hãy đọc yonder. Theo thuật ngữ đơn giản hơn:
- KERNEL - tên kernel của device
- GROUP - nhóm UNIX nên sở hữu device
- MODE - permission bitwise cho device
Khi rule đã ở chỗ, reload rule mà không cần reboot:
udevadm control --reload-rules
Và để an toàn, bạn cũng có thể muốn restart service libvirt:
systemctl restart libvirtd
Permission device node - lại
Mảnh ghép cuối cùng của phương trình - nếu không có giải pháp nào trên hoạt động, bạn có thể đơn giản thay đổi permission trên /dev/kvm thành một set thoáng hơn. Thay vì 660, bạn có thể dùng 666 - điều này nghĩa là bất kỳ user nào trên hệ thống cũng có thể quản lý ảo hóa KVM. Trong setup nhà, đây không phải deal lớn.
sudo chmod +666 /dev/kvm
Và bây giờ bạn nên có thể chạy KVM oai oai.
Kết luận
Xong rồi. Tutorial này không quá dài, nhưng cover khá nhiều khu vực. Bây giờ, nó không phải bài debug generic cho mọi vấn đề liên quan KVM. Cho đó, bạn có hướng dẫn troubleshooting KVM cũ của tôi, plus email, để hỏi tips và giải pháp mới. Chúng ta nói cụ thể về vấn đề permission khởi động KVM, và bạn có ba hoặc bốn cách khác nhau để phân tích và giải quyết.
Tổng thể, KVM là phần mềm ảo hóa mạnh mẽ, linh hoạt - với nhược điểm duy nhất là có thể khá nerdy, và do đó không accessible như một số công cụ frontend-friendly khác. Không phải ảo hóa không nerdy từ đầu, nhưng hey. Vâng, nếu bạn gặp rắc rối với tạo hoặc khởi động VM với KVM do permission sai, checklist trên nên đưa bạn lên và chạy. Đơn giản, non-intrusive, không cần reboot. Và xong ở đây, các anh em.
Chúc vui.