Skip to content

KVM

KVM QEMU virtio(para virtualization)

KVM/QEMU KVM/virtio (para virtualization)

Intel VT-x AMD AMD-V

three mode - user - kernel - guest

libvirt

Ubuntu

if the node is the vmware vm, enable "向客體作業系統公開硬體協助虛擬化" in "硬體虛擬化"

sudo apt-get -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon qemu qemu-kvm
sudo kvm-ok
lsmod | grep kvm
modinfo kvm
modinfo kvm_amd
systemctl status libvirtd
virsh list --all
sudo apt-get -y install virt-manager

GUI

sudo apt-get install slim ubuntu-desktop
sudo reboot
systemctl status slim.service

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 guest

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

# meta-data
instance-id: my-ubuntu-vm
local-hostname: my-ubuntu-vm

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
:::info \$6\$P2LlhzIYWXC4XyCa$JzSWM6UBQ3BNLtQXO2jKTIhkBQyNl8DuhJ6tx8kovCtiick0mXMWE6z12HGBhTzAPW0EpDglWn7j.W9XZoaBl0 => foo@123

from openssl passwd -6 foo@123 :::

Redhat

For redhat guest

  1. fetch Red Hat Enterprise Linux x.x KVM Guest Image
    • example: rhel-8.8-x86_64-kvm.qcow2
  2. Creating a virtual machine from a KVM guest image
mkdir cloudinitiso
cd cloudinitiso

meta-data

instance-id: citest
local-hostname: vm-rhel

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

command

network

virsh net-list --all