10. Qemu / KVM虚拟机

Qemu(Quick Emulator的缩写)是一个模拟物理计算机的开源虚拟机管理程序。从运行Qemu的主机系统的角度来看,Qemu是一个用户程序,可以访问许多本地资源,例如分区,文件,网卡,然后将这些资源传递给模拟计算机,该计算机将它们视为真实设备。 。

在仿真计算机上运行的来宾操作系统访问这些设备,并在真实硬件上运行。例如,您可以将iso映像作为参数传递给Qemu,并且在仿真计算机上运行的OS会在CD驱动器中看到真正的CDROM。

Qemu可以仿真从ARM到Sparc的各种硬件,但是Proxmox VE仅涉及32位和64位PC克隆仿真,因为它代表了绝大多数服务器硬件。由于具有处理器扩展功能,因此PC克隆的仿真也是最快的仿真之一,当仿真架构与主机架构相同时,它们可以大大加快Qemu的速度。

 

有时您可能会遇到KVM(基于内核的虚拟机)一词。这意味着Qemu通过Linux kvm模块在虚拟化处理器扩展的支持下运行。在Proxmox VE的上下文中,Qemu和 KVM可以互换使用,因为Proxmox VE中的Qemu将始终尝试加载kvm模块。

Proxmox VE内的Qemu作为根进程运行,因为这是访问块和PCI设备所必需的。

10.1。仿真设备和半虚拟设备

Qemu模拟的PC硬件包括主板,网络控制器,scsi,ide和sata控制器,串行端口(完整列表请参见kvm(1)手册页),所有这些均在软件中模拟。所有这些设备都是与现有硬件设备完全等效的软件,并且如果在来宾中运行的OS具有正确的驱动程序,它将像在真实硬件上运行一样使用这些设备。这使Qemu可以运行未修改的操作系统。

但是,这会降低性能,因为在软件中运行原本希望在硬件中运行会为主机CPU带来很多额外的工作。为了缓解这种情况,Qemu可以向来宾操作系统提供半虚拟化设备,来宾OS会在其中识别出它正在Qemu内部运行并与虚拟机管理程序合作。

Qemu依靠virtio虚拟化标准,因此能够展示半虚拟化的virtio设备,其中包括半虚拟化的通用磁盘控制器,半虚拟化的网卡,半虚拟化的串行端口,半虚拟化的SCSI控制器等。

强烈建议您尽可能使用virtio设备,因为它们可以显着提高性能。使用bonnie ++(8)衡量,使用virtio通用磁盘控制器与仿真IDE控制器相比,顺序写入吞吐量将翻倍。使用iperf(1)进行测量,使用virtio网络接口可以提供高达模拟Intel E1000网卡吞吐量的三倍。[ 21 ]

10.2。虚拟机设置

一般来说,Proxmox VE会尝试为虚拟机(VM)选择合理的默认设置。确保您了解所更改设置的含义,因为这可能会导致性能下降或使数据面临风险。

10.2.1。通用设置

VM的常规设置包括

  • 节点:在物理服务器上虚拟机将运行
  • VM ID:本Proxmox一个唯一的编号VE安装用于识别您的VM
  • 名称:可用于描述虚拟机的自由格式文本字符串
  • 资源池:VM的逻辑组

10.2.2。操作系统设置

创建虚拟机(VM)时,设置适当的操作系统(OS)可使Proxmox VE优化一些底层参数。例如,Windows操作系统期望BIOS时钟使用本地时间,而基于Unix的操作系统期望BIOS时钟具有UTC时间。

10.2.3。系统设置

创建VM时,您可以更改新VM的一些基本系统组件。您可以指定要使用的显示类型。

此外,可以更改SCSI控制器。如果您打算安装QEMU Guest Agent,或者您选择的ISO映像已经发货并自动安装,则可能需要在Qemu Agent框内打钩,这将使Proxmox VE知道它可以使用其功能来显示更多信息,并更智能地完成一些操作(例如,关机或快照)。

Proxmox VE可以引导具有不同固件和机器类型(即 SeaBIOS和OVMF)的VM。在大多数情况下,仅当您计划使用PCIe直通时,才希望从默认的SeabBIOS切换到OVMF 。VM 机器类型定义VM的虚拟主板的硬件布局。您可以在默认的Intel 440FX或 Q35 芯片组之间进行选择,后者也提供虚拟PCIe总线,因此如果希望通过PCIe硬件,则可能需要这样做。

10.2.4。硬盘

Qemu可以模拟许多存储控制器:

  • IDE控制器,有一个设计可以追溯到1984年的PC / AT磁盘控制器。即使此控制器已被最近的设计所取代,您可以想到的每个操作系统都支持该控制器,如果您要运行2003年之前发布的操作系统,则它是一个不错的选择。您最多可以在该控制器上连接4个设备。 。
  • 始于 2003年 的SATA(串行ATA)控制器采用更现代的设计,可提供更高的吞吐量和更多的设备连接。您最多可以在此控制器上连接6个设备。
  • SCSI控制器,在1985年设计的,在服务器级硬件通常发现,并且最多可连接14个存储装置。Proxmox VE默认情况下模拟LSI 53C895A控制器。

如果您追求性能,建议使用VirtIO SCSI类型的SCSI控制器,并从Proxmox VE 4.3开始为新创建的Linux VM自动选择一个SCSI控制器。从2012年开始,Linux发行版就对此控制器提供了支持,从2014年以来,Linux发行版就已经支持FreeBSD。对于Windows操作系统,在安装过程中需要提供包含驱动程序的额外iso。如果要达到最佳性能,则可以选择VirtIO SCSI single类型的SCSI控制器,该控制器 将允许您选择IO Thread选项。选择VirtIO SCSI时,单个 Qemu将为每个磁盘创建一个新的控制器,而不是将所有磁盘添加到同一控制器。

  • Virtio控制器,通常被叫做为Virtio或已将virtio-BLK,都是老式的半虚拟化控制器。就功能而言,已被VirtIO SCSI控制器取代。

在每个控制器上,您将连接许多模拟的硬盘,这些硬盘由位于已配置存储中的文件或块设备支持。存储类型的选择将确定硬盘映像的格式。提供块设备(LVM,ZFS,Ceph)的存储将需要原始磁盘映像格式,而基于文件的存储(Ext4,NFS,CIFS,GlusterFS)将允许您选择原始磁盘映像格式QEMU映像格式

  • QEMU图像格式是上写格式的副本,其允许快照,以及磁盘映像的精简配置。
  • 原始磁盘映像是硬盘,类似于执行时,你会得到什么样的位,以位图像DD在Linux的块设备上的命令。此格式本身不支持自动精简配置或快照,因此需要来自存储层的协作才能完成这些任务。但是,它可能比QEMU图像格式快10%。[ 22 ]
  • 仅当您打算将磁盘映像导入/导出到其他虚拟机管理程序时 ,VMware映像格式才有意义。

设置硬盘驱动器的缓存模式将影响主机系统如何将块写入完成通知来宾系统。“ 默认”为“ 无缓存,这意味着当每个块到达物理存储写入队列时,将忽略主机页缓存,从而通知来宾系统写入已完成。这在安全性和速度之间提供了良好的平衡。

如果希望Proxmox VE备份管理器在执行VM备份时跳过磁盘,则可以在该磁盘上设置“ 无备份选项。

如果希望Proxmox VE存储复制机制在开始复制作业时跳过磁盘,则可以在该磁盘上设置“ 跳过复制选项。从Proxmox VE 5.0开始,复制要求磁盘映像位于zfspool类型的存储上 ,因此,在VM已配置复制时,将磁盘映像添加到其他存储中需要跳过对此磁盘映像的复制。

如果您的存储支持精简配置(请参阅Proxmox VE指南中的存储一章),则可以激活驱动器上的“ 丢弃选项。与丢弃 集合和TRIM -启用客户OS [ 23 ]中,当虚拟机的文件系统的标记块作为删除文件后未使用的,控制器将此信息中继到存储,然后将相应地缩小磁盘映像。为了使来宾能够发出TRIM命令,您必须使用 VirtIO SCSI(或VirtIO SCSI Single)控制器或 在驱动器上设置SSD仿真选项。请注意,舍弃不支持VirtIO 驱动器。

如果希望将驱动器作为固态驱动器而不是旋转硬盘提供给客户机,则可以在该驱动器上设置SSD仿真选项。不需要底层存储实际上由SSD支持。此功能可与任何类型的物理介质一起使用。请注意,VirtIO Block驱动器不支持SSD仿真

IO线程

仅当模拟控制器类型为VirtIO SCSI single时,才可以将选件IO线程与 VirtIO控制器或SCSI控制器 一起使用。启用此功能后,Qemu为每个存储控制器创建一个I / O线程,而不是为所有I / O创建一个线程,因此当使用多个磁盘且每个磁盘都有自己的存储控制器时,Qemu可以提高性能。请注意,备份当前无法在启用IO线程的情况下使用

10.2.5。中央处理器

一个CPU插座是PC主板,你可以插入一个CPU上的物理插槽。然后,该CPU可以包含一个或多个内核,它们是独立的处理单元。从性能的角度来看,您是拥有4个核心的单个CPU插槽还是拥有两个核心的两个CPU插槽都是无关紧要的。但是,某些软件许可证取决于计算机具有的插槽数量,在这种情况下,将插槽数量设置为许可证允许的数量是有意义的。

尽管增加虚拟cpus(核心和套接字)的数量在很大程度上取决于VM的使用,但通常可以提高性能。当然,多线程应用程序将受益于大量的虚拟CPU,因为您添加的每个虚拟CPU,Qemu都会在主机系统上创建一个新的执行线程。如果您不确定VM的工作负载,通常可以将Total Core数设置为2 是一个安全的选择。

 

如果所有VM的内核总数大于服务器上的内核数目(例如,只有8个内核的计算机上有4个VM,而每个4个内核),则是绝对安全的。在这种情况下,主机系统将平衡服务器核心之间的Qemu执行线程,就像运行标准多线程应用程序一样。但是,Proxmox VE会阻止您分配比实际可用的虚拟CPU内核更多的虚拟CPU内核,因为这只会由于上下文切换的成本而降低性能。

资源限制

除了虚拟核心数之外,您还可以配置与主机CPU时间以及其他VM相关的VM可以获取多少资源。使用cpulimit(“主机CPU时间”)选项,您可以限制整个VM在主机上可以使用的CPU时间。它是一个浮点值,以百分比表示CPU时间,因此1.0等于100%,2.5到250%等。如果单个进程将完全使用一个内核,则它将有100%的 CPU时间使用率。如果具有四个核心的虚拟机充分利用其所有核心,则理论上将使用 400%。实际上,使用率可能更高,因为Qemu除了vCPU核心外,还可以为VM外设提供其他线程。如果虚拟机应具有多个vCPU(因为它并行运行几个进程),则此设置很有用,但作为一个整体,虚拟机不能同时运行所有vCPU的100%。举一个具体的例子:假设我们有一个虚拟机,它可以从拥有8个vCPU中获利,但是这8个内核中的任何一个都不应该在满负载下运行-因为这会使服务器超负荷,其他VM和CT会进入更少的CPU。因此,我们将cpulimit限制设置为 4.0(= 400%)。如果所有内核都执行相同的繁重工作,则它们都将获得真实主机内核CPU时间的50%。但是,如果只有4个可以工作,那么每个人仍然可以获得几乎100%的真实内核。

 

VM可以根据其配置使用其他线程,例如用于网络或IO操作,以及实时迁移。因此,VM可能会使用比其虚拟CPU可以使用的更多的CPU时间。为确保VM永远不会使用比分配的虚拟CPU多的CPU时间,请将cpulimit设置设置为与核心总数相同的值。

第二个CPU资源限制设置cpuunits(现在通常称为CPU份额或CPU重量)控制一个VM相对于其他VM的运行获得的CPU时间。它是一个默认的相对权重,默认值为1024,如果您为虚拟机增加此权重,则与其他权重较低的虚拟机相比,调度程序将优先权。例如,如果VM 100已将默认值设置为1024,并且VM 200更改为2048,则后一个VM 200的CPU带宽将是第一个VM 100的两倍。

有关更多信息,请参见man systemd.resource-control,此处CPUQuota 对应于cpulimit,而CPUShares对应于我们的cpuunits 设置,请访问其Notes部分以获取参考和实现细节。

CPU类型

