Bắt đầu nhanh (5 phút)
Vận hành máy ảo môi trường production không nhất thiết phải cần đến Proxmox, VMware ESXi hay một môi trường desktop tốn RAM. Nhờ có KVM tích hợp sẵn trong nhân Linux kernel, QEMU đảm nhiệm bên dưới và virsh quản lý vòng đời, terminal của bạn sẽ biến thành một bảng điều khiển hypervisor nhanh nhẹn và cực kỳ vững chắc.
Kiểm tra xem bộ vi xử lý của bạn có hỗ trợ tiện ích mở rộng ảo hóa phần cứng (Intel VT-x hoặc AMD-V) hay không:
grep -E -c '(vmx|svm)' /proc/cpuinfo
Bất kỳ kết quả nào lớn hơn 0 đều xác nhận CPU của bạn đã sẵn sàng. Tiếp theo, cài đặt bộ công cụ hypervisor trên Ubuntu hoặc Debian:
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils
sudo systemctl enable --now libvirtd
Cấp quyền truy cập trực tiếp cho tài khoản người dùng thông thường để bạn không cần dùng sudo cho các tác vụ VM hàng ngày:
sudo usermod -aG libvirt,kvm $USER
newgrp libvirt
Kiểm tra kết nối tới socket của hypervisor trên máy:
virsh list --all
Một bảng trống hiển thị các cột Id, Name và State xác nhận libvirtd đang lắng nghe và sẵn sàng triển khai máy ảo.
Tìm hiểu sâu: Khởi tạo máy khách Headless với Virt-Install
Quản trị VM từ bash về bản chất là tạo các định nghĩa domain dạng XML cho libvirt. Thay vì phải tự viết XML thủ công, virt-install sẽ tự động chuyển đổi các cờ lệnh thành các định nghĩa phần cứng hợp lệ.
Chuẩn bị phân vùng lưu trữ
Libvirt mặc định lưu trữ ổ đĩa tại /var/lib/libvirt/images. Định dạng Raw phân bổ toàn bộ dung lượng đĩa ngay từ đầu, trong khi QCOW2 tăng dần dung lượng theo nhu cầu thực tế. Hãy tạo sẵn một ổ đĩa sparse QCOW2 dung lượng 25 GB với metadata preallocation để cân bằng giữa tốc độ truy xuất đĩa và dung lượng chiếm dụng trên máy host:
sudo qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/web-server-01.qcow2 25G
Image mới tạo chỉ chiếm khoảng 350 MB trên hệ thống tệp của host nhưng lại cung cấp một block device 25 GB đầy đủ cho máy khách.
Cài đặt tự động một máy khách Headless
Các máy chủ headless không có phần cứng hiển thị đồ họa. Vì Ubuntu 22.04 đã loại bỏ trình cài đặt debian-installer truyền thống để chuyển sang Subiquity, việc truyền trực tiếp URL netboot installer thường sẽ thất bại. Thay vào đó, hãy cung cấp cloud image chính thức hoặc file ISO cùng với các tham số kernel cho serial console:
sudo virt-install \
--name web-server-01 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/web-server-01.qcow2,format=qcow2,bus=virtio \
--os-variant ubuntu22.04 \
--network network=default,model=virtio \
--graphics none \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.4-live-server-amd64.iso \
--console pty,target_type=serial
Driver VirtIO giúp giảm đáng kể overhead do giả lập. Băng thông mạng và tốc độ đọc ghi đĩa tăng khoảng 15% đến 30% so với giả lập IDE hoặc e1000 thông thường.
Kết nối vào text console của máy khách bất kỳ lúc nào:
virsh console web-server-01
Để ngắt kết nối khỏi serial console và quay lại terminal của host, nhấn tổ hợp phím Ctrl + ].
Quản lý vòng đời VM hàng ngày
Công việc quản trị hàng ngày chỉ xoay quanh một vài lệnh ngắn gọn:
- Bật nguồn máy ảo:
virsh start web-server-01 - Gửi lệnh tắt máy an toàn qua ACPI:
virsh shutdown web-server-01 - Tắt nguồn cưỡng bức (rút nguồn ảo):
virsh destroy web-server-01 - Tự động khởi động cùng máy host:
virsh autostart web-server-01 - Xóa máy ảo cùng với toàn bộ ổ đĩa ảo:
virsh undefine web-server-01 --remove-all-storage
Lưu ý rằng lệnh virsh undefine đơn thuần vẫn giữ lại các file disk image mồ côi trên hệ thống tệp. Luôn thêm cờ --remove-all-storage nếu bạn muốn giải phóng vĩnh viễn dung lượng ổ đĩa.
Sử dụng nâng cao: Bridged Networking và tinh chỉnh tài nguyên động
Theo mặc định, libvirt đặt các máy ảo phía sau một mạng NAT riêng biệt (virbr0, thường là dải 192.168.122.0/24). Cấu hình này hoạt động tốt khi tải các package. Tuy nhiên, việc định tuyến lưu lượng truy cập từ mạng LAN văn phòng hoặc subnet homelab vào máy ảo lại đòi hỏi các quy tắc port-forwarding rườm rà. Một network bridge sẽ giải quyết vấn đề này bằng cách gắn trực tiếp các interface ảo vào card mạng vật lý NIC.
Gắn máy khách vào System Bridge
Giả sử máy host Linux của bạn đã bridge card mạng vật lý eth0 sang br0 thông qua Netplan hoặc NetworkManager. Bạn có thể mở bridge này cho libvirt sử dụng mà không làm gián đoạn các quy tắc tường lửa hiện có của host.
Lưu cấu hình mạng này vào file host-bridge.xml:
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
Đăng ký và kích hoạt cấu hình bridge trong libvirt:
virsh net-define host-bridge.xml
virsh net-start host-bridge
virsh net-autostart host-bridge
Đổi tham số trong lệnh virt-install thành --network network=host-bridge,model=virtio. Máy khách sẽ broadcast các yêu cầu DHCP trực tiếp qua switch vật lý, nhận một địa chỉ IP LAN thông thường (như 192.168.1.145) hệt như một máy chủ vật lý gắn rack.
Tinh chỉnh tài nguyên trực tiếp (Live Tuning)
Khởi động lại các node database hoặc web server production chỉ để tăng RAM là điều rất bất tiện. May mắn thay, KVM và QEMU hỗ trợ cắm nóng (hot-plug) RAM và CPU trực tiếp thông qua virtio balloon driver.
Miễn là file XML domain của bạn có khai báo giới hạn bộ nhớ trần (chẳng hạn tối đa 8 GB với mức cơ bản 2 GB), bạn có thể nâng lượng RAM phân bổ ngay lập tức theo đơn vị kibibyte:
virsh setmem web-server-01 4194304 --live
Chỉ trong vài giây, dung lượng bộ nhớ khả dụng bên trong máy khách sẽ tăng lên 4 GB mà không làm gián đoạn các kết nối cơ sở dữ liệu đang chạy. Bạn cũng có thể mở rộng số lượng vCPU hoạt động tương tự lên đến mức tối đa của phần cứng:
virsh setvcpus web-server-01 4 --live
Kiểm tra giới hạn tài nguyên đang hoạt động bất cứ lúc nào bằng lệnh virsh dominfo web-server-01.
Kinh nghiệm thực tế cho môi trường Production
Vận hành ảo hóa headless ổn định đòi hỏi phải phân bổ tài nguyên có kỷ luật. Việc thiếu kiểm soát bộ nhớ hoặc I/O quá tải có thể làm sập toàn bộ node máy chủ vật lý.
Ngăn chặn tình trạng cạn kiệt RAM trên Host
Tránh overcommit RAM trên các máy khách đang chạy ở môi trường production. Nếu một host vật lý có 32 GB RAM chứa sáu VM, mỗi VM được cấp 6 GB, thì một đợt tăng đột biến lưu lượng truy cập sẽ kích hoạt cơ chế Out-Of-Memory (OOM) killer của kernel. Khi điều đó xảy ra, kernel của host có thể đột ngột buộc dừng tiến trình qemu-system-x86_64 chính. Hãy luôn dự phòng tối thiểu từ 2 GB đến 4 GB RAM chưa phân bổ dành riêng cho các tác vụ kernel của host và bộ nhớ đệm I/O cache.
Tạo Snapshot nhanh trước khi triển khai
Tạo một snapshot atomic crash-consistent trước khi thực hiện các đợt nâng cấp hệ thống quan trọng hoặc cấu hình lại reverse proxy:
virsh snapshot-create-as --domain web-server-01 \
--name "pre-nginx-upgrade" \
--description "Snapshot trước khi biên dịch bản build OpenResty tùy chỉnh" \
--atomic
Nếu bản cập nhật làm hỏng các thư viện hệ thống, bạn có thể hoàn tác về trạng thái ban đầu đã lưu chỉ trong khoảng hai giây:
virsh snapshot-revert web-server-01 pre-nginx-upgrade
Xử lý sự cố: Treo Serial Console
Khi chạy lệnh virsh console web-server-01, đôi lúc terminal chỉ hiện Connected to domain web-server-01 rồi bị treo mà không hiển thị dấu nhắc lệnh shell. Nhấn Enter thường sẽ đánh thức được màn hình. Nếu màn hình vẫn đen kịt, nguyên nhân là do hệ điều hành máy khách chưa kích hoạt tiến trình lắng nghe getty trên ttyS0.
Hãy đăng nhập qua SSH một lần và kích hoạt systemd serial getty unit:
sudo systemctl enable --now [email protected]
Kết hợp lưu trữ QCOW2 nhẹ nhàng với bridged networking nguyên bản mang lại cho bạn một hệ thống hypervisor cực nhanh và dễ dàng tự động hóa bằng script. Bạn có được khả năng kiểm soát chi tiết, hiệu năng thuần túy và không lãng phí tài nguyên cho giao diện đồ họa.

