Я сделал это, используя qemu, работающий на Debian с виртуальной машиной Windows Server 2003. Я включил "Службы аварийного управления" на виртуальной машине Win2k3. Это дает вам "Специальную консоль администрирования" на последовательном порту. qemu позволяет вам подключить виртуальный последовательный порт к порту "telnet", поэтому я дал ему адрес localhost. SAC позволяет вам аккуратно завершить работу системы, выполнив команду через последовательный порт, и, поскольку это что-то вроде "аварийной задней двери", это имеет тенденцию быть очень надежным независимо от того, что еще может происходить в ВМ.
Затем я создал короткий expect
сценарий для "входа" в последовательный SAC и выдачи команды выключения. Это было включено в другой скрипт, который будет вызывать этот expect
скрипт и ждать 2 минуты, пока процесс qemu не прекратит работу. Если бы процесс не умер, он бы насильно его убил. Настройка Linux для вызова этого сценария при завершении работы гарантировала, что виртуальная машина всегда отключается чисто, если это возможно.
Таким образом, вы можете адаптировать этот метод к вашей ситуации.
Если у вас виртуальная машина Linux, вы действительно можете просто создать небольшой скрипт в вашей системе Ubuntu, который будет входить в виртуальную машину через ssh и вызывать скрипт, который корректно завершит работу системы.