Qemu可以模拟从486到最新Xeon处理器的多种CPU类型。每一代新处理器都会添加新功能,例如硬件辅助3d渲染,随机数生成,内存保护等…通常,您应该为VM选择与主机系统CPU紧密匹配的处理器类型,因为这意味着主机CPU 虚拟机中将提供功能(也称为CPU标志)。如果需要完全匹配,可以将CPU类型设置为主机,在这种情况下,VM将具有与主机系统完全相同的CPU标志。

这有一个缺点。如果要在不同主机之间进行VM的实时迁移,则VM可能最终以具有不同CPU类型的新系统结束。如果传递给客户机的CPU标志丢失,则qemu进程将停止。为了解决这个问题,Qemu还拥有自己的CPU类型kvm64,Proxmox VE默认使用该类型。kvm64是奔腾4外观类似于CPU的类型,其CPU标志的设置减少了,但保证可以在任何地方使用。

简而言之,如果您关心实时迁移和在节点之间移动VM,请将kvm64保留为默认值。如果您不关心实时迁移或具有所有节点具有相同CPU的同质集群,请将CPU类型设置为主机,因为从理论上讲,这将为来宾提供最佳性能。

崩溃/幽灵相关的CPU标志

与Meltdown和Spectre漏洞[ 24 ]相关的多个CPU标志 需要手动设置,除非您的VM的所选CPU类型默认已启用它们。

要使用这些CPU标志,需要满足两个要求:

  • 主机CPU必须支持该功能并将其传播到来宾的虚拟CPU
  • 来宾操作系统必须更新为可以缓解攻击并能够利用CPU功能的版本

否则,您需要通过在WebUI中编辑CPU选项或通过在VM配置文件中设置cpu选项的flags属性 来设置虚拟CPU的所需CPU标志。

对于Spectre v1,v2,v4修复程序,您的CPU或系统供应商还需要为CPU提供所谓的“微码更新” [ 25 ] 。

要检查Proxmox VE主机是否容易受到攻击,请以root用户身份执行以下命令:

