Cài đặt KVM trên Ubuntu: Quản lý VM qua Cockpit Web UI
Hướng dẫn cài đặt KVM trên Ubuntu và quản lý VM qua Cockpit Web UI. Cấu hình network bridge, mạng ảo NAT, storage pool cho homelab 2 node.
Nếu bạn đang tìm kiếm giải pháp ảo hóa mạnh mẽ, miễn phí và được tích hợp trực tiếp vào Linux kernel, thì KVM (Kernel-based Virtual Machine) chính là câu trả lời. KVM biến Linux thành một Type-1 hypervisor, cho phép bạn chạy nhiều máy ảo (VMs) với hiệu năng gần như native.
Trong bài viết này, mình sẽ hướng dẫn bạn cài đặt KVM từ A-Z trên 2 máy chủ vật lý với cấu hình cụ thể:
| Hostname | IP Address | Vai trò |
|---|---|---|
| kvm-node01 | 192.168.1.10 | KVM Host #1 |
| kvm-node02 | 192.168.1.11 | KVM Host #2 |
Cấu hình này phù hợp cho việc xây dựng homelab, chạy Kubernetes cluster, hoặc môi trường development/testing.
Tại sao chọn KVM?
Trước khi bắt tay vào cài đặt, hãy hiểu tại sao KVM là lựa chọn phổ biến:
So sánh các giải pháp ảo hóa:
┌─────────────────┬──────────────┬─────────────┬──────────────┐
│ Tiêu chí │ KVM │ VMware │ VirtualBox │
├─────────────────┼──────────────┼─────────────┼──────────────┤
│ Chi phí │ Miễn phí │ Có phí │ Miễn phí │
│ Hiệu năng │ Xuất sắc │ Xuất sắc │ Tốt │
│ Tích hợp Linux │ Native │ Cần driver │ Cần driver │
│ Production-ready│ Có │ Có │ Không │
│ Cloud providers │ AWS, GCP... │ VMware Cloud│ Không │
│ Nested Virt │ Tốt │ Tốt │ Hạn chế │
└─────────────────┴──────────────┴─────────────┴──────────────┘
KVM được sử dụng bởi các cloud providers lớn như AWS, Google Cloud, DigitalOcean, và là nền tảng cho OpenStack, Proxmox VE.
Yêu cầu hệ thống
Cấu hình 2 máy chủ của chúng ta:

