Index: lib/cros_vm_lib.sh |
diff --git a/lib/cros_vm_lib.sh b/lib/cros_vm_lib.sh |
index 7a99cbebe25774791d68a0892780977a8a402f22..0ed87891bb10395d4bbdbd83e998f3f510baccfd 100644 |
--- a/lib/cros_vm_lib.sh |
+++ b/lib/cros_vm_lib.sh |
@@ -14,6 +14,7 @@ DEFINE_string vnc "" "VNC Server to display to instead of SDL." |
KVM_PID_FILE=/tmp/kvm.$$.pid |
LIVE_VM_IMAGE= |
+KVM_MONITOR_SOCKET= |
function get_pid() { |
sudo cat "${KVM_PID_FILE}" |
@@ -40,6 +41,7 @@ function start_kvm() { |
echo "Starting a KVM instance" >&2 |
local nographics="" |
local usesnapshot="" |
+ local save_vm_state="" |
if [ ${FLAGS_no_graphics} -eq ${FLAGS_TRUE} ]; then |
nographics="-nographic -serial none" |
fi |
@@ -51,6 +53,14 @@ function start_kvm() { |
snapshot="-snapshot" |
fi |
+ if [ ${FLAGS_save_vm_state} -eq ${FLAGS_TRUE} ]; then |
+ # Redirect the QEMU monitor to the guest usb serial port so tests |
+ # can trigger a "savevm" command from inside the guest. |
+ KVM_MONITOR_SOCKET=/tmp/kvm.mon.socket.$$ |
+ save_vm_state="-monitor unix:${KVM_MONITOR_SOCKET},server,nowait |
+ -usbdevice serial::unix:${KVM_MONITOR_SOCKET}" |
+ fi |
+ |
sudo kvm -m 1024 \ |
-vga std \ |
-pidfile "${KVM_PID_FILE}" \ |
@@ -58,6 +68,7 @@ function start_kvm() { |
-net nic,model=e1000 \ |
${nographics} \ |
${snapshot} \ |
+ ${save_vm_state} \ |
-net user,hostfwd=tcp::${FLAGS_ssh_port}-:22 \ |
-hda "${1}" |
@@ -100,6 +111,9 @@ function stop_kvm() { |
echo "Killing ${pid}" >&2 |
sudo kill ${pid} |
sudo rm "${KVM_PID_FILE}" |
+ if [ -n "${KVM_MONITOR_SOCKET}" ]; then |
+ sudo rm "${KVM_MONITOR_SOCKET}" |
+ fi |
else |
echo "No kvm pid found to stop." >&2 |
return 1 |