对于/ sys / devices / system / cpu / vulnerabilities / *中的f;做echo“ $ {f ## * /}-” $(cat“ $ f”); 完成

还可以使用社区脚本来检测主机是否仍然容易受到攻击。 [ 26 ]

英特尔处理器

  • pcid

这减少了称为内核页表隔离(KPTI的Meltdown(CVE-2017-5754)缓解措施对性能的影响,该漏洞有效地将内核内存隐藏在用户空间中。没有PCID,KPTI是相当昂贵的机制[ 27 ]。

要检查Proxmox VE主机是否支持PCID,请以root用户身份执行以下命令:

#grep'pcid'/ proc / cpuinfo

如果没有返回空,则主机的CPU支持pcid

  • 规格控制

在补充谱不足的情况下启用Spectre v1(CVE-2017-5753)和Spectre v2(CVE-2017-5715)修复程序所需。默认情况下,带有-IBRS后缀的Intel CPU型号中包括。对于不带-IBRS后缀的Intel CPU型号,必须明确将其打开。需要更新的主机CPU微代码(英特尔微代码> = 20180425)。

  • ssbd

启用S​​pectre V4(CVE-2018-3639)修复程序所需。默认情况下不包含在任何Intel CPU型号中。必须为所有Intel CPU型号显式打开。需要更新的主机CPU微代码(intel-microcode> = 20180703)。

AMD处理器

  • 宜宾

在补充谱不足的情况下启用Spectre v1(CVE-2017-5753)和Spectre v2(CVE-2017-5715)修复程序所需。默认情况下,带有-IBPB后缀的AMD CPU型号中包括。对于不带-IBPB后缀的AMD CPU模型,必须明确将其打开。要求主机CPU微代码支持此功能,然后才能用于来宾CPU。

  • virt-ssbd

启用S​​pectre v4(CVE-2018-3639)修复程序所需。默认情况下不包含在任何AMD CPU型号中。必须为所有AMD CPU型号明确打开。即使已同时提供amd-ssbd,也应将其提供给来宾,以实现最大的来宾兼容性。请注意,在使用“主机” cpu模型时,必须显式启用此功能,因为这是物理CPU中不存在的虚拟功能。

  • amd-ssbd

启用S​​pectre v4(CVE-2018-3639)修复程序所需。默认情况下不包含在任何AMD CPU型号中。必须为所有AMD CPU型号明确打开。与virt-ssbd相比,它提供了更高的性能,因此,支持该功能的主机应始终在可能的情况下将此信息公开给来宾。但是,也应该公开virt-ssbd以获得最大的来宾兼容性,因为某些内核只知道virt-ssbd。

  • amd-no-ssb

建议表明主机不受Spectre V4的攻击(CVE-2018-3639)。默认情况下不包含在任何AMD CPU型号中。下一代的CPU硬件将不会受到CVE-2018-3639的攻击,因此应通过公开amd-no-ssb告知来宾不要启用其缓解措施。这与virt-ssbd和amd-ssbd互斥。

NUMA

您还可以选择在VM中模拟NUMA [ 28 ]架构。NUMA体系结构的基础意味着,内存将分散到每个插槽附近的本地存储区中,而不是为所有内核都使用全局内存池。由于内存总线不再是瓶颈,因此可以提高速度。如果您的系统具有NUMA架构[ 29 ],我们建议激活该选项,因为这将允许在主机系统上正确分配VM资源。热插拔VM中的内核或RAM时也需要此选项。

如果使用NUMA选项,建议将套接字数设置为主机系统的节点数。

vCPU热插拔

现代操作系统引入了在正在运行的系统中热插拔CPU(在一定程度上可热插拔)的功能。虚拟化使我们避免了实际硬件在这种情况下可能引起的许多(物理)问题。尽管如此,这是一个相当新且复杂的功能,因此应将其使用限制在绝对需要的情况下。大多数功能都可以与其他经过良好测试且不太复杂的功能一起复制,请参阅 资源限制。。

在Proxmox VE中,插入的CPU的最大数量始终是cores * sockets。要启动少于此CPU核心总数的VM,可以使用 vpus设置,它表示在VM启动时应插入多少个vCPU。

当前只有Linux才支持此功能,需要的内核版本高于3.10,建议的内核版本高于4.7。

您可以按照以下方式使用udev规则在来宾系统中自动将新CPU设置为在线:

SUBSYSTEM ==“ cpu”,ACTION ==“ add”,TEST ==“ online”,ATTR {online} ==“ 0”,ATTR {online} =“ 1”

下/etc/udev/rules.d/保存此作为结尾的文件.rules。

注意:CPU热删除取决于计算机,并且需要来宾合作。delete命令不能保证实际上确实会删除CPU,通常是使用目标相关机制(例如x86 / amd64上的ACPI)转发给来宾的请求。

10.2.6。记忆

对于每个VM,您可以选择设置固定大小的内存,也可以要求Proxmox VE根据主机当前的RAM使用情况动态分配内存。

固定内存分配

如果将内存和最小内存设置为相同的数量,Proxmox VE只会将您指定的内容分配给VM。

即使使用固定的内存大小,气球设备也会添加到VM,因为它会提供有用的信息,例如guest虚拟机实际使用了多少内存。通常,您应该保持启用气球飞行功能,但是如果要禁用它(例如出于调试目的),只需取消选中“ 气球飞行设备或设置

气球:0

在配置中。

自动内存分配

当将最小内存设置为低于内存时,Proxmox VE将确保您指定的最小数量始终可用于VM,并且如果主机上的RAM使用率低于80%,则会动态地向来宾添加最大内存指定的内存。

当主机的RAM不足时,VM将向主机释放一些内存,如果需要则交换正在运行的进程,并在最后的方法中启动oom killer。主机和来宾之间的内存传递是通过在来宾内部运行的特殊气球内核驱动程序完成的,该驱动程序将从主机获取或释放内存页面。 [ 30 ]

当多个VM使用自动分配功能时,可以设置一个 Shares系数,该系数指示每个VM应该占用的可用主机内存的相对数量。例如,假设您有四个VM,其中三个运行HTTP服务器,最后一个是数据库服务器。要在数据库服务器RAM中缓存更多数据库块,您希望在可用RAM可用时对数据库VM进行优先级排序。为此,您为数据库VM分配了3000个Shares属性,而其他VM的Shares默认设置为1000。主机服务器具有32GB RAM,当前正在使用16GB,剩下32 * 80/100-16 = 9GB RAM分配给虚拟机。数据库VM将获得9 * 3000 /(3000 + 1000 + 1000 + 1000)= 4.5 GB的额外RAM,每个HTTP服务器将获得1.5 GB。

2010年之后发布的所有Linux发行版均包含气球内核驱动程序。对于Windows操作系统,需要手动添加气球驱动程序,这可能会导致客户机速度变慢,因此我们建议您不要在关键系统上使用它。

在为VM分配RAM时,一个好的经验法则是始终为主机保留1GB的RAM。

10.2.7。网络设备

每个VM可以具有许多四种不同类型的网络接口控制器(NIC):

  • Intel E1000是默认设置,它模拟Intel千兆网卡。
  • Virtio半虚拟化的,如果你的目标是获得最大性能NIC应该使用。与所有VirtIO设备一样,来宾OS应已安装正确的驱动程序。
  • 瑞昱8139模拟一个较旧的100 MB / s的网卡,只应模拟旧版操作系统时使用(2002年之前发布)
  • 所述VMXNET3是另一半虚拟化设备,从另一个管理程序导入VM时,才应使用。

Proxmox VE将为每个NIC生成一个随机MAC地址,以便您的VM可在以太网上寻址。

您添加到VM的NIC可以遵循以下两种不同模型之一:

  • 在默认的桥接模式下,每个虚拟NIC都由Tap设备(模拟以太网NIC的软件回送设备)备份到主机上 。此分流设备已添加到网桥,默认为Proxmox VE中的vmbr0。在这种模式下,VM可以直接访问主机所在的以太网LAN。
  • 在备用NAT模式下,每个虚拟NIC仅与Qemu用户网络堆栈进行通信,其中内置的路由器和DHCP服务器可以提供网络访问。此内置DHCP将为专用10.0.2.0/24范围内的地址提供服务。NAT模式比桥接模式要慢得多,只能用于测试。此模式仅可通过CLI或API使用,而不能通过WebUI使用。

通过选择无网络设备,您还可以在创建VM时跳过添加网络设备的操作

多队列

如果使用的是VirtIO驱动程序,则可以选择激活“多 队列选项。此选项允许来宾OS使用多个虚拟CPU处理网络数据包,从而增加了传输的数据包总数。

当将VirtIO驱动程序与Proxmox VE一起使用时,每个NIC网络队列都将传递到主机内核,该队列将由vhost驱动程序产生的内核线程处理。启用此选项后,可以将 每个NIC的多个网络队列传递到主机内核。

使用多队列时,建议将其设置为等于来宾的“总核心数”的值。您还需要使用ethtool命令在VM中设置每个VirtIO NIC上的多用途通道数:

ethtool -L ens1组合X

其中X是VM的vcpus数。

您应注意,将Multiqueue参数设置为大于1的值会随着流量的增加而增加主机和来宾系统上的CPU负载。我们建议仅在VM必须处理大量传入连接时(例如,VM作为路由器,反向代理或忙于长时间轮询的HTTP服务器运行时)设置此选项。

10.2.8。显示

QEMU可以虚拟化几种VGA硬件。一些例子是:

  • 默认值std模拟具有Bochs VBE扩展名的卡。
  • cirrus,这曾经是默认设置,它模拟了一个非常老的硬件模块,并带有所有问题。仅在确实有必要时才使用此显示类型[ 31 ],例如,如果使用Windows XP或更早版本
  • vmware是VMWare SVGA-II兼容的适配器。
  • qxl是QXL半虚拟图形卡。选择此选项还会为VM启用SPICE。

您可以通过设置内存选项来编辑分配给虚拟GPU的内存量。这可以在VM内部实现更高的分辨率,尤其是使用SPICE / QXL时。

由于内存是由显示设备保留的,因此为SPICE选择多监视器模式(例如,双监视器为qxl2)会产生一些影响:

  • Windows为每个监视器都需要一个设备,因此,如果您的操作系统类型是Windows的某个版本,则Proxmox VE会为VM提供每个监视器额外的设备。每个设备都会获得指定的内存量。
  • Linux VM始终可以启用更多虚拟监视器,但是选择多监视器模式会将分配给设备的内存乘以监视器数量。

选择serialX作为显示类型将禁用VGA输出,并将Web控制台重定向到所选的串行端口。 在这种情况下,配置的显示内存设置将被忽略。

10.2.9USB直通

USB直通设备有两种不同类型:

  • 主机USB直通
  • SPICE USB直通

主机USB直通通过为VM提供主机的USB设备来工作。这可以通过供应商和产品ID或主机总线和端口来完成。

供应商/产品ID如下所示:0123abcd,其中0123是供应商的ID,而abcd是产品的ID,这意味着同一台USB设备的两个部件具有相同的ID。

总线/端口如下所示:1-2.3.4,其中1是总线,而2.3.4是端口路径。这代表主机的物理端口(取决于USB控制器的内部顺序)。

如果启动虚拟机时在虚拟机配置中存在设备,但主机中不存在该设备,则虚拟机可以启动而不会出现问题。一旦主机中的设备/端口可用,它就会通过。

 

使用这种USB直通意味着您无法将VM在线移动到另一个主机,因为硬件仅在VM当前所在的主机上可用。

第二种类型的直通是SPICE USB直通。如果使用支持SPICE的客户端,这将很有用。如果将SPICE USB端口添加到VM,则可以从SPICE客户端所在的USB设备直接传递到VM(例如输入设备或硬件加密狗)。

10.2.10BIOSUEFI

为了正确模拟计算机,QEMU需要使用固件。在启动VM时,在通常称为BIOS或(U)EFI的普通PC上将其执行为第一步。它负责执行基本的硬件初始化,并为操作系统的固件和硬件提供接口。默认情况下,QEMU 为此使用SeaBIOS,这是开源的x86 BIOS实现。SeaBIOS是大多数标准设置的不错选择。

但是,在某些情况下,BIOS并不是从中启动的好固件,例如,如果要进行VGA直通。[ 32 ] 在这种情况下,您应该使用OVMF,它是开源UEFI实现。[ 33 ]

如果要使用OVMF,则需要考虑以下几点:

为了保存启动顺序之类的东西,需要有一个EFI磁盘。该磁盘将包含在备份和快照中,并且只能有一个。

您可以使用以下命令创建这样的磁盘:

qm设置<vmid> -efidisk0 <存储>:1,格式= <格式>

其中<storage>是要在其中拥有磁盘的存储,而 <format>是该存储支持的格式。或者,您可以通过Web界面在VM的硬件部分中使用Add → EFI Disk创建此类磁盘。

当将OVMF与虚拟显示器一起使用(无VGA直通)时,您需要在OVMF菜单中设置客户端分辨率(在启动过程中通过按ESC按钮可以达到该分辨率),或者必须选择SPICE作为显示类型。

10.2.11VM间共享内存

您可以添加一个VM间共享内存设备(ivshmem),该设备允许一个主机和来宾之间或多个来宾之间共享内存。

要添加这样的设备,可以使用qm:

qm设置<vmid> -ivshmem size = 32,name = foo

大小以MiB为单位。该文件将位于 / dev / shm / pve-shm- $ name下(默认名称为vmid)。

 

目前,该设备将在使用该设备的任何VM关闭或停止后立即删除。打开的连接仍将保留,但无法再建立与同一设备的新连接。

此类设备的用例是Looking Glass [ 34 ]项目,该项目可实现主机和来宾之间的高性能,低延迟的显示镜像。

10.2.12。自动启动和关闭虚拟机

创建虚拟机后,您可能希望它们在主机系统启动时自动启动。为此,您需要从Web界面中VM 的“ 选项选项卡中选择启动时启动选项,或使用以下命令进行设置:

qm设置<vmid> -onboot 1

启动和关机顺序

在某些情况下,您希望能够微调VM的启动顺序,例如,如果其中一台VM正在为其他来宾系统提供防火墙或DHCP。为此,您可以使用以下参数:

  • 开始/关闭顺序:定义开始顺序的优先级。例如,如果您希望虚拟机首先启动,则将其设置为1。(我们使用反向启动顺序进行关闭,因此启动顺序为1的计算机将是最后关闭的计算机)。如果多个VM在主机上定义的顺序相同,则VMID还将按升序对它们进行排序。
  • 启动延迟:定义此VM启动与后续VM启动之间的间隔。例如,如果要在启动其他VM之前等待240秒,则将其设置为240。
  • 关机超时:以秒为单位定义Proxmox VE在发出关机命令后应等待VM脱机的持续时间。默认情况下,此值设置为180,这意味着Proxmox VE将发出关闭请求,并等待180秒以使计算机脱机。如果超时后机器仍处于在线状态,则将其强行停止。
 

由HA堆栈管理的VM 当前不遵循启动时启动和 启动顺序选项。这些虚拟机将被启动和关闭算法跳过,因为高可用性管理器本身可确保启动和停止虚拟机。

请注意,没有启动/关闭顺序参数的机器将始终在设置了该参数的机器之后启动。此外,只能在同一主机上运行的虚拟机之间强制执行此参数,而不能在群集范围内强制执行此参数。

10.3。移民

如果有群集,则可以使用以下命令将VM迁移到另一台主机

qm迁移<vmid> <target>

通常有两种机制

  • 在线迁移(又名实时迁移)
  • 离线迁移

10.3.1。在线迁移

当您的VM正在运行并且没有定义本地资源(例如本地存储上的磁盘,通过设备传递的等等)时,您可以使用-online标志启动实时迁移。

这个怎么运作

这会使用传入的标志在目标主机上启动Qemu进程,这意味着该进程将启动并等待源虚拟机的内存数据和设备状态(因为所有其他资源(例如磁盘)都是共享的,因此内存内容和设备状态是剩下的唯一要传输的内容)。

建立此连接后,源将开始将内存内容异步发送到目标。如果源上的内存发生更改,这些部分将被标记为脏,并且将再次发送数据。这种情况一直发生,直到要发送的数据量很小到足以暂停源上的VM,将剩余数据发送到目标并在一秒钟内启动目标上的VM为止。

要求

为了使实时迁移正常工作,需要做一些事情:

  • VM没有本地资源(例如,通过设备,本地磁盘等传递)
  • 主机位于同一Proxmox VE群集中。
  • 主机具有有效(且可靠)的网络连接。
  • 目标主机必须具有相同或更高版本的Proxmox VE软件包。(它可能以另一种方式起作用,但是永远不能保证)

10.3.2。离线迁移

如果您具有本地资源,则只要所有磁盘都位于两个主机上都定义的存储上,您仍然可以脱机迁移VM。然后,迁移会将磁盘通过网络复制到目标主机。

10.4。副本和克隆

通常使用操作系统供应商的安装介质(CD-ROM)完成VM的安装。根据操作系统,这可能是一项可能要避免的耗时的工作。

部署许多相同类型的VM的一种简单方法是复制现有VM。我们将术语“ 克隆用于此类副本,并区分 链接克隆和完整克隆。

全克隆

这样复制的结果是一个独立的VM。新的VM不与原始VM共享任何存储资源。

可以选择目标存储,因此可以使用它来将VM迁移到完全不同的存储。您还可以更改磁盘映像格式,如果存储驱动器支持多种格式。

 

完整克隆需要读取和复制所有VM映像数据。这通常比创建链接克隆慢得多。

某些存储类型允许复制特定的Snapshot,该快照默认为当前 VM数据。这也意味着最终副本永远不会包含原始VM的任何其他快照。

链接克隆

现代存储驱动程序支持一种生成快速链接克隆的方法。这样的克隆是可写副本,其初始内容与原始数据相同。创建链接克隆几乎是瞬时的,并且最初不占用额外空间。

之所以称它们为链接的,是因为新图像仍然引用原始图像。从原始图像读取未修改的数据块,但从新位置写入(然后读取)修改。该技术称为写时复制

这要求原始卷是只读的。使用Proxmox VE,可以将任何VM转换为只读Template)。此类模板以后可用于有效创建链接克隆。

 

链接克隆存在时,无法删除原始模板。

无法更改链接克隆的目标存储,因为这是存储内部功能。

目标节点选项,可以在不同的节点上创建新的虚拟机。唯一的限制是VM在共享存储上,并且该存储在目标节点上也可用。

为了避免资源冲突,所有网络接口MAC地址都会随机化,我们会为VM BIOS(smbios1)设置生成一个新的UUID

10.5。虚拟机模板

可以将虚拟机转换为模板。这样的模板是只读的,您可以使用它们创建链接的克隆。

 

无法启动模板,因为这会修改磁盘映像。如果要更改模板,请创建链接的克隆并进行修改。

10.6VM生成ID

Proxmox VE支持虚拟机的虚拟机生成ID(vmgenid)[ 35 ] 。来宾操作系统可以使用它来检测导致时移事件的任何事件,例如还原备份或快照回滚。

创建新的虚拟机时,将自动生成一个vmgenid并将其保存在其配置文件中。

要创建vmgenid并将其添加到已存在的VM,可以传递特殊值'1'来让Proxmox VE自动生成一个值,或通过将其用作值来手动设置UUID [ 36 ],例如:

qm设置VMID -vmgenid 1

qm设置VMID -vmgenid 00000000-0000-0000-0000-000000000000

 

vmgenid设备初始添加到现有VM可能会产生与快照回滚,备份还原等更改相同的效果,因为VM可以将此解释为世代更改。

在极少数情况下,不希望使用vmgenid机制,可以在创建VM时为其值传递“ 0”,或使用以下命令追溯删除配置中的属性:

qm设置VMID-删除vmgenid

vmgenid最突出的用例是较新的Microsoft Windows操作系统,该操作系统使用它来避免快照回滚,备份还原或整个VM克隆操作在时间敏感或复制服务(例如数据库,域控制器 [ 37 ])中出现问题。

10.7。导入虚拟机和磁盘映像

从外部虚拟机管理程序导出的VM通常采用一个或多个磁盘映像的形式,并带有一个描述该VM设置(RAM,内核数)的配置文件。
如果磁盘映像来自VMware或VirtualBox,则磁盘映像可以为vmdk格式;如果磁盘映像来自KVM虚拟机管理程序,则磁盘映像可以为qcow2。VM导出最流行的配置格式是OVF标准,但实际上,互操作性受到限制,因为该标准本身未实现许多设置,并且管理程序以非标准扩展名导出补充信息。

除了格式问题之外,如果模拟的硬件从一个虚拟机监控程序到另一个虚拟机监控程序的变化太大,则从其他虚拟机监控程序导入磁盘映像可能会失败。Windows VM对此特别关注,因为OS对硬件的任何更改都很挑剔。可以通过在导出之前安装Internet上可用的MergeIDE.zip实用程序来解决此问题,并在引导导入的Windows VM之前选择IDE的硬盘类型。

最后,还有一个半虚拟化驱动程序的问题,它提高了仿真系统的速度,并且特定于虚拟机管理程序。GNU / Linux和其他免费的Unix OS默认情况下安装了所有必需的驱动程序,并且您可以在导入VM之后立即切换到半虚拟化的驱动程序。对于Windows VM,您需要自己安装Windows半虚拟化驱动程序。

通常可以轻松导入GNU / Linux和其他免费的Unix。请注意,由于上述问题,我们不能保证在所有情况下都能成功导入/导出Windows VM。

10.7.1Windows OVF导入的分步示例

Microsoft提供了 虚拟机下载 以开始Windows开发。我们将使用其中之一来演示OVF导入功能。

下载虚拟机​​zip

获悉用户协议后,选择适用于VMware平台的Windows 10企业版(评估-生成),然后下载zip。

zip提取磁盘映像

使用unzip实用程序或您选择的任何存档程序,解压缩zip,然后通过ssh / scp将ovf和vmdk文件复制到Proxmox VE主机。

导入虚拟机

这将使用从OVF清单中读取的核心,内存和VM名称创建一个新的虚拟机,并将磁盘导入到本地lvm 存储中。您必须手动配置网络。

qm importovf 999 WinDev1709Eval.ovf本地lvm

准备启动虚拟机。

10.7.2。将外部磁盘映像添加到虚拟机

您也可以将现有磁盘映像添加到VM,该映像既可以来自外部虚拟机管理程序,也可以来自您自己创建的映像。

假设您使用vmdebootstrap工具创建了Debian / Ubuntu磁盘映像:

vmdebootstrap-详细\

--size 10GiB-串行控制台\

--grub --no-extlinux \

--package openssh-server \

--package avahi-daemon \

--package qemu-guest-agent \

--hostname vm600 --enable-dhcp \

--customize =。/ copy_pub_ssh.sh \

--sparse --image vm600.raw

现在,您可以为此映像创建一个新的目标VM。

qm创建600 --net0 virtio,bridge = vmbr0 --name vm600 --serial0套接字\

--bootdisk scsi0 --scsihw virtio-scsi-pci --ostype l26

使用存储pvedir将磁盘映像作为unused0添加到VM :

qm importdisk 600 vm600.raw pvedir

最后,将未使用的磁盘连接到VM的SCSI控制器:

qm设置600 --scsi0 pvedir:600 / vm-600-disk-1.raw

准备启动虚拟机。

10.8。云初始化支持

Cloud-Init是事实上的多分布软件包,用于处理虚拟机实例的早期初始化。使用Cloud-Init,可以在管理程序端配置网络设备和ssh密钥。VM首次启动时,VM内的Cloud-Init软件将应用这些设置。

许多Linux发行版都提供了现成的Cloud-Init映像,这些映像主要是为OpenStack设计的。这些图像也可以与Proxmox VE一起使用。尽管获得此类即用型图像似乎很方便,但我们通常建议您自己准备图像。好处是您将确切知道已安装的内容,这有助于您稍后轻松地根据需要自定义映像。

创建了此类Cloud-Init映像后,我们建议将其转换为VM模板。通过VM模板,您可以快速创建链接克隆,因此这是推出新VM实例的快速方法。在启动新的VM之前,您只需要配置网络(可能还有ssh密钥)。

我们建议使用基于SSH密钥的身份验证来登录Cloud-Init设置的VM。也可以设置密码,但这不如使用基于SSH密钥的身份验证安全,因为Proxmox VE需要在Cloud-Init数据中存储该密码的加密版本。

Proxmox VE生成一个ISO映像,以将Cloud-Init数据传递给VM。为此,所有Cloud-Init VM都需要具有分配的CDROM驱动器。另外,许多Cloud-Init映像都假定具有串行控制台,因此建议添加串行控制台并将其用作这些VM的显示。

10.8.1。准备Cloud-Init模板

第一步是准备您的VM。基本上,您可以使用任何VM。只需将Cloud-Init软件包安装在要准备的VM内。在基于Debian / Ubuntu的系统上,这很简单:

apt-get install cloud-init

已经有许多发行版提供了即用型Cloud-Init映像(以.qcow2文件形式提供),因此,您也可以简单地下载和导入此类映像。对于以下示例,我们将使用Ubuntu提供的云映像,网址为https://cloud-images.ubuntu.com。

#下载图片

wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

#创建一个新的VM

qm创建9000-内存2048 --net0 virtio,bridge = vmbr0

#将下载的磁盘导入本地lvm存储

qm importdisk 9000仿生服务器-cloudimg-amd64.img本地-lvm

#最终将新磁盘作为scsi驱动器附加到VM

qm设置9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1

 

Ubuntu Cloud-Init映像要求 SCSI驱动器使用virtio-scsi-pci控制器类型。

添加Cloud-Init CDROM驱动器

下一步是配置CDROM驱动器,该驱动器用于将Cloud-Init数据传递到VM。

qm设置9000 --ide2 local-lvm:cloudinit

为了能够直接从Cloud-Init映像引导,请将bootdisk参数设置 为scsi0,并将BIOS限制为仅从磁盘引导。这将加快启动速度,因为VM BIOS跳过了对可启动CDROM的测试。

qm设置9000 --boot c --bootdisk scsi0

还要配置一个串行控制台并将其用作显示器。许多Cloud-Init映像都依赖于此,因为这是OpenStack映像的要求。

qm设置9000 --serial0套接字--vga serial0

在最后一步中,将VM转换为模板会很有帮助。然后,您可以从此模板快速创建链接的克隆。通过VM模板进行部署比创建完整克隆(副本)要快得多。

qm模板9000

10.8.2。部署Cloud-Init模板

您可以通过克隆轻松部署这样的模板:

qm clone 9000 123-名称ubuntu2

然后配置用于身份验证的SSH公钥,并配置IP设置:

qm设置123 --sshkey〜/ .ssh / id_rsa.pub

qm设置123 --ipconfig0 ip = 10.0.10.123 / 24,gw = 10.0.10.1

您还可以仅使用一个命令来配置所有Cloud-Init选项。我们仅将上面的示例拆分为几个命令,以减少行长。还要确保为您的特定环境采用IP设置。

10.8.3。自定义Cloud-Init配置

Cloud-Init集成还允许使用自定义配置文件来代替自动生成的配置。这是通过 命令行上的cicustom选项完成的:

qm设置9000 --cicustom“ user = <卷>,network = <卷>,meta = <卷>”

自定义配置文件必须位于支持代码段的存储中,并且必须在要迁移VM的所有节点上可用。否则,VM将无法启动。例如:

qm设置9000 --cicustom“ user = local:snippets / userconfig.yaml”

Cloud-Init共有三种配置。 如上例所示,第一个是用户配置。第二个是网络配置,第三个是元配置。它们可以一起指定,也可以根据需要混合和匹配。自动生成的配置将用于未指定自定义配置文件的任何配置。

可以将生成的配置转储为自定义配置的基础:

qm cloudinit dump 9000用户

存在相同的命令network和meta。

10.8.4。特定于Cloud-Init的选项

cicustom:[元= <卷>] [,网络= <卷>] [,用户= <卷>]

指定自定义文件以替换启动时自动生成的文件。

meta = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有元数据。这是提供程序特定的含义,configdrive2和nocloud有所不同。

网络 = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有网络数据。

用户 = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有用户数据。

cipassword:<字符串>

分配用户的密码。通常不建议使用此功能。请改用ssh键。另请注意,较早的cloud-init版本不支持哈希密码。

citype:<configdrive2 | nocloud>

指定cloud-init配置格式。缺省值取决于所配置的操作系统类型(OSTYPE。我们使用nocloud为Linux格式,configdrive2窗户。

ciuser:<字符串>

更改ssh密钥和密码的用户名,而不是映像的配置默认用户。

ipconfig [n]:[gw = <网关IPv4>] [,gw6 = <网关IPv6>] [,ip = <IPv4Format / CIDR>] [,ip6 = <IPv6Format / CIDR>]

指定相应接口的IP地址和网关。

IP地址使用CIDR表示法,网关是可选的,但需要指定相同类型的IP。

特殊字符串dhcp可以用于IP地址以使用DHCP,在这种情况下,不应提供任何显式网关。对于IPv6,特殊字符串auto可用于使用无状态自动配置。

如果启用了cloud-init且未指定IPv4或IPv6地址,则默认在IPv4上使用dhcp。

gw = <网关IPv4>

IPv4流量的默认网关。

 

需要选项:ip

gw6 = < 网关IPv6 >

IPv6流量的默认网关。

 

需要选项:ip6

ip = <IPv4Format / CIDR>(默认dhcp)

CIDR格式的IPv4地址。

ip6 = <IPv6Format / CIDR>(默认dhcp)

CIDR格式的IPv6地址。

名称服务器:<string>

设置容器的DNS服务器IP地址。如果未设置searchdomain或nameserver,则Create将自动使用主机中的设置。

searchdomain:<string>

设置容器的DNS搜索域。如果未设置searchdomain或nameserver,则Create将自动使用主机中的设置。

sshkeys:<字符串>

设置公共SSH密钥(每行一个密钥,OpenSSH格式)。

10.9PCIe)直通

PCI(e)直通是一种机制,可以使虚拟机从主机对PCI设备进行控制。与使用虚拟化硬件相比,这可能具有一些优势,例如更低的延迟,更高的性能或更多的功能(例如,卸载)。

但是,如果将设备传递给虚拟机,则无法再在主机或任何其他VM上使用该设备。

10.9.1。一般要求

由于直通是一项功能,还需要硬件支持,因此需要检查一些要求并进行准备才能使其正常运行。

硬件

你的硬件需要支持IOMMU( / Ø 中号埃默里中号 anagement ü NIT)中断重映射,这包括CPU和主板。

通常,具有VT-d的Intel系统和具有AMD-Vi的AMD系统都支持此功能。但是,由于硬件实施不正确以及驱动程序缺失或质量低劣,因此不能保证一切都能正常使用。

此外,服务器级硬件通常比消费者级硬件具有更好的支持,但是即使那样,许多现代系统也可以支持此功能。

请咨询您的硬件供应商,以检查它们是否在Linux下支持您的特定设置。

组态

一旦确保硬件支持直通,就需要进行一些配置以启用PCI(e)直通。

国际货币基金组织

必须在内核命令行上激活IOMMU 。

命令行参数是:

  • 对于Intel CPU:

intel_iommu =开启

  • 对于AMD CPU:

amd_iommu =开启

内核模块

您必须确保已加载以下模块。这可以通过将它们添加到“ / etc / modules ”中来实现

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

更改任何相关模块后,您需要刷新 initramfs。在Proxmox VE上,这可以通过执行以下操作来完成:

#update-initramfs -u -k全部

如果您使用systemd-boot,请确保 将新的initramfs同步到可引导分区。

完成配置

最后重新启动以使更改生效,并检查它是否确实已启用。

#dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

应该显示已启用IOMMU,定向I / O或中断重映射,具体信息取决于硬件和内核。

您要通过的设备位于单独的 IOMMU组中,这一点也很重要。可以通过以下方法检查:

#找到/ sys / kernel / iommu_groups / -type l

可以将设备及其功能(例如带有HDMI音频设备的GPU)或它的根端口或PCI(e)桥接器一起放在IOMMU组中。

 

PCIe)插槽

