Эффективное управление виртуальной машиной

Уже давно не секрет, что ОС Windows удобнее и безопаснее всего запускать в виртуальной машине. Наверно единственной необходимостью запуска ОС Windows на реальном железе является получение максимальной производительности для игр или каких либо графических или медийных приложений не доступных в Linux. Но чаще всего приходится использоваться ОС Windows для работы с Windows-only софтом и по-этому использование для этого виртуальной Windows вполне оправданно.

Ещё не редко бывает ситуация когда некоторая Windows программа должна выполнять некоторые продолжительные интенсивные вычисления или обработку некоторого списка задач в не интерактивном режиме и в этом случае можно воспользовать возможностями нашего открытого и супер удобного Линукса чтобы организовать эффективное управление виртуальной машиной. Суть такого управления сводится к тому, что гостевая машина с ОС Windows работает только в моменты когда хостова Линукс машина простаивает.

Осуществить такое управление можно с помощью одного bash скрипта и небольшой самодельной программки на Си. Принцип управления так же прост как и простейший скринсейвер: в бесконечном цикле вычисляем время простоя главного окна в Иксах и при достижении желаемого периода простоя выполняем команду приоставливающую виртуальную машину, а idle меньше заданного времени простоя включаем виртуальную машину. Для вычисления idle главного окна необходимо скомпилировать вот эту программу  (cat getIdleTime.c)

#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
  Display *dpy = XOpenDisplay(NULL);
  if (!dpy) {
    return(1);
  }
  XScreenSaverInfo *info = XScreenSaverAllocInfo();
  XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
  printf("%lu", info->idle);
  return(0);
}

для сборки потребуется установить пакет с заголовками от скринсейвера

sudo aptitude install libxss-dev

а затем собрать программу вот таким образом

gcc -o getIdleTime getIdleTime.c -lXss  -lX11

для запуска необходимо создать bash скрипт со следующим текстом (cat control_vm.sh)

#!/bin/sh
VM="Win" # название виртуальной машины можно получить с помощью vboxmanage list vms
sleep=60000 # просто 60 секунд
while [ 1 ] ;do
    xidle=$(./getIdleTime)
    status=$(vboxmanage list vms -l | grep State| awk '{print $2 }')
    if [ $xidle -gt $sleep ];then
        if [ "$status" = "paused" ];then
            echo "resume"
            vboxmanage controlvm  $VM resume
        fi
    else
        if [ "$status" = "running" ];then
            echo "pause"
            vboxmanage controlvm  $VM pause
        fi
    fi
    sleep 3;
done

запускать можно самым простым образом, предварительно вписав нужно имя в переменную VM и дав скрипту права выполнения

./control_vm.sh

После запуска виртуальная машина должна остановиться, а если перестать размахивать мышкой и топтать клавиши, то через минуту виртуалка опять заработает и будет работать до тех пор пока снова не появится активновность на рабочем столе.

Комментариев 2
Вахрушева Юлия Владимировна

2016-02-03

./control_vm.sh

Илья Басманов
Илья Басманов

2016-02-03

что это значит?

Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут