Tôi đã tạo một tập lệnh python có thể tạm dừng tất cả các máy ảo VirtualBox đang chạy và sau đó thiết lập hệ thống để chạy tập lệnh khi đăng xuất như một tác vụ theo lịch trình.
Tôi không biết chính xác độ tin cậy của phương pháp này. Như những người khác đã lưu ý, có những giới hạn về thời gian hệ thống sẽ chờ đợi một nhiệm vụ Winlogon 7002 hoàn thành. Nhưng cá nhân tôi không gặp vấn đề gì với việc cung cấp các trạng thái lưu có thể sử dụng được ngay cả với nhiều máy ảo đang chạy trên 4 GB RAM VM tổng thể.
Dưới đây là các bước để thiết lập nó:
- Tải xuống và cài đặt Python 2.7.x từ python.org
- Tạo tệp kịch bản python ở đâu đó trên hệ thống của bạn bằng Notepad hoặc bất kỳ trình soạn thảo văn bản đơn giản nào khác (xem bên dưới)
- Mở lịch trình tác vụ
- Chọn hành động -> Tạo tác vụ cơ bản ... và sử dụng trình hướng dẫn để tạo tác vụ với các cài đặt sau
- Tên bạn chọn
- Bắt đầu tác vụ khi một sự kiện cụ thể được ghi lại
- Nhật ký: Hệ thống
- Nguồn: Winlogon
- ID sự kiện: 7002
- Bắt đầu một chương trình
- Bên cạnh Chương trình / Tập lệnh ,
python.exe
ví dụ , nhập đường dẫn đầy đủ đếnc:\Python27\python.exe
- Bên cạnh Thêm đối số , hãy nhập đường dẫn đầy đủ nơi bạn đặt tệp tập lệnh python, ví dụ tôi đặt tệp của tôi vào thư mục con của thư mục tài liệu của mình, vì vậy đây là
C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
- Chọn kết thúc.
Bây giờ máy ảo VirtualBox sẽ bị treo khi đăng xuất / khởi động lại / tắt máy.
Kịch bản python để thực hiện tắt máy dưới đây:
# A script to suspend all running VirtualBox VMs
import os
import subprocess
import sys
class VM(object):
def __init__(self, name, uuid):
self.name = name
self.uuid = uuid
def __repr__(self):
return "VM(%r,%r)" % (self.name, self.uuid)
class VBoxRunner(object):
def __init__(self):
program_files = os.environ["ProgramW6432"]
vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")
def vbox_run(self, *args):
subprocess.check_call([self.vboxmanage_filename] + list(args))
def vbox_run_output(self, *args):
return subprocess.check_output([self.vboxmanage_filename] + list(args))
def list(self, running=True):
if running:
list_cmd = "runningvms"
else:
list_cmd = "vms"
return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]
def suspend_all(self):
success = True
stopped_some_vms = False
vms = self.list(running=True)
for vm in vms:
if vm is None:
continue
# noinspection PyBroadException
try:
self.suspend_vm(vm)
except:
success = False
else:
stopped_some_vms = True
if not stopped_some_vms:
self.message("No running vms")
return success
@staticmethod
def parse_vm_list_entry(x):
""":type x: str"""
if not x.startswith('"'):
return None
end_pos = x.find('"', 1)
if end_pos == -1:
return None
name = x[1:end_pos]
assert x[end_pos + 1: end_pos + 3] == " {"
assert x.endswith("}")
uuid = x[end_pos + 2:]
return VM(name, uuid)
@staticmethod
def message(msg):
print >>sys.stderr, msg
def suspend_vm(self, vm):
assert isinstance(vm, VM)
self.vbox_run("controlvm", vm.uuid, "savestate")
def main():
vr = VBoxRunner()
success = vr.suspend_all()
if not success:
sys.exit(1)
if __name__ == "__main__":
main()