某些平台处理其物理PCI(e)插槽的方式有所不同。因此,如果您无法获得所需的IOMMU组分隔,有时将其有助于将卡放在另一个PCI(e)插槽中。

 

不安全的中断

对于某些平台,可能需要允许不安全的中断。为此,在/etc/modprobe.d/中以'.conf'结尾的文件中添加以下行 :

选项vfio_iommu_type1 allow_unsafe_interrupts = 1

请注意,此选项会使您的系统不稳定。

GPU传递说明

无法在Proxmox VE Web界面上通过NoVNC或SPICE显示GPU的帧缓冲区。

当通过整个GPU或vGPU并需要图形输出时,必须将监视器物理连接到卡上,或在客户机中配置远程桌面软件(例如,VNC或RDP)。

如果要将GPU用作硬件加速器,例如,对于使用OpenCL或CUDA的程序,则不需要这样做。

10.9.2。主机设备直通

PCI(e)直通的最常用变体是穿过整个PCI(e)卡,例如GPU或网卡。

主机配置

在这种情况下,主机将无法使用该卡。有两种方法可以实现此目的:

  • 通过添加将设备ID传递到vfio-pci模块 的选项

选项vfio-pci ids = 1234:5678,4321:8765

/etc/modprobe.d/中的.conf文件,其中1234:5678和4321:8765是通过以下方式获得的供应商和设备ID:

#lcpci -nn

  • 将驱动程序完全列入主机黑名单,以确保它可以自由绑定以进行传递

黑名单DRIVERNAME

/etc/modprobe.d/中的.conf文件

对于这两种方法,您都需要 再次更新initramfs,然后重新启动。

虚拟机配置

要通过设备,您需要在VM配置中设置hostpciX选项,例如通过执行以下命令:

#qm设置VMID -hostpci0 00:02.0

如果您的设备具有多种功能(例如'00:02.0 '和'00:02.1 '),则可以将它们与所有缩短的语法'00: 02 ' 一起传递给所有用户。

根据设备和来宾操作系统的不同,可能需要一些选项:

  • x-vga = on | off将PCI(e)设备标记为VM的主要GPU。启用此选项后,将忽略vga配置选项。
  • pcie = on | off告诉Proxmox VE使用PCIe或PCI端口。一些来宾/设备组合需要PCIe而不是PCI。PCIe仅适用于q35 机器类型。
  • rombar = on | off使客户机可以看到固件ROM。默认为开。某些PCI(e)设备需要禁用此功能。
  • romfile = <path>,是设备要使用的ROM文件的可选路径。这是/ usr / share / kvm /下的相对路径。

将GPU设置为主要的PCIe直通示例:

#qm设置VMID -hostpci0 02:00,pcie = on,x-vga = on

其他注意事项

通过GPU时,将q35用作计算机类型,使用OVMF(VM的EFI)代替SeaBIOS和PCIe代替PCI 时,可以达到最佳兼容性 。请注意,如果要使用OVMF进行GPU 穿越,则GPU需要具有支持EFI的ROM,否则请使用SeaBIOS。

10.9.3SR-IOV

