Shutting down guests

Posted by Underdog Linux on November 27, 2023

有多种方法可以关闭 QNX hypervisor 虚拟机中的Guest。

为了避免在 I/O 操作期间终止驱动程序,并可能使硬件处于不可恢复的状态,请使用 SIGTERMSIGINT 信号来终止 qvm 进程。

关于如何关闭hypervisor,参考Shutting down the QNX hypervisor。 有关如何处理 VM 终止的信息,参考QNX Hypervisor: Protection Features章节的Handling a qvm termination

内部(受控)guest shutdown

guest (更具体地说,在guest操作系统上运行的应用程序)可以启动自己的关闭。 例如,QNX guest中的应用程序可以使用 shutdown_system() 函数自行关闭或重新启动。 简而言之,任何最终调用重新启动内核标注的操作都将起作用。

命令行,在 QNX guest中使用 shutdown,或在 Linux 或 Android guest中reboot 。

如果guest 自行关闭或尝试重新启动,hypervisor 将结束托管guest 的 VM 的 qvm 进程,并释放该进程使用的所有资源,其中包括guest 使用的资源(参阅Handling a qvm termination)。

主机无法查看guest,因此如果主机需要在guest关闭之前执行操作,则guest必须明确通知主机它正在关闭。 执行此操作的一个简单方法是:

  1. 使用shared memory vdev (vdev shmem) 设置在 guest 和 host 之间共享的一小块内存区域(参阅Memory sharing)
  2. 当它关闭时,guest会将pre-defined 值写入该共享内存中的某个位置。
  3. 当它在shared memory中读取该值时,hypervisor主机开始执行它需要完成的任何任务(例如,屏蔽对guest的中断,静默任何物理设备)以响应guest的关闭。 Quiescing devices during guest shutdown中给出了静默物理设备的说明。

如果guest 分配有物理设备,则guest 应通知可能与之共享这些设备的任何其他guest ,它正在关闭,因此设备将不再可用。

外部(不可控)guest shutdown

只要有可能,请在guest 中使用受控关闭(在 QNX 客户机中shutdown,或在 Linux 或 Android 客户机中reboot)。 如果您不能这样做,则可能会出现不受控制的guest 关闭,如此处所述。

从host 系统终端,您可以使用 slay 等实用程序向托管guest的 VM 的 qvm 进程传递信号(参阅slay):

  • SIGTERMSIGINT

向 qvm 实例发送 SIGTERM 或 SIGINT 信号以模拟按下电源按钮。 例如:slay -s SIGTERM qvm。 这使得 qvm 友好地要求 guest 程序终止。

在 x86 上,这会触发 ACPI power button notification mechanism,这将允许guest在注意到它时干净地关闭。 Linux 和 Android guest(后者如果设置正确)具有适当的 ACPI 处理并且会注意到,但 QNX guest不会。 如果您发送 SIGTERMSIGINT 但 guest 虚拟机没有关闭,qvm 会假定其中没有安装任何处理。 发送第二个信号将无条件终止访客。

在 ARM 上,没有电源按钮通知的标准,因此除非编写了特定于guest的 vdev,否则不会执行任何处理。 因此,发送 SIGTERMSIGINT 会立即终止guest系统,而不会发出任何通知。

  • SIGQUIT:

向托管 qvm 实例发送 SIGQUIT 信号以终止它,而无需通知guest,无论其中是否进行任何断电处理。 这模拟立即切断电源。 例如:slay -s SIGQUIT qvm

如果终止 VM(qvm 进程实例),则必须注意将passed through给 VM 中guest的所有硬件设备置于静止状态。 您可以使用 vdev 来完成此操作(参阅Virtual Device Developer’s Guide)。

如果您的guest以不受控制的方式终止,则该guest在后续启动时可能会以未定义的方式运行(例如,它可能具有损坏的文件系统(corrupt filesystem))。

Watchdogs

Guests 可以配置为在其托管 VM(qvm 实例)中使用watchdog vdev。 如果Guest未能及时kick 其看门狗,看门狗可能会触发 SIGQUIT 立即终止托管 qvm 实例。 这是使用看门狗的常见方法,但这不是唯一可能的操作(参阅Watchdogs)