diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-caution.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-caution.gif deleted file mode 100644 index 6e90d7cfc2193e39e10bb58c38d01a23f045d571..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-caution.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-danger.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-danger.gif deleted file mode 100644 index 6e90d7cfc2193e39e10bb58c38d01a23f045d571..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-danger.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-note.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-note.gif deleted file mode 100644 index 6314297e45c1de184204098efd4814d6dc8b1cda..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-note.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-notice.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-notice.gif deleted file mode 100644 index 86024f61b691400bea99e5b1f506d9d9aef36e27..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-notice.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-tip.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-tip.gif deleted file mode 100644 index 93aa72053b510e456b149f36a0972703ea9999b7..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-tip.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/public_sys-resources/icon-warning.gif b/docs/zh/docs/Virtualization/public_sys-resources/icon-warning.gif deleted file mode 100644 index 6e90d7cfc2193e39e10bb58c38d01a23f045d571..0000000000000000000000000000000000000000 Binary files a/docs/zh/docs/Virtualization/public_sys-resources/icon-warning.gif and /dev/null differ diff --git a/docs/zh/docs/Virtualization/virtualization.md b/docs/zh/docs/Virtualization/virtualization.md deleted file mode 100644 index 2199541c5bdd2744ddd11d2f3cd44391fcbceffa..0000000000000000000000000000000000000000 --- a/docs/zh/docs/Virtualization/virtualization.md +++ /dev/null @@ -1,3 +0,0 @@ -# 虚拟化用户指南 - -本文档给出虚拟化介绍,并给出基于openEuler的虚拟化安装方法、如何使用虚拟化的教程,进而让用户了解虚拟化,并指导管理员及普通用户安装和使用虚拟化。 \ No newline at end of file diff --git "a/docs/zh/docs/Virtualization/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" "b/docs/zh/docs/Virtualization/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" deleted file mode 100644 index a7901d1fdea9dcec650912f44c4f8d08569f0d72..0000000000000000000000000000000000000000 --- "a/docs/zh/docs/Virtualization/\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" +++ /dev/null @@ -1,17 +0,0 @@ -# 常见问题与解决方法 - -## **问题1:使用libcareplus工具制作的qemu热补丁无法加载** - -原因:qemu版本和热补丁版本不一致。 - -解决方法:下载qemu对应版本的源码,同时需保持制作热补丁的环境和制作qemu包环境一致,buildID可作为二者是否一致的判定标准。因用户无qemu版本的制作环境,故可以 **自行编包并安装** ,使用自编包中的/usr/libexec/qemu-kvm的buildID。 - -## **问题2:使用libcareplus工具制作的热补丁已加载但未生效** - -原因:不支持死循环、不退出、递归的函数,不支持对初始化函数、inline 函数以及小于5字节的短函数。 - -解决方法:查看补丁所在函数是否在约束限制中。 - -## **问题3:使用kvmtop工具第一次显示的结果为间隔0.05秒的两次采样计算得到的结果,波动较大** - -此为开源top框架缺陷导致,暂无解决方案。 \ No newline at end of file diff --git a/docs/zh/docs/virtulization/.markdownlint.json b/docs/zh/docs/virtulization/.markdownlint.json deleted file mode 100644 index 81f0eb7aae8fedbecf92202d0fb0962c6f05c8d3..0000000000000000000000000000000000000000 --- a/docs/zh/docs/virtulization/.markdownlint.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "MD003":{"style":"atx"}, - "MD007":{"indent":4}, - "MD029":{"style":"ordered"}, - "MD009":false, - "MD013":false, - "MD014":false, - "MD020":false, - "MD021":false, - "MD024":false, - "MD025":false, - "MD033":false, - "MD036":false, - "MD042":false, - "MD043":false, - "MD044":false, - "MD045":false, - "MD048":false, - "MD049":false, - "MD050":false, - "MD051":false, - "MD052":false, - "MD053":false -} \ No newline at end of file diff --git a/docs/zh/docs/virtulization/_toc.yaml b/docs/zh/docs/virtulization/_toc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8f80231aca863710135b0a207e8d9b84b30c391f --- /dev/null +++ b/docs/zh/docs/virtulization/_toc.yaml @@ -0,0 +1,9 @@ +label: 虚拟化 +sections: + - label: 虚拟化平台 + sections: + - href: ./virtualization_platform/virtualization/_toc.yaml + - href: ./virtualization_platform/stratovirt/_toc.yaml + - href: + upstream: 待定 + path: ./virtualization_platform/openstack diff --git a/docs/zh/docs/virtulization/virtulization_platform/virtulization/_toc.yaml b/docs/zh/docs/virtulization/virtulization_platform/virtulization/_toc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4f19e0d0e881b0e8807a4f47a5ae6f811e1f3fad --- /dev/null +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/_toc.yaml @@ -0,0 +1,35 @@ +label: 虚拟化用户指南 +isManual: true +description: 在openEuler系统中使用虚拟化技术创建和管理虚拟机 +sections: + - label: 认识虚拟化 + href: ./introduction_to_virtulization.md + - label: 安装虚拟化组件 + href: ./virtualization_installation.md + - label: 准备使用环境 + href: ./environment_preparation.md + - label: 虚拟机配置 + href: ./vm_configuration.md + - label: 管理虚拟机 + href: ./managing_vms.md + - label: 热迁移虚拟机 + href: ./vm_live_migration.md + - label: 管理系统资源 + href: ./system_resource_management.md + - label: 管理设备 + href: ./managing_devices.md + - label: 管理虚拟机可维护性 + href: ./vm_maintainability_managment.md + - label: 最佳实践 + href: ./best_practices.md + - label: 工具使用指南 + href: ./tool_guide.md + sections: + - label: vmtop + href: ./vmtop.md + - label: LibcarePlus + href: ./libcareplus.md + - label: Skylark虚拟机混部 + href: ./skylark.md + - label: 附录 + href: ./appendix.md diff --git "a/docs/zh/docs/Virtualization/\351\231\204\345\275\225.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/appendix.md similarity index 99% rename from "docs/zh/docs/Virtualization/\351\231\204\345\275\225.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/appendix.md index e7cef501559233400204561b089ca819bc34c4c1..8d370be98664cf7c83f35942379a8ce3aa79a0d3 100644 --- "a/docs/zh/docs/Virtualization/\351\231\204\345\275\225.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/appendix.md @@ -1,9 +1,4 @@ # 附录 - -- [附录](#附录.md) - - [术语和缩略语](#术语和缩略语) - - ## 术语和缩略语 @@ -143,4 +138,3 @@ - diff --git "a/docs/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/best_practices.md similarity index 96% rename from "docs/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/best_practices.md index 0f321d6f77a9f6585acf3893e21d09dc1725bcae..87dd6a7a035e85555de6acf3ac3f488f2933a6b5 100644 --- "a/docs/zh/docs/Virtualization/\346\234\200\344\275\263\345\256\236\350\267\265.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/best_practices.md @@ -8,7 +8,7 @@ 在计算资源充足的情况下,为使虚拟机获得接近物理机的性能,可以使用halt-polling特性。没有使用halt-polling特性时,当vCPU空闲退出后,主机会把CPU资源分配给其他进程使用。当主机开启halt-polling特性时,虚拟机vCPU处于空闲时会polling一段时间,polling的时间由具体配置决定。若该vCPU在polling期间被唤醒,可以不从主机侧调度而继续运行,减少了调度流程的开销,从而在一定程度上提高了虚拟机系统的性能。 ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >halt-polling的机制保证虚拟机的vCPU线程的及时响应,但在虚拟机空载的时候,主机侧也会polling,导致主机看到vCPU所在CPU占用率比较高,而实际虚拟机内部CPU占用率并不高。 #### 操作指导 @@ -215,7 +215,7 @@ PV-qspinlock主要是针对虚拟化CPU超分场景自旋锁的优化,允许hy [ 0.000000] arm-pv: PV qspinlocks enabled ``` ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >PV-qspinlock仅限于宿主机和虚拟机操作系统均为openEuler 20.09及以上版本支持,且虚拟机内核编译选项需要配置CONFIG_PARAVIRT_SPINLOCKS=y(openEuler默认配置)。 ### Guest-Idle-Haltpoll @@ -224,7 +224,7 @@ PV-qspinlock主要是针对虚拟化CPU超分场景自旋锁的优化,允许hy 为了保证公平性及降低功耗,当虚拟机vCPU空闲时,虚拟机将执行WFx/HLT指令退出到宿主机中,并触发上下文切换。宿主机将决定在物理CPU上调度其他进程或vCPU,或进入节能模式。但是,虚拟机和宿主机之间的切换、额外的上下文切换以及唤醒IPI中断开销较大,在频繁睡眠和唤醒的业务中该问题尤为突出。Guest-Idle-Haltpoll技术是指当虚拟机vCPU空闲时,不立刻执行WFx/HLT并发生VM-exit,而是在虚拟机内部轮询(polling)一段时间。在该时间段内,其他共享LLC的vCPU在该vCPU上的任务被唤醒不需要发送IPI中断,减少了发送和接收处理IPI的开销及虚拟机陷出(VM-exit)的开销,从而降低任务唤醒的时延。 ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >由于vCPU在虚拟机内部执行idle-haltpoll会增加vCPU在宿主机的CPU开销,所以开启该特性建议vCPU在宿主机独占物理核。 #### 操作指导 @@ -443,7 +443,7 @@ qemu-ga(Qemu Guest Agent)它是运行在虚拟机内部的守护进程,它 在一些对安全要求较高的使用场景,为了防止虚拟机内部信息泄露,qemu-ga提供了黑名单功能,用户可以通过黑名单选择性屏蔽qemu-ga提供的部分功能。 ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >qemu-ga对应的安装包是qemu-guest-agent-xx.rpm,openEuler默认不安装。xx为实际版本号。 #### 操作方法 @@ -492,14 +492,14 @@ qemu-ga(Qemu Guest Agent)它是运行在虚拟机内部的守护进程,它 root 727 1 0 08:17 ? 00:00:00 /usr/bin/qemu-ga --method=virtio-serial --path=/dev/virtio-ports/org.qemu.guest_agent.0 --blacklist=guest-file-open guest-file-close guest-file-read guest-file-write guest-file-seek guest-file-flush -F/etc/qemu-ga/fsfreeze-hook ``` - >![](./public_sys-resources/icon-note.gif) **说明:** + >[!NOTE]说明 >更多关于qemu-ga的资料可以参见[https://wiki.qemu.org/Features/GuestAgent](https://wiki.qemu.org/Features/GuestAgent)。 ### sVirt保护 #### 概述 -在只使用自由访问控制DAC(Discretionary Acces Control)策略的虚拟化环境中,主机上运行的恶意虚拟机可能存在攻击hypervisor或其他虚拟机的情况。为了提升虚拟化场景的安全性,openEuler使用了sVirt保护。sVirt是基于SELinux,适用于KVM虚拟化场景的安全防护技术。虚拟机本质是主机操作系统上的普通进程,sVirt机制在hypervisor将虚拟机对应的QEMU进程进行SELinux标记分类,除了使用type表示虚拟化专有进程和文件,还用不同的category(在seclevel区间)表示不同虚拟机,每个虚拟机只能访问自身相同category的文件设备,防止虚拟机访问非授权的主机或其他虚拟机的文件和设备,从而防止虚拟机逃逸,提升主机和虚拟机的安全性。 +在只使用自由访问控制DAC(Discretionary Access Control)策略的虚拟化环境中,主机上运行的恶意虚拟机可能存在攻击hypervisor或其他虚拟机的情况。为了提升虚拟化场景的安全性,openEuler使用了sVirt保护。sVirt是基于SELinux,适用于KVM虚拟化场景的安全防护技术。虚拟机本质是主机操作系统上的普通进程,sVirt机制在hypervisor将虚拟机对应的QEMU进程进行SELinux标记分类,除了使用type表示虚拟化专有进程和文件,还用不同的category(在seclevel区间)表示不同虚拟机,每个虚拟机只能访问自身相同category的文件设备,防止虚拟机访问非授权的主机或其他虚拟机的文件和设备,从而防止虚拟机逃逸,提升主机和虚拟机的安全性。 #### 开启sVirt保护 diff --git "a/docs/zh/docs/Virtualization/\345\207\206\345\244\207\344\275\277\347\224\250\347\216\257\345\242\203.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/environment_preparation.md similarity index 99% rename from "docs/zh/docs/Virtualization/\345\207\206\345\244\207\344\275\277\347\224\250\347\216\257\345\242\203.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/environment_preparation.md index aa3655d0398cde0ac0a9dbde86923b072d283d71..228c7360dbd4721a32752ee4e6136e0797610283 100644 --- "a/docs/zh/docs/Virtualization/\345\207\206\345\244\207\344\275\277\347\224\250\347\216\257\345\242\203.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/environment_preparation.md @@ -361,14 +361,19 @@ openEuler虚拟化使用virsh管理虚拟机。如果希望在非root用户使 5. 在虚拟机XML配置文件中的domain根元素中添加如下内容,使qemu-kvm进程可以访问磁盘镜像文件。 执行如下命令查询当前运行的虚拟机 + ```sh virsh list ``` + 使用如下命令编辑对应虚拟机的XML,name参数为上一步查询到的需要修改的目标虚拟机名称 + ```sh virsh edit ``` + 添加如下配置,编辑后保存即可生效 + ```xml ``` diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP1.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP1.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP1.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP1.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP2.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP2.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP2.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP2.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP3.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP3.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP3.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP3.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP4.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP4.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP4.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP4.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP5.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP5.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP5.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP5.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP6.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP6.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP6.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP6.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP7.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP7.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP7.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP7.png diff --git a/docs/zh/docs/Virtualization/figures/CertEnrollP8.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP8.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/CertEnrollP8.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/CertEnrollP8.png diff --git a/docs/zh/docs/Virtualization/figures/OSBootFlow.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/OSBootFlow.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/OSBootFlow.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/OSBootFlow.png diff --git a/docs/zh/docs/Virtualization/figures/SecureBootFlow.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/SecureBootFlow.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/SecureBootFlow.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/SecureBootFlow.png diff --git a/docs/zh/docs/Virtualization/figures/kvm-architecture.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/kvm-architecture.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/kvm-architecture.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/kvm-architecture.png diff --git a/docs/zh/docs/Virtualization/figures/status-transition-diagram.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/status-transition-diagram.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/status-transition-diagram.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/status-transition-diagram.png diff --git a/docs/zh/docs/Virtualization/figures/virtual-network-structure.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/virtual-network-structure.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/virtual-network-structure.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/virtual-network-structure.png diff --git a/docs/zh/docs/Virtualization/figures/virtualized-architecture.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/virtualized-architecture.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/virtualized-architecture.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/virtualized-architecture.png diff --git a/docs/zh/docs/Virtualization/figures/zh-cn_image_0218587435.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/zh-cn_image_0218587435.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/zh-cn_image_0218587435.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/zh-cn_image_0218587435.png diff --git a/docs/zh/docs/Virtualization/figures/zh-cn_image_0218587436.png b/docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/zh-cn_image_0218587436.png similarity index 100% rename from docs/zh/docs/Virtualization/figures/zh-cn_image_0218587436.png rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/figures/zh-cn_image_0218587436.png diff --git "a/docs/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/introduction_to_virtualization.md similarity index 100% rename from "docs/zh/docs/Virtualization/\350\256\244\350\257\206\350\231\232\346\213\237\345\214\226.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/introduction_to_virtualization.md diff --git a/docs/zh/docs/Virtualization/LibcarePlus.md b/docs/zh/docs/virtulization/virtulization_platform/virtulization/libcareplus.md similarity index 93% rename from docs/zh/docs/Virtualization/LibcarePlus.md rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/libcareplus.md index ce7cd7d736ef7cffba4a45508322d3192d136e92..d09814f7b43e9ff86243fac2435deea6f1288796 100644 --- a/docs/zh/docs/Virtualization/LibcarePlus.md +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/libcareplus.md @@ -22,7 +22,6 @@ LibcarePlus 是一个用户态进程热补丁框架,可以在不重启进程 - LibcarePlus 制作热补丁时,依赖原可执行文件的符号表,因此,请勿过早将符号表strip掉。 - 对于开启selinux的Linux系统,需要自行适配对应的selinux规则。 - ## 注意事项和约束 使用 LibcarePlus,需遵循以下热补丁规范和约束: @@ -38,14 +37,14 @@ LibcarePlus 是一个用户态进程热补丁框架,可以在不重启进程 - 对于TLS变量,仅支持修改IE模式的TLS变量。 - 后续补丁不能使用之前补丁中定义的符号。 - 以下场景不支持热补丁: - - 死循环函数、不退出函数、inline 函数、初始化函数、NMI 中断处理函数 - - 替换全局变量 - - 小于5字节的短函数 - - 修改头文件 - - 增加和删除目标函数的出参和入参 - - 数据结构成员变化(新增、删除、修改) - - 修改包含 __LINE__ , __FILE__ 等gcc编译宏的 C 文件 - - 修改 intel 矢量汇编指令 + - 死循环函数、不退出函数、inline 函数、初始化函数、NMI 中断处理函数 + - 替换全局变量 + - 小于5字节的短函数 + - 修改头文件 + - 增加和删除目标函数的出参和入参 + - 数据结构成员变化(新增、删除、修改) + - 修改包含 __LINE__ , __FILE__ 等gcc编译宏的 C 文件 + - 修改 intel 矢量汇编指令 ## 安装 LibcarePlus @@ -158,8 +157,7 @@ LibcarePlus 支持如下方式制作热补丁: bar.c bar.s foo.c foo.s ``` - -3. 使用 **kpatch_gensrc** 对比 foo.s 和 bar.s 差异,生成包含原文件的汇编内容和差异内容的 foobar.s,参考命令如下: +3. 使用 **kpatch_gensrc** 对比 foo.s 和 bar.s 差异,生成包含原文件的汇编内容和差异内容的 foobar.s,参考命令如下: ``` shell # sed -i 's/bar.c/foo.c/' bar.s @@ -196,7 +194,7 @@ LibcarePlus 支持如下方式制作热补丁: 6. 制作热补丁文件。 通过以上操作,已经得到了热补丁制作所需的主要内容。接下来需要使用 **kpatch_make** 将原可执行文件的 **Build ID** 以及 **kpatch_strip** 的输出文件 **foobar.stripped** 作为参数传递给 **kpatch_make**,最终生成热补丁文件,参考命令如下: - + ``` shell # str=$(readelf -n foo | grep 'Build ID') # substr=${str##* } @@ -204,7 +202,7 @@ LibcarePlus 支持如下方式制作热补丁: # ls bar.c bar.s foo foobar foobar.s foobar.stripped foo.c foo.kpatch foo.s ``` - + 至此,就得到了patch ID为0001的热补丁文件 foo.kpatch。 #### 通过脚本制作 @@ -223,10 +221,9 @@ LibcarePlus 支持如下方式制作热补丁: 点击展开 foo.patch