通过PCI(e)设备的另一种变体是使用设备的硬件虚拟化功能(如果有)。

SR-IOVš ingle- ř OOT  NPUT / ö安输出V irtualization)使单个设备,以提供多个VFV irtual ˚F unctions)到系统中。这些VF中的每一个都可以在不同的VM中使用,具有完整的硬件功能,并且比软件虚拟化设备具有更好的性能和更低的延迟。

目前,最常见的情况下,使用此是网卡(Ñ etwork 覆盖整个院落Ç ARD)用SR-IOV的支持,其可以提供每个物理端口的多个虚拟转发。这允许在VM内部使用校验和卸载等功能,从而减少了(主机)CPU开销。

主机配置

通常,有两种方法可以在设备上启用虚拟功能。

  • 有时驱动程序模块有一个选项,例如某些英特尔驱动程序

max_vfs = 4

可以将.conf文件放在/etc/modprobe.d/下。(不要忘记在那之后更新您的initramfs)

请参阅驱动程序模块文档以获取确切的参数和选项。

  • 第二种更通用的方法是使用sysfs。如果设备和驱动程序支持此功能,则可以随时更改VF的数量。例如,要在设备0000:01:00.0上设置4个VF,请执行:

#回声4> /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

要使更改永久生效,您可以使用'sysfsutils` Debian软件包。安装后通过配置它/etc/sysfs.conf或`FILE.conf”在 /etc/sysfs.d/

虚拟机配置

创建VF之后,使用lspci输出它们时,应将它们视为独立的PCI(e)设备。获取它们的ID并将它们像普通的PCI(e)设备一样传递 。

其他注意事项

对于此功能,平台支持尤其重要。可能需要首先在BIOS / EFI中启用此功能,或者使用特定的PCI(e)端口使其起作用。如有疑问,请查阅平台手册或联系其供应商。

