Hoạt động nội bộ trong ảo hóa sử dụng KVM
1. Làm quen với libvirt.
libvirt là một open source Application Programming Interface (API). Và cũng là một tiến trình ngầm và công cụ quản lý để quản lý các trình ảo hóa khác nhau. libvirt được sử dụng bởi nhiều chương trình hay nền tảng ảo hóa, ví dụ như virsh, virt-manager, Openstack(có thể tìm hiểu ở đây),…
livirt có thư viện hỗ trợ quản lý từ xa được tích hợp sẵn. Do đó, các công cụ libvirt (như virt-manager) có thể kết nối đến libvirtd (libvirt daemon - Tiến trình chạy ngầm của libvirt) trên các server khác qua mạng.
Mục đích của libvirt cung cấp một lớp quản lý chịu trách nhiệm cung cấp API mà thực hiện các tác vụ quản lý như cung cấp máy ảo, tạo, sửa, theo dõi, điều khiển,…
libvirtd là tiến trình ngầm của livirt chịu trách nhiệm lắng nghe và cung cấp dịch vụ mỗi khi có yêu cầu từ người dùng. Ví dụ mỗi lần nhận virsh yêu cầu dịch vụ từ libvirtd, libvird sẽ kết nối đến hypervisor dựa trên URI của client.
URI là một chuỗi các ký tự được cung cấp bởi client để chỉ dẫn cho libvirt(API + livirtd) kết nối với hypervisor mà client muốn. Định dạng chung của URI là:
driver[+transport]://[username@][hostname][:port]/[path]
[?extraparameters]
Ví dụ:
qemu://xxxx/system
qemu://xxxx/session
Ví dụ thứ nhất(qemu://xxxx/system
) yêu cầu kết nối local bằng tài khoản root đến QEMU daemon và máy ảo KVM. Ví dụ thứ hai (qemu://xxxx/session
) yêu cầu kết nối local bằng tài khoản thông thường đến QEMU daemon và máy ảo KVM.
Một ví dụ nữa về URI mà virsh sử dụng để kết nối từ xa qua ssh:
virsh --connect qemu+ssh://root@remoteserver.yourdomain.com/system list
--all
2. Hoạt động nội bộ của libvirt.
libvirt hoạt động hay bắt đầu kết nối dựa trên chế độ driver. Tại thời điểm khởi tạo, các driver được đăng ký với libvirt. Driver cơ bản là một khối được xây dựng cho libvirt để hỗ trợ libvirt xử lý các kết nối đến các hypervisor đặc biệt. Các driver được phát hiện và đăng ký tại thời điểm xử lý các kết nối.
Như hình trên, Public API sẽ được công khai ra bên ngoài. Dựa trên URI mà client cung cấp, Public API sẽ nhượng quyền triển khai cho một hay nhiều drivers. Có nhiều loại driver trong libvirt như hypervisor, interface, network, nodeDevice, nwfilter, secret, storage,..
3. QEMU
Quick Emulator(QEMU) được viết bởi Fabrice Bellard và là phần mềm miễn phí, được cấp phép chủ yếu theo giấy phép GNU GPL. QEMU là trình giả lập máy và ảo hóa mã nguồn mở và miễn phí. Nó thực chất là một hosted hypervisor mà có khả năng ảo hóa phần cứng.
- QEMU có thể hoạt động như một trình giả lập hoặc một trình ảo hóa:
- QEMU hoạt động như một trình giả lập máy: Khi QEMU hoạt động như một trình giả lập, nó có thể chạy chương trình được thiết kế cho kiểu máy này trên kiểu máy khác bằng kỹ thuật dịch nhị phân tự động. Nó dịch mã của chương trình khách cho phần cứng khác để có thể chạy trên phần cứng của máy host. Trình biên dịch nhị phân đó là Tiny Code Generator (TCG).
- QEMU hoạt động như một trình ảo hóa: Khi này, QEMU sẽ thực thi mã của chương trình khách trực tiếp lên cpu host, do đó tăng được hiệu năng. Ví dụ, QEMU có thể chạy ở chế độ này khi sử dụng Xen/ KVM hypervisor ở dưới. Tóm lại, QEMU vẫn có thể chạy mà không cần KVM, sử dụng trình biên dịch nhị phân, nhưng nó sẽ chậm hơn so với khi sử dụng với KVM. Ở cả hai chế độ, QEMU không chỉ ảo hóa vi sử lý, mà còn ảo hóa cả các thiết bị ngoại vi khác, như ổ đĩa, mạng, VGA, PCI, serial, usb,… Bên cạnh giả lập các thiết bị I/O, khi hoạt động với KVM, QEMU_KVM tạo và khởi tạo các máy ảo. Nó cũng khởi tạo cả các luồng posix cho mỗi CPU ảo cho khách.
Để thực thi mã của khách trên CPU vật lý, QEMU sử dụng luồng posix. Các cpu ảo sẽ thực thi trên host kernel như là một luồng posix. Các CPU ảo sẽ như là những tiến trình trên Linux kernel ở high-level. Ở một góc độ khác, Phần không gian người dùng cho KVM hypervisor được cung cấp bởi QEMU. QEMU chạy mã của khách thông qua KVM module. Khi làm việc cùng KVM, QEMU cũng thực hiện giả lập I/O, live migration,…
Tóm lại, KVM sử dụng QEMU để có thể trở thành một hypervisor hoàn chỉnh và KVM là một trình tăng tốc hay hỗ trợ các extension ảo hóa phần cứng do cpu cung cấp. Điều này có nghĩa các hệ thống ảo phải cùng sử dụng một kiến trúc để có thể sử dụng các extension. Khi các extension được sử dụng, nó sẽ cung cấp hiệu năng tốt hơn là sử dụng các trình biên dịch nhị phân.
4. Hoạt động nội bộ trong qemu
QEMU KVM là ứng dụng đa luồng. Có các luồng chính là:
- Main thread.
- Worker threads for virtual disk I/O backend.
- One thread for each virtual CPU.
Với mỗi VM, sẽ có một tiến trình QEMU đang chạy trên hệ thống máy host. Nếu hệ thống khách bị tắt thì tiến trình này sẽ bị hủy/thoát. Bên cạnh các luồng cho mỗi vCPU thì có các event loop thread chạy để sử lý các sự kiện I/O như gói tin mạng, ổ đĩa. Ram vật lý của máy khách được gán bên trong Virtual address space của QEMU.
Ví dụ, Lệnh htop
hiển thị 3 tiến trình qemu trên hệ thống khi có 3 máy ảo chạy, mỗi tiến trình lại có nhiều luồng:
5. KVM
Có một mô-đun hạt nhân phổ biến được gọi là kvm.ko và có các mô-đun hạt nhân dựa trên phần cứng như kvm-intel.ko (hệ thống dựa trên Intel) hoặc kvm-amd.ko (hệ thống dựa trên AMD). Theo đó, KVM sẽ tải các mô đun kvm-intel.ko (nếu có cờ vmx) hoặc kvm-amd.ko (nếu có cờ svm). Điều này biến hạt nhân Linux thành một trình hóa.
KVM công khai một file thiết bị /dev/kvm để tứng dụng cso thể tận dụng được ioctl()
. QEMU tận dụng file thiết bị này để nói chuyện với kvm và tạo, khởi chạy, và quản lý kernel của máy ảo.
KVM không phải là hypervisor. Kết hợp với QEMU( giả lập thiết bị phần cứng và bios), thì chúng được coi là một hypervisor. KVM cần khả năng ảo hóa phần cứng để hoạt động. Sử dụng khả năng này, nó biến Linux kernel thành một hypervisor. Khi KVM chạy các máy ảo, mỗi máy ảo đều như một tiến trình trên hệ thống, được host kernel lên lịch để chạy trên CPU như với bất kỳ tiến trình nào khác trên host kernel. KVM là một tính năng ảo hóa trên Linux kernel mà cho phép các chương trình như QEMU thực thi các guest code trực tiếp lên host cpu. Điều này chỉ có thể sảy ra khi kiến trúc hệ thống máy khách được hỗ trợ bởi cpu máy chủ.
Ngoài user mode và kernel mode trong Linux, KVM giới thiệu thêm một chế độ gọi là guest mode. Guest mode là những thực thi mã của hệ thống khách.
Tài liệu tham khảo:
- Sách “Mastering KVM Virtualization”.