- ``` diff - --- foo.c 2020-12-09 15:39:51.159632075 +0800 - +++ bar.c 2020-12-09 15:40:03.818632220 +0800 + --- foo.c 2020-12-09 15:39:51.159632075 +0800 + +++ bar.c 2020-12-09 15:40:03.818632220 +0800 @@ -1,10 +1,10 @@ -// foo.c +// bar.c @@ -245,30 +242,21 @@ LibcarePlus 支持如下方式制作热补丁:

- 2. 编写编译 foo.c 的 Makefile 文件,具体如下所示: -
- 点击展开 Makefile -

- - ``` makefile - all: foo - - foo: foo.c - $(CC) -o $@ $< - - clean: - rm -f foo - - install: foo - mkdir $$DESTDIR || : - cp foo $$DESTDIR - ``` - -

-
+ ``` makefile + all: foo + + foo: foo.c + $(CC) -o $@ $< + + clean: + rm -f foo + install: foo + mkdir $$DESTDIR || : + cp foo $$DESTDIR + ``` 3. 编写好 Makefile 之后,直接调用 **libcare-patch-make** 即可。若 **libcare-patch-make** 询问选择哪个文件进行打补丁操作,输入原文件名即可,具体如下所示: @@ -285,8 +273,8 @@ LibcarePlus 支持如下方式制作热补丁: Perhaps you used the wrong -p or --strip option? The text leading up to this was: -------------------------- - |--- foo.c 2020-12-10 09:43:04.445375845 +0800 - |+++ bar.c 2020-12-10 09:48:36.778379648 +0800 + |--- foo.c 2020-12-10 09:43:04.445375845 +0800 + |+++ bar.c 2020-12-10 09:48:36.778379648 +0800 -------------------------- File to patch: foo.c patching file foo.c @@ -303,8 +291,6 @@ LibcarePlus 支持如下方式制作热补丁: 执行成功之后,输出显示:热补丁文件位于当前目录的 **patchroot** 目录下,可执行文件则在 **lpmake** 目录下。脚本生成的热补丁文件默认是采用 Build ID 作为热补丁文件的文件名。 - - ## 应用 LibcarePlus 热补丁 本节以原文件 **foo.c** 和补丁文件 **bar.c** 为例,介绍 LibcarePlus 热补丁的应用指导。 @@ -347,8 +333,6 @@ LibcarePlus 支持如下方式制作热补丁: Hello world being patched! ``` - - ### 查询补丁 本节介绍查询LibcarePlus热补丁的具体流程。 @@ -370,8 +354,6 @@ LibcarePlus 支持如下方式制作热补丁: Patch id: 0001 ``` - - ### 卸载热补丁 本节介绍卸载 LibcarePlus 热补丁的具体流程。 @@ -402,6 +384,7 @@ LibcarePlus 支持如下方式制作热补丁: 制作方法如下: ### 1.下载qemu制品仓代码,保持代码版本与openEuler环境中qemu版本一致 + ```shell # 下载qemu源码并解压 yum download --source qemu @@ -419,6 +402,7 @@ rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id ``` 有两份成果物: + - /root/rpmbuild/BUILD/qemu-8.2.0中生成中间代码,为编译qemu对应代码。将代码拷贝到/home/abuild/rpmbuild/BUILD/qemu-8.2.0,编译环境的路径也会影响补丁地址的偏移。 - /root/rpmbuild/RPMS/中生成qemu相关的rpm包。 @@ -455,6 +439,7 @@ rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id ``` ### 3.配置/etc/libcare.conf + /etc/libcare.conf填上patch文件修改的函数,用于后续制作补丁时,过滤掉不相关的函数; 当前修改内容如下: @@ -471,6 +456,7 @@ rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id # file /usr/libexec/qemu-kvm /usr/libexec/qemu-kvm: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=68f4ec13e140d3a688f3e0fb93442b8c7a86be8b, for GNU/Linux 3.7.0, stripped ``` + 注:需保持制作热补丁的环境和制作qemu包环境一致,buildID可作为二者是否一致的判定标准。因用户无qemu版本的制作环境,故可以自行编包并安装,使用自编包中的/usr/libexec/qemu-kvm的buildID。 ### 5.制作热补丁 @@ -480,6 +466,7 @@ rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id ```shell # libcare-patch-make --clean -s ../ 0002-patch-hello-qdm.patch -i 0001 --buildid=68f4ec13e140d3a688f3e0fb93442b8c7a86be8b -j 64 ``` + 参数说明: --clean 类似make clean @@ -490,4 +477,4 @@ rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id buildid=xxx 保持和系统中qemu-kvm buildid一致 --j 64 多线程编译 \ No newline at end of file +-j 64 多线程编译 diff --git "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_devices.md similarity index 80% rename from "docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_devices.md index f24962aca712e935259b892336dd9827de46df90..8fa7a269bb5deb8675f832d70bd38cacb2d1b735 100644 --- "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\256\276\345\244\207.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_devices.md @@ -45,7 +45,7 @@
- + ``` 其中: @@ -85,7 +85,6 @@ -
@@ -257,7 +256,7 @@ PCI直通是指将host上的物理PCI设备直接呈现给一台虚拟机,供

PCI设备呈现的Guest内bdf号。

-

[0x03-0x1e](./slot范围)

+

[0x03-0x1e] (./s`lot范围)

说明:

  • domain为域信息,bus为总线号,slot为插槽号,function为功能
  • 除了slot插槽号,这里其余均默认为0。
  • 第一个slot插槽号0x00被系统占用,第二个slot号0x01被IDE控制器和USB控制器占用,第三个slot号0x02被video占用。
  • 最后一个slot号0x1f被pvchannel占用。
@@ -265,30 +264,31 @@ PCI直通是指将host上的物理PCI设备直接呈现给一台虚拟机,供 ->![](./public_sys-resources/icon-note.gif) **说明:** ->VFIO直通方式的最小直通单位是iommu\_group,host根据硬件上的ACS位,来划分iommu\_group。同一个iommu\_group中的设备只允许直通给同一台虚拟机(一个PCI设备上的若干个function,如果属于同一个iommu\_group,只允许直通给一个虚拟机使用)。 +> [!NOTE]说明 +> +> VFIO直通方式的最小直通单位是iommu\_group,host根据硬件上的ACS位,来划分iommu\_group。同一个iommu\_group中的设备只允许直通给同一台虚拟机(一个PCI设备上的若干个function,如果属于同一个iommu\_group,只允许直通给一个虚拟机使用)。 ### SR-IOV直通 #### 概述 -SR-IOV(Single Root I/O Virtualizaiton)是一种基于硬件的虚拟化解决方案,通过SR-IOV技术可以将一个PF(Physical Function)虚拟成多个VF(Virtual Function),每个VF都可以单独被直通给一个虚拟机,极大地提升了硬件资源利用率和虚拟机的I/O性能。一种典型的应用场景就是网卡SR-IOV设备直通,利用SR-IOV技术可以将一个物理网卡(PF)虚拟成多个VF网卡,再把VF直通给虚拟机使用。 +SR-IOV(Single Root I/O Virtualization)是一种基于硬件的虚拟化解决方案,通过SR-IOV技术可以将一个PF(Physical Function)虚拟成多个VF(Virtual Function),每个VF都可以单独被直通给一个虚拟机,极大地提升了硬件资源利用率和虚拟机的I/O性能。一种典型的应用场景就是网卡SR-IOV设备直通,利用SR-IOV技术可以将一个物理网卡(PF)虚拟成多个VF网卡,再把VF直通给虚拟机使用。 ->![](./public_sys-resources/icon-note.gif) **说明:** +> [!NOTE]说明 > ->- SR-IOV需要物理硬件支持,使用SR-IOV前请确保要直通的硬件设备支持该能力,并且Host侧的设备驱动程序工作在SR-IOV模式下。 ->- 查询网卡具体型号的办法如下: ->例如下述回显,第一列为网卡的PCI号,19e5:1822为网卡的厂商号设备号。 +> - SR-IOV需要物理硬件支持,使用SR-IOV前请确保要直通的硬件设备支持该能力,并且Host侧的设备驱动程序工作在SR-IOV模式下。 +> - 查询网卡具体型号的办法如下: +> 例如下述回显,第一列为网卡的PCI号,19e5:1822为网卡的厂商号设备号。 > ->```sh -># lspci | grep Ether ->05:00.0 Ethernet controller: Device 19e5:1822 (rev 45) ->07:00.0 Ethernet controller: Device 19e5:1822 (rev 45) ->09:00.0 Ethernet controller: Device 19e5:1822 (rev 45) ->0b:00.0 Ethernet controller: Device 19e5:1822 (rev 45) ->81:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) ->81:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) ->``` +> ```sh +> # lspci | grep Ether +> 05:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +> 07:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +> 09:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +> 0b:00.0 Ethernet controller: Device 19e5:1822 (rev 45) +> 81:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) +> 81:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01) +> ``` #### 操作方法 @@ -432,14 +432,13 @@ SR-IOV(Single Root I/O Virtualizaiton)是一种基于硬件的虚拟化解 - >![](./public_sys-resources/icon-note.gif) **说明:** - >关闭SR-IOV功能。 - >在虚拟机使用完毕后(虚拟机关机,所有的VF均没有在使用中的时候),若要关闭SR-IOV功能。执行操作如下: - >这里以Hi1822网卡(eth0对应PF的网口名称)为例: -> - >```sh - >echo 0 > /sys/class/net/eth0/device/sriov_numvfs - >``` + 关闭SR-IOV功能: + 在虚拟机使用完毕后(虚拟机关机,所有的VF均没有在使用中的时候),若要关闭SR-IOV功能。执行操作如下: + 这里以Hi1822网卡(eth0对应PF的网口名称)为例: + + ```shell + echo 0 > /sys/class/net/eth0/device/sriov_numvfs + ``` #### HPRE加速器SR-IOV直通 @@ -447,6 +446,7 @@ SR-IOV(Single Root I/O Virtualizaiton)是一种基于硬件的虚拟化解 在鲲鹏服务器上,需要把主机Host上的HPRE加速器的VF直通给虚拟机,供虚拟机内部业务使用。 **表 1** HPRE加速器说明 + | 项目 | 说明 | |-------------|-----------------------------------------------------------------------------------------------------| | 设备名称 | Hi1620 on-chip RSA/DH security algorithm accelerator (HPRE engine) | @@ -456,160 +456,14 @@ SR-IOV(Single Root I/O Virtualizaiton)是一种基于硬件的虚拟化解 | VF DeviceID | 0xA259 | | 最大VF数量 | 一个HPRE PF最多支持创建63个VF | ->![](./public_sys-resources/icon-note.gif) **说明:** ->当虚拟机正在使用VF设备时,不允许卸载Host上的驱动,加速器不支持热插拔。 ->VF操作(VFNUMS为0表示关闭VF,hpre_num用来标识具体的加速器设备): +> [!NOTE]说明 > ->```sh ->echo $VFNUMS > /sys/class/uacce/hisi_hpre-$hpre_num/device/sriov_numvfs ->``` - -### vDPA直通 - -#### 概述 - -vDPA直通是将host上的一个设备对接到vDPA框架,通过vhost-vdpa驱动对外呈现字符设备,并将该字符设备配置给虚拟机,供虚拟机使用的一种方式。vDPA直通的磁盘支持作为虚拟机的系统盘或数据盘使用,并支持数据盘热扩容。 - -vDPA直通提供了与VFIO直通持平的IO性能,同时提供了virtio设备的灵活性,可以支持vDPA直通设备热迁移。 - -配合SR-IOV方案,vDPA直通可以实现一个物理网卡(PF)虚拟成多个VF网卡,再将VF网卡对接到vDPA框架后,提供给虚拟机使用。 - -#### 操作方法 - -请使用root用户按照如下操作步骤配置vDPA设备直通 - -1. 创建及配置VF设备,详细流程参考SR-IOV直通中的第1-3步,以下述virtio-net设备为例(08:00.6和08:00.7为PF,其余为创建的VF): - - ```shell - # lspci | grep -i Eth | grep Virtio - 08:00.6 Ethernet controller: Virtio: Virtio network device - 08:00.7 Ethernet controller: Virtio: Virtio network device - 08:01.1 Ethernet controller: Virtio: Virtio network device - 08:01.2 Ethernet controller: Virtio: Virtio network device - 08:01.3 Ethernet controller: Virtio: Virtio network device - 08:01.4 Ethernet controller: Virtio: Virtio network device - 08:01.5 Ethernet controller: Virtio: Virtio network device - 08:01.6 Ethernet controller: Virtio: Virtio network device - 08:01.7 Ethernet controller: Virtio: Virtio network device - 08:02.0 Ethernet controller: Virtio: Virtio network device - 08:02.1 Ethernet controller: Virtio: Virtio network device - 08:02.2 Ethernet controller: Virtio: Virtio network device - ``` - -2. 解绑VF驱动,并绑定对应硬件的厂商vdpa驱动 - - ```shell - echo 0000:08:01.1 > /sys/bus/pci/devices/0000\:08\:01.1/driver/unbind - echo 0000:08:01.2 > /sys/bus/pci/devices/0000\:08\:01.2/driver/unbind - echo 0000:08:01.3 > /sys/bus/pci/devices/0000\:08\:01.3/driver/unbind - echo 0000:08:01.4 > /sys/bus/pci/devices/0000\:08\:01.4/driver/unbind - echo 0000:08:01.5 > /sys/bus/pci/devices/0000\:08\:01.5/driver/unbind - echo -n "1af4 1000" > /sys/bus/pci/drivers/vender_vdpa/new_id - ``` - -3. 绑定vDPA设备后,可以通过vdpa命令查询vdpa管理设备列表 - - ```shell - # vdpa mgmtdev show - pci/0000:08:01.1: - supported_classes net - pci/0000:08:01.2: - supported_classes net - pci/0000:08:01.3: - supported_classes net - pci/0000:08:01.4: - supported_classes net - pci/0000:08:01.5: - supported_classes net - ``` - -4. 完成vdpa设备的创建后,创建vhost-vDPA设备 - - ```shell - vdpa dev add name vdpa0 mgmtdev pci/0000:08:01.1 - vdpa dev add name vdpa1 mgmtdev pci/0000:08:01.2 - vdpa dev add name vdpa2 mgmtdev pci/0000:08:01.3 - vdpa dev add name vdpa3 mgmtdev pci/0000:08:01.4 - vdpa dev add name vdpa4 mgmtdev pci/0000:08:01.5 - ``` - -5. 完成vhost-vDPA的设备创建后,可以通过vdpa命令查询vdpa设备列表;也可以通过libvirt命令查询环境的vhost-vDPA设备信息 - - ```shell - # vdpa dev show - vdpa0: type network mgmtdev pci/0000:08:01.1 vendor_id 6900 max_vqs 3 max_vq_size 256 - vdpa1: type network mgmtdev pci/0000:08:01.2 vendor_id 6900 max_vqs 3 max_vq_size 256 - vdpa2: type network mgmtdev pci/0000:08:01.3 vendor_id 6900 max_vqs 3 max_vq_size 256 - vdpa3: type network mgmtdev pci/0000:08:01.4 vendor_id 6900 max_vqs 3 max_vq_size 256 - vdpa4: type network mgmtdev pci/0000:08:01.5 vendor_id 6900 max_vqs 3 max_vq_size 256 - - # virsh nodedev-list vdpa - vdpa_vdpa0 - vdpa_vdpa1 - vdpa_vdpa2 - vdpa_vdpa3 - vdpa_vdpa4 - - # virsh nodedev-dumpxml vdpa_vdpa0 - - vdpa_vdpa0 - /sys/devices/pci0000:00/0000:00:0c.0/0000:08:01.1/vdpa0 - pci_0000_08_01_1 - - vhost_vdpa - - - /dev/vhost-vdpa-0 - - - ``` - -6. 挂载vDPA设备到虚拟机中 - - 创建虚拟机时,在虚拟机配置文件中增加vDPA直通设备的配置项 - - ```xml - - - - - - ``` - - **表 4** vDPA配置选项说明 - - - - - - - - - - - - - - - - -
-

