Skip to content

KVM

安装

sh
$ apt install libvirt-daemon libvirt-daemon-system virtinst qemu-kvm
# virtinst: utilities to create and edit virtual machines
# libvirt-daemon: Virtualization daemon
# libvirt-daemon-system: Libvirt daemon configuration files
# qemu-kvm: qemu-system-common qemu-system-data qemu-system-gui qemu-system-x86 qemu-utils
# bridge-utils: Utilities for configuring the Linux Ethernet bridge

$ systemctl status libvritd.socket

环境检查

sh
# kvm_intel 模组参数 nested: Y 允许在虚拟机中再启动虚拟机
# 未运行 VM 可以随时修改 kvm_intel 模组的参数,如果已有 VM 那么需求 reboot
$ lsmod | grep kvm
$ modinfo kvm
$ modinfo kvm_intel
$ modinfo kvm_intel | grep nested

# parm:           nested:bool
# Y 参数启用
$ cat /sys/module/kvm_intel/parameters/nested
Y

# 修改参数
$ vim /etc/modprobe.d/kvm.conf
# For Intel
options kvm_intel nested=1

$ modprobe -r kvm_intel
$ modprobe kvm_intel

主机虚拟化能力支持

$ virsh capabilities
$ virsh capabilities --machine q35 --arch x86_64

网络

sh
$ apt install bridge-utils
$ ip link add name br0 type bridge
$ ip addr add 172.20.1.1/24 dev br0
$ ip link set br0 up
$ ip link add veth0 type veth peer name veth1
$ ip link set veth0 master br0

virt network

MAC 生成

openssl rand -hex 6 | sed 's/../&:/g;s/:$//'

error: XML error: expected unicast mac address, found multicast 'e5:91:17:b3:8f:ba' in network 'default'

  • 单播(Unicast) 数据包从 一个发送方 发送到 一个接收方(一对一通信) 单播 MAC 地址的 最低有效位(LSB)第 1 个字节的最低位 是 0(十六进制表示为 0x0)
  • 多播(Multicast) 数据包从 一个发送方 发送到 多个接收方(一对多通信) 多播 MAC 地址的 最低有效位(LSB)第 1 个字节的最低位 是 1(十六进制表示为 0x1)
  • 广播(Broadcast) 数据包发送到 同一局域网内的所有设备(一对全体) 固定为 FF:FF:FF:FF:FF:FF
xml
<!-- default.xml -->
 <network>
  <name>default</name> <!-- virt network name -->
  <forward mode='nat'/>
  <bridge name='default' stp='on' delay='0'/> <!-- inteface name -->
  <mac address='52:54:00:66:ec:89'/>
  <ip address='192.168.122.1'netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2'end='192.168.122.254'/>
      <!-- 固定ip分配 -->
      <host mac='52:54:00:ed:63:1f' name='xxx' ip='192.168.122.2'/> <!-- ssh hostname -->
    </dhcp>
  </ip>
</network>

$ virsh net-create defualt.xml

磁盘文件

sh
$ qemu-img create -f qcow2 -o cluster_size=2M demo.qcow2 30G

$ qemu-img info demo.qcow2

domain

sh
# q35 PCI Express (PCIe) 虚拟化硬件架构主要用于 QEMU/KVM 虚拟化平台。它是传统 PC (i440fx) 架构的升级版,支持更多高级功能
$ apt install virtinst

$ virt-install \
 --name demo \
 --cpu host-passthrough,cache.mode=passthrough \
 --vcpu 1 \
 --memory 1024 \
 --memballoon virtio \
 --machine q35 \
 --os-type=Linux \
 --os-variant=generic \
 --disk /path/to/demo.qcow2,cache=writeback,io=threads,device=disk,bus=virtio \
 --network network=defualt,model=virtio \
 --graphics vnc,port=5900,listen=0.0.0.0,password=123456 \
 --location /data/virt/debian-12.11.0-amd64-DVD-1.iso \
 --extra-args="console=tty0 console=ttyS0,115200n8 serial" \
 --dry-run --print-xml > demo.xml
