Basics
用来管理不同的hypervisor的库,virsh(命令行)与virt-manager(GUI)都是调用的这个api。
virsh 常用命令
virsh list --all #check all vms
virsh start rh8-vm01
virsh shutdown rh8-vm01
virsh reboot rh8-vm01
virsh reset rh8-vm01
virsh dumpxml rh8-vm01 #export xml
virsh domifaddr rh8-vm01 #check net status
virsh edit rh8-vm01 #edit xml
virt-install 常用命令
virt-install --cdrom ~/Fedora-Workstation-Live-x86_64-37-1.7.iso # 新建虚拟机
virt-install --disk ~/fdsdfsa.qcow2 --import # 导入已有的虚拟机
virt-viewer machinename # 可视化查看某个虚拟机
非ubuntu可能需要sudo运行,或者添加环境变量
export LIBVIRT_DEFAULT_URI=qemu:///systemserverfault.com/questions/8…
Debug kernal with virt-manager
enable gdb port
virsh edit kvmname, then change <domain type='kvm'> to the following
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-s'/>
</qemu:commandline>
or (debug your own port)
<qemu:commandline>
<qemu:arg value='-gdb'/>
<qemu:arg value='tcp::1236'/>
</qemu:commandline>
Reference: mhcerri.github.io/posts/debug…
enable terminal output
- enable ttyS0
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service
2. output to ttyS0
GRUB_CMDLINE_LINUX_DEFAULT="nokaslr console=tty0 console=ttyS0 ignore_loglevel"
GRUB_TERMINAL="serial console"
update-grub
ignore_loglevelis to print all level info.debugmaybe needed (not sure)
- connect it
virsh console kvmname
Reference: serverfault.com/questions/3… docs.kernel.org/admin-guide…
config CPU
libvirt.org/formatdomai… vcpu 定义了分配给虚拟机的最大数量,可选以下的属性。
- cpuset,可以指定使用哪些cpu,甚至后面可以使用cputune属性进行逐个指定
- current,代表当前启用的cpu的数量,应该小于最大的数量
- placement, 默认static,如果设置为auto,所有vcpu的设置将被忽略。
vcpus 可以进行更加细致的控制每个vcpu的属性。
- id
- enable 是否禁用,这里面启用的数量要与current保持一致,否则保存时,也会一致的。
- hotpluggable 所有disable的cpu必须为true
- order cpu加入系统的顺序
cputune 每个vcpu的调优
- vcpuin 将某个vcpu绑定到host的core
red hat 建议选择Single core,Single Thread与不同数量的socket来达到最大的performance. qemu支持 overcommit, 虚拟的cpu/内存超过物理机的容量。 cpu-pm=on|off 让guest直接控制cpu power state, 对于guest vcpu会加速,但是对其他的guest machine就不友好。
还有其他的优化,例如 iothreads,mem-lock=on, apic的优化
如下执行cpu的1:1 映射
<vcpu placement="static">32</vcpu>
<cputune>
<vcpupin vcpu="0" cpuset="0"/>
<vcpupin vcpu="1" cpuset="1"/>
<vcpupin vcpu="2" cpuset="2"/>
<vcpupin vcpu="3" cpuset="3"/>
<vcpupin vcpu="4" cpuset="4"/>
<vcpupin vcpu="5" cpuset="5"/>
<vcpupin vcpu="6" cpuset="6"/>
<vcpupin vcpu="7" cpuset="7"/>
<vcpupin vcpu="8" cpuset="8"/>
<vcpupin vcpu="9" cpuset="9"/>
<vcpupin vcpu="10" cpuset="10"/>
<vcpupin vcpu="11" cpuset="11"/>
<vcpupin vcpu="12" cpuset="12"/>
<vcpupin vcpu="13" cpuset="13"/>
<vcpupin vcpu="14" cpuset="14"/>
<vcpupin vcpu="15" cpuset="15"/>
<vcpupin vcpu="16" cpuset="16"/>
<vcpupin vcpu="17" cpuset="17"/>
<vcpupin vcpu="18" cpuset="18"/>
<vcpupin vcpu="19" cpuset="19"/>
<vcpupin vcpu="20" cpuset="20"/>
<vcpupin vcpu="21" cpuset="21"/>
<vcpupin vcpu="22" cpuset="22"/>
<vcpupin vcpu="23" cpuset="23"/>
<vcpupin vcpu="24" cpuset="24"/>
<vcpupin vcpu="25" cpuset="25"/>
<vcpupin vcpu="26" cpuset="26"/>
<vcpupin vcpu="27" cpuset="27"/>
<vcpupin vcpu="28" cpuset="28"/>
<vcpupin vcpu="29" cpuset="29"/>
<vcpupin vcpu="30" cpuset="30"/>
<vcpupin vcpu="31" cpuset="31"/>
</cputune>