Qemu虚拟机管理工具
项目描述
此软件包提供了一种管理在Flying Circus中虚拟机及其生命周期的工具。我们尽量不在此包含我们环境的特定细节,但我们做出了一些假设
虚拟机磁盘(root、swap、tmp)存储在Ceph中
有一个名为 create-vm 的脚本,它将准备一个新的根磁盘镜像。
此工具允许您
启动、停止和在不同主机之间迁移VM
运行一个守护程序,强制执行由一组配置文件提供的关于运行VM的策略
调整磁盘大小。
配置格式
通用模板
Qemu配置文件将从一个模板生成。如果在 /etc/qemu/qemu.vm.cfg.in 中找不到模板,将使用内置的默认模板。请参阅源分布中的qemu.vm.cfg.in。
每个VM的配置
期望在 /etc/qemu/vm/*.cfg 中为每个VM有一个配置文件。
配置文件格式是YAML。
格式
name: test00 parameters: id: 12345 resource_group: test online: true kvm_host: bob disk: 5 memory: 512 cores: 1 nics: - srv: 00-01-02-03-05-06 - fe: 00-01-02-03-05-06
发布说明
1.4.0 (2023-10-12)
引入基于RBD的锁定机制,以确保一次只有一个KVM主机可以执行维护操作。(PL-131618)
稳定了依赖于主机性能的故障迁移测试。(PL-131812)
1.3.1 (2023-02-03)
修复了guestagent Qemu.write_file中的回归,导致mark-qemu-binary-generation调用失败
提升guestagent测试覆盖率和模拟功能
1.3.0 (2023-01-17)
移植到Python 3
Ceph Nautilus兼容性
1.2.0 (2022-12-02)
适应Ceph Luminous的测试
1.1.5 (2021-04-09)
修复AMD/Intel兼容性矩阵中的CPU错误标志(ssbd与amd-ssbd等),以避免由于兼容性问题在启动和在线迁移时崩溃。
添加新的AMD Epyc型号。
为Python 2/3和Gentoo/NixOS兼容性准备目录集成。
1.1.4 (2020-11-06)
保留一些解冻改进(定时、重构等),但不要使用alt-sysrq-j组合,因为太多guest内核对它过敏,使用后需要重启。
添加对AMD CPU型号的支持,并简化(并加快)型号检测。 #3-126540
1.1.3 (2020-04-30)
提高解冻的可靠性。使用监控器发送alt-sysrq-j(全局解冻)并尝试代理最多3次。使用更好的锤子比反复使用同一锤子更有可能成功……有助于解决#124656。
1.1.2 (2020-04-10)
通过显式停止测试虚拟机并避免2秒的超时来检测其运行情况,提高
report-supported-cpu-models
的性能。
1.1.1 (2019-09-02)
report-supported-cpu-models
如果在主机支持该型号的情况下泄漏虚拟机。
1.1 (2019-08-30)
添加发现、报告和选择主机支持的并由客人请求的CPU型号的功能。 #114627
将基本支持从Qemu 2.7移至Qemu 4.1
各种测试固定装置改进以提高测试性能和稳定性。
添加全局“关闭所有”命令以改善KVM主机关闭时间。
1.0.8 (2019-08-30)
Brownbag发布原本打算为1.1。
1.0.7 (2019-03-27)
在处理来自外部虚拟机的consul快照请求时,抑制错误警告。
1.0.6 (2019-03-26)
显式失败,当尝试对未在本地运行的虚拟机进行快照时。同时改进快照输出。(#108360)
1.0.5 (2019-02-14)
修复1.0.4中引入的进程匹配问题,使其也能覆盖长虚拟机名称。Linux中的proc.name()字段只保留16个字节,我们确实有很长的虚拟机名称……
1.0.4 (2019-02-05)
不要——我再重复一次——基于PID文件杀死进程,如果进程名称与预期的虚拟机进程命名模式不匹配。
这种情况仅在多种情况下才会出现
Ceph的一个错误导致已删除的虚拟机无法删除它们的锁
有时删除的虚拟机被认为是过时的
目标PID突然变成了不同的虚拟机,因为我们回收PID的速度比预期快得多(大约每小时一次)
1.0.3 (2019-01-30)
为Qemu添加自定义的守护进程包装器,以捕获stdout、stdin和退出代码(可靠地)。
添加支持Ceph Hammer上具有损坏锁ID的迁移的辅助工具。
修复在显示状态时Consul不一致时的一个小错误。
1.0.2 (2019-01-08)
修复一个边缘情况:正在关闭的虚拟机在请求迁移后可能使inmigrate作业挂起,直到超时。我们已经有机会处理配置更改,现在这也是其中之一,因此可以更快地触发受影响虚拟机的常规启动。
机会性地尝试重新获取丢失的锁。这是为了避免无效的“不一致”决策,并允许我们修复由于Ceph错误而损坏的锁。如果无法正确重新获取锁,这仍然会导致可见的失败。
清理关于in-migrations和如何发现是否值得等待传入迁移的预期。使用consul和Ceph锁信息,并将该决策集中在一个地方。
1.0.1 (2018-06-04)
错误修复:有一个暂存配置但没有活动配置导致代理全局记录,从而阻止创建新的虚拟机。
1.0 (2018-05-23)
删除过时的配置文件锁定机制。
在虚拟机启动期间删除(同步和多余的)内存压缩,以避免意外延迟,这些延迟会导致超时并无必要地延迟虚拟机启动。
改进配置文件更新过程。
这增加了预演区域,以便 consul 更新更快,并且处理更改事件现在已变为异步。注意这里 consul 的 ModifyIndex,以避免更新丢失,并使用它作为实际触发器。包括一个“稳定”机制,以便运行 确保 看到更改的实例将在保持锁的同时寻找更多更改。这意味着对于 KVM 主机上的每个虚拟机,即使有大量的更新,也只有一个代理进程在运行。
引入主机特定的迁移锁:我们希望虚拟机尽可能快地运行,不要过载主机。一次只有一个迁移运行意味着有一个 TCP 流将与其他在同一网络上运行的流(在我们的情况下是 Ceph 客户端)竞争。此外,竞争流导致某些流建立缓慢的速度,即使成为唯一剩余的流后也不会提高。
进一步的优化包括主机将快速重试以获取这些锁,并继续推动迁移。
改进迁移的超时处理。
使用新的异步代理,我们现在等待很长时间来发现我们的对等方,并在我们的对等方联系我们时固定缺失的超时重置。(这是现在已移除的内存压缩问题,它比超时时间长,会导致迁移中的‘突然死亡’。)
使客户代理部分的“确保”方法对缺失的客户代理更加健壮。
改善 consul 中传入迁移服务的清理。我们倾向于留下旧的实例。现在我们将首先尝试连接到最新的服务,然后尝试连接到旧的服务,并在此过程中消除我们无法与之通信的服务。这可能会留下一些,但趋势应该是在某个时候它们将被清理。
0.9.8 (2018-01-30)
恢复裸除。
0.9.7 (2018-01-30)
当发现多个 vm-inmigrate 服务时,选择具有最高‘ModifyIndex’值的那个。
0.9.6 (2018-01-30)
修复使用 ls 和 check 命令的问题。它们不执行常规锁定,因为它们不使用任何关键资源,不应被阻塞或被现有操作阻塞。
尽管如此,管理 Qemu QMP 监视器连接的清理代码意外触发了清理时创建一个多余会话,这导致了不必要的阻塞。
0.9.5 (2018-01-25)
放宽对 consulate 版本的依赖要求(#27695)。
0.9.4 (2017-12-19)
引入一个与 Nagios/Sensu 兼容的“检查”命令,执行几个检查。目前,此命令验证 RAM 分配是否满足要求,包括虚拟机级别(不超过客户机内存+2倍预期开销)和主机级别(不超过客户机内存+总开销+10%)。此命令将来可以扩展以引入更多检查。
允许选择 Qemu 的“磁盘缓存模式”,这样我们就可以开始禁用持续使用过多内存的写回缓存。(#28840)
将内存限制功能扩展到也验证主机是否实际上有足够的内存(除了足够的可预订内存外),还包括预期开销以及客户机内存。
修复 fc-qemu 全局锁,使用专用锁文件而不是(再次)使用可能会意外移动的文件。
0.9.3 (2017-12-11)
禁用看门狗:对于新启动的虚拟机,完全删除设备。对于现有虚拟机(以及未来的虚拟机),禁用重启操作。这解决了虚拟机在内存和 I/O 压力下自动重启的问题,并无法适当通知看门狗。总的来说,看门狗可能有助于的情况非常有限,而恶意行为已经成为一个沉重的负担。
0.9.2 (2017-09-18)
修复客户代理超时处理,以便快照获得实际的 120s 超时,以便虚拟机能够正确刷新它们的 I/O。
0.9.1 (2017-09-01)
解决 brownbag 发布问题:默认配置选项没有正确包含在发布中。
0.9 (2017-09-01)
(功能)允许通过在虚拟机上配置可配置的“最大总内存”来管理主机内存(-m 开关)。这不是基于实际 RAM 使用或可用性,而是基于当前运行虚拟机的计划和配置值!
如果虚拟机需要迁移或启动,且宿主机使用该虚拟机的内存超过“vm-max-total-memory”设置,则该操作将失败。
[锁定] 通过移动到单独的锁文件并确保正确处理可重入锁的使用来修复锁定问题。另外,通过使用现有的锁文件提供升级场景。
[锁定] 确保只有在锁定时才重写配置文件,以减少在升级过程中旧机制的可攻击面。
[日志] 通过更具体的调试输出改进日志记录。
[日志] 记录每个Qemu进程启动时的特定命令行,以帮助调试。
[日志] 将日志记录从UTC转换为本地服务器时间。这证明比其他磁盘日志更令人困惑,因为我们的其他磁盘日志都在服务器时间。
[日志] 不要在日志损坏(例如磁盘满或STDIO丢失)时崩溃,以避免因为控制脚本遇到问题而意外崩溃虚拟机。
[日志] 对于堆栈转储和跟踪回溯,也添加虚拟机名称前缀。
[consul] 确保在线程失败时,consul事件处理不会使进程失败。(可能有点像snake oil,但不会造成伤害。)
[consul] 将consul事件处理池从10减少到3,以减少多个并行迁移的负担。
[ceph] 正确关闭RBD卷引用,以避免librbd崩溃。
[ceph] 确保我们不打开不必要的重复RBD映像句柄。
[qemu] 将Qemu QMP超时时间增加到5分钟,以容忍在迁移清理期间的延迟,因为QMP处理器在主线程中运行,可能被阻塞很长时间。
[迁移] 改进出站迁移连接到入站服务器:简化代码并减少不必要的等待时间。更好的错误输出。
[迁移] 改进实时迁移:跳过压缩,启用无限带宽,并使用临时端口以避免在快速重试实时迁移时遇到TCP定时问题。
[配置] 清理某些配置选项的默认选项处理:我们使用了两种不同的默认样式。它们已被统一到一个单独的“default.conf”中,首先加载。
0.8.11 (2017-05-29)
在实时迁移日志中添加千位分隔符,以便更容易进行视觉检查。
改进fsfreeze超时处理:这可能需要一段时间,如果我们太急躁,最终会快速进入不稳定的状态。
改进错误和调试日志。
提高在迁移失败后继续本地操作的能力。
0.8.10 (2017-04-12)
改进日志记录:包括运行进程的PID,以帮助检测和理解并行运行中的潜在冲突。
更努力地捕获错误,并在与代理重置通信时正确重试。
通过获取代理套接字文件的独占锁来为代理添加另一层保护。
在常规的ensure调用中继续尝试确保虚拟机未冻结。
0.8.9 (2017-04-07)
改进代理通信。代理可能处于不一致状态,导致其挂起。我们已经看到在冻结机器后,代理处于不一致状态的情况。
现在通过发送推荐的正确UTF-8字节来正确重置代理连接,该字节保证会中断代理的JSON解析器。
在由于不一致状态而销毁虚拟机时改进日志输出。(#25158)
0.8.8 (2016-11-18)
错误修复:由于远程端没有响应而导致超时的迁移意外解锁并清理,而没有正确关闭虚拟机。这导致了单个虚拟机的多个实例。
0.8.7 (2016-11-11)
如果虚拟机标记为在线但没有分配KVM宿主机,则不进行任何更改。(#23965)
重构Agent.ensure()以提高可靠性和可读性。
如果虚拟机离线,则拒绝创建一致的快照。
略微加快测试速度。
不要并行调用未经资格的partprobe调用。
使调试级别日志稍微不那么冗长。
0.8.6 (2016-11-04)
如果主机持有旧锁且确定虚拟机不再运行,则中断不一致的Ceph锁。(#23695)
Qemu 2.5和2.7之间的迁移兼容性。(#23695)
始终清理未使用的资源,如Consul服务注册和运行文件。
改进错误报告和日志记录。
0.8.5 (2016-10-31)
修复了事件处理中的一个主要错误:consul事件处理器不正确地使用了multiprocessing.pool API。这没有被测试捕获,导致所有事件处理机制无声地“无操作”。
0.8.4 (2016-10-31)
等待Qemu优雅地关闭时,没有预料到socket错误,这导致重启失败(干净)。#24434
限制并行处理的Consul事件数量,以避免过载主机。可以通过fc-qemu配置文件进行配置:
[consul] event-threads = <INT>
默认为10个线程。
降低处理Consul配置更改事件的开销:如果配置没有更改,则不激活Ceph和Qemu连接,也不执行擦除(确保)。在这种情况下,不需要Ceph和Qemu连接,预期擦除将由调度器从单独的任务中执行,而不是从仅应响应更改的事件处理器中执行。
为二进制生成计数器提供一个默认值,以允许从先前版本平稳升级。
0.8.3 (2016-10-23)
降低虚拟机代理的超时时间,以帮助测试更快地完成,并且如果虚拟机尚未或当前没有代理可用,也能保持响应。
提供一个Qemu配置模板变量,根据提供的筛选前缀来确定最当前的Qemu机器类型。
提供一个“二进制生成计数器”,它是a)注入启动(到/tmp/fc-data/qemu-binary-generation-booted)和b)在每次“确保”命令期间更新(到/run/qemu-binary-generation-current)。虚拟机应使用这些文件的差异来安排冷重启(即关闭)以使用新的Qemu二进制文件重启。
0.8.2 (2016-09-20)
将使用multiprocessing切换到使用线程管理多个consul VM事件处理器以减少处理单个位置中多个虚拟机时的Python启动开销。同时移除睡眠时间。
修复consul快照事件处理中的日志错误。提高consul事件处理的测试覆盖率。
删除多余的虚拟机名称处理,在这种情况下可以指定虚拟机配置文件而不是虚拟机名称。这导致代码模糊,并且很少使用。
即使fc.qemu认为虚拟机没有运行,也允许使用telnet命令。这个命令对于调试很有帮助,阻止它是无用的安全带。
不要记录QMP连接错误,因为它们非常常见且预期。
0.8.1 (2016-09-11)
显式地将日志添加到/var/log/fc-qemu.log。不要过滤日志输出:我们总是希望得到尽可能多的信息。
0.8 (2016-09-08)
引入fc-qemu telnet命令:一个连接到人类监控端口而不必手动查找端口的快捷方式。
将监控自动化从使用telnet端口切换到使用QMP套接字。这应该要可靠得多。这也解决了之前的一个竞争条件,即迁移状态检查可能会间歇性地失败,然后不必要地中断迁移。
更新vagrant环境以检查Qemu 2.6。
改进输出格式,以使用Hynek的出色的structlog库。
限制一些命令到特定的虚拟机状态:仅在运行时停止。
实现IOPS限制,基于虚拟机特定的ENC数据、Ceph池默认值或全局默认值。这限制了虚拟机中所有磁盘(单独,尚未分组)的IOPS,并在此期间保持限制。
重新设计Ceph卷解锁:如果客户端拥有锁,则打破它将导致立即断开rbd/rados连接,以避免发送进一步的数据更新。这可能会发生在我们设置迁移上的锁时,然后在迁移失败时必须放弃它们。
0.7.22 (2016-07-21)
修复fc-qemu重启中的错误,导致tmp的mkfs.xfs失败。
0.7.21 (2016-06-20)
适度调整swap和tmp卷的大小,以便它们不会随着非常大的虚拟机线性扩展。#21961
0.7.20 (2016-05-03)
增加更多日志输出,以帮助诊断罕见的锁恢复失败(#21345)。
删除shrink-vm。安息吧。(#14222)。
0.7.19 (2016-04-08)
修复竞态条件:在连续轮询监控状态以确定虚拟机是否正在运行时,也考虑虚拟机即将关机且监控已消失的情况。
0.7.18 (2016-04-04)
另一个棕色纸袋发布:如果实际存在快照,则快照重构未经过适当测试。
0.7.17 (2016-04-04)
修复unicode/str问题:consul json解码为unicode,但librbd需要纯字符串。
0.7.16 (2016-03-31)
修复快照创建中的回归问题。
0.7.15 (2016-03-20)
考虑XFS和mkfs.ext4的不同mkfs选项 (#19079)。
改进Vagrant虚拟机引导。
重构hazmat目录下的类(ceph.py,volume.py)(#19079)。
使用“rbd_pool”ENC选项允许特定虚拟机选择RBD池,而不是从资源组名称派生。
提高从失败迁移中正确恢复的成功率:某些条件会导致目标仅部分释放锁,从而导致不一致的状态。
0.7.14 (2016-01-21)
使用XFS作为tmp分区 (#17873)。
删除super-floppy设置von vdc,并使用合适的分区表代替 (#17873)。
修复ENC种子JSON文件的文件权限。
0.7.13 (2015-12-10)
忽略对配置缺失的虚拟机的consul请求 (#18841)。
加快Vagrant中的初始NTP同步,以避免由于MON未同步而失败的Ceph测试。
精炼Ceph.unlock()以以最佳努力的方式移除自己的锁。这是从不完全迁移中恢复所需的 (#18771)。
改进失败监控连接的错误处理。
0.7.12 (2015-11-11)
改进迁移过程中的错误处理。
修复fsfreeze期间的超时,导致虚拟机锁定 (#18917)。
0.7.11 (2015-11-04)
将默认qemu.vm.cfg中的
设置切换为“threads”。这将保持fc-qemu与未来的Qemu版本兼容 (#18743)。 改进日志记录。
将ENC数据的初始副本放在/tmp/fc-data/enc.json。
0.7.10 (2015-08-12)
重构系统级配置代码。
使用适当的文件系统标签创建交换分区和tmp分区 (#16783)。
修复tmp卷创建期间罕见的竞态条件。
为交换分区和tmp卷设置文件系统标签 (#17078)。
0.7.9 (2015-08-03)
添加“snapshot”命令。可以从命令行和通过consul触发。
0.7.8 (2015-07-27)
改进运行实例的检测。
扩展监控连接检查以处理双栈环境。
0.7.7 (2015-07-14)
修复迁移问题:我们在错误的时间注销了。
0.7.6 (2015-07-01)
快速修复:较新的mkfs.ext4版本需要“-F”标志来覆盖文件系统 (#14920)。
0.7.5 (2015-07-01)
使用多进程生成单个虚拟机操作。等待所有迁移完成 (#14920)。
增加允许的迁移停机时间,以使忙碌虚拟机的迁移时间保持在合理范围内 (#14920)。
修复Consul事件处理期间的异常处理错误 (#14920)。
给udev映射留出一些时间以解决。
改进日志的可读性。
0.7.4 (2015-06-02)
纠正棕色纸袋发布。
修复一些未注意到的任意测试失败。
0.7.3 (2015-06-02)
为每个虚拟机从consul启动事件处理。尽早返回主进程以避免阻塞consul代理。
更多与迁移相关的日志。
0.7.2 (2015-05-26)
适应QEMU 2.2.1:现在默认使用stdvga (#15748)。
0.7.1 (2015-05-20)
修复迁移中Consul服务注册的bug (#15313)。
将节点KV命名空间从“vm/”更改为“node/” (#14920)。
0.7 (2015-05-18)
Consul服务注册 (#15313)。
通过Consul协调迁移 (#15313)。
0.6.4 (2015-02-27)
容忍“setup”作为中间迁移状态,这在野外遇到过。
0.6.3 (2015-02-19)
改进pid文件解析器以正确处理尾行和空pid文件。
确保如果发生(例如,在Agent.__init__()中直接发生),则正确记录异常 (#13867)。
0.6.2 (2015-01-22)
放宽PyYaml和psutil版本要求,以适应飞行的 Circus托管平台。
0.6.1 (2015-01-22)
改进日志记录和错误消息 (#13867)。
修复错误条件期间的不当行为 (#13867)。
0.6 (2015-01-15)
实现实时迁移。使用“inmigrate”和“outmigrate”命令来协调过程 (#13229)。
注意,qemu.cfg.in模板已更改!
提高测试覆盖率。
0.5.1 (2014-11-22)
错误修复:移除Ceph discard调用,因为它似乎不稳定(#13414)。
通过重构写入fc-qemu.log的内容来提高可操作性。
0.5 (2014-11-21)
VM启动期间根文件系统缩小(#13414)。
添加“force-unlock”动作以打破陈旧的锁(例如,在VM主机宕机后)。
0.4.3 (2014-11-13)
从/etc/qemu/qemu.vm.cfg.in读取Qemu配置文件模板。
修复测试和文档。
0.4.2 (2014-11-12)
限制从主机到虚拟机的熵传输速率(#13751)。
添加“restart”命令以简化虚拟机重启。
0.4.1 (2014-09-24)
不需要PID与机器名匹配以确定在线状态。这导致具有超过11个字符名称的虚拟机出现问题:http://status.flyingcircus.io/incidents/3j8wsrszlx2w
0.4 (2014-09-16)
允许使用配置文件和格式化语法选择特定的命令行来创建虚拟机。
添加测试覆盖率,以显示我们在后续的“确保”操作中优雅地恢复崩溃的虚拟机。
0.3 (2014-09-13)
重构并重命名为“fc.qemu”。集成之前放置在初始化脚本和localconfig (fc.agent) 工具中的大多数功能。
添加大量测试覆盖率。
0.2.6 (2014-08-21)
修复了对已锁定且已启动的虚拟机的传入虚拟机检测。
0.2.5 (2014-08-20)
实现安全带,禁止迁移尚未使用支持的 /run/kvm.*.cfg.in 格式启动的虚拟机。
fc.qemu 开发
我们假设您在计算机上有一个本地签出用于编辑,并且您将该代码(例如,在保存时使用rsync)同步到远程计算机,通常是我们的hydra服务器。要运行开发版本的测试,您还需要具有平台代码的(当前或“合适”)签出
local$ ssh hydra01.fcio.net hydra01 ~ $ cd fc-nixos
hydra01 ~/fc-nixos $ nix-shell hydra01 ~/fc-nixos $ nix-build –arg useCheckout true tests/kvm_host_ceph-nautilus.nix
要仅运行某些测试,您可以向pytest传递参数
hydra01 ~/fc-nixos $ nix-build –arg useCheckout true –argstr testOpts “-k test_agent_check” tests/kvm_host_ceph-nautilus.nix
在FCIO DEV网络上进行实际测试
在fc-nixos上创建分支
提交您的fc.qemu更改
更新qemu包引用到您的提交
在您想要测试的主机上使用fc-nixos dev-checkout
项目详情
fc.qemu-1.4.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 085d6c101b87d3cfb445422b65e9d7f4d1bfa7bc94ce5fd7006eb4da5a15e5f5 |
|
MD5 | f6ee0a8726a5746c79b34d845f732f6e |
|
BLAKE2b-256 | e9fb2fa16c6de08cb487a54dbd2e8318aaf6e05c870da20975d33385f2b36619 |