QEMU-KVM
- 第 1 類與第 2 類 Hypervisor - Hypervisor 類型之間的區別 - AWS
- GitHub - 0voice/kernel_awsome_feature: 深入研究 kvm,ceph,fuse特性
- 什麼是 KVM? - 說明 Kernel 虛擬機器 - AWS
- :star:KVM 架構跟原理
- KVM 本身只負責 CPU / memory 層面的虛擬化,加上 QEMU 或其他工具模擬 I/O 與週邊裝置,才能形成完整的虛擬機環境
- QEMU vs KVM: Key Differences in Virtualization | Vinchin Backup
- 了解使用 QEMU 和 Libvirt 實現 KVM 虛擬化
- 有一張簡單的架構圖, 說明proxmax API也是基於QEMU-KVM; libvirt Virtualization AP可以跨多個虛擬化技術,QEMU-KVM, Xen, vSphere, Hype-V
- KVM: Linux 虛擬化基礎建設 - HackMD
- How to Create Virtual Machines in Linux Using KVM (Kernel-based Virtual Machine) - Part 1
- Ubuntu安裝QEMU/KVM和Virt Manager虛擬機管理員 · Ivon的部落格
- Linux KVM啟用巢狀虛擬化,在虛擬機裡面跑虛擬機 · Ivon的部落格
- 免Mac電腦,OSX-KVM讓你在Linux系統安裝macOS的QEMU虛擬機 · Ivon的部落格
KVM QEMU virtio(para virtualization)
KVM/QEMU KVM/virtio (para virtualization)
Intel VT-x AMD AMD-V
three mode - user - kernel - guest
libvirt
# default image dir
/var/lib/libvirt/images
# log
/var/log/libvirt/qemu/Window11-clone1.log
# QEMU driver configuration file
/etc/libvirt/qemu.conf
# config xml
/etc/libvirt/qemu/
# Runtime configurations and snapshots
/var/lib/libvirt/qemu/
# default OVMF_VARS for EFI Variables
/var/lib/libvirt/qemu/nvram/
EDITOR=vim virsh edit Window11-clone1
# Restart services
sudo systemctl restart libvirtd
sudo systemctl restart qemu-kvm
journalctl -u libvirtd
# check what firmware files QEMU can find
/usr/local/bin/qemu-system-x86_64 -L help
# Check libvirt daemon version
libvirtd --version
# Or check client library version
virsh version
# Verify new version
qemu-system-x86_64 --version
# displays the IP addresses and MAC addresses of network interfaces inside a running KVM/QEMU virtual machine (domain)
virsh domifaddr rocky9-1 --source agent
virsh domblklist rocky9-1
# Target Source
# -----------------------------------------------------------------
# vda /var/lib/libvirt/images/rocky9-1.img
# sda /var/lib/libvirt/boot/virtinst-b2trnlhb-cloudinit.iso
virsh change-media rocky9-1 sda --eject
virsh change-media rocky9-1 sda --eject --config
virsh detach-disk rocky9-1 sda
virsh detach-disk rocky9-1 sda --config
# Replace "my-vm" with your actual VM name
virsh destroy my-vm --graceful # if running
virsh undefine rocky9-1 --remove-all-storage
QEMU
- Hosts/Linux - QEMU
- System Emulation — QEMU documentation
- Linux系統QEMU/KVM指令教學,安裝UEFI開機的虛擬機 · Ivon的部落格
- Install QEMU on Ubuntu 22.04 - arcsin2's blog
- for self compiled qemu
- UEFI, BIOS & OVMF
sudo apt install ninja-build \
zlib1g zlib1g-dev \
libglib2.0-dev \
libspice-server-dev libspice-protocol-dev \
libusbredirhost-dev libusbredirparser-dev \
libpixman-1-dev
wget https://download.qemu.org/qemu-7.2.0.tar.xz
tar xvJf qemu-7.2.0.tar.xz
cd qemu-7.2.0
./configure --enable-kvm --enable-spice -enable-usb-redir | tee /tmp/qemu_configure.log
grep -i 'usbredir' /tmp/qemu_configure.log
make
make install
Failed to start QEMU binary /usr/local/bin/qemu-system-x86_64 for probing: libvirt: error : cannot execute binary /usr/local/bin/qemu-system-x86_64: Permission denied - libvirt for qemu | Winddoing's Notes
OR stop the apparmor to test
Virt Manager
- libvirt: virsh
- Ubuntu安裝QEMU/KVM和Virt Manager虛擬機管理員 · Ivon的部落格
- 如何備份Linux Virt Manager所建立的QEMU/KVM虛擬機映像檔 · Ivon的部落格
- Linux Virt Manager將網路設定為橋接模式,讓外網可以連線到QEMU/KVM虛擬機 · Ivon的部落格
- Spice Guest Tools用法,QEMU/KVM虛擬機自動縮放解析度、共享資料夾 · Ivon的部落格
Ubuntu
- KVM hypervisor: a beginners’ guide | Ubuntu
- Install KVM On Ubuntu 22.04 Server - OSTechNix
- 鳥哥私房菜 - 第二章、第一個虛擬機器的安裝與調整
- 在 ubuntu 實體機安裝 ubuntu VM 的流程 - HackMD
- Virtual Machine Manager | Ubuntu
- kvm virtualization - How to install Ubuntu 22.04 as GUEST in KVM - Ask Ubuntu
- Web or GUI
- Web-based interface for KVM / QEMU VM management? : r/selfhosted
- How to Install a Desktop (GUI) on an Ubuntu Server
- Managing KVM Virtual Machines with Cockpit Web Console in Linux
- Proxmox VE
if the node is the vmware vm, enable "向客體作業系統公開硬體協助虛擬化" in "硬體虛擬化"
sudo apt-get -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon libvirt-daemon-system qemu qemu-kvm
sudo kvm-ok
lsmod | grep kvm
modinfo kvm
modinfo kvm_amd
systemctl status libvirtd
GUI
Web Console
sudo apt-get install cockpit cockpit-machines
# for error "sscg: command not found"
sudo apt-get install libgnutls-openssl27
sudo systemctl start cockpit
sudo systemctl status cockpit
sudo ufw allow 9090/tcp
sudo ufw reload
For Ubuntu 22.04 guest - basic concept
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
cp jammy-server-cloudimg-amd64.img /var/lib/libvirt/images/
qemu-img create -F qcow2 -b jammy-server-cloudimg-amd64.img -f qcow2 my-ubuntu-vm.img 10G
cp my-ubuntu-vm.img /var/lib/libvirt/images/
virt-install --name my-first-vm --ram 6144 --vcpus 2 --import --disk path=/var/lib/libvirt/images/my-ubuntu-vm.img,format=qcow2 --cloud-init root-password-generate=on,disable=on,meta-data=/root/meta-data,user-data=/root/user-data --os-variant ubuntu22.04 --network bridge=virbr0 --graphics vnc,listen=0.0.0.0 --console pty,target_type=serial --noautoconsole
virsh net-dhcp-leases default
meta-data
user-data - https://bugs.launchpad.net/cloud-images/+bug/2049860/comments/15
#cloud-config
ssh_pwauth: true
users:
- name: root
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
- name: ubuntu
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
from openssl passwd -6 foo@123 :::
whole thing for Ubuntu
ssh-keygen -t ed25519 -C "KVM VM Instance" -f ~/.ssh/kvm-vm-instance
# Launch the Ubuntu 22.04 Guest OS
wget -O /var/lib/libvirt/images/jammy-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
# Launch the Ubuntu 24.04 Guest OS
wget -O /var/lib/libvirt/images/noble-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
cat <<'EOF' >> /root/meta-data
# meta-data
instance-id: k8s-ubuntu-vm
local-hostname: k8s-ubuntu-vm
EOF
# ubuntu/foo@123
# note: shell is interpreting the $ characters in your hashed password as variable expansions. so use single quote 'EOF'
cat <<'EOF' >> /root/user-data
#cloud-config
ssh_pwauth: true
users:
- name: root
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
- name: ubuntu
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
#ssh_authorized_keys:
# - ssh-ed25519 AAAAC3NzaC1lZDI1NT... your-public-key-here
EOF
# For Ubuntu 22.04 Guest OS
qemu-img create -F qcow2 -b /var/lib/libvirt/images/jammy-server-cloudimg-amd64.img -f qcow2 /var/lib/libvirt/images/k8s-ubuntu-vm-worker-2.img 30G
virt-install --name k8s-worker-2 --ram 4096 --vcpus 4 --import --disk path=/var/lib/libvirt/images/k8s-ubuntu-vm-worker-2.img,format=qcow2 --cloud-init root-password-generate=on,disable=on,meta-data=/root/meta-data,user-data=/root/user-data --os-variant ubuntu22.04 --network bridge=virbr0 --graphics vnc,listen=0.0.0.0 --console pty,target_type=serial --noautoconsole
# For Ubuntu 24.04 Guest OS
qemu-img create -F qcow2 -b /var/lib/libvirt/images/noble-server-cloudimg-amd64.img -f qcow2 /var/lib/libvirt/images/ubuntu-noble-1.img 20G
virt-install --name ubuntu-noble-1 \
--ram 4096 --vcpus 4 --import --disk path=/var/lib/libvirt/images/ubuntu-noble-1.img,format=qcow2 \
--cloud-init root-password-generate=on,disable=on,meta-data=/root/meta-data,user-data=/root/user-data --os-variant ubuntu24.04 \
--network bridge=virbr0 \
--graphics vnc,listen=0.0.0.0 --console pty,target_type=serial --noautoconsole
Redhat
- Chapter 8. Preparing and deploying a KVM Guest Image by using RHEL image builder | Red Hat Product Documentation
- 🐧Linux_RH134_09_安裝RHEL - HackMD
For redhat guest
- fetch Red Hat Enterprise Linux x.x KVM Guest Image
- example:
rhel-8.8-x86_64-kvm.qcow2
- example:
- Creating a virtual machine from a KVM guest image
meta-data
user-data
#cloud-config
ssh_pwauth: true
users:
- name: root
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
- name: rhel
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
cp rhel-8.8-x86_64-kvm.qcow2 /var/lib/libvirt/images/
qemu-img create -F qcow2 -b rhel-8.8-x86_64-kvm.qcow2 -f qcow2 my-rhel-vm.img 20G
mv my-rhel-vm.img /var/lib/libvirt/images/
method 1: use cloud-init.iso
genisoimage -output cloud-init.iso -volid cidata -joliet -rock user-data meta-data
cp cloudinitiso/cloud-init.iso /var/lib/libvirt/images/
virt-install \
--memory 4096 \
--vcpus 4 \
--name myvm \
--disk /var/lib/libvirt/images/my-rhel-vm.img,device=disk,bus=virtio,format=qcow2 \
--disk /var/lib/libvirt/images/cloud-init.iso,device=cdrom \
--os-variant rhel8.8 \
--virt-type kvm \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--noautoconsole \
--import
method 2: use --cloud-init argument
virt-install \
--memory 4096 \
--vcpus 4 \
--name myvm2 \
--disk /var/lib/libvirt/images/my-rhel-vm.img,device=disk,bus=virtio,format=qcow2 \
--cloud-init root-password-generate=on,disable=on,meta-data=/root/cloudinitiso/meta-data,user-data=/root/cloudinitiso/user-data \
--os-variant rhel8.8 \
--virt-type kvm \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--noautoconsole \
--import
For rocky linux guest
wget -O /var/lib/libvirt/images/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2 https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2
cat <<'EOF' >> /root/meta-data-rocky9
# meta-data
instance-id: rocky9-vm
local-hostname: rocky-vm
EOF
cat <<'EOF' >> /root/user-data-rocky9
#cloud-config
ssh_pwauth: true
users:
- name: root
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
- name: rocky
lock_passwd: false
hashed_passwd: $6$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
#ssh_authorized_keys:
# - ssh-ed25519 AAAAC3NzaC1lZDI1NT... your-public-key-here
EOF
# For Rocky Linux 9 Guest OS
qemu-img create -F qcow2 -b /var/lib/libvirt/images/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2 -f qcow2 /var/lib/libvirt/images/rocky9-1.img 20G
virt-install \
--name rocky9-1 \
--memory 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/rocky9-1.img,device=disk,bus=virtio,format=qcow2 \
--cloud-init root-password-generate=on,disable=on,meta-data=/root/meta-data-rocky9,user-data=/root/user-data-rocky9 \
--os-variant rocky9 \
--virt-type kvm \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--noautoconsole \
--import
for multiple vms at one time
#!/bin/bash
IMAGES=("rocky9-1" "rocky9-2")
BASE_IMAGE="/var/lib/libvirt/images/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2"
META_DATA="/root/meta-data-rocky9"
USER_DATA="/root/user-data-rocky9"
for img in "${IMAGES[@]}"; do
qemu-img create -F qcow2 -b "$BASE_IMAGE" -f qcow2 "/var/lib/libvirt/images/${img}.img" 20G
virt-install \
--name "$img" \
--memory 4096 \
--vcpus 4 \
--disk path="/var/lib/libvirt/images/${img}.img",device=disk,bus=virtio,format=qcow2 \
--cloud-init root-password-generate=on,disable=on,meta-data="$META_DATA",user-data="$USER_DATA" \
--os-variant rocky9 \
--virt-type kvm \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--noautoconsole \
--import \
--network bridge=br0 --network bridge=virbr0
# Wait for VM to appear in list (optional: adjust as needed)
echo "Waiting for VM $img to boot and acquire IP..."
sleep 10
# Try for up to 30 seconds to get IP
for attempt in {1..6}; do
VM_IP=$(virsh domifaddr "$img" --source agent | awk '/ipv4/ {print $4}' | cut -d'/' -f1)
if [[ -n "$VM_IP" ]]; then
echo "VM $img IP address: $VM_IP"
break
else
sleep 5
fi
done
if [[ -z "$VM_IP" ]]; then
echo "Unable to determine IP address for $img."
fi
done
command
- Ubuntu Cloud Images - the official Ubuntu images for public clouds, Openstack, KVM and LXD
- 第 4 章 配置 cloud-init | Red Hat Product Documentation
- Creating a VM using Libvirt, Cloud Image and Cloud-Init | Sumit’s Space
- Use Ubuntu Server Cloud Image to Create a KVM Virtual Machine with Fixed Network Properties | by Yu Ping | Medium
- Cloud Images with KVM (cloud-init) | 夢想家
- How to Install Ubuntu 22.04 Virtual Machine on KVM
- virt-install --cloud-init support | Cole Robinson
network
- libvirt: Virtual Networking
- KVM Host Networking Configuration Choices - IBM Documentation
- kernel_awsome_feature/KVM虚拟机网络管理实战.md
- Bridged network — libvirt Networking Handbook — Jamie Nguyen
- How to set up a network bridge for virtual machine communication | Enable Sysadmin
- 設定 Ubuntu 下 KVM 的 Bridge Networking » j7 碎唸人生
- Set up Network Bridge on Ubuntu 22.04 - Full Guide - OrcaCore
- 將Linux的QEMU/KVM網路設定為橋接模式,讓外網可以連線到虛擬機 · Ivon的部落格
- How to Connect KVM VM to Host Network? – GetLabsDone
- Setting up UEFI HTTP boot with libvirt | Enable Sysadmin