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.

Cài đặt KVM trên Ubuntu: Quản lý VM qua Cockpit Web UI

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 hệ thống

Yêu cầu tối thiểu mỗi node:

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-x
  • svm - 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.

Cấu hình VXLAN Overlay Network (Mạng ảo chung 2 node)

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-private thay 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
Tạo VM với 2 Network Interfaces

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


Nếu bạn gặp vấn đề trong quá trình cài đặt, hãy để lại comment bên dưới!

#kvm #virtualization #ubuntu #linux #Homelab