虚拟硬件
虚拟硬件¶
一台虚拟机,除CPU、内存、磁盘、网络外,还包括主板、BIOS/UEFI固件、声卡、显示适配器、输入设备(键盘、鼠标、USB)、ACPI、TPM安全模块等。 其中,主板、BIOS/UEFI固件属于设备无关(与具体的物理设备相对独立)的硬件。而诸如CPU、内存、磁盘、网络适配器、声卡、显示适配器等则是与设备相关的硬件,因为它们在虚拟化环境中虽然模拟了物理设备的功能, 但其性能表现会受到宿主机实际物理设备配置的影响。
BIOS/UEFI¶
默认,所有虚拟机都使用
BIOS进行引导。在需要使用UEFI引导场景下,可以通过spec.firmware.bootloader设置值来利用UEFI进行引导,例如:-apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-ubuntu01-bootdisk namespace: default spec: storageClassName: "ceph-hdd-block" volumeMode: Block accessModes: - ReadWriteMany dataSource: kind: PersistentVolumeClaim name: img-ubuntu2204 resources: requests: storage: 10Gi --- apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: vm-ubuntu01 namespace: default spec: running: true template: metadata: labels: kubevirt.io/size: small kubevirt.io/domain: vm-ubuntu01 #annotations: # ovn.kubernetes.io/ip_address: 12.244.10.203 spec: dnsConfig: # 自定义dns配置 nameservers: - 1.1.1.1 - 2.1.1.1 dnsPolicy: "None" domain: cpu: cores: 1 model: host-passthrough memory: guest: 2Gi devices: rng: {} disks: - name: root-disk disk: bus: virtio - name: cloudinitdisk disk: bus: virtio interfaces: - name: default masquerade: {} features: smm: enabled: true firmware: uuid: 04829306-4293-4271-8d44-02d12398d012 serial: 12345678-serial1234 bootloader: efi: secureBoot: true resources: requests: memory: 2048M networks: - name: default pod: {} volumes: - name: root-disk persistentVolumeClaim: claimName: pvc-ubuntu01-bootdisk - name: cloudinitdisk cloudInitConfigDrive: userData: |- #cloud-config hostname: vm-ubuntu01 ssh_pwauth: True disable_root: False timezone: Asia/Shanghai password: 123456 chpasswd: {"list":"root:12345678",expire: False} bootcmd: - setenforce 0 - sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config runcmd: - sed -i "/PermitRootLogin/s/^.*$/PermitRootLogin yes/g" /etc/ssh/sshd_config - systemctl restart sshd.service #- echo root:12345678 |chpasswdsmm默认不开启 -bootloader默认为bios,需手工指定为efi-uuid可以手工指定,但值必须是一个uuid,可以通过uuidgen命令生成。如若不是uuid,则virt-launcher pod会报virError(Code=35, Domain=20, Message='malformed <sysinfo> uuid element')","timestamp":"2024-02-16T09:23:06.664568Z","uid":"abfc7ee9-d775-4738-836e-e1e34f991242"}-serial需要手工指定。 - 可在虚拟机中可通过dmidecode可查看到uuid和serial
注意 在KubeVirt中,如果启用了EFI(统一可扩展固件接口),那么Secure Boot功能也会默认启用。Secure Boot 是一种安全启动机制,可以防止未经授权的引导程序加载,从而保护操作系统免受恶意软件攻击。
然而,若在efi配置部分下的secureBoot 字段被显式设置为 false,则即使启用了 EFI,也不会启用Secure Boot功能。
另外需要注意的是,Secure Boot功能本身要求CPU支持SMM(System Management Mode,系统管理模式)这一特性,并且出于安全原因,SMM默认不启用。
开启UEFI引导模式时,不仅需要kubevirt支持UEFI启动功能,还需要使用的虚拟机镜像支持UEFI引导。也就是说我们下载的虚拟机镜像应包含适用于UEFI的引导加载程序。
测试发现镜像 CentOS-7-x86_64-GenericCloud.qcow2 不支持UEFI,而镜像 ubuntu-22.04-server-cloudimg-amd64.img 支持UEFI
虚拟机支持的CPU型号¶
CPU可用型号列表 , CPU型号区分大小写。
指定为host-model可以获得最接近所在宿主机的CPU型号。默认不指定时为host-model; 指定为host-passthrough可以获得与所在宿主机相同的CPU。
一般生产环境用的是host-passthrough或者host-model,基本不会到 CPU可用型号列表 中去找一个型号来用。
虚拟机硬件时钟¶
在kubevirt中,可以通过spec.domain.clock字段来设置虚拟机的硬件时钟,支持utc和timezone
- utc,表示硬件时钟为UTC时区
utc还可以设置offsetSeconds,这样配置后,虚拟机内部的时间将会比标准的协调世界时间(UTC)快8小时
也可以设置成UTC-8,即比UTC慢8小时。- timezone,表示虚拟机的硬件时钟使用指定的时区,如
timezone: Asia/Shanghai
计时器(Timers)¶
kubevirt支持设置5种计时器:
- hpet(High Precision Event Timer,高精度事件计时器,简称 HPET):是一种现代计算机硬件中普遍采用的定时器技术,它提供了多个可编程、周期性中断的定时器。
- pit(Programmable Interval Timer,可编程的间隔定时器,简称 PIT):这是一种早期的硬件定时器,在传统的个人计算机中广泛使用,用于提供周期性的中断信号。在虚拟化环境如 KVM 中,PIT 被模拟以支持旧版操作系统或应用程序,它能够为虚拟机提供基本的时间和延时服务。
- rtc(Real-Time Clock):实时时钟是一种即使在主机断电后也能继续维持时间信息的硬件组件。在虚拟化环境下,RTC 也被模拟出来,以便虚拟机可以拥有独立且准确的系统时间,并能够在宿主机重启后恢复正确的时间状态。
- kvm: 在 KVM(Kernel-based Virtual Machine)虚拟化技术中,KVM 提供了一种基于内核的高效、精确的计时机制。KVM 可能会利用主机 CPU 的高级特性(如 TSC 或 HPET)来提供高度精确的虚拟计时器,从而提升虚拟机的性能和时间精度。
- hyperv: Hyper-V 是微软开发的虚拟化平台,它也有自己的计时器实现。Hyper-V 使用的是合成计时器(Synthetic Timers),它可以提供比传统 PIT 更精确的计时服务,并且优化了在虚拟化环境下的中断管理和同步。在 Hyper-V 虚拟机中,这种计时器对于保证虚拟机内部操作系统的时间准确性和实时性至关重要。
spec:
domain:
clock:
utc: {}
# here are the timer
timer:
hpet:
present: false
pit:
tickPolicy: delay
rtc:
tickPolicy: catchup
hyperv: {}
随机数生成器(RNG)¶
在某些情况下,我们可能希望在虚拟机内部使用由集群节点收集的熵(Entropy)。KubeVirt 允许向虚拟机添加一个 virtio 随机数生成器设备,配置如下:
对于Linux客户机操作系统,在启动过程中应尽早加载 virtio-rng 内核模块,以便能够访问熵源。其他操作系统或用户负载可能也需要进行类似的调整以配合 virtio RNG 设备工作。注意:某些客户机操作系统或用户应用载荷可能要求 RNG 设备提供足够的熵,并且如果没有该设备可能会导致无法正常启动。例如,较新的内核版本(如Fedora中的 4.16.4+)可能需要存在 virtio RNG 设备才能成功引导至登录界面。 因此,在创建虚拟机实例时,确保正确配置和启用 RNG 设备对某些系统来说是至关重要的。
非Linux客户机系统的虚拟化特性¶
KubeVirt支持一系列虚拟化特性,这些特性可以通过调整来确保非Linux 客户机操作系统能够正确启动,例如:
spec:
domain:
# typical features
features:
acpi: {}
apic: {}
hyperv:
relaxed: {}
vapic: {}
spinlocks:
spinlocks: 8191
apic (Advanced Programmable Interrupt Controller): 表示启用高级可编程中断控制器(APIC)。在现代多处理器环境中,APIC 负责处理中断请求并提高系统的中断处理能力。在虚拟化环境下,为来宾操作系统提供 APIC 支持有助于其更有效地管理中断和多核处理器间的通信。
hyperv: 这一组特定于 Hyper-V 的功能优化,旨在提高运行在 KVM 上但针对 Hyper-V 平台优化过的来宾操作系统的兼容性和性能。其中包括几个子特性:
relaxed: 它允许虚拟机监控器(如 KVM)对某些 CPU 特性采取更为宽松的模拟策略,从而改善 Hyper-V 兼容性,并可能提高性能。
vapic: 表示启用虚拟 APIC(Virtual APIC),这有助于在虚拟化环境中实现精确的时间中断和更好的中断路由,特别是在 Windows 虚拟机上。
spinlocks: spinlocks 参数是 Hyper-V 特定的一个优化设置,它控制虚拟机内核可以使用的自旋锁数量。自旋锁是一种同步机制,当资源被占用时,CPU会循环等待直到该资源变为可用。 数值 8191 表示最多允许 8191 个并发自旋锁,这对于避免在高度并发情况下因自旋锁限制而导致的性能瓶颈至关重要,尤其是在高负载或实时性要求较高的系统中。