Yêu cầu tối thiểu mỗi node:
- CPU hỗ trợ Hardware Virtualization (Intel VT-x hoặc AMD-V)
- RAM: 8GB+ (khuyến nghị 16GB+)
- Storage: 100GB+ SSD
- Ubuntu Server 22.04 LTS hoặc 24.04 LTS
- Network: 1 NIC (có thể thêm NIC cho storage network)
Bước 1: Kiểm tra Hardware Virtualization Support
📚 Thực hiện trên cả 2 node: kvm-node01 và kvm-node02
Đầu tiên, bạn cần xác nhận CPU hỗ trợ ảo hóa phần cứng. Đây là bước quan trọng nhất - nếu CPU không hỗ trợ, bạn không thể sử dụng KVM.
Kiểm tra CPU flags:
# Kiểm tra số lượng CPU cores hỗ trợ virtualization
egrep -c '(vmx|svm)' /proc/cpuinfo
Kết quả trả về số lớn hơn 0 nghĩa là CPU hỗ trợ:
vmx- Intel VT-xsvm- AMD-V
Kiểm tra chi tiết hơn:
# Xem loại virtualization
lscpu | grep Virtualization
# Output mẫu:
# Virtualization: VT-x (Intel)
# Virtualization: AMD-V (AMD)
Sử dụng công cụ kvm-ok:
# Cài đặt cpu-checker
sudo apt update
sudo apt install -y cpu-checker
# Chạy kiểm tra
sudo kvm-ok
Kết quả mong muốn:
INFO: /dev/kvm exists
KVM acceleration can be used
⚠️ Lưu ý: Nếu kết quả báo "KVM acceleration can NOT be used", hãy kiểm tra BIOS/UEFI và enable tùy chọn Intel VT-x hoặc AMD-V.
Bước 2: Cài đặt KVM và các Packages
📚 Thực hiện trên cả 2 node
Tiến hành cài đặt KVM và các packages cần thiết:
# Update hệ thống
sudo apt update && sudo apt upgrade -y
# Cài đặt KVM và toàn bộ dependencies
sudo apt install -y \
qemu-kvm \
libvirt-daemon-system \
libvirt-clients \
bridge-utils \
virtinst \
virt-manager \
libguestfs-tools \
libosinfo-bin \
cloud-image-utils
Giải thích từng package:
| Package | Chức năng |
|---|---|
qemu-kvm |
QEMU emulator với KVM acceleration |
libvirt-daemon-system |
Libvirt daemon quản lý VMs |
libvirt-clients |
CLI tools như virsh |
bridge-utils |
Tạo và quản lý network bridges |
virtinst |
Công cụ virt-install để tạo VMs |
virt-manager |
GUI quản lý VMs (optional cho server) |
libguestfs-tools |
Tools thao tác với disk images |
libosinfo-bin |
Database thông tin các OS |
cloud-image-utils |
Tools làm việc với cloud images |
Verify cài đặt:
# Kiểm tra KVM modules đã load
lsmod | grep kvm
# Output mẫu (Intel):
# kvm_intel 368640 0
# kvm 1028096 1 kvm_intel
# Output mẫu (AMD):
# kvm_amd 139264 0
# kvm 1028096 1 kvm_amd
Bước 3: Cấu hình User và Services
📚 Thực hiện trên cả 2 node
Để sử dụng KVM mà không cần sudo cho mọi lệnh, thêm user vào các groups cần thiết:
# Thêm user hiện tại vào group libvirt và kvm
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
# Verify groups
groups $USER
Enable và start libvirtd service:
# Enable service khởi động cùng hệ thống
sudo systemctl enable libvirtd
# Start service
sudo systemctl start libvirtd
# Kiểm tra status
sudo systemctl status libvirtd
Output mong muốn:
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; ...)
Active: active (running) since ...
💡 Tip: Sau khi thêm user vào groups, bạn cần logout và login lại, hoặc chạy newgrp libvirt để áp dụng ngay.Kiểm tra kết nối libvirt:
# Test virsh command
virsh list --all
# Nếu thành công, output sẽ là:
# Id Name State
# ----------------------
# (empty - chưa có VM nào)
Bước 4: Cấu hình Network Bridge
Đây là bước quan trọng nhất để VMs có thể giao tiếp với mạng bên ngoài. Chúng ta sẽ cấu hình bridge network cho cả 2 máy chủ với IP tĩnh.
Xác định tên network interface (thực hiện trên cả 2 node):
# Liệt kê các network interfaces
ip link show
# Tìm interface chính (thường là enp0s3, eth0, eno1, ens18...)
# Ghi nhớ tên này để dùng ở bước sau
Backup config hiện tại:
sudo mkdir -p /etc/netplan/backup
sudo cp /etc/netplan/*.yaml /etc/netplan/backup/
Cấu hình cho kvm-node01 (192.168.1.10)
sudo nano /etc/netplan/01-bridge-config.yaml
# /etc/netplan/01-bridge-config.yaml - kvm-node01
network:
version: 2
renderer: networkd
ethernets:
enp0s3: # ⚠️ Thay bằng tên interface thực tế
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces:
- enp0s3 # ⚠️ Thay bằng tên interface thực tế
addresses:
- 192.168.1.10/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
mtu: 1500
parameters:
stp: true
forward-delay: 4
Cấu hình cho kvm-node02 (192.168.1.11)
sudo nano /etc/netplan/01-bridge-config.yaml
# /etc/netplan/01-bridge-config.yaml - kvm-node02
network:
version: 2
renderer: networkd
ethernets:
enp0s3: # ⚠️ Thay bằng tên interface thực tế
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces:
- enp0s3 # ⚠️ Thay bằng tên interface thực tế
addresses:
- 192.168.1.11/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
mtu: 1500
parameters:
stp: true
forward-delay: 4
Áp dụng cấu hình (thực hiện trên cả 2 node):
# Kiểm tra syntax
sudo netplan try
# Nếu OK, áp dụng
sudo netplan apply
# Verify bridge đã tạo
ip addr show br0
brctl show
Output mong muốn:
bridge name bridge id STP enabled interfaces
br0 8000.xxxxxxxxxxxx yes enp0s3
⚠️ Cảnh báo: Khi cấu hình network bridge qua SSH, bạn có thể bị mất kết nối. Sử dụng netplan try sẽ tự động rollback sau 120 giây nếu bạn không confirm.Quy hoạch IP cho VMs
| Range | Mục đích |
|---|---|
| 192.168.1.10 - 192.168.1.11 | KVM Hosts |
| 192.168.1.20 - 192.168.1.49 | Infrastructure VMs (DNS, DHCP, etc.) |
| 192.168.1.50 - 192.168.1.99 | Kubernetes Cluster |
| 192.168.1.100 - 192.168.1.149 | VMs trên kvm-node01 |
| 192.168.1.150 - 192.168.1.199 | VMs trên kvm-node02 |
| 192.168.1.200 - 192.168.1.250 | Reserved / DHCP Pool |
| 192.168.1.1 | Gateway |
Cấu hình Mạng Ảo cho VMs (NAT Network)
Ngoài bridge network, chúng ta sẽ tạo thêm một mạng ảo riêng cho các VMs. Mạng này sử dụng NAT để VMs có thể truy cập internet thông qua host, nhưng được cô lập khỏi mạng vật lý.

Tạo file định nghĩa mạng ảo:
# Tạo file XML cho mạng ảo
sudo tee /tmp/vm-private-network.xml << EOF
<network>
<name>vm-private</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.100' end='10.10.10.200'/>
</dhcp>
</ip>
</network>
EOF
Tạo và kích hoạt mạng ảo (thực hiện trên cả 2 node):
# Define network từ XML
sudo virsh net-define /tmp/vm-private-network.xml
# Start network
sudo virsh net-start vm-private
# Enable autostart
sudo virsh net-autostart vm-private
# Verify
sudo virsh net-list --all
Output mong muốn:
Name State Autostart Persistent
------------------------------------------------
default active yes yes
vm-private active yes yes
Xem thông tin chi tiết mạng ảo:
# Xem cấu hình
sudo virsh net-dumpxml vm-private
# Xem DHCP leases
sudo virsh net-dhcp-leases vm-private
# Xem bridge interface
ip addr show virbr1
Quy hoạch mạng ảo cho cả 2 nodes:
| Node | Virtual Network | Subnet | DHCP Range |
|---|---|---|---|
| kvm-node01 | vm-private | 10.10.10.0/24 | 10.10.10.100-149 |
| kvm-node02 | vm-private | 10.10.10.0/24 | 10.10.10.150-200 |
💡 Lưu ý: Cả 2 node dùng chung subnet 10.10.10.0/24 nhưng chia DHCP range khác nhau để tránh xung đột IP. VMs trên 2 node có thể giao tiếp trực tiếp với nhau qua mạng ảo.
Cấu hình mạng ảo cho kvm-node02 (cùng subnet, khác DHCP range):
# Trên kvm-node02, tạo file XML với DHCP range khác
sudo tee /tmp/vm-private-network.xml << EOF
<network>
<n>vm-private</n>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='10.10.10.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.10.10.150' end='10.10.10.200'/>
</dhcp>
</ip>
</network>
EOF
# Define và start
sudo virsh net-define /tmp/vm-private-network.xml
sudo virsh net-start vm-private
sudo virsh net-autostart vm-private
Cài đặt Cockpit để quản lý KVM qua Web UI
Cockpit là web UI giúp quản lý KVM trực quan và dễ dàng. Cài đặt trên cả 2 node:
# Cài đặt Cockpit và module KVM
sudo apt install -y cockpit cockpit-machines
# Enable và start Cockpit
sudo systemctl enable --now cockpit.socket
# Kiểm tra status
sudo systemctl status cockpit.socket
# Mở firewall (nếu có)
sudo ufw allow 9090/tcp
Truy cập Cockpit:
| Node | URL |
|---|---|
| kvm-node01 | https://192.168.1.10:9090 |
| kvm-node02 | https://192.168.1.11:9090 |
Login bằng user Linux của bạn (cần quyền sudo).
Giao diện Cockpit cho KVM:

Tính năng Cockpit cho KVM:
| Tính năng | Mô tả |
|---|---|
| Virtual Machines | Tạo, xóa, start, stop VMs trực quan |
| Console | VNC/Serial console ngay trong browser |
| Storage Pools | Quản lý disk images, upload ISO |
| Networks | Tạo/sửa virtual networks (NAT, Bridge) |
| Snapshots | Tạo và restore snapshots |
| Resource Monitor | Theo dõi CPU, RAM, Disk, Network real-time |
Cấu hình VXLAN Overlay Network (Mạng ảo chung 2 node)
Để VMs trên 2 node có thể giao tiếp trực tiếp với nhau qua mạng ảo chung, chúng ta sử dụng VXLAN (Virtual Extensible LAN). VXLAN tạo tunnel Layer 2 qua mạng vật lý, cho phép VMs trên các host khác nhau như cùng một switch ảo.

Bước 1: Tạo VXLAN interface trên kvm-node01:
# Tạo VXLAN interface với VNI 100
sudo ip link add vxlan100 type vxlan id 100 \
local 192.168.1.10 \
remote 192.168.1.11 \
dstport 4789 \
dev br0
# Bật interface
sudo ip link set vxlan100 up
Bước 2: Tạo VXLAN interface trên kvm-node02:
# Tạo VXLAN interface với VNI 100
sudo ip link add vxlan100 type vxlan id 100 \
local 192.168.1.11 \
remote 192.168.1.10 \
dstport 4789 \
dev br0
# Bật interface
sudo ip link set vxlan100 up
Bước 3: Tạo bridge cho VXLAN (thực hiện trên cả 2 node):
# Tạo bridge mới cho VXLAN
sudo ip link add vxlan-br0 type bridge
sudo ip link set vxlan-br0 up
# Gắn VXLAN interface vào bridge
sudo ip link set vxlan100 master vxlan-br0
# Verify
bridge link show
Bước 4: Cấu hình persistent với Netplan:
Tạo file /etc/netplan/02-vxlan.yaml trên kvm-node01:
network:
version: 2
tunnels:
vxlan100:
mode: vxlan
id: 100
local: 192.168.1.10
remote: 192.168.1.11
port: 4789
bridges:
vxlan-br0:
interfaces:
- vxlan100
mtu: 1450
parameters:
stp: false
forward-delay: 0
Tạo file /etc/netplan/02-vxlan.yaml trên kvm-node02:
network:
version: 2
tunnels:
vxlan100:
mode: vxlan
id: 100
local: 192.168.1.11
remote: 192.168.1.10
port: 4789
bridges:
vxlan-br0:
interfaces:
- vxlan100
mtu: 1450
parameters:
stp: false
forward-delay: 0
Áp dụng cấu hình:
sudo netplan apply
# Verify VXLAN
ip -d link show vxlan100
bridge link show
Bước 5: Định nghĩa VXLAN network cho libvirt (cả 2 node):
sudo tee /tmp/vxlan-network.xml << EOF
<network>
<name>vxlan-net</name>
<forward mode="bridge"/>
<bridge name="vxlan-br0"/>
</network>
EOF
# Define và start network
sudo virsh net-define /tmp/vxlan-network.xml
sudo virsh net-start vxlan-net
sudo virsh net-autostart vxlan-net
# Verify
sudo virsh net-list --all
Bước 6: Tạo VM sử dụng VXLAN network:
# Tạo VM với VXLAN network
sudo virt-install \
--name vm-vxlan-01 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm-vxlan-01.qcow2,size=20 \
--os-variant ubuntu22.04 \
--network network=vxlan-net \
--graphics vnc \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.3-live-server-amd64.iso \
--noautoconsole
⚠️ Lưu ý MTU: VMs sử dụng VXLAN cần đặt MTU = 1450 (do VXLAN header ~50 bytes). Cấu hình trong VM:
Test kết nối VXLAN:
# Trên VM1 (kvm-node01) - IP: 10.10.10.101
ping 10.10.10.103 # Ping đến VM3 trên kvm-node02
# Kiểm tra VXLAN statistics
ip -s link show vxlan100
So sánh các loại mạng ảo:
| Loại | Use Case | VMs giao tiếp cross-node | Cô lập |
|---|---|---|---|
| NAT (vm-private) | Dev/Test đơn giản | ❌ Không | ✅ Có |
| Bridge (br0) | Production, LAN access | ✅ Qua LAN | ❌ Không |
| VXLAN Overlay | Multi-node cluster | ✅ Trực tiếp L2 | ✅ Có |
Bước 5: Cấu hình Storage Pool
📚 Thực hiện trên cả 2 node
Storage pool là nơi lưu trữ các disk images của VMs.
Tạo thư mục lưu trữ:
# Sử dụng thư mục mặc định
sudo mkdir -p /var/lib/libvirt/images
# Set permissions
sudo chown -R libvirt-qemu:kvm /var/lib/libvirt/images
sudo chmod -R 775 /var/lib/libvirt/images
Định nghĩa storage pool:
# Tạo pool mới
sudo virsh pool-define-as \
--name default \
--type dir \
--target /var/lib/libvirt/images
# Build và start pool
sudo virsh pool-build default
sudo virsh pool-start default
sudo virsh pool-autostart default
# Verify
sudo virsh pool-list --all
sudo virsh pool-info default
Output mong muốn:
Name State Autostart
-------------------------------
default active yes
Bước 6: Cấu hình Hostname và /etc/hosts
Để 2 node có thể giao tiếp với nhau bằng hostname, cần cấu hình SSH và hostname:
Trên kvm-node01:
# Set hostname
sudo hostnamectl set-hostname kvm-node01
# Cập nhật /etc/hosts
sudo nano /etc/hosts
127.0.0.1 localhost
192.168.1.10 kvm-node01
192.168.1.11 kvm-node02
Trên kvm-node02:
# Set hostname
sudo hostnamectl set-hostname kvm-node02
# Cập nhật /etc/hosts
sudo nano /etc/hosts
127.0.0.1 localhost
192.168.1.10 kvm-node01
192.168.1.11 kvm-node02
Test kết nối giữa 2 node:
# Từ kvm-node01
ping -c 3 kvm-node02
# Từ kvm-node02
ping -c 3 kvm-node01
Bước 7: Tạo Virtual Machine đầu tiên
Sau khi cài đặt KVM xong, chúng ta sẽ tạo VM đầu tiên sử dụng mạng ảo vm-private.
Phương pháp 1: Sử dụng Cloud Image (Nhanh)
Cloud images là disk images đã cài đặt sẵn OS, chỉ cần configure và boot:
Trên kvm-node01:
# Download Ubuntu Cloud Image
cd /var/lib/libvirt/images
sudo wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
# Tạo disk image cho VM
sudo qemu-img create -f qcow2 \
-F qcow2 \
-b jammy-server-cloudimg-amd64.img \
vm-test-01.qcow2 20G
Tạo cloud-init configuration:
# Tạo thư mục cho cloud-init
sudo mkdir -p /var/lib/libvirt/cloud-init
# Tạo file meta-data
sudo tee /var/lib/libvirt/cloud-init/meta-data << EOF
instance-id: vm-test-01
local-hostname: vm-test-01
EOF
# Tạo file user-data
sudo tee /var/lib/libvirt/cloud-init/user-data << EOF
#cloud-config
hostname: vm-test-01
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, admin
home: /home/ubuntu
shell: /bin/bash
lock_passwd: false
chpasswd:
list: |
ubuntu:ubuntu123
expire: false
package_update: true
packages:
- qemu-guest-agent
- curl
- wget
- vim
runcmd:
- systemctl enable qemu-guest-agent
- systemctl start qemu-guest-agent
EOF
# Tạo cloud-init ISO
sudo cloud-localds /var/lib/libvirt/images/vm-test-01-cidata.iso \
/var/lib/libvirt/cloud-init/user-data \
/var/lib/libvirt/cloud-init/meta-data
Tạo VM với mạng ảo vm-private:
sudo virt-install \
--name vm-test-01 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm-test-01.qcow2,format=qcow2 \
--disk path=/var/lib/libvirt/images/vm-test-01-cidata.iso,device=cdrom \
--os-variant ubuntu22.04 \
--network network=vm-private \
--graphics none \
--import \
--noautoconsole
💡 Lưu ý: Sử dụng--network network=vm-privatethay vì--network bridge=br0để VM kết nối vào mạng ảo.
Kiểm tra VM:
# List VMs
virsh list --all
# Xem IP của VM (VM sẽ nhận IP từ DHCP 10.10.10.x)
virsh domifaddr vm-test-01
# Hoặc xem từ DHCP leases
sudo virsh net-dhcp-leases vm-private
# Console vào VM
virsh console vm-test-01
# Login: ubuntu / ubuntu123
# Thoát console: Ctrl + ]
Kiểm tra network trong VM:
# Sau khi login vào VM
ip addr show
# Output mẫu:
# eth0: 10.10.10.101/24 (mạng ảo)
# Test internet (qua NAT)
ping -c 3 google.com
# Test ping đến host
ping -c 3 10.10.10.1
Tạo VM với 2 Network Interfaces
Nếu bạn cần VM vừa kết nối mạng ảo (internal) vừa kết nối bridge (external):
sudo virt-install \
--name vm-dual-nic \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm-dual-nic.qcow2,size=20,format=qcow2 \
--os-variant ubuntu22.04 \
--network network=vm-private \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.3-live-server-amd64.iso \
--boot cdrom,hd \
--noautoconsole

Phương pháp 2: Cài đặt từ ISO
# Download Ubuntu Server ISO (nếu chưa có)
cd /var/lib/libvirt/images
sudo wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso
# Tạo VM với mạng ảo
sudo virt-install \
--name vm-ubuntu-01 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm-ubuntu-01.qcow2,size=20,format=qcow2 \
--os-variant ubuntu22.04 \
--network network=vm-private \
--graphics vnc,listen=0.0.0.0,port=5901 \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.3-live-server-amd64.iso \
--boot cdrom,hd \
--noautoconsole
Kết nối VNC để cài đặt:
# Xem VNC port
sudo virsh vncdisplay vm-ubuntu-01
# Output: :1 (nghĩa là port 5901)
# Kết nối từ máy khác bằng VNC client
# Address: 192.168.1.10:5901
So sánh các loại Network
| Loại Network | Use Case | VM IP | Truy cập từ bên ngoài |
|---|---|---|---|
| vm-private (NAT) | Development, Testing | 10.10.10.x | Cần port forwarding |
| br0 (Bridge) | Production, Services | 192.168.1.x | Trực tiếp |
| Dual NIC | DMZ, Multi-tier apps | Cả hai | Tùy chọn |
Bước 8: Quản lý Virtual Machines với virsh
Sau khi tạo VM trên KVM, bạn sẽ quản lý chúng bằng virsh command.
Quản lý Virtual Networks
# Liệt kê tất cả networks
virsh net-list --all
# Xem thông tin network
virsh net-info vm-private
# Xem DHCP leases (IP đã cấp cho VMs)
virsh net-dhcp-leases vm-private
# Xem cấu hình XML của network
virsh net-dumpxml vm-private
# Start/Stop network
virsh net-start vm-private
virsh net-destroy vm-private
# Enable/Disable autostart
virsh net-autostart vm-private
virsh net-autostart --disable vm-private
# Xóa network
virsh net-undefine vm-private
Các lệnh cơ bản
Lifecycle management:
# Liệt kê tất cả VMs
virsh list --all
# Start VM
virsh start vm-test-01
# Shutdown graceful
virsh shutdown vm-test-01
# Force stop (như rút điện)
virsh destroy vm-test-01
# Reboot
virsh reboot vm-test-01
# Suspend/Resume
virsh suspend vm-test-01
virsh resume vm-test-01
# Autostart khi host boot
virsh autostart vm-test-01
virsh autostart --disable vm-test-01
Thông tin VM:
# Thông tin tổng quan
virsh dominfo vm-test-01
# CPU và memory stats
virsh domstats vm-test-01
# Network interfaces
virsh domiflist vm-test-01
# Disk information
virsh domblklist vm-test-01
# IP address
virsh domifaddr vm-test-01
Snapshots
# Tạo snapshot
virsh snapshot-create-as vm-test-01 \
--name "before-upgrade" \
--description "Snapshot before system upgrade"
# Liệt kê snapshots
virsh snapshot-list vm-test-01
# Revert về snapshot
virsh snapshot-revert vm-test-01 before-upgrade
# Xóa snapshot
virsh snapshot-delete vm-test-01 before-upgrade
Clone VM
# Shutdown VM trước khi clone
virsh shutdown vm-test-01
# Clone VM
virt-clone \
--original vm-test-01 \
--name vm-test-02 \
--auto-clone
Xóa VM
# Shutdown VM
virsh shutdown vm-test-01
# Xóa VM definition và storage
virsh undefine vm-test-01 --remove-all-storage
Bước 9: Cấu hình Nested Virtualization (Optional)
Nested virtualization cho phép chạy VMs bên trong VMs - hữu ích khi bạn muốn test Kubernetes hoặc Docker trong VM.
Cho Intel CPU:
# Tạo file config
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
# Reload module
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel
# Verify
cat /sys/module/kvm_intel/parameters/nested
# Output: Y hoặc 1
Cho AMD CPU:
# Tạo file config
echo "options kvm_amd nested=1" | sudo tee /etc/modprobe.d/kvm-amd.conf
# Reload module
sudo modprobe -r kvm_amd
sudo modprobe kvm_amd
# Verify
cat /sys/module/kvm_amd/parameters/nested
Bước 10: Troubleshooting
Lỗi thường gặp
Lỗi: "Cannot access storage file"
# Kiểm tra permissions
ls -la /var/lib/libvirt/images/
# Fix permissions
sudo chown libvirt-qemu:kvm /var/lib/libvirt/images/*.qcow2
sudo chmod 660 /var/lib/libvirt/images/*.qcow2
Lỗi: VM không có IP address
# Kiểm tra bridge
brctl show
ip addr show br0
# Trong VM, request DHCP
sudo dhclient -v
Lỗi: "Permission denied" khi chạy virsh
# Thêm vào groups
sudo usermod -aG libvirt,kvm $USER
# Logout và login lại
Xem logs:
# Libvirt logs
sudo journalctl -u libvirtd -f
# QEMU logs cho specific VM
sudo tail -f /var/log/libvirt/qemu/vm-test-01.log
Tài liệu tham khảo
- Tất cả bài viết về KVM
- Cockpit trên xdev.asia
- Virtualization trên xdev.asia
- Networking trên xdev.asia
- QEMU Documentation
- Libvirt trên xdev.asia
- Ubuntu Server Guides
- KVM Official Documentation
- VXLAN - Linux Kernel Documentation
Nếu bạn gặp vấn đề trong quá trình cài đặt, hãy để lại comment bên dưới!