KVM
安装
$ 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
环境检查
# 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
网络
$ 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
<!-- 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
磁盘文件
$ qemu-img create -f qcow2 -o cluster_size=2M demo.qcow2 30G
$ qemu-img info demo.qcow2
domain
# 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 文件后仍需要手动修改。下列为一个示例。
<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>
# 创建 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
# 启用字符终端
# --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