参数名

-
-

说明

-
-

取值

-
-

hostdev.source.dev

-
-

host上vhost-vdpa字符设备的路径。

-
-

/dev/vhost-vdpa-x

-
- - >![](./public_sys-resources/icon-note.gif) **说明:** - >根据各硬件厂商的设计不同,创建/配置VF、绑定厂商vdpa驱动等流程如有差异,请以各厂商流程为准。 - +> 当虚拟机正在使用VF设备时,不允许卸载Host上的驱动,加速器不支持热插拔。 +> VF操作(VFNUMS为0表示关闭VF,hpre_num用来标识具体的加速器设备): +> +> ```sh +> echo $VFNUMS > /sys/class/uacce/hisi_hpre-$hpre_num/device/sriov_numvfs +> ``` ## 管理虚拟机USB @@ -688,8 +542,8 @@ USB设备的XML描述: ``` -- \
,其中,m表示该USB设备在主机上的bus地址,n表示device ID编号。 -- \
表示该USB设备要挂载到虚拟机指定的USB控制器。其中x表示控制器ID,与虚拟机所配置的USB控制器index编号相对应,y表示port地址。用户配置直通USB设备的时候需要配置这个字段,确保设备挂载的控制器与预期相符。 +- `
`,其中,m表示该USB设备在主机上的bus地址,n表示device ID编号。 +- `
` 表示该USB设备要挂载到虚拟机指定的USB控制器。其中x表示控制器ID,与虚拟机所配置的USB控制器index编号相对应,y表示port地址。用户配置直通USB设备的时候需要配置这个字段,确保设备挂载的控制器与预期相符。 #### 配置方法 @@ -752,8 +606,9 @@ USB设备的XML描述: 虚拟机在使用过程中可能由于病毒对系统的破坏、系统文件被误删除或误格式化等原因造成虚拟机系统损坏导致系统无法启动。为了使损坏的系统快速恢复,openEuler提供了存储快照功能。openEuler可以在用户不感知的情况下制作虚拟机在某一时刻的快照(制作通常指需要几秒钟),该快照能帮助用户将磁盘快速恢复到某一时刻的状态,例如系统损坏后能快速恢复系统,从而提升系统可靠性。 ->![](./public_sys-resources/icon-note.gif) **说明:** ->当前存储快照只支持raw、qcow2格式镜像,不支持block块设备。 +> [!NOTE]说明 +> +> 当前存储快照只支持raw、qcow2格式镜像,不支持block块设备。 ### 操作步骤 @@ -818,11 +673,10 @@ USB设备的XML描述: - 存储故障发生后,虽然存在磁盘IO悬挂,依然解决不了以下问题: - 1. 存储相关高级特性执行失败 - - 高级特性包括:虚拟磁盘热插、虚拟磁盘热拔、创建虚拟磁盘、虚拟机启动、虚拟机关机、虚拟机强制关机、虚拟机休眠、虚拟机唤醒、虚拟机存储热迁移、虚拟机存储热迁移取消、虚拟机创建存储快照、虚拟机存储快照合并、查询虚拟机磁盘容量、磁盘在线扩容、插入虚拟光驱、弹出虚拟机光驱。 + 1. 存储相关高级特性执行失败 + 高级特性包括:虚拟磁盘热插、虚拟磁盘热拔、创建虚拟磁盘、虚拟机启动、虚拟机关机、虚拟机强制关机、虚拟机休眠、虚拟机唤醒、虚拟机存储热迁移、虚拟机存储热迁移取消、虚拟机创建存储快照、虚拟机存储快照合并、查询虚拟机磁盘容量、磁盘在线扩容、插入虚拟光驱、弹出虚拟机光驱。 - 2. 虚拟机生命周期执行失败 + 2. 虚拟机生命周期执行失败 - 配置了磁盘IO悬挂的虚拟机发起热迁移时,应该在目的端磁盘的XML配置中带上与源端相同的磁盘IO悬挂配置。 @@ -861,7 +715,6 @@ virtio-blk磁盘的磁盘IO悬挂xml配置如下: - ``` @@ -872,7 +725,6 @@ virtio-scsi磁盘的磁盘IO悬挂xml配置如下: -
``` diff --git "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_vms.md similarity index 81% rename from "docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_vms.md index 24fe2efb0d088971efe5ac5cf20978b4c1b90b36..e014039c2844ad79077fa2c57118d120ae795724 100644 --- "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/managing_vms.md @@ -1,19 +1,4 @@ # 管理虚拟机 - -- [管理虚拟机](#管理虚拟机) - - [虚拟机生命周期](#虚拟机生命周期) - - [总体介绍](#总体介绍) - - [管理命令](#管理命令) - - [示例](#示例) - - [在线修改虚拟机配置](#在线修改虚拟机配置) - - [查询虚拟机信息](#查询虚拟机信息) - - [登录虚拟机](#登录虚拟机) - - [使用VNC密码登录](#使用vnc密码登录) - - [配置VNC TLS登录](#配置vnc-tls登录) - - [虚拟机安全启动](#虚拟机安全启动) - - [总体介绍](#总体介绍) - - [安全启动实践](#安全启动实践) - ## 虚拟机生命周期 @@ -27,25 +12,25 @@ 虚拟机主要有如下几种状态: -- 未定义(undefined):虚拟机未定义或未创建,即libvirt认为该虚拟机不存在。 -- 关闭状态(shut off):虚拟机已经被定义但未运行,或者虚拟机被终止。 -- 运行(running):虚拟机处于运行状态。 -- 暂停(paused):虚拟机运行被挂起,其运行状态被临时保存在内存中,可以恢复到运行状态。 -- 保存(saved):与暂停(paused)状态类似,其运行状态被保存在持久性存储介质中,可以恢复到运行状态。 -- 崩溃(crashed):通常是由于内部错误导致虚拟机崩溃,不可恢复到运行状态。 +- 未定义(undefined):虚拟机未定义或未创建,即libvirt认为该虚拟机不存在。 +- 关闭状态(shut off):虚拟机已经被定义但未运行,或者虚拟机被终止。 +- 运行(running):虚拟机处于运行状态。 +- 暂停(paused):虚拟机运行被挂起,其运行状态被临时保存在内存中,可以恢复到运行状态。 +- 保存(saved):与暂停(paused)状态类似,其运行状态被保存在持久性存储介质中,可以恢复到运行状态。 +- 崩溃(crashed):通常是由于内部错误导致虚拟机崩溃,不可恢复到运行状态。 #### 状态转换 虚拟机不同状态之间可以相互转换,但必须满足一定规则。虚拟机不同状态之间的转换常用规则如[图1](#fig671014583483)所示。 -**图 1** 状态转换图 +**图 1*- 状态转换图 ![](./figures/status-transition-diagram.png) #### 虚拟机标识 在libvirt中,完成创建的虚拟机实例称做一个“domain”,其描述了虚拟机的CPU、内存、网络设备、存储设备等各种资源的配置信息。在同一个主机上,每个domain具有唯一标识,通过虚拟机名称Name、UUID、Id表示,对应含义请参见[表1](#table84397266483)。在虚拟机生命周期期间,可以通过虚拟机标识对特定虚拟机进行操作。 -**表 1** domain标识说明 +**表 1*- domain标识说明

标识

@@ -74,7 +59,7 @@
->![](./public_sys-resources/icon-note.gif) **说明:** +[!NOTE]说明 >可通过virsh命令查询虚拟机Id和UUID,操作方法请参见[查询虚拟机信息](#查询虚拟机信息)章节内容。 ### 管理命令 @@ -85,27 +70,27 @@ #### 前提条件 -- 执行虚拟机生命周期操作之前,需要查询虚拟机状态以确定可以执行对应操作。状态之间的基本转换关系请参见"总体介绍"中的"状态转换"的内容。 -- 具备管理员权限。 -- 准备好虚拟机XML配置文件。 +- 执行虚拟机生命周期操作之前,需要查询虚拟机状态以确定可以执行对应操作。状态之间的基本转换关系请参见"总体介绍"中的"状态转换"的内容。 +- 具备管理员权限。 +- 准备好虚拟机XML配置文件。 #### 命令使用说明 用户可以使用virsh命令管理虚拟机生命周期,命令格式为: -``` +```sh virsh ``` 各参数含义如下: -- _operate_:管理虚拟机生命周期对应操作,例如创建、销毁、启动等。 -- _obj_:命令操作对象,如指定需要操作的虚拟机。 -- _options_:命令选项,该参数可选。 +- _operate_:管理虚拟机生命周期对应操作,例如创建、销毁、启动等。 +- _obj_:命令操作对象,如指定需要操作的虚拟机。 +- _options_:命令选项,该参数可选。 虚拟机生命周期管理各命令如[表1](#table389518422611)所示。其中VMInstanse为虚拟机名称、虚拟机ID或者虚拟机UUID,XMLFile是虚拟机XML配置文件,DumpFile为转储文件,请根据实际情况修改。 -**表 1** 虚拟机生命周期管理命令 +**表 1*- 虚拟机生命周期管理命令

命令

@@ -176,53 +161,52 @@ virsh 本节给出虚拟机生命周期管理相关命令的示例。 -- 创建虚拟机 +- 创建虚拟机 虚拟机XML配置文件为openEulerVM.xml,命令和回显如下: - ``` + ```sh # virsh define openEulerVM.xml Domain openEulerVM defined from openEulerVM.xml ``` - -- 启动虚拟机 +- 启动虚拟机 启动名称为openEulerVM的虚拟机,命令和回显如下: - ``` + ```sh # virsh start openEulerVM Domain openEulerVM started ``` -- 重启虚拟机 +- 重启虚拟机 重启名称为openEulerVM的虚拟机,命令和回显如下: - ``` + ```sh # virsh reboot openEulerVM Domain openEulerVM is being rebooted ``` -- 关闭虚拟机 +- 关闭虚拟机 关闭名称为openEulerVM的虚拟机,命令和回显如下: - ``` + ```sh # virsh shutdown openEulerVM Domain openEulerVM is being shutdown ``` -- 销毁虚拟机 - - 若虚拟机启动时未使用nvram文件,销毁虚拟机命令如下: +- 销毁虚拟机 + - 若虚拟机启动时未使用nvram文件,销毁虚拟机命令如下: - ``` + ```sh # virsh undefine ``` - - 若虚拟机启动时使用了nvram文件,销毁该虚拟机需要指定nvram的处理策略,命令如下: + - 若虚拟机启动时使用了nvram文件,销毁该虚拟机需要指定nvram的处理策略,命令如下: - ``` + ```sh # virsh undefine ``` @@ -234,79 +218,78 @@ virsh 例如,删除虚拟机openEulerVM及其nvram文件,命令和回显如下: - ``` + ```sh # virsh undefine openEulerVM --nvram Domain openEulerVM has been undefined ``` - - ## 在线修改虚拟机配置 -#### 概述 +### 概述 虚拟机创建之后用户可以修改虚拟机的配置信息,称为在线修改虚拟机配置。在线修改配置以后,新的虚拟机配置文件会被持久化,并在虚拟机关闭、重新启动后生效。 修改虚拟机配置命令格式如下: -``` +```sh virsh edit ``` virsh edit命令通过编辑“domain”对应的XML配置文件,完成对虚拟机配置的更新。virsh edit使用vi程序作为默认的编辑器,可以通过修改环境变量“EDITOR”或“VISUAL”指定编辑器类型。virsh edit默认优先使用“VISUAL”环境变量指定的文本编辑器。 -#### 操作步骤 +### 操作步骤 -1. (可选)设置virsh edit命令的编辑器为vim。 +1.(可选)设置virsh edit命令的编辑器为vim。 - ``` - # export VISUAL=vim - ``` +```shell +# export VISUAL=vim +``` -2. 使用virsh edit打开虚拟机名称为openEulerVM对应的XML配置文件。 +2.使用virsh edit打开虚拟机名称为openEulerVM对应的XML配置文件。 - ``` - # virsh edit openEulerVM - ``` +```sh +# virsh edit openEulerVM +``` -3. 修改虚拟机配置文件。 -4. 保存虚拟机配置文件并退出。 -5. 关闭虚拟机。 +3.修改虚拟机配置文件。 +4.保存虚拟机配置文件并退出。 +5.关闭虚拟机。 - ``` - # virsh shutdown openEulerVM - ``` -6. 启动虚拟机使配置修改生效。 +```sh +# virsh shutdown openEulerVM +``` - ``` - # virsh start openEulerVM - ``` +6.启动虚拟机使配置修改生效。 + +```sh +# virsh start openEulerVM +``` ## 查询虚拟机信息 -#### 概述 +### 概述 管理员在管理虚拟机的过程中经常需要知道一些虚拟机信息,libvirt提供了一套命令行工具用于查询虚拟机的相关信息。本章介绍相关命令的使用方法,便于管理员来获取虚拟机的各种信息。 -#### 前提条件 +### 前提条件 查询虚拟机信息需要: -- libvirtd服务处于运行状态。 +- libvirtd服务处于运行状态。 -- 命令行操作需要拥有管理员权限。 +- 命令行操作需要拥有管理员权限。 -#### 查询主机上的虚拟机信息 +### 查询主机上的虚拟机信息 -- 查询主机上处于运行和暂停状态的虚拟机列表。 +- 查询主机上处于运行和暂停状态的虚拟机列表。 - ``` + ```sh # virsh list ``` 例如,下述回显说明当前主机上存在3台虚拟机,其中openEulerVM01、openEulerVM02处于运行状态,openEulerVM03处于暂停状态。 - ``` + ```markdown Id Name State ---------------------------------------------------- 39 openEulerVM01 running @@ -314,30 +297,28 @@ virsh edit命令通过编辑“domain”对应的XML配置文件,完成对虚 69 openEulerVM03 paused ``` +- 查询主机上已经定义的所有虚拟机信息列表。 -- 查询主机上已经定义的所有虚拟机信息列表。 - - ``` + ```sh # virsh list --all ``` 例如,下述回显说明当前主机上定义了4台虚拟机,其中虚拟机openEulerVM01处于运行状态,openEulerVM02处于暂停状态,openEulerVM03和openEulerVM04处于关机状态。 - ``` + ```markdown Id Name State ---------------------------------------------------- 39 openEulerVM01 running 69 openEulerVM02 paused - - openEulerVM03 shut off - - openEulerVM04 shut off + - openEulerVM03 shut off + - openEulerVM04 shut off ``` - -#### 查询虚拟机基本信息 +### 查询虚拟机基本信息 Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟机运行状态、设备信息或者调度属性等,使用方法请参见[表1](#table10582103963816)。 -**表 1** 查询虚拟机基本信息 +**表 1*- 查询虚拟机基本信息

查询的信息内容

@@ -400,11 +381,11 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟
-#### 示例 +### 示例 -- 使用virsh dominfo查询一个创建好的虚拟机的基本信息,从查询结果可知,虚拟机ID为5,UUID为ab472210-db8c-4018-9b3e-fc5319a769f7,内存大小为8GiB,vCPU数目为4个等。 +- 使用virsh dominfo查询一个创建好的虚拟机的基本信息,从查询结果可知,虚拟机ID为5,UUID为ab472210-db8c-4018-9b3e-fc5319a769f7,内存大小为8GiB,vCPU数目为4个等。 - ``` + ```sh # virsh dominfo openEulerVM Id: 5 Name: openEulerVM @@ -422,17 +403,16 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 Security DOI: 0 ``` +- 使用virsh domstate查询虚拟机的当前状态,从查询结果可知,虚拟机openEulerVM当前处于运行状态。 -- 使用virsh domstate查询虚拟机的当前状态,从查询结果可知,虚拟机openEulerVM当前处于运行状态。 - - ``` + ```sh # virsh domstate openEulerVM running ``` -- 使用virsh schedinfo查询虚拟机的调度信息,从查询结果可知,虚拟机CPU预留份额为1024。 +- 使用virsh schedinfo查询虚拟机的调度信息,从查询结果可知,虚拟机CPU预留份额为1024。 - ``` + ```sh # virsh schedinfo openEulerVM Scheduler : posix cpu_shares : 1024 @@ -446,17 +426,17 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 iothread_quota : -1 ``` -- 使用virsh vcpucount查询虚拟机的vCPU数目,从查询结果可知,虚拟机有4个CPU。 +- 使用virsh vcpucount查询虚拟机的vCPU数目,从查询结果可知,虚拟机有4个CPU。 - ``` + ```sh # virsh vcpucount openEulerVM maximum live 4 current live 4 ``` -- 使用virsh domblklist查询虚拟机磁盘设备信息,从查询结果可知,虚拟机有2个磁盘,sda是qcow2格式的虚拟磁盘,sdb是一个cdrom设备。 +- 使用virsh domblklist查询虚拟机磁盘设备信息,从查询结果可知,虚拟机有2个磁盘,sda是qcow2格式的虚拟磁盘,sdb是一个cdrom设备。 - ``` + ```sh # virsh domblklist openEulerVM Target Source --------------------------------------------------------------------- @@ -464,18 +444,18 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 sdb /home/openeuler/vm/openEuler-20.09-aarch64-dvd.iso ``` -- 使用virsh domiflist查询虚拟机网卡信息,从查询结果可知,虚拟机有1张网卡,对应的后端是vnet0在主机br0网桥上,MAC地址为00:05:fe:d4:f1:cc。 +- 使用virsh domiflist查询虚拟机网卡信息,从查询结果可知,虚拟机有1张网卡,对应的后端是vnet0在主机br0网桥上,MAC地址为00:05:fe:d4:f1:cc。 - ``` + ```sh # virsh domiflist openEulerVM Interface Type Source Model MAC ------------------------------------------------------- vnet0 bridge br0 virtio 00:05:fe:d4:f1:cc ``` -- 使用virsh iothreadinfo查询虚拟机I/O线程信息,从查询结果可知虚拟机有5个I/O线程,在物理CPU7-10上进行调度。 +- 使用virsh iothreadinfo查询虚拟机I/O线程信息,从查询结果可知虚拟机有5个I/O线程,在物理CPU7-10上进行调度。 - ``` + ```sh # virsh iothreadinfo openEulerVM IOThread ID CPU Affinity --------------------------------------------------- @@ -486,7 +466,6 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 2 7-10 ``` - ## 登录虚拟机 本章介绍使用VNC登录虚拟机的方法。 @@ -501,37 +480,38 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 使用RealVNC、TightVNC等客户端登录虚拟机,在登录虚拟机之前需要获取如下信息: -- 虚拟机所在主机的IP地址。 -- 确保客户端所在的环境可以访问到主机的网络。 -- 虚拟机的VNC侦听端口,该端口一般在客户机启动时自动分配,一般为5900 + x(x为正整数,按照虚拟机启动的顺序递增,且5900对用户不可见)。 -- 如果VNC设置了密码,还需要获取虚拟机的VNC密码。 +- 虚拟机所在主机的IP地址。 +- 确保客户端所在的环境可以访问到主机的网络。 +- 虚拟机的VNC侦听端口,该端口一般在客户机启动时自动分配,一般为5900 + x(x为正整数,按照虚拟机启动的顺序递增,且5900对用户不可见)。 +- 如果VNC设置了密码,还需要获取虚拟机的VNC密码。 - >![](./public_sys-resources/icon-note.gif) **说明:** - >为虚拟机VNC配置密码,需要编辑虚拟机XML配置文件,即为graphics元素新增一个passwd属性,属性的值为要配置的密码。例如,将虚拟机的VNC密码配置为n8VfjbFK的XML配置参考如下: - >``` + [!NOTE]说明 + >为虚拟机VNC配置密码,需要编辑虚拟机XML配置文件,即为graphics元素新增一个passwd属性,属性的值为要配置的密码。例如,将虚拟机的VNC密码配置为n8VfjbFK的XML配置参考如下: + > + >```conf > > > >``` - #### 操作步骤 -1. 查询虚拟机使用的VNC端口号。例如名称为openEulerVM的虚拟机,命令如下: +1. 查询虚拟机使用的VNC端口号。例如名称为openEulerVM的虚拟机,命令如下: - ``` + ```sh # virsh vncdisplay openEulerVM :3 ``` - >![](./public_sys-resources/icon-note.gif) **说明:** + [!NOTE]说明 >登录 VNC 需要配置防火墙规则,允许 VNC 端口的连接。参考命令如下,其中X为数值“5900 + 端口号” ,例如本例中为5903。 - >``` + > + >```sh >firewall-cmd --zone=public --add-port=X/tcp >``` -2. 打开VncViewer软件,输入主机IP和端口号。格式为“主机IP:端口号”,例如:“10.133.205.53:3”。 -3. 单击“确定”输入VNC密码(可选),登录到虚拟机VNC进行操作。 +2. 打开VncViewer软件,输入主机IP和端口号。格式为“主机IP:端口号”,例如:“10.133.205.53:3”。 +3. 单击“确定”输入VNC密码(可选),登录到虚拟机VNC进行操作。 ### 配置VNC-TLS登录 @@ -539,37 +519,38 @@ Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟 VNC服务端和客户端默认采用明文方式进行数据传输,因此通信内容可能被第三方截获。为了提升安全性,openEuler支持VNC服务端配置TLS模式进行加密认证。TLS(Transport Layer Security)即传输层安全,可以实现VNC服务端和客户端之间加密通信,从而防止通信内容被第三方截获。 ->![](./public_sys-resources/icon-note.gif) **说明:** ->- 使用TLS加密认证模式需要VNC客户端支持TLS模式(例如TigerVNC),否则无法连接到VNC客户端。 ->- TLS加密认证模式配置粒度为主机服务器级别,开启该特性后,主机上正在运行的所有虚拟机对应的VNC客户端都将开启TLS加密认证模式。 +[!NOTE]说明 +> +>- 使用TLS加密认证模式需要VNC客户端支持TLS模式(例如TigerVNC),否则无法连接到VNC客户端。 +>- TLS加密认证模式配置粒度为主机服务器级别,开启该特性后,主机上正在运行的所有虚拟机对应的VNC客户端都将开启TLS加密认证模式。 #### 操作步骤 VNC开启TLS加密认证模式的操作步骤如下: -1. 登录VNC服务端所在主机登录VNC服务端所在主机,开启或修改服务端配置文件/etc/libvirt/qemu.conf中对应的配置项。相关配置内容如下所示: +1. 登录VNC服务端所在主机登录VNC服务端所在主机,开启或修改服务端配置文件/etc/libvirt/qemu.conf中对应的配置项。相关配置内容如下所示: - ``` + ```conf vnc_listen = "x.x.x.x" # "x.x.x.x"为VNC的侦听地址,请用户根据实际配置,VNC服务端只允许该地址或地址段范围内的客户端连接请求 vnc_tls = 1 # 配置为1,表示开启VNC TLS支持 vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc" #指定证书存放的路径为/etc/pki/libvirt-vnc vnc_tls_x509_verify = 1 #配置为1,表示TLS认证使用X509证书 ``` -2. 为VNC创建证书和私钥文件。此处以GNU TLS为例进行说明。 +2. 为VNC创建证书和私钥文件。此处以GNU TLS为例进行说明。 - >![](./public_sys-resources/icon-note.gif) **说明:** + [!NOTE]说明 >使用GNU TLS,请提前安装好gnu-utils软件包。 - 1. 制作证书颁发机构CA(Certificate Authority)的证书文件。 + 1. 制作证书颁发机构CA(Certificate Authority)的证书文件。 - ``` + ```sh # certtool --generate-privkey > ca-key.pem ``` - 1. 制作自签名的CA证书公私钥。其中Your organization name为机构名,由用户指定。 + 2. 制作自签名的CA证书公私钥。其中Your organization name为机构名,由用户指定。 - ``` + ```sh # cat > ca.info< server.info< server-key.pem # certtool --generate-certificate \ --load-ca-certificate ca-cert.pem \ @@ -609,9 +590,9 @@ VNC开启TLS加密认证模式的操作步骤如下: 上述生成文件,server-key.pem是VNC服务端的私钥,server-cert.pem是VNC服务端的公钥。 - 3. 为VNC客户端颁发证书。 + 4. 为VNC客户端颁发证书。 - ``` + ```sh # cat > client.info< client-key.pem # certtool --generate-certificate \ --load-ca-certificate ca-cert.pem \ @@ -632,15 +613,15 @@ VNC开启TLS加密认证模式的操作步骤如下: 上述生成文件,client-key.pem是VNC客户端的私钥,client-cert.pem是VNC客户端的公钥,生成的公私钥对需要拷贝到VNC客户端。 -3. 关闭需要被登录的虚拟机,重启VNC服务端所在主机的libvirtd服务。 +3. 关闭需要被登录的虚拟机,重启VNC服务端所在主机的libvirtd服务。 - ``` + ```sh # systemctl restart libvirtd ``` -4. 将生成的服务端证书放置到VNC服务端指定目录并将证书的权限改为只允许当前用户读写。 +4. 将生成的服务端证书放置到VNC服务端指定目录并将证书的权限改为只允许当前用户读写。 - ``` + ```sh # sudo mkdir -m 750 /etc/pki/libvirt-vnc # cp ca-cert.pem /etc/pki/libvirt-vnc/ca-cert.pem # cp server-cert.pem /etc/pki/libvirt-vnc/server-cert.pem @@ -648,11 +629,11 @@ VNC开启TLS加密认证模式的操作步骤如下: # chmod 0600 /etc/pki/libvirt-vnc/* ``` -5. 将生成的客户端证书ca-cert.pem,client-cert.pem和client-key.pem拷贝到VNC客户端。配置VNC客户端的TLS证书后即可使用VNC TLS登录。 +5. 将生成的客户端证书ca-cert.pem,client-cert.pem和client-key.pem拷贝到VNC客户端。配置VNC客户端的TLS证书后即可使用VNC TLS登录。 - >![](./public_sys-resources/icon-note.gif) **说明:** - >- VNC客户端证书的配置请参见各客户端对应的使用说明,由用户自行配置。 - >- 登录虚拟机的方式请参见“使用VNC密码登录”。 + [!NOTE]说明 + >- VNC客户端证书的配置请参见各客户端对应的使用说明,由用户自行配置。 + >- 登录虚拟机的方式请参见“使用VNC密码登录”。 ## 虚拟机安全启动 @@ -674,13 +655,13 @@ VNC开启TLS加密认证模式的操作步骤如下: 本次实现的虚拟机安全启动特性基于edk开源项目。非安全启动模式下,Linux基本流程如下: -**图 1** 系统启动流程图 +**图 1*- 系统启动流程图 ![](./figures/OSBootFlow.png) 安全启动模式下UEFI BIOS启动后加载的首个组件是系统镜像中的shim,shim与UEFI BIOS进行交互获取存储在UEFI BIOS变量db里面的密钥对grub进行验证,加载grub后同样调用密钥和认证接口对kernel进行验证。Linux启动流程如下: -**图 2** 安全启动流程图 +**图 2*- 安全启动流程图 ![](./figures/SecureBootFlow.png) @@ -688,12 +669,12 @@ VNC开启TLS加密认证模式的操作步骤如下: #### 约束限制 -* 在不支持安全启动的UEFI BIOS上运行,对现有功能没有影响,业务无感知。 -* 安全启动特性依赖UEFI BIOS,必须在UEFI支持此功能的条件下才能发挥作用。 -* 在UEFI BIOS开启安全启动的情况下,如果相关部件没有签名或签名不正确,则无法正常启动系统。 -* 在UEFI BIOS关闭安全启动的情况下,启动过程的验证功能都会被关闭。 -* 安全启动验证链后半段,即shim->grub->kernel引导内核启动这部分的验证链由操作系统镜像实现,若操作系统不支持引导内核安全启动过程,则虚拟机安全启动失败。 -* 当前不提供x86架构使用nvram文件配置虚拟机安全启动 +- 在不支持安全启动的UEFI BIOS上运行,对现有功能没有影响,业务无感知。 +- 安全启动特性依赖UEFI BIOS,必须在UEFI支持此功能的条件下才能发挥作用。 +- 在UEFI BIOS开启安全启动的情况下,如果相关部件没有签名或签名不正确,则无法正常启动系统。 +- 在UEFI BIOS关闭安全启动的情况下,启动过程的验证功能都会被关闭。 +- 安全启动验证链后半段,即shim->grub->kernel引导内核启动这部分的验证链由操作系统镜像实现,若操作系统不支持引导内核安全启动过程,则虚拟机安全启动失败。 +- 当前不提供x86架构使用nvram文件配置虚拟机安全启动 ### 安全启动实践 @@ -703,7 +684,7 @@ VNC开启TLS加密认证模式的操作步骤如下: edk rpm包中的组件安装于/usr/share/edk2/aarch64目录下,包括`QEMU_EFI-pflash.raw`和`vars-template-pflash.raw`。虚拟机启动UEFI BIOS部分xml配置如下: -``` +```conf hvm /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw @@ -719,27 +700,28 @@ edk rpm包中的组件安装于/usr/share/edk2/aarch64目录下,包括`QEMU_EF 制作证书文件镜像 -``` +```con dd of='/path/to/data.img' if='/dev/zero' bs=1M count=64 mkfs.vfat -I /path/to/data.img mkdir /path/to/mnt mount path/to/data.img /path/to/mnt/ -cp -a /path/to/certificates/* /path/to/mnt/ +cp -a /path/to/certificates/- /path/to/mnt/ umount /path/to/mnt/ ``` + 其中,/path/to/certificates/为证书文件所在路径,/path/to/data.img为证书文件镜像所在路径,/path/to/mnt/为镜像挂载路径。 在虚拟机xml文件中配置挂载该镜像 -``` +```conf - - - - - - - + + + + + + + ``` @@ -747,45 +729,45 @@ umount /path/to/mnt/ 虚拟机启动后,点击F2进入bios界面 -**图 1** 进入bios界面 +**图 1*- 进入bios界面 ![](./figures/CertEnrollP1.png) -**图 2** 进入Device Manager +**图 2*- 进入Device Manager ![](./figures/CertEnrollP2.png) -**图 3** 进入Custom Secure Boot Options +**图 3*- 进入Custom Secure Boot Options ![](./figures/CertEnrollP3.png) -**图 4** 进入PK Options +**图 4*- 进入PK Options ![](./figures/CertEnrollP4.png) -**图 5** Enroll PK +**图 5*- Enroll PK ![](./figures/CertEnrollP5.png) 在File Explorer界面可以看到很多磁盘目录,其中包括我们通过磁盘挂载的证书文件目录 -**图 6** File Explorer +**图 6*- File Explorer ![](./figures/CertEnrollP6.png) 在磁盘目录中选择要导入的PK证书 -**图 7** 进入证书所在磁盘 +**图 7*- 进入证书所在磁盘 ![](./figures/CertEnrollP7.png) -**图 8** 选择Commit Changes and Exit保存导入证书 +**图 8*- 选择Commit Changes and Exit保存导入证书 ![](./figures/CertEnrollP8.png) 导入证书后,UEFI BIOS将证书信息以及安全启动属性写入nvram配置文件/path/to/QEMU-VARS.fd中,虚拟机下一次启动时会从/path/to/QEMU-VARS.fd文件中读取相关配置并初始化证书信息以及安全启动属性,自动导入证书并开启安全启动。同样,我们可以将/path/to/QEMU-VARS.fd作为其他相同配置虚拟机的UEFI BIOS启动配置模板文件,通过修改nvram template字段使其他虚拟机启动时自动导入证书并开启安全启动选项,虚拟机xml配置修改如下: -``` +```conf hvm /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw @@ -797,9 +779,9 @@ umount /path/to/mnt/ 正确配置虚拟机并导入PK、KEK、DB证书后,虚拟机将以安全启动的方式运行。可以通过在虚拟机配置文件xml中配置串口日志文件观测虚拟机是否为安全启动,串口日志文件的配置方式如: -``` +```conf - + ``` diff --git a/docs/zh/docs/Virtualization/Skylark.md b/docs/zh/docs/virtulization/virtulization_platform/virtulization/skylark.md similarity index 97% rename from docs/zh/docs/Virtualization/Skylark.md rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/skylark.md index eb146e5250e577c2c649d5fa94d09bef17fb4f11..1c43b98fdfd5ff273f83efeb276bd8adb8f316dc 100644 --- a/docs/zh/docs/Virtualization/Skylark.md +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/skylark.md @@ -1,14 +1,5 @@ # Skylark - - -- [Skylark概述](#skylark概述) -- [架构及特性](#架构及特性) -- [安装Skylark](#安装skylark) -- [配置Skylark](#配置skylark) -- [使用Skylark](#使用skylark) -- [最佳实践](#最佳实践) - ## Skylark概述 @@ -30,6 +21,7 @@ ### 总体实现框架 Skylark 核心类为`QoSManager`,类成员包括数据收集类实例、QoS 分析类实例、QoS 控制类实例、以及任务调度类实例: + - `DataCollector`:数据收集类,有`HostInfo`和`GuestInfo`两个成员,分别用于收集主机信息和虚拟机信息。 - `PowerAnalyzer`:功耗分析类,用于分析功耗干扰以及需要限制的低优先级虚拟机。 - `CpuController`:CPU 带宽控制类,用于限制低优先级虚拟机的 CPU 带宽。 @@ -37,6 +29,7 @@ Skylark 核心类为`QoSManager`,类成员包括数据收集类实例、QoS - `BackgroundScheduler`:任务调度类,用于周期性驱动以上模块,持续进行 QoS 管理。 Skylark 检查主机环境后,创建守护进程。守护进程有两种线程:主调度线程和 Job 线程: + - 主调度线程是唯一的,首先连接 Libvirt,然后创建并初始化`QosManager`类实例,最后开始驱动 Job 线程。 - Job 线程可能不止一个,每个 Job 线程负责周期性执行某个 QoS 管理任务。 @@ -72,6 +65,7 @@ Skylark 初始化时,会把 Cgroup CPU 子控制器下低优先级虚拟机对 ### 硬件要求 处理器架构:仅支持 AArch64 和 Intel x86_64 处理器架构。 + - Intel 处理器需支持 RDT 功能。 - AArch64 当前仅支持 Kunpeng920,且需将 bios 升级到 1.79 及以上以支持 MPAM 功能。 diff --git "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\347\263\273\347\273\237\350\265\204\346\272\220.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/system_resource_management.md similarity index 60% rename from "docs/zh/docs/Virtualization/\347\256\241\347\220\206\347\263\273\347\273\237\350\265\204\346\272\220.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/system_resource_management.md index 7128d26331ac8562ccf1307e668c504ca081d2d0..ec9f4d29a0f8fab1f7ce4321daba1c29e0271491 100644 --- "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\347\263\273\347\273\237\350\265\204\346\272\220.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/system_resource_management.md @@ -1,15 +1,13 @@ # 管理系统资源 - ## 总体说明 openEuler 虚拟化使用libvirt命令来管理虚拟机的系统资源,如vCPU、虚拟内存资源等。 在开始前: -- 确保主机上运行了libvirtd守护进程。 -- 用virsh list --all命令确认虚拟机已经被定义。 - +- 确保主机上运行了libvirtd守护进程。 +- 用virsh list --all命令确认虚拟机已经被定义。 ## 管理虚拟CPU @@ -25,9 +23,9 @@ CPU份额表示一个虚拟机竞争物理CPU计算资源的能力大小总和 通过修改分配给虚拟机的运行时间的cpu\_shares值,来平衡vCPU之间的调度。 -- 查看虚拟机的当前CPU份额: +- 查看虚拟机的当前CPU份额: - ``` + ```sh $ virsh schedinfo Scheduler : posix cpu_shares : 1024 @@ -41,16 +39,15 @@ CPU份额表示一个虚拟机竞争物理CPU计算资源的能力大小总和 iothread_quota : -1 ``` +- 在线修改:修改处于running状态的虚拟机的当前CPU份额,使用带 **--live** 参数的virsh schedinfo命令: -- 在线修改:修改处于running状态的虚拟机的当前CPU份额,使用带 **--live** 参数的virsh schedinfo命令: - - ``` + ```sh $ virsh schedinfo --live cpu_shares= ``` 比如将正在运行的虚拟机openEulerVM的CPU份额从1024改为2048: - ``` + ```sh $ virsh schedinfo openEulerVM --live cpu_shares=2048 Scheduler : posix cpu_shares : 2048 @@ -66,15 +63,15 @@ CPU份额表示一个虚拟机竞争物理CPU计算资源的能力大小总和 对cpu\_shares值的修改立即生效,虚拟机_openEulerVM_能得到的运行时间将是原来的2倍。但是这一修改将在虚拟机关机并重新启动后失效。 -- 持久化修改:在libvirt内部配置中修改虚拟机的CPU份额,使用带 **--config** 参数的virsh schedinfo命令: +- 持久化修改:在libvirt内部配置中修改虚拟机的CPU份额,使用带 **--config** 参数的virsh schedinfo命令: - ``` + ```sh $ virsh schedinfo --config cpu_shares= ``` 比如将虚拟机openEulerVM的CPU份额从1024改为2048: - ``` + ```sh $ virsh schedinfo openEulerVM --config cpu_shares=2048 Scheduler : posix cpu_shares : 2048 @@ -90,7 +87,6 @@ CPU份额表示一个虚拟机竞争物理CPU计算资源的能力大小总和 对cpu\_shares值的修改不会立即生效,在虚拟机openEulerVM下一次启动后才生效,并持久生效。虚拟机openEulerVM能得到的运行时间将是原来的2倍。 - ### 绑定QEMU进程至物理CPU #### 概述 @@ -101,9 +97,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 通过virsh emulatorpin命令可以绑定QEMU主进程到物理CPU。 -- 查看QEMU进程当前绑定的物理CPU范围: +- 查看QEMU进程当前绑定的物理CPU范围: - ``` + ```sh $ virsh emulatorpin openEulerVM emulator: CPU Affinity ---------------------------------- @@ -112,9 +108,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 这说明虚拟机_openEulerVM_对应的QEMU主进程可以在主机的所有物理CPU上调度。 -- 在线绑定:修改处于running状态的虚拟机对应的QEMU进程的绑定关系,使用带 **--live** 参数的vcpu emulatorpin命令: +- 在线绑定:修改处于running状态的虚拟机对应的QEMU进程的绑定关系,使用带 **--live** 参数的vcpu emulatorpin命令: - ``` + ```sh $ virsh emulatorpin openEulerVM --live 2-3 $ virsh emulatorpin openEulerVM @@ -125,9 +121,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 以上命令把虚拟机_open__Euler__VM_对应的QEMU进程绑定到物理CPU2、3上,即限制了QEMU进程只在这两个物理CPU上调度。这一绑定关系的调整立即生效,但在虚拟机关机并重新启动后失效。 -- 持久化绑定:在libvirt内部配置中修改虚拟机对应的QEMU进程的绑定关系,使用带 **--config** 参数的virsh emulatorpin命令: +- 持久化绑定:在libvirt内部配置中修改虚拟机对应的QEMU进程的绑定关系,使用带 **--config** 参数的virsh emulatorpin命令: - ``` + ```sh $ virsh emulatorpin openEulerVM --config 0-3,^1 $ virsh emulatorpin openEulerVM --config @@ -138,7 +134,6 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 以上命令把虚拟机_open__Euler__VM_对应的QEMU进程绑定到物理CPU0、2、3上,即限制了QEMU进程只在这三个物理CPU上调度。**这一绑定关系的调整不会立即生效,在虚拟机下一次启动后才生效,并持久生效**。 - ### 调整虚拟CPU绑定关系 #### 概述 @@ -149,9 +144,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 通过virsh vcpupin命令可以调整vCPU和物理CPU的绑定关系。 -- 查看虚拟机的当前vCPU绑定信息: +- 查看虚拟机的当前vCPU绑定信息: - ``` + ```sh $ virsh vcpupin openEulerVM VCPU CPU Affinity ---------------------- @@ -163,9 +158,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 这说明虚拟机_openEulerVM_的所有vCPU可以在主机的所有物理CPU上调度。 -- 在线调整:修改处于running状态的虚拟机的当前vCPU绑定关系,使用带 **--live** 参数的vcpu vcpupin命令: +- 在线调整:修改处于running状态的虚拟机的当前vCPU绑定关系,使用带 **--live** 参数的vcpu vcpupin命令: - ``` + ```sh $ virsh vcpupin openEulerVM --live 0 2-3 $ virsh vcpupin openEulerVM @@ -179,9 +174,9 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 以上命令把虚拟机_open__Euler__VM_的vCPU0绑定到PCPU2、3上,即限制了vCPU0只在这两个物理CPU上调度。这一绑定关系的调整立即生效,但在虚拟机关机并重新启动后失效。 -- 持久化调整:在libvirt内部配置中修改虚拟机的vCPU绑定关系,使用带 **--config** 参数的virsh vcpupin命令: +- 持久化调整:在libvirt内部配置中修改虚拟机的vCPU绑定关系,使用带 **--config** 参数的virsh vcpupin命令: - ``` + ```sh $ virsh vcpupin openEulerVM --config 0 0-3,^1 $ virsh vcpupin openEulerVM --config @@ -195,7 +190,6 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 以上命令把虚拟机_open__Euler__VM_的vCPU0绑定到物理CPU0、2、3上,即限制了vCPU0只在这三个物理CPU上调度。**这一绑定关系的调整不会立即生效,在虚拟机下一次启动后才生效,并持久生效**。 - ### CPU热插拔 #### 概述 @@ -204,27 +198,26 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 注意:从2403版本开始,AArch64架构新增了CPU热拔功能,但实现上采用了新的主线社区方案,和之前版本的CPU热插协议不兼容。Guest版本和Host版本需匹配,即2403及将来版本的Guest需搭配2403及将来版本的Host,2403之前版本的Guest需搭配2403之前版本的Host,才能正常使用CPU热插(拔)功能。 - #### 约束限制 -- 如果处理器为AArch64架构,创建虚拟机时指定的虚拟机芯片组类型\(machine\)需为virt-4.2或virt更高版本。如果处理器为x86\_64架构,创建虚拟机时指定的虚拟机芯片组类型\(machine\)需为pc-i440fx-1.5或pc更高版本。 -- 对于AArch64架构虚拟机,初始启动时就存在的CPU不支持热插拔。 -- 在配置Guest NUMA的场景中,必须把属于同一个socket的vcpu配置在同一vNode中,否则热插拔CPU后可能导致虚拟机softlockup,进而可能导致虚拟机panic。 -- 虚拟机在迁移、休眠唤醒、快照过程中均不支持CPU热插拔。 -- 虚拟机CPU热插是否自动上线取决于虚拟机操作系统自身逻辑,虚拟化层不保证热插CPU自动上线。 -- CPU热插同时受限于Hypervisor和GuestOS支持的最大CPU数目。 -- 虚拟机启动、关闭、重启过程中可能出现热插CPU失效的情况,但再次重启会生效。 -- 虚拟机启动、关闭、重启过程中可能出现热拔CPU超时失败的情况,需等虚拟机回到正常运行状态重试。 -- 热插拔虚拟机CPU的时候,如果新增CPU数目不是虚拟机CPU拓扑配置项中Cores的整数倍,可能会导致虚拟机内部看到的CPU拓扑是混乱的,建议每次新增或减少的CPU数目为Cores的整数倍。 -- 若需要热插拔CPU在线生效且在虚拟机重启后仍有效,virsh setvcpus接口中需要同时传入--config和--live选项, 将热插拔CPU动作持久化。 +- 如果处理器为AArch64架构,创建虚拟机时指定的虚拟机芯片组类型\(machine\)需为virt-4.2或virt更高版本。如果处理器为x86\_64架构,创建虚拟机时指定的虚拟机芯片组类型\(machine\)需为pc-i440fx-1.5或pc更高版本。 +- 对于AArch64架构虚拟机,初始启动时就存在的CPU不支持热插拔。 +- 在配置Guest NUMA的场景中,必须把属于同一个socket的vcpu配置在同一vNode中,否则热插拔CPU后可能导致虚拟机softlockup,进而可能导致虚拟机panic。 +- 虚拟机在迁移、休眠唤醒、快照过程中均不支持CPU热插拔。 +- 虚拟机CPU热插是否自动上线取决于虚拟机操作系统自身逻辑,虚拟化层不保证热插CPU自动上线。 +- CPU热插同时受限于Hypervisor和GuestOS支持的最大CPU数目。 +- 虚拟机启动、关闭、重启过程中可能出现热插CPU失效的情况,但再次重启会生效。 +- 虚拟机启动、关闭、重启过程中可能出现热拔CPU超时失败的情况,需等虚拟机回到正常运行状态重试。 +- 热插拔虚拟机CPU的时候,如果新增CPU数目不是虚拟机CPU拓扑配置项中Cores的整数倍,可能会导致虚拟机内部看到的CPU拓扑是混乱的,建议每次新增或减少的CPU数目为Cores的整数倍。 +- 若需要热插拔CPU在线生效且在虚拟机重启后仍有效,virsh setvcpus接口中需要同时传入--config和--live选项, 将热插拔CPU动作持久化。 #### 操作步骤 **一、配置虚拟机XML** -1. 使用CPU热插拔功能,需要在创建虚拟机时配置虚拟机当前的CPU数目、虚拟机所支持的最大CPU数目,以及虚拟机芯片组类型(对于AArch64架构,需为virt-4.2及以上版本。对于x86\_64架构,需为pc-i440fx-1.5及以上版本)。这里以AArch64架构虚拟机为例,配置模板如下: +1. 使用CPU热插拔功能,需要在创建虚拟机时配置虚拟机当前的CPU数目、虚拟机所支持的最大CPU数目,以及虚拟机芯片组类型(对于AArch64架构,需为virt-4.2及以上版本。对于x86\_64架构,需为pc-i440fx-1.5及以上版本)。这里以AArch64架构虚拟机为例,配置模板如下: - ``` + ```conf ... n @@ -235,13 +228,13 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 ``` - >![](./public_sys-resources/icon-note.gif) **说明:** - >- placement的值必须是static。 - >- m为虚拟机当前CPU数目,即虚拟机启动后默认的CPU数目。n为虚拟机支持热插到的最大CPU数目,该值不能超过Hypervisor支持的虚拟机最大CPU规格及GuestOS支持的最大CPU规格。n大于或等于m。 + >[!NOTE]说明 + >- placement的值必须是static。 + >- m为虚拟机当前CPU数目,即虚拟机启动后默认的CPU数目。n为虚拟机支持热插到的最大CPU数目,该值不能超过Hypervisor支持的虚拟机最大CPU规格及GuestOS支持的最大CPU规格。n大于或等于m。 例如,配一个虚拟机当前CPU数目为4,最大支持的热插CPU上限为64的XML配置为: - ``` + ```conf …… 64 @@ -251,59 +244,60 @@ QEMU主进程绑定特性是将QEMU主进程绑定到特定的物理CPU范围内 …… ``` - **二、热插并上线CPU** -1. 如果热插CPU后需要自动上线热插的CPU,可以使用root权限在虚拟机内部创建udev rules文件/etc/udev/rules.d/99-hotplug-cpu.rules,并在其中定义udev规则,内容参考如下: +1. 如果热插CPU后需要自动上线热插的CPU,可以使用root权限在虚拟机内部创建udev rules文件/etc/udev/rules.d/99-hotplug-cpu.rules,并在其中定义udev规则,内容参考如下: - ``` + ```sh # automatically online hot-plugged cpu ACTION=="add", SUBSYSTEM=="cpu", ATTR{online}="1" ``` - >![](./public_sys-resources/icon-note.gif) **说明:** + >[!NOTE]说明 >如果没有使用udev rules自动上线热插CPU,可以在热插CPU后,使用root权限,参考如下命令手动上线: - >``` + > + >```sh >for i in `grep -l 0 /sys/devices/system/cpu/cpu*/online` >do > echo 1 > $i >done >``` -2. 利用virsh工具进行虚拟机CPU热插操作。例如给虚拟机openEulerVM热插CPU到6,且在线生效的参考命令如下: +2. 利用virsh工具进行虚拟机CPU热插操作。例如给虚拟机openEulerVM热插CPU到6,且在线生效的参考命令如下: - ``` + ```sh virsh setvcpus openEulerVM 6 --live ``` - >![](./public_sys-resources/icon-note.gif) **说明:** - >virsh setvcpus 进行虚拟机CPU热插操作的格式如下: - >``` - >virsh setvcpus [--config] [--live] - >``` - >- domain: 参数,必填。指定虚拟机名称。 - >- count: 参数,必填。指定目标CPU数目,即热插后虚拟机CPU数目。 - >- --config: 选项,选填。虚拟机下次启动时仍有效。 - >- --live: 选项,选填。在线生效。 + virsh setvcpus 进行虚拟机CPU热插操作的格式如下: + + ```sh + virsh setvcpus [--config] [--live] + ``` + - domain: 参数,必填。指定虚拟机名称。 + - count: 参数,必填。指定目标CPU数目,即热插后虚拟机CPU数目。 + - --config: 选项,选填。虚拟机下次启动时仍有效。 + - --live: 选项,选填。在线生效。 **三、热拔CPU** 利用virsh工具进行虚拟机CPU热拔操作。例如给虚拟机openEulerVM热拔CPU到4,参考命令如下: - ``` - virsh setvcpus openEulerVM 4 --live - ``` +```sh +virsh setvcpus openEulerVM 4 --live +``` - >![](./public_sys-resources/icon-note.gif) **说明:** - >virsh setvcpus 进行虚拟机CPU热拔操作的格式如下: - >``` - >virsh setvcpus [--config] [--live] - >``` - >- domain: 参数,必填。指定虚拟机名称。 - >- count: 参数,必填。指定目标CPU数目,即热拔后虚拟机CPU数目。 - >- --config: 选项,选填。虚拟机下次启动时仍有效。 - >- --live: 选项,选填。在线生效。 +virsh setvcpus 进行虚拟机CPU热拔操作的格式如下: + +```sh +virsh setvcpus [--config] [--live] +``` + +- domain: 参数,必填。指定虚拟机名称。 +- count: 参数,必填。指定目标CPU数目,即热拔后虚拟机CPU数目。 +- --config: 选项,选填。虚拟机下次启动时仍有效。 +- --live: 选项,选填。在线生效。 ## 管理虚拟内存 @@ -319,9 +313,9 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 #### 操作步骤 -- 查看host的NUMA拓扑结构: +- 查看host的NUMA拓扑结构: - ``` + ```sh $ numactl -H available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @@ -344,9 +338,9 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 3: 20 20 15 10 ``` -- 在虚拟机XML配置文件中添加numatune字段,创建并启动虚拟机。例如使用主机上的NUMA node 0给虚拟机分配内存,配置参数如下: +- 在虚拟机XML配置文件中添加numatune字段,创建并启动虚拟机。例如使用主机上的NUMA node 0给虚拟机分配内存,配置参数如下: - ``` + ```conf @@ -354,10 +348,10 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 假设虚拟机的vCPU也绑定在NODE0的物理CPU上,就可以避免由于vCPU访问远端内存带来的性能下降。 - >![](./public_sys-resources/icon-note.gif) **说明:** - >- 分配给虚拟机的内存不要超过该NUMA节点剩余的可用内存,否则可能导致虚拟机启动失败。 - >- 建议虚拟机内存和vCPU都绑定在同一NUMA节点,避免vCPU访问远端内存造成性能下降。例如将上例中vCPU也绑定在NUMA node 0上。 - + > [!NOTE]说明 + > + > - 分配给虚拟机的内存不要超过该NUMA节点剩余的可用内存,否则可能导致虚拟机启动失败。 + > - 建议虚拟机内存和vCPU都绑定在同一NUMA节点,避免vCPU访问远端内存造成性能下降。例如将上例中vCPU也绑定在NUMA node 0上。 ### 配置Guest-NUMA @@ -369,7 +363,7 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 在虚拟机的XML配置文件中,配置了Guest NUMA后,就可以在虚拟机内部查看NUMA拓扑结构。项是Guest NUMA的必配项。 -``` +```conf @@ -389,12 +383,10 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 ``` ->![](./public_sys-resources/icon-note.gif) **说明:** ->- 项提供虚拟机内部呈现NUMA拓扑功能,“cell id”表示vNode编号,“cpus”表示vCPU编号,“memory”表示对应vNode上的内存大小。 ->- 如果希望通过Guest NUMA提供更好的性能,则需要配置,使vCPU和对应的内存分布在同一个物理NUMA NODE上: -> - 中的“cellid”和中的“cell id”是对应的;“mode”可以配置为“strict”(严格从指定node上申请内存,内存不够则失败)、“preferred”(优先从某一node上申请内存,如果不够则从其他node上申请)、“interleave”(从指定的node上交叉申请内存);“nodeset”表示指定物理NUMA NODE。 -> - 中需要将同一cell id中的vCPU绑定到与memnode相同的物理NUMA NODE上。 - +- 项提供虚拟机内部呈现NUMA拓扑功能,“cell id”表示vNode编号,“cpus”表示vCPU编号,“memory”表示对应vNode上的内存大小。 +- 如果希望通过Guest NUMA提供更好的性能,则需要配置,使vCPU和对应的内存分布在同一个物理NUMA NODE上: + - 中的“cellid”和中的“cell id”是对应的;“mode”可以配置为“strict”(严格从指定node上申请内存,内存不够则失败)、“preferred”(优先从某一node上申请内存,如果不够则从其他node上申请)、“interleave”(从指定的node上交叉申请内存);“nodeset”表示指定物理NUMA NODE。 + - 中需要将同一cell id中的vCPU绑定到与memnode相同的物理NUMA NODE上。 ### 内存热插 @@ -404,29 +396,29 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 #### 约束限制 -- 创建虚拟机的时候,AArch64平台上指定的主板类型(machine)需为virt-4.1或更高virt以上,x86平台上指定的主板类型需要为pc-i440fx-1.5以上版本。 -- 内存热插特性依赖于Guest NUMA,虚拟机必须配置Guest NUMA,否则无法完成内存热插流程。 -- 热插内存时候必须指定新增内存所属的Gust NUMA node编号,否则内存热插失败。 -- 虚拟机内核必须支持内存热插能力,否则虚拟机无法识别新增内存或者无法上线内存。 -- 配置使用大页的虚拟机,热插内存的容量必须是系统hugepagesz的整数倍,否则会导致热插失败。 -- 热插内存的大小必须为Guest物理内存块大小block_size_bytes的整数倍,否则无法正常上线。在Guest内部执行lsmem可以获取block_size_bytes大小。 -- 配置n个virtio-net网卡后,最大可热插次数取值为min{max_slot, 64 - n},因为要给网卡预留slot。 -- vhost-user设备和内存热插特性互斥。配置了vhost-user设备的虚拟机不支持内存热插;内存热插后,不支持虚拟机热插vhost-user设备。 -- 如果虚拟机操作系统为Linux系列,请确保初始内存大于等于4GB。 -- 如果虚拟机操作系统为Windows类型,第一次热插内存必须指定到Guest NUMA node0上,否则热插内存无法被虚拟机识别。 -- 在直通场景下,由于需要预先分配内存,因此启动和热插内存都比普通虚拟机要慢(尤其是大规格虚拟机),属于正常现象。 -- 建议虚拟机可用内存与热插内存的比例至少为1:32,即热插32G内存虚拟机至少需要有1G可用内存,如果低于该比例可能会导致虚拟机卡死。 -- 热插内存是否自动上线取决于虚拟机操作系统自身逻辑,可以手动上线或者配置udev规则自动上线。 +- 创建虚拟机的时候,AArch64平台上指定的主板类型(machine)需为virt-4.1或更高virt以上,x86平台上指定的主板类型需要为pc-i440fx-1.5以上版本。 +- 内存热插特性依赖于Guest NUMA,虚拟机必须配置Guest NUMA,否则无法完成内存热插流程。 +- 热插内存时候必须指定新增内存所属的Gust NUMA node编号,否则内存热插失败。 +- 虚拟机内核必须支持内存热插能力,否则虚拟机无法识别新增内存或者无法上线内存。 +- 配置使用大页的虚拟机,热插内存的容量必须是系统hugepagesz的整数倍,否则会导致热插失败。 +- 热插内存的大小必须为Guest物理内存块大小block_size_bytes的整数倍,否则无法正常上线。在Guest内部执行lsmem可以获取block_size_bytes大小。 +- 配置n个virtio-net网卡后,最大可热插次数取值为min{max_slot, 64 - n},因为要给网卡预留slot。 +- vhost-user设备和内存热插特性互斥。配置了vhost-user设备的虚拟机不支持内存热插;内存热插后,不支持虚拟机热插vhost-user设备。 +- 如果虚拟机操作系统为Linux系列,请确保初始内存大于等于4GB。 +- 如果虚拟机操作系统为Windows类型,第一次热插内存必须指定到Guest NUMA node0上,否则热插内存无法被虚拟机识别。 +- 在直通场景下,由于需要预先分配内存,因此启动和热插内存都比普通虚拟机要慢(尤其是大规格虚拟机),属于正常现象。 +- 建议虚拟机可用内存与热插内存的比例至少为1:32,即热插32G内存虚拟机至少需要有1G可用内存,如果低于该比例可能会导致虚拟机卡死。 +- 热插内存是否自动上线取决于虚拟机操作系统自身逻辑,可以手动上线或者配置udev规则自动上线。 #### 操作步骤 **一、配置虚拟机XML** -1. 使用内存热插功能,需要在创建虚拟机时配置可热插内存的最大范围、预留槽位号,并配置Guest NUMA拓扑结构。 +1. 使用内存热插功能,需要在创建虚拟机时配置可热插内存的最大范围、预留槽位号,并配置Guest NUMA拓扑结构。 例如,为虚拟机配置32GiB初始内存,预留256个槽位号,最大支持1TiB内存上限,2个NUMA node的配置为: - ``` + ```conf 32 1024 @@ -440,8 +432,7 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 .... ``` - ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >其中: >maxMemory字段中slots号表示预留的内存插槽,最大取值为256。 >maxMemory表示虚拟机支持的最大物理内存上限。 @@ -449,18 +440,18 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 **二、热插并上线内存** -1. 如果热插内存后需要自动上线热插的内存,可以使用root权限在虚拟机内部创建udev rules文件/etc/udev/rules.d/99-hotplug-memory.rules,并在其中定义udev规则,内容参考如下: +1. 如果热插内存后需要自动上线热插的内存,可以使用root权限在虚拟机内部创建udev rules文件/etc/udev/rules.d/99-hotplug-memory.rules,并在其中定义udev规则,内容参考如下: - ``` + ```conf # automatically online hot-plugged memory ACTION=="add", SUBSYSTEM=="memory", ATTR{state}="online" ``` -2. 根据需要热插的内存大小和虚拟机Guest NUMA Node创建内存描述xml文件。 +2. 根据需要热插的内存大小和虚拟机Guest NUMA Node创建内存描述xml文件。 例如,热插1GiB内存到NUMA node0上: - ``` + ```con 1024 @@ -469,18 +460,18 @@ NUMA(Non Uniform Memory Access Architecture) 模式是一种分布式存储 ``` -3. 使用virsh attach-device命令为虚拟机热插内存。其中openEulerVM为虚拟机名称,memory.xml为热插内存的描述文件,--live表示热插内存在线生效,也可以使用--config 将热插内存持久化到虚拟机xml文件中。 +3. 使用virsh attach-device命令为虚拟机热插内存。其中openEulerVM为虚拟机名称,memory.xml为热插内存的描述文件,--live表示热插内存在线生效,也可以使用--config 将热插内存持久化到虚拟机xml文件中。 - ``` + ```conf # virsh attach-device openEulerVM memory.xml --live ``` - >![](./public_sys-resources/icon-note.gif) **说明:** + >[!NOTE]说明 >如果没有使用udev rules自动上线热插内存,也可以使用root权限,参考如下命令手动上线: - >``` + > + >```sh >for i in `grep -l offline /sys/devices/system/memory/memory*/state` >do > echo online > $i >done >``` - diff --git "a/docs/zh/docs/Virtualization/\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/tool_guide.md similarity index 88% rename from "docs/zh/docs/Virtualization/\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/tool_guide.md index 29aeea3dd189c30a37cc5cbb82c2eba96c7357a0..1260d88fcd6593e04b4fc99d460b8b72d72ed9de 100644 --- "a/docs/zh/docs/Virtualization/\345\267\245\345\205\267\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/tool_guide.md @@ -1 +1,3 @@ +# 工具使用指南 + 为了方便用户更好地使用虚拟化,openEuler 提供了一系列工具,包括 vmtop、LibcarePlus 等。本章介绍这些工具的安装和使用指导。 diff --git "a/docs/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\347\273\204\344\273\266.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/virtulization_installation.md similarity index 97% rename from "docs/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\347\273\204\344\273\266.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/virtulization_installation.md index 37f7b3ddfc4dca1ead72f29fdb2b54137c6e7ece..94b10e321374669425ae77816e611c9168966338 100644 --- "a/docs/zh/docs/Virtualization/\345\256\211\350\243\205\350\231\232\346\213\237\345\214\226\347\273\204\344\273\266.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/virtulization_installation.md @@ -39,7 +39,7 @@ # yum install -y qemu ``` - >![](./public_sys-resources/icon-caution.gif) **注意:** + >[!WARNING]注意 >QEMU组件默认以用户qemu和用户组qemu运行,如果您不了解Linux用户组、用户的权限管理,后续创建和启动虚拟机时可能会遇到权限不足问题,以下有两种解决方法: >第一种方法:修改QEMU配置文件。使用以下命令打开QEMU配置文件,`sudo vim /etc/libvirt/qemu.conf`,找到以下两个字段,`user = "root"`和`group = "root"`,取消注释(即删除前面的`#`号),保存并退出。 >第二种方法:修改虚拟机文件的所有者。首先需要保证用户qemu拥有访问存放虚拟机文件的文件夹权限,使用以下命令修改文件的所有者,`sudo chown qemu:qemu xxx.qcow2`,修改所有需要读写的虚拟机文件即可。 @@ -56,7 +56,7 @@ # systemctl start libvirtd ``` ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >KVM模块已经集成在openEuler内核中,因此不需要单独安装。 ### 验证安装是否成功 diff --git "a/docs/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_configuration.md similarity index 82% rename from "docs/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_configuration.md index 5df9f8b16936913bf27e7b8e102fac99dd20ccbd..8395496236be0e049f2a37ee9af262eebd8bcf2e 100644 --- "a/docs/zh/docs/Virtualization/\350\231\232\346\213\237\346\234\272\351\205\215\347\275\256.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_configuration.md @@ -1,36 +1,18 @@ # 虚拟机配置 - -- [虚拟机配置](#虚拟机配置) - - [总体介绍](#总体介绍) - - [虚拟机描述](#虚拟机描述) - - [虚拟CPU和虚拟内存](#虚拟cpu和虚拟内存) - - [配置虚拟设备](#配置虚拟设备) - - [存储设备](#存储设备) - - [网络设备](#网络设备) - - [总线配置](#总线配置) - - [其他常用设备](#其他常用设备) - - [体系架构相关配置](#体系架构相关配置) - - [其他常见配置项](#其他常见配置项) - - [XML配置文件示例](#xml配置文件示例) - - - - - ## 总体介绍 -#### 概述 +### 概述 Libvirt工具采用XML格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件,对虚拟机进行管理。本章介绍XML配置文件各个元素的含义,指导用户完成虚拟机配置。 -#### 基本格式 +### 基本格式 虚拟机XML配置文件以domain为根元素,domain根元素中包含多个其他元素。XML配置文件中的部分元素可以包含对应属性和属性值,用以详细地描述虚拟机信息,同一元素的不同属性使用空格分开。 XML配置文件的基本格式如下,其中label代表具体标签名,attribute代表属性,value代表属性值,需要根据实际情况修改。 -``` +```conf VMName 8 @@ -46,41 +28,40 @@ XML配置文件的基本格式如下,其中label代表具体标签名,attrib ``` -#### 配置流程 +### 配置流程 -1. 创建一个根元素为domain的XML配置文件。 -2. 使用标签name,根据命名规则指定唯一的虚拟机名称。 -3. 配置虚拟CPU和虚拟内存等系统资源。 -4. 配置虚拟设备。 - 1. 配置存储设备。 - 2. 配置网络设备。 - 3. 配置外部总线结构。 - 4. 配置鼠标等外部设备。 +1. 创建一个根元素为domain的XML配置文件。 +2. 使用标签name,根据命名规则指定唯一的虚拟机名称。 +3. 配置虚拟CPU和虚拟内存等系统资源。 +4. 配置虚拟设备。 + 1. 配置存储设备。 + 2. 配置网络设备。 + 3. 配置外部总线结构。 + 4. 配置鼠标等外部设备。 -5. 保存XML配置文件。 +5. 保存XML配置文件。 ## 虚拟机描述 -#### 概述 +### 概述 本节介绍虚拟机domain根元素和虚拟机名称的配置。 -#### 元素介绍 +### 元素介绍 -- domain:虚拟机XML配置文件的根元素,用于配置运行此虚拟机的hypervisor的类型。 +- domain:虚拟机XML配置文件的根元素,用于配置运行此虚拟机的hypervisor的类型。 属性type:虚拟化中domain的类型。openEuler虚拟化中属性值为kvm。 -- name:虚拟机名称。 +- name:虚拟机名称。 虚拟机名称为一个字符串,同一个主机上的虚拟机名称不能重复,虚拟机名称必须由数字、字母、“\_”、“-”、“:”组成,但不支持全数字的字符串,且虚拟机名称不超过64个字符。 - -#### 配置示例 +### 配置示例 例如,虚拟机名称为openEuler的配置如下: -``` +```conf openEuler ... @@ -89,49 +70,49 @@ XML配置文件的基本格式如下,其中label代表具体标签名,attrib ## 虚拟CPU和虚拟内存 -#### 概述 +### 概述 本节介绍虚拟CPU和虚拟内存的常用配置。 -#### 元素介绍 +### 元素介绍 -- vcpu:虚拟处理器的个数。 -- memory:虚拟内存的大小。 +- vcpu:虚拟处理器的个数。 +- memory:虚拟内存的大小。 属性unit:指定内存单位,属性值支持KiB(210 字节),MiB(220 字节),GiB(230 字节),TiB(240 字节)等。 -- cpu:虚拟处理器模式。 +- cpu:虚拟处理器模式。 属性mode:表示虚拟CPU的模式。 - - host-passthrough:表示虚拟CPU的架构和特性与主机保持一致。 + - host-passthrough:表示虚拟CPU的架构和特性与主机保持一致。 - - custom:表示虚拟CPU的架构和特性由此cpu元素控制。 + - custom:表示虚拟CPU的架构和特性由此cpu元素控制。 子元素topology:元素cpu的子元素,用于描述虚拟CPU模式的拓扑结构。 - - 子元素topology的属性socket、cores、threads分别描述了虚拟机具有多少个cpu socket,每个cpu socket中包含多少个处理核心(core),每个处理器核心具有多少个超线程(threads),属性值为正整数且三者的乘积等于虚拟CPU的个数。 - - ARM架构支持虚拟超线程, 虚拟CPU热插与虚拟超线程功能互斥。 + - 子元素topology的属性socket、cores、threads分别描述了虚拟机具有多少个cpu socket,每个cpu socket中包含多少个处理核心(core),每个处理器核心具有多少个超线程(threads),属性值为正整数且三者的乘积等于虚拟CPU的个数。 + - ARM架构支持虚拟超线程, 虚拟CPU热插与虚拟超线程功能互斥。 子元素model:元素cpu的子元素,当mode为custom时用于描述CPU的模型。 子元素feature:元素cpu的子元素,当mode为custom时用于描述某一特性的使能情况。其中,属性name表示特性的名称,属性policy表示这一特性的使能控制策略: - - force:表示强制使能该特性,无论主机CPU是否支持该特性。 + - force:表示强制使能该特性,无论主机CPU是否支持该特性。 - - require:表示使能该特性,当主机CPU不支持该特性并且hypervisor不支持模拟该特性时,创建虚拟机失败。 + - require:表示使能该特性,当主机CPU不支持该特性并且hypervisor不支持模拟该特性时,创建虚拟机失败。 - - optional:表示该特性的使能情况与主机上该特性的使能情况保持一致。 + - optional:表示该特性的使能情况与主机上该特性的使能情况保持一致。 - - disable:禁用该特性。 + - disable:禁用该特性。 - - forbid:禁用该特性,当主机支持该特性时创建虚拟机失败。 + - forbid:禁用该特性,当主机支持该特性时创建虚拟机失败。 -#### 配置示例 +### 配置示例 例如,虚拟CPU个数为4,处理模式为host-passthrough,虚拟内存为8GiB,4个CPU分布在两个CPU socket中,且不支持超线程的配置如下: -``` +```conf ... 4 @@ -145,7 +126,7 @@ XML配置文件的基本格式如下,其中label代表具体标签名,attrib 虚拟内存为8GiB,虚拟CPU个数为4,处理模式为custom,model为Kunpeng-920,且禁用pmull特性的配置如下: -``` +```conf ... 4 @@ -161,13 +142,14 @@ XML配置文件的基本格式如下,其中label代表具体标签名,attrib ## 配置虚拟设备 虚拟机XML配置文件使用devices元素配置虚拟设备,包括存储设备、网络设备、总线、鼠标等,本节介绍常用的虚拟设备如何配置。 -### 存储设备 -#### 概述 +## 存储设备 + +### 概述 XML配置文件可以配置虚拟存储设备信息,包括软盘、磁盘、光盘等存储介质及其存储类型等信息,本节介绍存储设备的配置方法。 -#### 元素介绍 +### 元素介绍 XML配置文件使用disk元素配置存储设备,disk常见的属性如[表1](#table14200183410353)所示,常见子元素及子元素属性如[表2](#table4866134925114)所示。 @@ -272,42 +254,44 @@ XML配置文件使用disk元素配置存储设备,disk常见的属性如[表1]
-#### 配置示例 +### 配置示例 按照“准备虚拟机镜像”操作完成虚拟机镜像准备后,可以使用如下XML配置文件示例,为虚拟机配置虚拟磁盘。 例如,该示例为虚拟机配置了两个IO线程,一个块磁盘设备,一个光盘设备和一个rbd磁盘,第一个IO线程分配给块磁盘设备使用。该块磁盘设备的后端介质为qcow2格式,且被作为优先启动盘。 在使用rbd磁盘前请确保已经安装qemu-block-rbd驱动,如未安装,请在root下使用如下命令进行安装: -``` + +```sh # yum install qemu-block-rbd ``` + 配置实例: -``` +```conf ... 2 - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + ... @@ -389,9 +373,9 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 #### 配置示例 -- 按照“准备虚拟机网络”创建了Linux网桥br0后,配置一个桥接在br0网桥上的virtio类型的虚拟网卡设备,对应的XML配置如下: +- 按照“准备虚拟机网络”创建了Linux网桥br0后,配置一个桥接在br0网桥上的virtio类型的虚拟网卡设备,对应的XML配置如下: - ``` + ```conf ... @@ -404,9 +388,9 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 ``` -- 如果按照“准备虚拟机网络”创建了OVS网桥,配置一个后端使用vhost驱动,且具有四个队列的virtio虚拟网卡设备。 +- 如果按照“准备虚拟机网络”创建了OVS网桥,配置一个后端使用vhost驱动,且具有四个队列的virtio虚拟网卡设备。 - ``` + ```conf ... @@ -421,7 +405,6 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 ``` - ### 总线配置 #### 概述 @@ -430,7 +413,7 @@ XML配置文件中使用元素“interface”,其属性“type”表示虚拟 PCIe总线是一种典型的树结构,具有比较好的扩展性,总线之间通过控制器关联,这里以PCIe总线为例介绍如何为虚拟机配置总线拓扑。 ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >总线的配置相对比较繁琐,若不需要精确控制设备拓扑结构,可以使用libvirt自动生成的缺省总线配置。 #### 元素介绍 @@ -439,15 +422,14 @@ PCIe总线是一种典型的树结构,具有比较好的扩展性,总线之 controller:控制器元素,表示一个总线。 -- 属性type:控制器必选属性,表示总线类型。常用取值有“pci”、“usb”、“scsi”、“virtio-serial”、“fdc”、“ccid”。 -- 属性index:控制器必选属性,表示控制器的总线“bus”编号(编号从0开始),可以在地址元素“address”元素中使用。 -- 属性model:控制器必选属性,表示控制器的具体型号,其可选择的值与控制器类型“type”的值相关,对应关系及含义请参见[表4](#table191911761111)。 -- 子元素address:为设备或控制器指定其在总线网络中的挂载位置。 - - 属性type:设备地址类型。常用取值有“pci”、“usb”、“drive”。address的type类型不同, 对应的属性也不同,常用type属性值及其该取值下address的属性请参见[表5](#table1200165711314)。 - -- 子元素model:控制器具体型号的名称。 - - 属性name:指定控制器具体型号的名称,和父元素controller中的属性model对应。 +- 属性type:控制器必选属性,表示总线类型。常用取值有“pci”、“usb”、“scsi”、“virtio-serial”、“fdc”、“ccid”。 +- 属性index:控制器必选属性,表示控制器的总线“bus”编号(编号从0开始),可以在地址元素“address”元素中使用。 +- 属性model:控制器必选属性,表示控制器的具体型号,其可选择的值与控制器类型“type”的值相关,对应关系及含义请参见[表4](#table191911761111)。 +- 子元素address:为设备或控制器指定其在总线网络中的挂载位置。 + - 属性type:设备地址类型。常用取值有“pci”、“usb”、“drive”。address的type类型不同, 对应的属性也不同,常用type属性值及其该取值下address的属性请参见[表5](#table1200165711314)。 +- 子元素model:控制器具体型号的名称。 + - 属性name:指定控制器具体型号的名称,和父元素controller中的属性model对应。 **表 4** controller属性type常用取值和model取值对应关系 @@ -553,35 +535,35 @@ controller:控制器元素,表示一个总线。 该示例给出一个PCIe总线的拓扑结构。PCIe根节点(BUS 0)下挂载了三个PCIe-Root-Port控制器。第一个PCIe-Root-Port控制器(BUS 1)开启了multifunction功能,并在其下挂载一个PCIe-to-PCI-bridge控制器,形成了一个PCI总线(BUS 3),该PCI总线上挂载了一个virtio-serial设备和一个USB 2.0控制器。第二个PCIe-Root-Port控制器(BUS 2)下挂载了一个SCSI控制器。第三个PCIe-Root-Port控制器(BUS 0)下无挂载设备。配置内容如下: -``` +```conf ... - -
- - -
- - - -
- - -
- - -
- - -
- - -
- - ... - + +
+ + +
+ + + +
+ + +
+ + +
+ + +
+ + +
+ + ... + ``` @@ -593,12 +575,11 @@ controller:控制器元素,表示一个总线。 #### 元素介绍 -- serial:串口设备 +- serial:串口设备 属性type:用于指定串口类型。常用属性值为pty、tcp、pipe、file。 - -- video:媒体设备 +- video:媒体设备 属性type:媒体设备类型。AArch64架构常用属性值为virtio,x86\_64架构通常使用属性值为vga或cirrus。 @@ -608,34 +589,33 @@ controller:控制器元素,表示一个总线。 例如:给x86\_64架构虚拟机配置16MB的VGA类型的显卡,XML示例如下,其中vram属性代表显存大小,单位默认为KB: - ``` + ```conf ``` -- input:输出设备 +- input:输出设备 属性type:指定输出设备类型。常用属性值为tabe、keyboard,分别表示输出设备为写字板、键盘。 属性bus:指定挂载的总线。常用属性值为USB。 -- emulator:模拟器应用路径 -- graphics:图形设备 +- emulator:模拟器应用路径 +- graphics:图形设备 属性type:指定图形设备类型。常用属性值为vnc。 属性listen:指定侦听的IP地址。 - #### 配置示例 例如,在下面的示例中,配置了虚拟机的模拟器路径,pty串口、virtio媒体设备、USB写字板、USB键盘以及VNC图形设备。 ->![](./public_sys-resources/icon-note.gif) **说明:** +>[!NOTE]说明 >graphics的type配置为VNC时,建议配置属性passwd,即使用VNC登录时的密码。 -``` +```conf ... @@ -647,20 +627,20 @@ controller:控制器元素,表示一个总线。 - ... - + ... + ``` ## 体系架构相关配置 -#### 概述 +### 概述 XML中还有一部分体系架构相关的配置,这部分配置包括主板,CPU,一些与体系架构相关的feature,本章节主要介绍它们的配置和含义。 -#### 元素介绍 +### 元素介绍 -- os:定义虚拟机启动参数。 +- os:定义虚拟机启动参数。 子元素type:指定虚拟机类型,属性arch表示架构类型,如aarch64,属性machine表示虚拟机的芯片组类型,虚拟机支持的芯片组可以通过 **qemu-kvm -machine ?** 命令查询,如AArch64结构使用“virt”类型。 @@ -668,14 +648,13 @@ XML中还有一部分体系架构相关的配置,这部分配置包括主板 子元素nvram:指定nvram文件路径,用于存储UEFI启动配置。 +- features:hypervisor支持控制一些虚拟机CPU/machine的特性,如高级电源管理接口“acpi”,ARM处理器指定GICv3中断控制器等。 -- features:hypervisor支持控制一些虚拟机CPU/machine的特性,如高级电源管理接口“acpi”,ARM处理器指定GICv3中断控制器等。 - -#### AArch64架构配置示例 +### AArch64架构配置示例 虚拟机的类型为AArch64结构,使用virt芯片组,利用UEFI启动的虚拟机配置如下: -``` +```conf ... @@ -689,18 +668,18 @@ XML中还有一部分体系架构相关的配置,这部分配置包括主板 为虚拟机配置ACPI和GIC V3中断控制器特性。 -``` +```conf ``` -#### x86\_64架构配置示例 +### x86\_64架构配置示例 x86\_64架构支持BIOS和UEFI两种启动方式,如果不配置loader,则使用默认启动方式BIOS。这里给出启动方式为UEFI、芯片组为q35的配置参考。 -``` +```conf ... @@ -713,77 +692,76 @@ x86\_64架构支持BIOS和UEFI两种启动方式,如果不配置loader,则 ## 其他常见配置项 -#### 概述 +### 概述 除系统资源和虚拟设备外,XML配置文件还需要配置一些其他元素,本节介绍这些元素的配置方法。 -#### 元素介绍 +### 元素介绍 -- iothreads:指定iothread数量,可以用于加速存储设备性能。 +- iothreads:指定iothread数量,可以用于加速存储设备性能。 -- on\_poweroff:虚拟机关闭时采取的动作。 -- on\_reboot:虚拟机重启时采取的动作。 -- on\_crash:虚拟机崩溃时采取的动作。 -- clock:采用的时钟类型。 +- on\_poweroff:虚拟机关闭时采取的动作。 +- on\_reboot:虚拟机重启时采取的动作。 +- on\_crash:虚拟机崩溃时采取的动作。 +- clock:采用的时钟类型。 属性offset:设置虚拟机时钟的同步类型,可选的值有“localtime”、“utc”、“timezone”、“variable”等。 - -#### 配置示例 +### 配置示例 为虚拟机配置两个iothread,用于加速存储设备性能。 -``` +```conf 2 ``` 虚拟机关闭时,销毁虚拟机。 -``` +```conf destroy ``` 虚拟机重启时,重新启动虚拟机。 -``` +```conf restart ``` 虚拟机崩溃时,重新启动虚拟机。 -``` +```conf restart ``` 时钟采用“utc”的同步方式。 -``` +```conf ``` ## XML配置文件示例 -#### 概述 +### 概述 本节给出一个基本的AArch64虚拟机和一个x86\_64虚拟机的XML配置文件示例,供用户参考。 -#### 示例一 +### 示例一 一个包含基本元素的AArch64架构虚拟机的XML配置文件,其内容示例如下: -``` +```conf openEulerVM 8 4 - hvm - /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw - /var/lib/libvirt/qemu/nvram/openEulerVM.fd + hvm + /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw + /var/lib/libvirt/qemu/nvram/openEulerVM.fd - - + + @@ -794,43 +772,43 @@ x86\_64架构支持BIOS和UEFI两种启动方式,如果不配置loader,则 restart restart - /usr/libexec/qemu-kvm - - - - - - - - - - - - - - - - - - + /usr/libexec/qemu-kvm + + + + + + + + + + + + + + + + + + - - - - + + + + ``` -#### 示例二 +### 示例二 一个包含基本元素及总线元素x86\_64架构虚拟机的XML配置文件,其配置示例如下: -``` +```conf openEulerVM 8388608 @@ -901,4 +879,3 @@ x86\_64架构支持BIOS和UEFI两种启动方式,如果不配置loader,则 ``` - diff --git "a/docs/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_live_migration.md similarity index 71% rename from "docs/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_live_migration.md index ecf6a17c90562a37ba2b42ba1f484bc243b260c5..fd1df824d29f8e5ad0b8be50778bd339f020e0f5 100644 --- "a/docs/zh/docs/Virtualization/\347\203\255\350\277\201\347\247\273\350\231\232\346\213\237\346\234\272.md" +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_live_migration.md @@ -1,12 +1,4 @@ # 热迁移虚拟机 - -- [热迁移虚拟机](#热迁移虚拟机) - - [总体介绍](#总体介绍) - - [应用场景](#应用场景) - - [注意事项和约束限制](#注意事项和约束限制) - - [热迁移操作](#热迁移操作) - - ## 总体介绍 @@ -18,41 +10,41 @@ 共享存储和非共享存储热迁移的共同应用场景有: -- 当物理机故障或者负载过重时,可以将运行的虚拟机迁移到另一台物理机上,以避免业务中断,保证业务的正常运行。 -- 当多数的物理机负载过轻时,可以将虚拟机迁移整合,以减少物理机数量,提高资源的利用率。 -- 当物理服务器硬件设备成为瓶颈,比如CPU、内存、硬盘等,需要更换性能更好的硬件,或者需要增加设备,但是又不能关闭虚拟机或者停止业务。 -- 服务器软件升级,比如虚拟化平台升级,就可以把虚拟机从旧版本虚拟化平台热迁移到新版本虚拟化平台。 +- 当物理机故障或者负载过重时,可以将运行的虚拟机迁移到另一台物理机上,以避免业务中断,保证业务的正常运行。 +- 当多数的物理机负载过轻时,可以将虚拟机迁移整合,以减少物理机数量,提高资源的利用率。 +- 当物理服务器硬件设备成为瓶颈,比如CPU、内存、硬盘等,需要更换性能更好的硬件,或者需要增加设备,但是又不能关闭虚拟机或者停止业务。 +- 服务器软件升级,比如虚拟化平台升级,就可以把虚拟机从旧版本虚拟化平台热迁移到新版本虚拟化平台。 对于非共享存储热迁移,还可以应用在如下场景: -- 当物理机故障存储空间不足,需要将运行的虚拟机迁移到另一台物理机上,可以避免业务中断,保证业务的正常运行。 -- 当物理机存储设备老化,性能不能支撑当前业务数据处理,成为系统性能的瓶颈,需要更换性能更强的存储,但是又不能关闭虚拟机或者停止虚拟机,这需要将运行的虚拟机迁移到一个具有更好性能的物理机上。 +- 当物理机故障存储空间不足,需要将运行的虚拟机迁移到另一台物理机上,可以避免业务中断,保证业务的正常运行。 +- 当物理机存储设备老化,性能不能支撑当前业务数据处理,成为系统性能的瓶颈,需要更换性能更强的存储,但是又不能关闭虚拟机或者停止虚拟机,这需要将运行的虚拟机迁移到一个具有更好性能的物理机上。 ### 注意事项和约束限制 -- 热迁移过程中,需要保证网络状态良好。如果发生网络中断,热迁移会暂停,直到网络恢复后才会继续,当发生超时,热迁移会失败。 -- 迁移过程中,不允许对虚拟机进行生命周期和管理虚拟机硬件设备等操作。 -- 虚拟机正在迁移的过程中,应尽可能保证源端、目的端服务器不被意外下电或重启,否则会导致热迁移失败,甚至可能导致虚拟机被下电。 -- 虚拟机正在迁移的过程中,不允许对虚拟机做关机、重启或恢复操作,否则可能会导致热迁移失败,当执行ACPI方式重启时,再执行热迁移会导致虚拟机关闭。 +- 热迁移过程中,需要保证网络状态良好。如果发生网络中断,热迁移会暂停,直到网络恢复后才会继续,当发生超时,热迁移会失败。 +- 迁移过程中,不允许对虚拟机进行生命周期和管理虚拟机硬件设备等操作。 +- 虚拟机正在迁移的过程中,应尽可能保证源端、目的端服务器不被意外下电或重启,否则会导致热迁移失败,甚至可能导致虚拟机被下电。 +- 虚拟机正在迁移的过程中,不允许对虚拟机做关机、重启或恢复操作,否则可能会导致热迁移失败,当执行ACPI方式重启时,再执行热迁移会导致虚拟机关闭。 -- 只支持同构热迁移,即源端和目的端CPU型号需要相同。 -- 跨业务网段虚拟机迁移可以成功,但是到目的端后会出现网络异常,为了防止该情况发生,需要用户保证迁移业务网段一致。 -- 如果源端虚拟机vCPU数大于目的端的物理机CPU核数,则迁移后将会影响到虚拟机的性能,应保证目的端物理机CPU核数大于等于源端虚拟机vCPU数。 +- 只支持同构热迁移,即源端和目的端CPU型号需要相同。 +- 跨业务网段虚拟机迁移可以成功,但是到目的端后会出现网络异常,为了防止该情况发生,需要用户保证迁移业务网段一致。 +- 如果源端虚拟机vCPU数大于目的端的物理机CPU核数,则迁移后将会影响到虚拟机的性能,应保证目的端物理机CPU核数大于等于源端虚拟机vCPU数。 非共享存储热迁移过程中的额外注意事项: -- 不支持迁移源端和目的端为同一个磁盘镜像文件的迁移,用户需要对该类迁移进行特殊处理,提防覆盖写坏数据而导致镜像损坏。 -- 不支持对共享磁盘的迁移,用户需要对该类迁移进行防呆处理。 -- 迁移的目的端镜像只支持文件,不支持裸设备,用户需要对目的端是裸设备的迁移进行防呆处理。 -- 目的端需要创建与源端大小、数量相同的磁盘镜像,否则迁移失败。 -- 混合迁移场景,需要传入迁移的磁盘,不能包括共享和只读的磁盘。 +- 不支持迁移源端和目的端为同一个磁盘镜像文件的迁移,用户需要对该类迁移进行特殊处理,提防覆盖写坏数据而导致镜像损坏。 +- 不支持对共享磁盘的迁移,用户需要对该类迁移进行防呆处理。 +- 迁移的目的端镜像只支持文件,不支持裸设备,用户需要对目的端是裸设备的迁移进行防呆处理。 +- 目的端需要创建与源端大小、数量相同的磁盘镜像,否则迁移失败。 +- 混合迁移场景,需要传入迁移的磁盘,不能包括共享和只读的磁盘。 ## 热迁移操作 ### 前提条件 -- 进行热迁移之前要确保源端和目的端主机之间的网络是互通的,并且源端和目的端获得资源权限是对等的,即两端同时能够访问到相同的存储资源和网络资源。 -- 在执行虚拟机热迁移前应当对虚拟机进行健康检查,并确保目的端主机有足够的CPU、内存和存储资源。 +- 进行热迁移之前要确保源端和目的端主机之间的网络是互通的,并且源端和目的端获得资源权限是对等的,即两端同时能够访问到相同的存储资源和网络资源。 +- 在执行虚拟机热迁移前应当对虚拟机进行健康检查,并确保目的端主机有足够的CPU、内存和存储资源。 ### 热迁移脏页率预测(可选) @@ -62,13 +54,13 @@ 例如,指定名为openEulerVM的虚拟机,计算时间为1s: -``` +```sh virsh qemu-monitor-command openEulerVM '{"execute":"calc-dirty-rate", "arguments": {"calc-time": 1}}' ``` 间隔1s后,查询脏页变化速率: -``` +```sh virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' ``` @@ -78,7 +70,7 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' 例如,指定名为openEulerVM的虚拟机最大停机时间为500ms: -``` +```sh # virsh migrate-setmaxdowntime openEulerVM 500 ``` @@ -86,16 +78,17 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' 例如,指定名为openEulerVM的虚拟机热迁带宽为500Mbps: -``` +```sh # virsh migrate-setspeed openEulerVM --bandwidth 500 ``` 用户可以使用migrate-getspeed来查询虚拟机热迁移过程中的最大带宽。 -``` +```sh # virsh migrate-getspeed openEulerVM 500 ``` + 用户可以使用migrate-set-parameters来设置热迁移时相关的参数,与热迁移压缩的参数如下所示: 1. compress-level: 压缩级别,缺省值:1 @@ -106,12 +99,13 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' 例如,指定名为openEulerVM的虚拟机热迁算法为zstd,其余参数采用默认设置。 -``` +```sh # virsh qemu-monitor-command openeulerVM '{ "execute": "migrate-set-parameters", "arguments": {"compress-method": "zstd"}}' ``` 用户可以使用query-migrate-parameters来查询热迁移时相关的参数。 -``` + +```sh # virsh qemu-monitor-command openeulerVM '{ "execute": "query-migrate-parameters"}' --pretty { @@ -145,9 +139,9 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' ### 热迁移操作(共享存储场景) -1. 确认是否为共享存储。 +1. 确认是否为共享存储。 - ``` + ```sh # virsh domblklist Target Source -------------------------------------------- @@ -157,11 +151,11 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' 首先,使用virsh domblklist命令查询虚拟机的存储设备信息,例如上面的查询结果显示虚拟机配置有2个存储设备:sda盘和sdb盘,然后再分别查询一下这两个设备对应后端存储是本地存储还是远端存储,如果虚拟机的所有存储设备都在远端共享存储之上,则说明该虚拟机为共享存储虚拟机,否则为非共享存储虚拟机。 -2. 执行如下命令,进行虚拟机热迁移。 +2. 执行如下命令,进行虚拟机热迁移。 例如,将虚拟机openEulerVM迁移到目的主机上使用virsh migrate命令。 - ``` + ```sh # virsh migrate --live --unsafe openEulerVM qemu+ssh:///system ``` @@ -177,15 +171,15 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' --timeout选项会指定一个热迁移超时时间,热迁移超过指定时间后会强制挂起虚拟机让热迁移得以收敛。 -3. 热迁移完成后命令返回,虚拟机在目的端主机正常运行。 +3. 热迁移完成后命令返回,虚拟机在目的端主机正常运行。 ### 热迁移操作(非共享存储场景) -1. 首先,先查询虚拟机存储设备列表,确保虚拟机使用的是非共享存储。 +1. 首先,先查询虚拟机存储设备列表,确保虚拟机使用的是非共享存储。 例如,通过virsh domblklist查询到准备迁移的虚拟机有一个qcow2格式的磁盘sda,sda的xml配置为: - ``` + ```conf @@ -196,30 +190,30 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' 执行热迁移之前需要在目的端主机相同磁盘目录下创建一个虚拟磁盘文件,注意磁盘的格式和大小必须保持一致。 - ``` + ```sh # qemu-img create -f qcow2 /mnt/sdb/openeuler/openEulerVM.qcow2 20G ``` -2. 在源端使用virsh migrate命令来执行热迁移,迁移的时候会将存储也一并迁移到目的端。 +2. 在源端使用virsh migrate命令来执行热迁移,迁移的时候会将存储也一并迁移到目的端。 - ``` + ```sh # virsh migrate --live --unsafe --copy-storage-all --migrate-disks sda \ openEulerVM qemu+ssh:///system ``` -3. 热迁移完成后命令返回,虚拟机在目的端主机行正常运行,存储设备也被迁移到目的主机上。 +3. 热迁移完成后命令返回,虚拟机在目的端主机行正常运行,存储设备也被迁移到目的主机上。 ### 热迁移操作(加密传输) -1. 简介 +#### 简介 -​ 为了能够更好的对虚拟机热迁移过程中数据的加密,openEuler提供了使用TLS对迁移数据进行加密的特性。几乎QEMU中所有的网络服务都能够使用TLS对会话数据进行加密操作,同时也可以使用X509证书对客户端进行简单的身份认证。 +​为了能够更好的对虚拟机热迁移过程中数据的加密,openEuler提供了使用TLS对迁移数据进行加密的特性。几乎QEMU中所有的网络服务都能够使用TLS对会话数据进行加密操作,同时也可以使用X509证书对客户端进行简单的身份认证。 -2. 应用场景 +#### 应用场景 ​ 典型应用场景为要求热迁移过程中虚拟机数据在源端和目的端进行传输时保证数据的安全性。 -3. 注意事项 +#### 注意事项 ​ 在使用TLS对虚拟机进行热迁移前,需要申请证书,然后在源端和目的端分别设置证书。使用TLS功能前需要打开对端认证配置项,需在/etc/libvirt/qemu.conf文件中设置migrate_tls_x509_verify = 1。 @@ -227,31 +221,31 @@ virsh qemu-monitor-command openEulerVM '{"execute":"query-dirty-rate"}' ​ 支持使用multiFd进行多通道TLS迁移,但会增加CPU开销(多开2个迁移线程),可能影响虚拟机运行;建议通过设置热迁移线程CPU亲和性将热迁移线程享受的CPU资源与虚拟机进程绑定的CPU资源隔离,迁移每台虚拟机建议绑定2个CPU。 -4. 使用方法 +#### 使用方法 单通道热迁移加密传输命令 -``` +```sh virsh migrate --live --unsafe --tls --domain openEulerVM --desturi qemu+tcp:///system --migrateuri tcp:// ``` 多通道热迁移加密传输命令 -``` +```sh virsh migrate --live --unsafe --parallel --tls --domain openEulerVM --desturi qemu+tcp:///system --migrateuri tcp:// ``` ### 热迁移操作(迁移绑核) -1. 简介 +#### 简介 ​ 为了在特定情况下提升迁移性能,需要提供设置热迁移线程CPU亲和性的功能。在默认情况下,热迁移线程与虚拟机进程共享CPU资源,通过该功能,用户可以将热迁移线程运行的CPU资源设置到虚拟机进程绑定的CPU范围之外。 -2. 应用场景 +#### 应用场景 ​ 典型应用场景为要求热迁移过程中可以控制迁移线程绑定的CPU,防止热迁移过程中因竞争CPU资源而对其他业务造成影响。 -3. 注意事项 +#### 注意事项 ​ 当前迁移绑核需要运行对应的脚本来设置迁移绑核的参数,脚本内容如下: @@ -324,11 +318,10 @@ if conn is not None: conn.close() ``` -4. 使用方法 +#### 使用方法 执行迁移绑核脚本 ```shell python migrateToURI3.py domain_name dst_ip xml ``` - diff --git "a/docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272\345\217\257\347\273\264\346\212\244\346\200\247.md" b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_maintainability_management.md similarity index 100% rename from "docs/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272\345\217\257\347\273\264\346\212\244\346\200\247.md" rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/vm_maintainability_management.md diff --git a/docs/zh/docs/Virtualization/vmtop.md b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vmtop.md similarity index 97% rename from docs/zh/docs/Virtualization/vmtop.md rename to docs/zh/docs/virtulization/virtulization_platform/virtulization/vmtop.md index d6b85635b5c831d166ff36e2b26ce475e1b5532a..7321de221b7299ff910d4e68c434c9655aaac589 100644 --- a/docs/zh/docs/Virtualization/vmtop.md +++ b/docs/zh/docs/virtulization/virtulization_platform/virtulization/vmtop.md @@ -5,16 +5,20 @@ ## vmtop使用指南 ### 概述 + vmtop 是运行在宿主机host上的用户态工具。使用vmtop可以实时动态地查看虚拟机资源的使用情况,例如CPU占用率、内存占用率、vCPU陷入陷出次数等。因此,可以使用vmtop作为虚拟化问题定位和性能调优的工具。 #### 多架构支持 + 当前vmtop支持AArch64和x86_64处理器架构。 #### 显示项说明 + 不同处理器架构的操作系统,vmtop的显示项存在差异,这里给出各个显示项的含义及其是否在对应架构呈现。 说明:以下采样差是指指定时间间隔内获取的两次数据的差值。 ##### **AArch64和x86_64架构公共显示项** + - VM/task-name: 虚拟机/进程名称 - DID: 虚拟机id - PID: 虚拟机qemu进程的pid @@ -27,6 +31,7 @@ vmtop 是运行在宿主机host上的用户态工具。使用vmtop可以实时 - %HYP: 虚拟化开销占比 ##### 仅AArch64架构的显示项 + - EXThvc: hvc-exit次数(采样差) - EXTwfe: wfe-exit次数(采样差) - EXTwfi: wfi-exit次数(采样差) @@ -37,8 +42,8 @@ vmtop 是运行在宿主机host上的用户态工具。使用vmtop可以实时 - EXTsys64: sys64 exit次数(采样差) - EXTmabt: mem abort exit次数(采样差) - ##### 仅x86_64架构的显示项 + - PFfix: 缺页次数(采样差) - PFgu: 向guest OS注入缺页次数(采样差) - INvlpg: 冲刷tlb某项次数(tlb其中一项,并不固定) @@ -63,15 +68,18 @@ vmtop 是运行在宿主机host上的用户态工具。使用vmtop可以实时 - EXTpau: Vcpu暂停退出次数(采样差) ### 使用方法 + vmtop是一款命令行工具,直接以命令行的方式运行 vmtop 即可。 另外,vmtop还提供了不同可选选项,用于查询不同信息。 #### 语法格式 + ```sh vmtop [选项] ``` #### 选项说明 + - -d: 设置显示刷新的时间间隔,单位:秒 - -H: 显示虚拟机的线程信息 - -n: 设置显示刷新的次数,刷新完成后退出 @@ -81,7 +89,9 @@ vmtop [选项] - -p: 监控指定id的虚拟机 #### 快捷键 + 在vmtop运行状态下使用的快捷键 + - H: 显示或关闭虚拟机线程信息,默认显示该信息 - up/down: 向上/向下移动显示的虚拟机列表 - left/right: 向左/向右移动显示的信息,从而显示因屏幕宽度被隐藏的列 @@ -89,11 +99,15 @@ vmtop [选项] - q: 退出vmtop进程 ### 示例 + 在host上直接以命令行的方式运行vmtop + ```sh vmtop ``` + 输出如下: + ```sh vmtop - 2020-09-14 09:54:48 - 1.0 Domains: 1 running @@ -101,16 +115,18 @@ Domains: 1 running DID VM/task-name PID %CPU EXThvc EXTwfe EXTwfi EXTmmioU EXTmmioK EXTfp EXTirq EXTsys64 EXTmabt EXTsum S P %ST %GUE %HYP 2 example 4054916 13.0 0 0 1206 10 0 144 62 174 0 1452 S 106 0.0 99.7 16.0 ``` + 可以看到,host上只有一台名称为“example”的虚拟机,ID为2,CPU占用率是13.0%,在1秒内的陷入陷出总次数是1452,虚拟机进程占用的物理CPU为106号CPU,虚拟机内部占用时间与CPU运行时间的比是99.7%。 1.显示虚拟机线程信息 按下‘H’后可以显示线程信息: + ```sh vmtop - 2020-09-14 10:11:27 - 1.0 Domains: 1 running DID VM/task-name PID %CPU EXThvc EXTwfe EXTwfi EXTmmioU EXTmmioK EXTfp EXTirq EXTsys64 EXTmabt EXTsum S P %ST %GUE %HYP - 2 example 4054916 13.0 0 0 1191 17 4 120 76 147 0 1435 S 119 0.0 123.7 4.0 + 2 example 4054916 13.0 0 0 1191 17 4 120 76 147 0 1435 S 119 0.0 123.7 4.0 |_ qemu-kvm 4054916 0.0 0 0 0 0 0 0 0 0 0 0 S 119 0.0 0.0 0.0 |_ qemu-kvm 4054928 0.0 0 0 0 0 0 0 0 0 0 0 S 119 0.0 0.0 0.0 |_ signalfd_com 4054929 0.0 0 0 0 0 0 0 0 0 0 0 S 120 0.0 0.0 0.0 @@ -123,10 +139,12 @@ Domains: 1 running |_ vnc_worker 4054944 0.0 0 0 0 0 0 0 0 0 0 0 S 118 0.0 0.0 0.0 |_ worker 4143738 0.0 0 0 0 0 0 0 0 0 0 0 S 120 0.0 0.0 0.0 ``` + example虚拟机有11个线程,其中包括vCPU线程、vnc_worker、IO mon_iotreads等等,每个线程同样会显示详细CPU占用、陷入陷出等信息。 2.选择监控项 按下‘f’进入监控项编辑模式: + ```sh field filter - select which field to be showed Use up/down to navigate, use space to set whether chosen filed to be showed @@ -152,16 +170,18 @@ Use up/down to navigate, use space to set whether chosen filed to be showed * %GUE * %HYP ``` + 当前所有监控项都默认显示,通过up/down键选择,用space键来设置对应显示项是否显示/隐藏,按‘q’键退出。 将%ST、%GUE、%HYP设置为隐藏后,输出如下: + ```sh vmtop - 2020-09-14 10:23:25 - 1.0 Domains: 1 running DID VM/task-name PID %CPU EXThvc EXTwfe EXTwfi EXTmmioU EXTmmioK EXTfp EXTirq EXTsys64 EXTmabt EXTsum S P - 2 example 4054916 12.0 0 0 1213 14 1 144 68 168 0 1464 S 125 - |_ qemu-kvm 4054916 0.0 0 0 0 0 0 0 0 0 0 0 S 125 - |_ qemu-kvm 4054928 0.0 0 0 0 0 0 0 0 0 0 0 S 119 + 2 example 4054916 12.0 0 0 1213 14 1 144 68 168 0 1464 S 125 + |_ qemu-kvm 4054916 0.0 0 0 0 0 0 0 0 0 0 0 S 125 + |_ qemu-kvm 4054928 0.0 0 0 0 0 0 0 0 0 0 0 S 119 |_ signalfd_com 4054929 0.0 0 0 0 0 0 0 0 0 0 0 S 120 |_ IO mon_iothr 4054932 0.0 0 0 0 0 0 0 0 0 0 0 S 117 |_ CPU 0/KVM 4054933 2.0 0 0 303 6 0 29 10 35 0 354 S 98 @@ -172,4 +192,5 @@ Domains: 1 running |_ vnc_worker 4054944 0.0 0 0 0 0 0 0 0 0 0 0 S 118 |_ worker 1794 0.0 0 0 0 0 0 0 0 0 0 0 S 126 ``` + %ST、%GUE、%HYP将不会出现在显示界面上。