10.9.4。中介设备(vGPUGVT-g

中介设备是将物理硬件的功能和性能重新用于虚拟化硬件的另一种方法。这些是在虚拟GPU设置中最常见的,例如GRID技术中使用的Intels GVT-g和Nvidias vGPU。

这样,物理卡就可以创建类似于SR-IOV的虚拟卡。区别在于,中介设备不会在主机中显示为PCI(e)设备,而仅适合在虚拟机中使用。

主机配置

通常,卡的驱动程序必须支持该功能,否则它将无法正常工作。因此,请向您的供应商咨询兼容的驱动程序以及如何配置它们。

英特尔GVT-g驱动程序已集成在内核中,并应与第五代,第六代和第七代英特尔酷睿处理器以及E3 v4,E3 v5和E3 v6 Xeon处理器一起使用。

要为Intel Graphics启用它,必须确保加载模块 kvmgt(例如,通过/ etc / modules),并在内核命令行上启用它, 并添加以下参数:

i915.enable_gvt = 1

之后,请记住 更新initramfs并重新启动主机。

虚拟机配置

要使用中介设备,只需在hostpciX VM配置选项上指定mdev属性。

您可以通过sysfs获得支持的设备。例如,要列出设备00000002.0支持的类型,您只需执行以下命令:

#ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

每个条目都是一个目录,其中包含以下重要文件:

  • available_instances包含此类型的仍可用实例的数量,VM中使用的每个mdev都会减少此数量。
  • description包含有关类型功能的简短描述
  • create是创建此类设备的端点,如果配置了mdev的hostpciX选项,则Proxmox VE会自动为您执行此操作。

使用Intel GVT-g vGPU(Intel Skylake 6700k)的示例配置:

#qm设置VMID -hostpci0 00:02.0,mdev = i915-GVTg_V5_4

设置此设置后,Proxmox VE会在VM启动时自动创建此类设备,并在VM停止时再次清理该设备。

10.10。挂钩脚本

您可以使用config属性hookscript将挂钩脚本添加到VM 。

qm设置100 -hookscript local:snippets / hookscript.pl

在访客生命周期的各个阶段都将调用它。有关示例和文档,请参见/usr/share/pve-docs/examples/guest-example-hookscript.pl下的示例脚本 。

10.11。使用QM管理虚拟机

qm是在Proxmox VE上管理Qemu / Kvm虚拟机的工具。您可以创建和销毁虚拟机,并控制执行(启动/停止/挂起/恢复)。除此之外,您可以使用qm在关联的配置文件中设置参数。也可以创建和删除虚拟磁盘。

10.11.1CLI使用示例

使用在本地存储上载的iso文件,在本地lvm存储上创建具有4 GB IDE磁盘的VM

qm创建300 -ide0 local-lvm:4 -net0 e1000 -cdrom local:iso / proxmox-mailgateway_2.1.iso

启动新的虚拟机

qm开始300

发送关闭请求,然后等待直到虚拟机停止。

qm关闭300 && qm等待300

与上述相同,但仅等待40秒。

qm关闭300 && qm等待300-超时40

10.12。组态

VM配置文件存储在Proxmox群集文件系统内部,可以在/etc/pve/qemu-server/<VMID>.conf中进行访问。像/ etc / pve /中存储的其他文件一样,它们会自动复制到所有其他群集节点。

 

<100的VMID保留用于内部目的,并且VMID必须在整个集群范围内是唯一的。

虚拟机配置示例

核心数:1

插座数:1

内存:512

名称:webmail

ostype:l26

引导盘:virtio0

net0:e1000 = EE:D2:28:5F:B6:3E,bridge = vmbr0

virtio0:本地:vm-100-disk-1,大小= 32G

这些配置文件是简单的文本文件,您可以使用常规文本编辑器(vi,nano …)进行编辑。有时这对于进行小的更正很有用,但请记住,您需要重新启动VM才能应用此类更改。

因此,通常最好使用qm命令来生成和修改这些文件,或者使用GUI进行整个操作。我们的工具包足够聪明,可以立即将大多数更改应用于正在运行的VM。此功能称为“热插拔”,在这种情况下,无需重新启动VM。

10.12.1。文件格式

VM配置文件使用简单的冒号分隔的键/值格式。每行具有以下格式:

#这是一条评论

选项:价值

这些文件中的空行将被忽略,以# 字符开头的行将被视为注释,也将被忽略。

10.12.2。快照

创建快照时,qm会将快照时的配置存储到同一配置文件中的单独快照部分中。例如,在创建名为“ testsnapshot”的快照后,您的配置文件将如下所示:

带有快照的虚拟机配置

内存:512

调换:512

父母:testsnaphot

...

[testsnaphot]

内存:512

调换:512

捕捉时间:1457170803

...

有一些快照相关的属性,例如parent和 snaptime。该父属性用于存储快照之间的父/子关系。snaptime是快照创建时间戳(Unix时期)。

10.12.3。选件

acpi:<布尔值>(默认1)

启用/禁用ACPI。

代理:[已启用=] <1 | 0> [,fstrim_cloned_disks = <1 | 0>]

启用/禁用Qemu GuestAgent及其属性。

enabled = <布尔值>(默认0)

启用/禁用Qemu GuestAgent。

fstrim_cloned_disks = <布尔值>(默认0)

克隆/移动磁盘后运行fstrim。

拱:<aarch64 | x86_64>

虚拟处理器体系结构。默认为主机。

args:<字符串>

传递给kvm的任意参数,例如:

args:-no-reboot -no-hpet

 

此选项仅适用于专家。

自动启动:<boolean>(默认0)

崩溃后自动重启(当前被忽略)。

气球:<整数>(0-N)

VM的目标RAM量,以MB为单位。使用零禁用气球驱动程序。

BIOS:<ovmf | seabios>(默认seabios)

选择BIOS实施。

引导:[acdn] {1,4}(默认cdn)

在软盘(a),硬盘(c),CD-ROM(d)或网络(n)上引导。

引导磁盘:(ide | sata | scsi | virtio)\ d +

启用从指定磁盘启动。

cdrom:<卷>

这是选项-ide2的别名

cicustom:[元= <卷>] [,网络= <卷>] [,用户= <卷>]

cloud-init:指定自定义文件以在启动时替换自动生成的文件。

meta = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有元数据。这是提供程序特定的含义,configdrive2和nocloud有所不同。

网络 = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有网络数据。

用户 = <卷>

指定一个自定义文件,其中包含通过cloud-init传递给VM的所有用户数据。

cipassword:<字符串>

cloud-init:分配用户的密码。通常不建议使用此功能。请改用ssh键。另请注意,较早的cloud-init版本不支持哈希密码。

citype:<configdrive2 | nocloud>

指定cloud-init配置格式。缺省值取决于所配置的操作系统类型(OSTYPE。我们使用nocloud为Linux格式,configdrive2窗户。

ciuser:<字符串>

cloud-init:用于更改ssh密钥和密码的用户名,而不是映像的配置默认用户。

核心数:<整数>(1-N)(默认1)

每个插槽的核心数。

cpu:[cputype =] <枚举> [,flags = <+ FLAG [;-FLAG ...]>] [,hidden = <1 | 0>] [,hv-vendor-id = <vendor-id>]

仿真的CPU类型。

cputype = <486 | Broadwell | Broadwell-IBRS | Broadwell-noTSX | Broadwell-noTSX-IBRS | 康罗| EPYC | EPYC-IBPB | Haswell | Haswell-IBRS | Haswell-noTSX | Haswell-noTSX-IBRS | IvyBridge | IvyBridge-IBRS | Nehalem | Nehalem-IBRS | Opteron_G1 | Opteron_G2 | Opteron_G3 | Opteron_G4 | Opteron_G5 | 彭林| SandyBridge | SandyBridge-IBRS | Skylake客户| Skylake-Client-IBRS | Skylake服务器| Skylake-Server-IBRS | 韦斯特米尔| Westmere-IBRS | 速龙| core2duo | 芯多| 主机| kvm32 | kvm64 | 最大| 奔腾| pentium2 | pentium3 | 现象 qemu32 | qemu64>(默认kvm64)

仿真的CPU类型。

标志 = <+ FLAG [;-FLAG ...]>

附加的CPU标志列表,以;分隔。采用 + FLAG启用,-FLAG来禁用标志。当前支持的标志:pcidspec-ctrlibpbssbdvirt-ssbdamd-ssbdamd-no-ssbpdpe1gbmd-clear

隐藏 = <布尔值>(默认0)

不要将其标识为KVM虚拟机。

hv-vendor-id = <供应商ID>

Hyper-V供应商ID。Windows guest虚拟机中的某些驱动程序或程序需要特定的ID。

cpulimit:<数字>(0-128 )(默认0)

CPU使用率限制。

 

如果计算机有2个CPU,则总共有2个 CPU时间。值0表示没有CPU限制。

cpuunits:<整数>(2-262144 )(默认1024)

VM的CPU重量。内核公平调度程序中使用了参数。数字越大,此VM获得的CPU时间就越多。数字是相对于所有其他正在运行的VM的权重而言的。

描述:<string>

VM的描述。仅在配置Web界面上使用。这被保存为配置文件中的注释。

efidisk0:[文件=] <卷> [,格式= <枚举>] [,大小= <磁盘大小>]

配置磁盘以存储EFI var

文件 = <卷>

驱动器的后备卷。

格式 = <cloop | 牛| qcow | qcow2 | qed | 原料| vmdk>

驱动器的后备文件的数据格式。

尺寸 = <磁盘>

磁盘大小。这纯粹是信息性的,没有任何作用。

冻结:<布尔值>

启动时冻结CPU(使用 c monitor命令开始执行)。

钩子脚本:<字符串>

在vms生存期内的各个步骤中将执行的脚本。

hostpci [n]: [host =] <HOSTPCIID [; HOSTPCIID2 ...]> [,mdev = <字符串>] [,pcie = <1 | 0>] [,rombar = <1 | 0>] [,romfile = <字符串>] [,x-vga = <1 | 0>]

将主机PCI设备映射到来宾。

 

此选项允许直接访问主机硬件。因此,不再可能迁移此类计算机-请特别小心使用。

 

实验!用户报告了此选项的问题。

主机 = <HOSTPCIID [; HOSTPCIID2 ...]>

主机PCI设备通过。主机的PCI设备的PCI ID或主机的PCI虚拟功能列表。HOSTPCIID语法为:

总线:dev.func(十六进制数)

您可以使用lspci命令列出现有的PCI设备。

mdev = <字符串>

要使用的中介设备的类型。这种类型的实例将在VM启动时创建,并在VM停止时将被清除。

pcie = <布尔值>(默认0)

选择PCI-express总线(需要q35机器型号)。

rombar = <布尔值>(默认1)

指定该设备的ROM在来宾的内存映射中是否可见。

romfile = <字符串>

自定义pci设备rom文件名(必须位于/ usr / share / kvm /中)。

x-vga = <布尔值>(默认0)

启用vfio-vga设备支持。

hotplug:<string>(默认network,disk,usb)

有选择地启用热插拔功能。这是逗号分隔的热插拔功能列表:网络磁盘cpu内存usb。使用0可以完全禁用热插拔。值1是默认networkdiskusb的别名。

大页数:<1024 | 2 | 任何>

启用/禁用大页面内存。

ide [n]:[file =] <卷> [,aio = <native | threads>] [,backup = <1 | 0>] [,bps = <bps>] [,bps_max_length = <seconds>] [,bps_rd = <bps> ] [,bps_rd_max_length = <秒>] [,bps_wr = <bps>] [,bps_wr_max_length = <秒>] [,cache = <枚举>] [,cyls = <整数>] [,detect_zeroes = <1 | 0> ] [,discard = <忽略> on] [,format = <枚举>] [,heads = <整数>] [,iops = <iops>] [,iops_max = <iops>] [,iops_max_length = <秒> ] [,iops_rd = <iops>] [,iops_rd_max = <iops>] [,iops_rd_max_length = <seconds>] [,iops_wr = <iops>] [,iops_wr_max = <iops>] [,iops_wr_max_length = <seconds>] [ ,mbps = <mbps>] [,mbps_max = <mbps>] [,mbps_rd = <mbps>] [,mbps_rd_max = <mbps>] [,mbps_wr = <mbps>] [,mbps_wr_max = <mbps>] [,media = <cdrom | disk>] [,model = <模型>] [,replicate = <1 | 0>] [,rerror = <ignore | report | stop>] [,secs = <整数>] [,serial = <serial>] [,shared = <1 | 0>] [ ,size = <磁盘大小>] [,快照= <1 | 0>] [,ssd = <1 | 0>] [,trans = <无| lba | auto>] [,werror = <枚举>] [,wwn = <wwn>]

将卷用作IDE硬盘或CD-ROM(n为0到3)。

aio = <本地| 线程>

要使用的AIO类型。

备份 = <布尔值>

进行备份时是否应包括驱动器。

bps = <bps>

最大r / w速度,以每秒字节数为单位。

bps_max_length = <秒>

I / O突发的最大长度,以秒为单位。

bps_rd = <bps>

最大读取速度,以每秒字节数为单位。

bps_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

bps_wr = <bps>

最大写入速度,以每秒字节数为单位。

bps_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

缓存 = <directsync | 无| 不安全| 回写 直写>

驱动器的缓存模式

cyls = <整数>

强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes = <布尔值>

控制是否检测并尝试优化零写入。

丢弃 = <忽略| 在>

控制是否将丢弃/修剪请求传递给基础存储。

文件 = <卷>

驱动器的后备卷。

格式 = <cloop | 牛| qcow | qcow2 | qed | 原料| vmdk>

驱动器的后备文件的数据格式。

头 = <整数>

强制驱动器的物理几何形状具有特定的磁头数。

iops = <iops>

每秒最大r / w I / O操作数。

iops_max = <iops>

每秒最大无限制r / w I / O池中的操作数。

iops_max_length = <秒>

I / O突发的最大长度,以秒为单位。

iops_rd = <iops>

每秒最大读取I / O操作数。

iops_rd_max = <iops>

每秒最大未限制的读取I / O池操作数。

iops_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

iops_wr = <iops>

每秒最大写入I / O操作数。

iops_wr_max = <iops>

每秒最大未限制写入I / O池的操作数。

iops_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

mbps = <mbps>

最大r / w速度,以每秒兆字节为单位。

mbps_max = <mbps>

最大未限制的读/写池,以每秒兆字节为单位。

mbps_rd = <mbps>

最大读取速度(兆字节/秒)。

mbps_rd_max = <mbps>

最大不受限制的读取池,以每秒兆字节为单位。

mbps_wr = <mbps>

最大写入速度(以兆字节/秒为单位)。

mbps_wr_max = <mbps>

最大不受限制的写池,以每秒兆字节为单位。

媒体 = <cdrom | 磁盘>(默认磁盘)

驱动器的介质类型。

型号 = <型号>

该驱动器的报告型号名称,经过url编码,最长40个字节。

复制 = <布尔值>(默认1)

是否应考虑将驱动器用于复制作业。

rerror = <忽略| 报告 停止>

读取错误操作。

秒 = <整数>

强制驱动器的物理几何结构具有特定的扇区数。

序列 = <序列号>

该驱动器的报告序列号,使用url编码,最长20个字节。

shared = <布尔值>(默认0)

将此本地管理的卷标记为在所有节点上都可用。

 

该选项不会自动共享该卷,它假定已共享该卷!

大小 = <磁盘大小>

磁盘大小。这纯粹是信息性的,没有任何作用。

快照 = <布尔值>

控制qemu的快照模式功能。如果激活,则对磁盘所做的更改是临时的,并且在VM关闭时将被丢弃。

ssd = <布尔值>

是否将此驱动器公开为SSD,而不是旋转硬盘。

trans = <自动| lba | 无>

强制磁盘几何图形BIOS转换模式。

werror = <enospc | 忽略| 报告 停止>

编写错误操作。

wwn = <wwn>

驱动器的全球名称,编码为16字节的十六进制字符串,前缀为0x

ipconfig [n]:[gw = <网关IPv4>] [,gw6 = <网关IPv6>] [,ip = <IPv4Format / CIDR>] [,ip6 = <IPv6Format / CIDR>]

cloud-init:指定相应接口的IP地址和网关。

IP地址使用CIDR表示法,网关是可选的,但需要指定相同类型的IP。

特殊字符串dhcp可以用于IP地址以使用DHCP,在这种情况下,不应提供任何显式网关。对于IPv6,特殊字符串auto可用于使用无状态自动配置。

如果启用了cloud-init且未指定IPv4或IPv6地址,则默认在IPv4上使用dhcp。

gw = <网关IPv4>

IPv4流量的默认网关。

 

需要选项:ip

gw6 = < 网关IPv6 >

IPv6流量的默认网关。

 

需要选项:ip6

ip = <IPv4Format / CIDR>(默认dhcp)

CIDR格式的IPv4地址。

ip6 = <IPv6Format / CIDR>(默认dhcp)

CIDR格式的IPv6地址。

ivshmem:大小= <整数> [,名称= <字符串>]

VM间共享内存。对于VM之间或主机之间的直接通信很有用。

名称 = <string>

文件名。将以pve-shm-为前缀。默认为VMID。虚拟机停止时将被删除。

大小 = <整数>(1-N)

文件大小,以MB为单位。

键盘:<da | de | de-ch | zh-cn | zh-cn es | fi | fr | fr-be | fr-ca | fr-ch | | 是| 它| ja | lt | mk | nl | 没有 pl | pt | pt-br | sl | sv | tr>

vnc服务器的键盘布局。默认值是从/etc/pve/datacenter.cfg配置文件读取的,不需要进行设置。

kvm:<布尔值>(默认1)

启用/禁用KVM硬件虚拟化。

当地时间:<布尔值>

将实时时钟设置为本地时间。如果ostype表示Microsoft操作系统,则默认情况下启用此功能。

锁:<备份| 克隆| 创建| 迁移| 回滚 快照| 快照删除| 暂停| 暂停>

锁定/解锁虚拟机。

机器:(pc | pc(-i440fx)?-\ d + \。\ d +(\。pxe)?| q35 | pc-q35- \ d + \。\ d +(\。pxe)?| virt(?:-\ d + \。\ d +)?)

指定Qemu机器类型。

内存:<整数>(16-N)(默认512)

VM的RAM量,以MB为单位。这是使用气球设备时的最大可用内存。

migrate_downtime:<数字>(0-N)(默认0.1)

设置迁移的最大允许停机时间(以秒为单位)。

migrate_speed:<整数>(0-N)(默认0)

设置迁移的最大速度(以MB / s为单位)。值0没有限制。

名称:<string>

设置虚拟机名称。仅在配置Web界面上使用。

名称服务器:<string>

cloud-init:设置容器的DNS服务器IP地址。如果未设置searchdomain或nameserver,则Create将自动使用主机中的设置。

net [n]:[model =] <枚举> [,bridge = <bridge>] [,防火墙= <1 | 0>] [,link_down = <1 | 0>] [,macaddr = <XX:XX:XX :XX:XX:XX>] [,queues = <整数>] [,rate = <数字>] [,tag = <整数>] [,trunks = <vlanid [; vlanid ...]>] [,<型号> = <macaddr>]

指定网络设备。

桥 = <桥>

连接网络设备的网桥。Proxmox VE标准桥称为vmbr0

如果您未指定网桥,我们将创建一个提供DHCP和DNS服务的kvm用户(NATed)网络设备。使用以下地址:

10.0.2.2网关

10.0.2.3 DNS服务器

10.0.2.4 SMB服务器

DHCP服务器从10.0.2.15开始为访客分配地址。

防火墙 = <布尔值>

此接口是否应由防火墙保护。

link_down = <布尔值>

是否应断开此接口的连接(例如拔下插头)。

macaddr = <XX:XX:XX:XX:XX:XX>

未设置I / G(个人/组)位的通用MAC地址。

型号 = <e1000 | e1000-82540em | e1000-82544gc | e1000-82545em | i82551 | i82557b | i82559er | ne2k_isa | ne2k_pci | pcnet | rtl8139 | virtio | vmxnet3>

网卡模型。在Virtio模型提供了非常低的CPU开销的最佳性能。如果您的来宾不支持此驱动程序,通常最好使用e1000

队列 = <整数>(0-16)

设备使用的报文队列数量。

比率 = <数字>(0-N)

速率限制(以mbps(兆字节/秒)为单位)为浮点数。

标签 = <整数>(1-4094)

VLAN标记应用于此接口上的数据包。

树干 = <vlanid [; vlanid ...]>

通过该接口的VLAN中继。

numa:<boolean>(默认0)

启用/禁用NUMA。

numa [n]:cpus = <id [-id]; ...> [,hostnodes = <id [-id]; ...>] [,memory = <number>] [,policy = <preferred | bind |交错>

NUMA拓扑。

cpus = <id [-id]; ...>

访问此NUMA节点的CPU。

hostnodes = <id [-id]; ...>

托管要使用的NUMA节点。

内存 = <数字>

此NUMA节点提供的内存量。

策略 = <绑定| 交错| 首选>

NUMA分配策略。

onboot:<boolean>(默认0)

指定是否在系统启动期间启动VM。

ostype:<l24 | l26 | 其他| solaris | w2k | w2k3 | w2k8 | win10 | win7 | win8 | wvista | wxp>

指定客户操作系统。这用于为特定操作系统启用特殊的优化/功能:

其他

未指定的操作系统

wxp

Microsoft Windows XP

w2k

Microsoft Windows 2000

w2k3

Microsoft Windows 2003

w2k8

Microsoft Windows 2008

维斯塔

Microsoft Windows Vista

赢7

Microsoft Windows 7

赢8

Microsoft Windows 8/2012 / 2012r2

赢10

Microsoft Windows 10/2016

l24

Linux 2.4内核

l26

Linux 2.6 / 3.X内核

日光浴

Solaris / OpenSolaris / OpenIndiania内核

parallel [n]:/ dev / parport \ d + | / dev / usb / lp \ d +

映射主机并行设备(n为0到2)。

 

此选项允许直接访问主机硬件。因此,不再可能迁移此类计算机-请特别小心使用。

 

实验!用户报告了此选项的问题。

保护:<boolean>(默认0)

设置虚拟机的保护标志。这将禁用删除VM和删除磁盘操作。

重新启动:<布尔值>(默认1)

允许重启。如果设置为0则VM在重新引导时退出。

sata [n]:[file =] <卷> [,aio = <native | threads>] [,backup = <1 | 0>] [,bps = <bps>] [,bps_max_length = <seconds>] [,bps_rd = <bps> ] [,bps_rd_max_length = <秒>] [,bps_wr = <bps>] [,bps_wr_max_length = <秒>] [,cache = <枚举>] [,cyls = <整数>] [,detect_zeroes = <1 | 0> ] [,discard = <忽略> on] [,format = <枚举>] [,heads = <整数>] [,iops = <iops>] [,iops_max = <iops>] [,iops_max_length = <秒> ] [,iops_rd = <iops>] [,iops_rd_max = <iops>] [,iops_rd_max_length = <seconds>] [,iops_wr = <iops>] [,iops_wr_max = <iops>] [,iops_wr_max_length = <seconds>] [ ,mbps = <mbps>] [,mbps_max = <mbps>] [,mbps_rd = <mbps>] [,mbps_rd_max = <mbps>] [,mbps_wr = <mbps>] [,mbps_wr_max = <mbps>] [,media = <cdrom | disk>] [,复制= <1 | 0>] [,rerror = <忽略|报告|停止>] [,secs = <整数>] [,serial = <序列>] [,shared = <1 | 0>] [,size = <DiskSize>] [,快照= <1 | 0>] [,ssd = <1 | 0>] [,trans = <无| lba | auto>] [,werror = <枚举>] [,wwn = <wwn>]

将卷用作SATA硬盘或CD-ROM(n为0到5)。

aio = <本地| 线程>

要使用的AIO类型。

备份 = <布尔值>

进行备份时是否应包括驱动器。

bps = <bps>

最大r / w速度,以每秒字节数为单位。

bps_max_length = <秒>

I / O突发的最大长度,以秒为单位。

bps_rd = <bps>

最大读取速度,以每秒字节数为单位。

bps_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

bps_wr = <bps>

最大写入速度,以每秒字节数为单位。

bps_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

缓存 = <directsync | 无| 不安全| 回写 直写>

驱动器的缓存模式

cyls = <整数>

强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes = <布尔值>

控制是否检测并尝试优化零写入。

丢弃 = <忽略| 在>

控制是否将丢弃/修剪请求传递给基础存储。

文件 = <卷>

驱动器的后备卷。

格式 = <cloop | 牛| qcow | qcow2 | qed | 原料| vmdk>

驱动器的后备文件的数据格式。

头 = <整数>

强制驱动器的物理几何形状具有特定的磁头数。

iops = <iops>

每秒最大r / w I / O操作数。

iops_max = <iops>

每秒最大无限制r / w I / O池中的操作数。

iops_max_length = <秒>

I / O突发的最大长度,以秒为单位。

iops_rd = <iops>

每秒最大读取I / O操作数。

iops_rd_max = <iops>

每秒最大未限制的读取I / O池操作数。

iops_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

iops_wr = <iops>

每秒最大写入I / O操作数。

iops_wr_max = <iops>

每秒最大未限制写入I / O池的操作数。

iops_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

mbps = <mbps>

最大r / w速度,以每秒兆字节为单位。

mbps_max = <mbps>

最大未限制的读/写池,以每秒兆字节为单位。

mbps_rd = <mbps>

最大读取速度(兆字节/秒)。

mbps_rd_max = <mbps>

最大不受限制的读取池,以每秒兆字节为单位。

mbps_wr = <mbps>

最大写入速度(以兆字节/秒为单位)。

mbps_wr_max = <mbps>

最大不受限制的写池,以每秒兆字节为单位。

媒体 = <cdrom | 磁盘>(默认磁盘)

驱动器的介质类型。

复制 = <布尔值>(默认1)

是否应考虑将驱动器用于复制作业。

rerror = <忽略| 报告 停止>

读取错误操作。

秒 = <整数>

强制驱动器的物理几何结构具有特定的扇区数。

序列 = <序列号>

该驱动器的报告序列号,使用url编码,最长20个字节。

shared = <布尔值>(默认0)

将此本地管理的卷标记为在所有节点上都可用。

 

该选项不会自动共享该卷,它假定已共享该卷!

大小 = <磁盘大小>

磁盘大小。这纯粹是信息性的,没有任何作用。

快照 = <布尔值>

控制qemu的快照模式功能。如果激活,则对磁盘所做的更改是临时的,并且在VM关闭时将被丢弃。

ssd = <布尔值>

是否将此驱动器公开为SSD,而不是旋转硬盘。

trans = <自动| lba | 无>

强制磁盘几何图形BIOS转换模式。

werror = <enospc | 忽略| 报告 停止>

编写错误操作。

wwn = <wwn>

驱动器的全球名称,编码为16字节的十六进制字符串,前缀为0x

scsi [n]:[file =] <卷> [,aio = <native | threads>] [,backup = <1 | 0>] [,bps = <bps>] [,bps_max_length = <seconds>] [,bps_rd = <bps> ] [,bps_rd_max_length = <秒>] [,bps_wr = <bps>] [,bps_wr_max_length = <秒>] [,cache = <枚举>] [,cyls = <整数>] [,detect_zeroes = <1 | 0> ] [,discard = <忽略> on] [,format = <枚举>] [,heads = <整数>] [,iops = <iops>] [,iops_max = <iops>] [,iops_max_length = <秒> ] [,iops_rd = <iops>] [,iops_rd_max = <iops>] [,iops_rd_max_length = <seconds>] [,iops_wr = <iops>] [,iops_wr_max = <iops>] [,iops_wr_max_length = <seconds>] [ ,iothread = <1 | 0>] [,mbps = <mbps>] [,mbps_max = <mbps>] [,mbps_rd = <mbps>] [,mbps_rd_max = <mbps>] [,mbps_wr = <mbps>] [ ,mbps_wr_max = <mbps>] [,media = <cdrom | disk>] [,queues = <整数>] [,replicate = <1 | 0>] [,rerror = <ignore | report | stop>] [,scsiblock = <1 | 0>] [,secs = <整数>] [ ,serial = <serial>] [,shared = <1 | 0>] [,size = <DiskSize>] [,snapshot = <1 | 0>] [,ssd = <1 | 0>] [,trans = < none | lba | auto>] [,werror = <枚举>] [,wwn = <wwn>]

将卷用作SCSI硬盘或CD-ROM(n为0到13)。

aio = <本地| 线程>

要使用的AIO类型。

备份 = <布尔值>

进行备份时是否应包括驱动器。

bps = <bps>

最大r / w速度,以每秒字节数为单位。

bps_max_length = <秒>

I / O突发的最大长度,以秒为单位。

bps_rd = <bps>

最大读取速度,以每秒字节数为单位。

bps_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

bps_wr = <bps>

最大写入速度,以每秒字节数为单位。

bps_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

缓存 = <directsync | 无| 不安全| 回写 直写>

驱动器的缓存模式

cyls = <整数>

强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes = <布尔值>

控制是否检测并尝试优化零写入。

丢弃 = <忽略| 在>

控制是否将丢弃/修剪请求传递给基础存储。

文件 = <卷>

驱动器的后备卷。

格式 = <cloop | 牛| qcow | qcow2 | qed | 原料| vmdk>

驱动器的后备文件的数据格式。

头 = <整数>

强制驱动器的物理几何形状具有特定的磁头数。

iops = <iops>

每秒最大r / w I / O操作数。

iops_max = <iops>

每秒最大无限制r / w I / O池中的操作数。

iops_max_length = <秒>

I / O突发的最大长度,以秒为单位。

iops_rd = <iops>

每秒最大读取I / O操作数。

iops_rd_max = <iops>

每秒最大未限制的读取I / O池操作数。

iops_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

iops_wr = <iops>

每秒最大写入I / O操作数。

iops_wr_max = <iops>

每秒最大未限制写入I / O池的操作数。

iops_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

iothread = <布尔值>

是否为此驱动器使用iothreads

mbps = <mbps>

最大r / w速度,以每秒兆字节为单位。

mbps_max = <mbps>

最大未限制的读/写池,以每秒兆字节为单位。

mbps_rd = <mbps>

最大读取速度(兆字节/秒)。

mbps_rd_max = <mbps>

最大不受限制的读取池,以每秒兆字节为单位。

mbps_wr = <mbps>

最大写入速度(以兆字节/秒为单位)。

mbps_wr_max = <mbps>

最大不受限制的写池,以每秒兆字节为单位。

媒体 = <cdrom | 磁盘>(默认磁盘)

驱动器的介质类型。

队列 = <整数>(2-N)

队列数。

复制 = <布尔值>(默认1)

是否应考虑将驱动器用于复制作业。

rerror = <忽略| 报告 停止>

读取错误操作。

scsiblock = <布尔值>(默认0)

是否将scsi-block用于主机块设备的完全通过

 

可能会导致I / O错误,以及主机上的内存不足或内存碎片过多

秒 = <整数>

强制驱动器的物理几何结构具有特定的扇区数。

序列 = <序列号>

该驱动器的报告序列号,使用url编码,最长20个字节。

shared = <布尔值>(默认0)

将此本地管理的卷标记为在所有节点上都可用。

 

该选项不会自动共享该卷,它假定已共享该卷!

大小 = <磁盘大小>

磁盘大小。这纯粹是信息性的,没有任何作用。

快照 = <布尔值>

控制qemu的快照模式功能。如果激活,则对磁盘所做的更改是临时的,并且在VM关闭时将被丢弃。

ssd = <布尔值>

是否将此驱动器公开为SSD,而不是旋转硬盘。

trans = <自动| lba | 无>

强制磁盘几何图形BIOS转换模式。

werror = <enospc | 忽略| 报告 停止>

编写错误操作。

wwn = <wwn>

驱动器的全球名称,编码为16字节的十六进制字符串,前缀为0x

scsihw:< lsi | lsi53c810 | megasas | pvscsi | virtio-scsi-pci | virtio-scsi-single>(默认lsi)

SCSI控制器型号

searchdomain:<string>

cloud-init:设置容器的DNS搜索域。如果未设置searchdomain或nameserver,则Create将自动使用主机中的设置。

serial [n]:(/dev/.+|socket)

在VM内创建一个串行设备(n为0到3),并通过主机串行设备(即/ dev / ttyS0),或在主机侧创建一个Unix套接字(使用qm终端打开终端连接)。

 

如果通过主机串行设备,将无法再迁移此类计算机-请格外小心。

 

实验!用户报告了此选项的问题。

份额:<整数>(0-50000)(默认1000)

自动气球的内存共享量。数字越大,此VM获得的内存越多。数字是相对于所有其他正在运行的VM的权重而言的。使用零将禁用自动气球。自动气球由pvestatd完成。

smbios1:[base64 = <1 | 0>] [,family = <Base64编码的字符串>] [,制造商= <Base64的编码字符串>] [,产品= <Base64的编码字符串>] [,serial = <Base64的编码字符串> ] [,sku = <Base64编码的字符串>] [,uuid = <UUID>] [,version = <Base64编码的字符串>]

指定SMBIOS类型1字段。

base64 = <布尔值>

指示SMBIOS值是base64编码的标志

family = <Base64编码的字符串>

设置SMBIOS1系列字符串。

制造商 = <Base64编码的字符串>

设置SMBIOS1制造商。

产品 = <Base64编码的字符串>

设置SMBIOS1产品ID。

serial = <Base64编码的字符串>

设置SMBIOS1序列号。

sku = <Base64编码的字符串>

设置SMBIOS1 SKU字符串。

uuid = <UUID>

设置SMBIOS1 UUID。

版本 = <Base64编码的字符串>

设置SMBIOS1版本。

smp:<整数>(1-N)(默认1)

CPU数。请改用-sockets选项。

套接字:<整数>(1-N)(默认1)

CPU插槽数。

sshkeys:<字符串>

cloud-init:设置公共SSH密钥(每行一个密钥,OpenSSH格式)。

开始日期:(现在| YYYY-MM-DD | YYYY-MM-DDTHH:MM:SS)(默认现在)

设置实时时钟的初始日期。日期的有效格式为:现在2006-06-17T1601212006-06-17

启动:`[[[order =] \ d +] [,up = \ d +] [,down = \ d +]`

启动和关闭行为。Order是一个非负数,用于定义常规启动顺序。关机顺序相反。此外,您可以设置启动关闭延迟(以秒为单位),该延迟指定了下一个VM启动或停止之前要等待的延迟。

平板电脑:<布尔值>(默认1)

启用/禁用USB平板电脑设备。通常需要此设备才能使用VNC进行绝对鼠标定位。否则,鼠标将与普通的VNC客户端不同步。如果您在一台主机上运行大量仅控制台的来宾,则可以考虑禁用此功能以保存一些上下文切换。如果您使用香料(-vga = qxl),则默认情况下将其关闭。

tdf:<boolean>(默认0)

启用/禁用时间漂移修复。

模板:<boolean>(默认0)

启用/禁用模板。

未使用[n]:<string>

引用未使用的卷。这是内部使用的,不应手动修改。

usb [n]:[host =] <HOSTUSBDEVICE | spice> [,usb3 = <1 | 0>]

配置USB设备(n为0到4)。

主机 = <HOSTUSBDEVICE | spice>

主机USB设备或端口或值spice。HOSTUSBDEVICE语法为:

'bus-port(.port)*'(十进制数字)或

'vendor_id:product_id'(十六进制数字)或

'香料'

您可以使用lsusb -t命令列出现有的USB设备。

 

此选项允许直接访问主机硬件。因此,不再可能迁移此类计算机-请特别小心使用。

香料值可用于为香料添加USB重定向设备。

usb3 = <布尔值>(默认0)

指定给定的主机选项是USB3设备还是端口(当前无法通过香料重定向可靠地工作,因此将被忽略)。

vcpus:<整数>(1-N)(默认0)

热插vcpus的数量。

vga:[[type =] <枚举>] [,内存= <整数>]

配置VGA硬件。如果要使用高分辨率模式(> = 1280x1024x16),则可能需要增加vga内存选项。从QEMU 2.9开始,除某些使用cirrus Windows版本(XP和更早版本)外,所有OS类型的默认VGA显示类型均为std。该QXL选项使SPICE显示服务器。对于win * OS,您可以选择所需的独立显示器数量,Linux guest虚拟机可以自行添加显示器。您也可以使用串行设备作为终端,而无需任何图形卡即可运行。

内存 = <整数>(4-512)

设置VGA内存(在MiB中)。对串行显示无效。

类型 = <cirrus | 无| qxl | qxl2 | qxl3 | qxl4 | serial0 | serial1 | serial2 | serial3 | 标准| virtio | vmware>(默认std)

选择VGA类型。

virtio [n]:[file =] <卷> [,aio = <native | threads>] [,backup = <1 | 0>] [,bps = <bps>] [,bps_max_length = <seconds>] [,bps_rd = <bps> ] [,bps_rd_max_length = <秒>] [,bps_wr = <bps>] [,bps_wr_max_length = <秒>] [,cache = <枚举>] [,cyls = <整数>] [,detect_zeroes = <1 | 0> ] [,discard = <忽略> on] [,format = <枚举>] [,heads = <整数>] [,iops = <iops>] [,iops_max = <iops>] [,iops_max_length = <秒> ] [,iops_rd = <iops>] [,iops_rd_max = <iops>] [,iops_rd_max_length = <seconds>] [,iops_wr = <iops>] [,iops_wr_max = <iops>] [,iops_wr_max_length = <seconds>] [ ,iothread = <1 | 0>] [,mbps = <mbps>] [,mbps_max = <mbps>] [,mbps_rd = <mbps>] [,mbps_rd_max = <mbps>] [,mbps_wr = <mbps>] [ ,mbps_wr_max = <mbps>] [,media = <cdrom | disk>] [,replicate = <1 | 0>] [,rerror = <ignore | report | stop>] [,secs = <整数>] [,serial = <serial>] [,shared = <1 | 0>] [ ,size = <磁盘大小>] [,快照= <1 | 0>] [,trans = <无| lba | auto>] [,werror = <枚举>]

将卷用作VIRTIO硬盘(n为0到15)。

aio = <本地| 线程>

要使用的AIO类型。

备份 = <布尔值>

进行备份时是否应包括驱动器。

bps = <bps>

最大r / w速度,以每秒字节数为单位。

bps_max_length = <秒>

I / O突发的最大长度,以秒为单位。

bps_rd = <bps>

最大读取速度,以每秒字节数为单位。

bps_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

bps_wr = <bps>

最大写入速度,以每秒字节数为单位。

bps_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

缓存 =<directsync | 无| 不安全| 回写 直写>

驱动器的缓存模式

cyls = <整数>

强制驱动器的物理几何形状具有特定的圆柱数。

detect_zeroes = <布尔值>

控制是否检测并尝试优化零写入。

丢弃 = <忽略| 在>

控制是否将丢弃/修剪请求传递给基础存储。

文件 = <卷>

驱动器的后备卷。

格式 = <cloop | 牛| qcow | qcow2 | qed | 原料| vmdk>

驱动器的后备文件的数据格式。

头 = <整数>

强制驱动器的物理几何形状具有特定的磁头数。

iops = <iops>

每秒最大r / w I / O操作数。

iops_max = <iops>

每秒最大无限制r / w I / O池中的操作数。

iops_max_length = <秒>

I / O突发的最大长度,以秒为单位。

iops_rd = <iops>

每秒最大读取I / O操作数。

iops_rd_max = <iops>

每秒最大未限制的读取I / O池操作数。

iops_rd_max_length = <秒>

读取I / O突发的最大长度,以秒为单位。

iops_wr = <iops>

每秒最大写入I / O操作数。

iops_wr_max = <iops>

每秒最大未限制写入I / O池的操作数。

iops_wr_max_length = <秒>

写入I / O突发的最大长度,以秒为单位。

iothread = <布尔值>

是否为此驱动器使用iothreads

mbps = <mbps>

最大r / w速度,以每秒兆字节为单位。

mbps_max = <mbps>

最大未限制的读/写池,以每秒兆字节为单位。

mbps_rd = <mbps>

最大读取速度(兆字节/秒)。

mbps_rd_max = <mbps>

最大不受限制的读取池,以每秒兆字节为单位。

mbps_wr = <mbps>

最大写入速度(以兆字节/秒为单位)。

mbps_wr_max = <mbps>

最大不受限制的写池,以每秒兆字节为单位。

媒体 = <cdrom | 磁盘>(默认磁盘)

驱动器的介质类型。

复制 = <布尔值>(默认1)

是否应考虑将驱动器用于复制作业。

rerror = <忽略| 报告 停止>

读取错误操作。

秒 = <整数>

强制驱动器的物理几何结构具有特定的扇区数。

序列 = <序列号>

该驱动器的报告序列号,使用url编码,最长20个字节。

shared = <布尔值>(默认0)

将此本地管理的卷标记为在所有节点上都可用。

 

该选项不会自动共享该卷,它假定已共享该卷!

大小 = <磁盘大小>

磁盘大小。这纯粹是信息性的,没有任何作用。

快照 = <布尔值>

控制qemu的快照模式功能。如果激活,则对磁盘所做的更改是临时的,并且在VM关闭时将被丢弃。

trans = <自动| lba | 无>

强制磁盘几何图形BIOS转换模式。

werror = <enospc | 忽略| 报告 停止>

编写错误操作。

vmgenid:<UUID>(默认1(自动生成))

VM生成ID(vmgenid)设备向来宾OS公开了128位整数值标识符。当使用不同的配置(例如快照执行或从模板创建)执行虚拟机时,这可以通知来宾操作系统。来宾操作系统会注意到更改,然后可以通过将其分布式数据库的副本标记为脏,重新初始化其随机数生成器等来进行适当的反应。请注意,只有在通过API / CLI创建完成后,自动创建才起作用或更新方法,但在手动编辑配置文件时则不行。

vmstatestorage:<字符串>

VM状态卷/文件的默认存储。

看门狗:[[model =] <i6300esb | ib700>] [,action = <枚举>]

创建虚拟硬件看门狗设备。一旦启用(通过来宾操作),就必须由来宾内部的代理定期轮询看门狗,否则看门狗将重置来宾(或执行指定的相应操作)

动作 = <调试| 无| 暂停| 断电| 重置| 关闭>

访客激活后执行的操作未能及时轮询看门狗。

型号 = <i6300esb | ib700>(默认i6300esb)

看门狗类型进行仿真。

10.13。锁具

联机迁移,快照和备份(vzdump)设置了锁定,以防止在受影响的VM上执行不兼容的并发操作。有时您需要手动删除此类锁(例如,在电源故障后)。

qm解锁<vmid>

 

仅当您确定设置锁定的操作不再运行时,才执行此操作。

Proxmox VE 6.0管理指南——10. Qemu / KVM虚拟机相关推荐

  1. Proxmox VE 6.0管理指南——3.主机系统管理

    3.主机系统管理 Proxmox VE基于著名的Debian Linux发行版.这意味着您可以访问Debian软件包的整个领域,并且基本系统的文档记录非常详尽.在 Debian的管理员手册可在网上,并 ...

  2. Proxmox VE 6.0管理指南——8. Proxmox VE存储

    8. Proxmox VE存储 Proxmox VE存储模型非常灵活.虚拟机映像可以存储在一个或多个本地存储中,也可以存储在共享存储中,例如NFS或iSCSI(NAS,SAN).没有限制,您可以根据需 ...

  3. Proxmox VE 6.0管理指南——2.安装Proxmox VE

    2.安装Proxmox VE Proxmox VE基于Debian,因此我们提供的磁盘映像(ISO文件)包括完整的Debian系统(版本5.x为" stretch")以及所有必需的 ...

  4. Proxmox VE 6.0管理指南——5.图形用户界面

    5.图形用户界面 Proxmox VE很简单.无需安装单独的管理工具,一切都可以通过网络浏览器完成(最好使用最新的Firefox或Google Chrome).内置的HTML5控制台用于访问来宾控制台 ...

  5. QEMU/KVM虚拟机Win11黑屏问题解决

    ArchLinux系统下,通过qemu/kvm虚拟机环境安装的win11(UEFI+GPT),8月份以来一直使用正常.最近看到一个错误想纠正(如下图),考虑到可能是权限问题,便将win11的qcow2 ...

  6. oracle cpu分配,CPU 分配 - Oracle VM Server for SPARC 2.0 管理指南

    CPU 分配 CPU 分配机制针对 CPU 资源使用以下约束和提示: 整体核心约束.此约束指定基于指定的 CPU 核心数将虚拟 CPU 分配给域.系统必须能够分配指定数目的核心,还必须能够将这些分配了 ...

  7. oracle vm传输,XML 传输 - Oracle VM Server for SPARC 2.0 管理指南

    XML 传输 外部程序可利用可扩展消息处理现场协议 (Extensible Messaging and Presence Protocol, XMPP – RFC 3920) 与 Logical Do ...

  8. QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)

    一.提升性能核心要素 1.将OPENGL 接口进行穿透调用,下面对opengl穿透做个小结 2.在arm开发板上打开kvm特性,这个qcom&mtk都是实现了的,只需要打开开关即可 二.AND ...

  9. Linux下KVM虚拟机基本管理及常用命令(转)

    说明:可能有重复 一.KVM的基本管理 1.查看KVM虚拟机配置文件 #Kvm虚拟机默认配置文件位置 [root@kvm qemu]# pwd /etc/libvirt/qemu [root@kvm ...

最新文章

  1. php读取excel文件_php读取EXCEL文件 php excelreader读取excel文件
  2. redis value多大会影响性能_redis面试总结
  3. Jsp和Servlet有什么区别?
  4. 奇虎360WEB平台部招贤纳士之服务端开发
  5. 【月入百万】,资深股民恐怕都不知道
  6. gitlab 迁移_无忌过招:手把手教你搭建自己的GitLab库
  7. 试题8 算法训练 P0103(从键盘输入一个大写字母,要求改用小写字母输出。)
  8. Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
  9. Homegrown【翻译】
  10. kuwo.php源码,酷我音乐官方flash播放器调用代码
  11. ShadowGun 暗影之枪 项目源码,手机优化示例关卡
  12. Kmeans算法思想
  13. 计算机考研自学,自学考研计算机
  14. 礼物帮手项目(3) - 传id跳转详情页(尝试2种方法)
  15. 基于卷积神经网络CNN的面部表情识别
  16. css横排文字光影效果_css实现发光文字,以及一点点js特效
  17. spring boot 集成框架事例
  18. WIN7下C:\Documents and Settings 无法打开_雨山_百度空间
  19. “郭德纲”挤兑人不带脏字
  20. 投了100份简历,唯一邀请我面试的这一家Android开发公司;是如何对我洗刷的?

热门文章

  1. c语言编程乒乓球分组,乒乓球分组比赛规则
  2. ControlCenter and Dataviewer
  3. Node.js自学笔记(4)
  4. 一般实验室、专用实验室及研究工作室的设计
  5. excel加载项不能被加载_最喜欢的免费Excel加载项
  6. 撞上元宇宙冷门新职业 我变年入百万打工人
  7. 如何从红帽官网下载redhat企业版系统镜像
  8. 至联云讲解《IPFS为何是下一代互联网的新宠》
  9. 网站http改https Let’s Encrypt 安装 续期教程 免费ssl证书Let’s Encrypt使用教程Certbot...
  10. github,源码,高仿 直播