跳转至

虚拟硬件

虚拟硬件

一台虚拟机,除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 |chpasswd
- smm默认不开启 - 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可查看到uuidserial

注意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字段来设置虚拟机的硬件时钟,支持utctimezone - utc,表示硬件时钟为UTC时区

    spec:
      domain:
        clock:
          utc: {}
utc还可以设置offsetSeconds,这样配置后,虚拟机内部的时间将会比标准的协调世界时间(UTC)快8小时
    spec:
      domain:
        clock:
          utc: 
            offsetSeconds: 28800 # 8 hours * 3600 seconds/hour
也可以设置成UTC-8,即比UTC慢8小时。
    spec:
      domain:
        clock:
          utc: 
            offsetSeconds: -28800 # 8 hours * 3600 seconds/hour

  • timezone,表示虚拟机的硬件时钟使用指定的时区,如timezone: Asia/Shanghai
        spec:
          domain:
            clock:
              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: {}
这些计时器在虚拟化环境中都是为了确保虚拟机有准确、可预测并且与物理世界时间同步的计时服务,同时也考虑到了不同场景下对性能和兼容性的需求。不过在实际使用中,主要还是在Windows系统中去设置计时器,可以参考官文档提供的一些偏好设置。Linux系统一般不用去设置。

随机数生成器(RNG)

在某些情况下,我们可能希望在虚拟机内部使用由集群节点收集的熵(Entropy)。KubeVirt 允许向虚拟机添加一个 virtio 随机数生成器设备,配置如下:

    spec:
      domain:
        devices:
          rng: {}
对于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
上面虚拟化特性含义如下: acpi (Advanced Configuration and Power Interface): 这是一个特性标志,表示启用 ACPI(高级配置与电源接口)支持。在虚拟机中启用 ACPI 允许操作系统识别和管理硬件资源以及执行电源管理操作。

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 个并发自旋锁,这对于避免在高度并发情况下因自旋锁限制而导致的性能瓶颈至关重要,尤其是在高负载或实时性要求较高的系统中。