# --location 参数可以使用 --extra-args 选项进行而外配置
# 如,添加字符终端,可以使用 virsh console 访问 guest os 
# --location 选项需要额外配置 <kernel>、<initrd>

domain.xml

virt-install 生成 xml 文件后仍需要手动修改。下列为一个示例。

xml
<domain type="kvm">
  <name>demo</name> <!-- domain name -->
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch="x86_64" machine="q35">hvm</type>
    <!-- 这里可以将 iso 镜像文件挂载到文件系统,填写对应的 kernel 和 initrd 路径 -->
    <kernel>/path/to/vmlinuz</kernel>
    <initrd>/path/to/initrd.gz</initrd>
    <cmdline>console=tty0 console=ttyS0,ttyS0,115200 serial</cmdline>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode="host-passthrough">
    <cache mode="passthrough"/>
  </cpu>
  <clock offset="utc">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
  </clock>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="file" device="disk">
      <driver name="qemu" type="qcow2" cache="writeback" io="threads"/>
      <source file="/path/to/demo.qcow2"/>
      <target dev="vda" bus="virtio"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/path/to/???.iso"/>
      <target dev="sda" bus="sata"/>
      <readonly/>
    </disk>
    <interface type="network">
      <source network="defualt"/>
      <mac address="e4:91:17:b3:8f:ba"/>
      <model type="virtio"/>
    </interface>
    <console type="pty"/>
    <input type="tablet" bus="usb"/>
    <!-- 启用 vnc -->
    <graphics type="vnc" port="5900" listen="0.0.0.0" passwd="123456"/>
    <video>
      <model type="vga"/>
    </video>
    <memballoon model="virtio"/>
  </devices>
  <!--
  <on_reboot>destroy</on_reboot>
  -->
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
</domain>
sh
# 创建 vm
$ virsh create domain.xml
$ virsh list --all
$ virsh shutdown <domain-name>
$ virsh destroy <domain-name>
$ virsh start <domain-name>
$ virsh edit <domain-name>
$ virsh undefine <domain-name>

connect

VNC<graphics type="vnc" port="5900" listen="0.0.0.0" passwd="123456"/> 将 guest host 的 VNC 服务端口挂在宿主机上。

使用 TightVNC 工具访问宿主机 ip:port 可以对 guest host 进行交互操作,完成系统安装。

另外,jar 包的方式通过Java JDK 执行 jar 包,启动 VNC 客端窗口访问 VNC 服务端。

console

sh
# 启用字符终端
# --cdrom /path/to/???.iso
# 改为
# --location /path/to/???.iso \
# --extra-args="console=tty0 console=ttyS0,115200n8"

$ virsh console <domain-name>

os 安装完成后,可以通过virsh edit <domain> 修改启动项。或者删除 domain 修改 xml 文件启动项再重新创建domain

Ref

https://wiki.archlinuxcn.org/wiki/Libvirt

https://libvirt.org/formatdomain.htm

https://linux.vbird.org/linux_server/rocky9/0130vmtuning.php

virsh

https://www.cnblogs.com/qiuhom-1874/p/13508231.html

https://www.cnblogs.com/88223100/p/KVM_QEMU_qemu-kvm_libvirt.html

virt-install

https://www.cnblogs.com/saryli/p/11827903.html

kubernetes

https://geekhour.net/2023/12/23/kubernetes/

bridge-utils, iproute2

https://blogs.92ac.cn/2025/01/08/network/Linux bridge配置工具介绍:bridge-utils与iproute2/

debian-ce

https://mirrors.cqupt.edu.cn/debian-cd/

pty

https://www.cnblogs.com/sparkdev/p/11605804.html

KVM

https://cloud-atlas.readthedocs.io/zh-cn/latest/kvm/index.html

https://adoyle.me/Today-I-Learned/vm/kvm.html