Уже давно не секрет, что ОС Windows удобнее и безопаснее всего запускать в виртуальной машине. Наверно единственной необходимостью запуска ОС Windows на реальном железе является получение максимальной производительности для игр или каких либо графических или медийных приложений не доступных в Linux. Но чаще всего приходится использоваться ОС Windows для работы с Windows-only софтом и по-этому использование для этого виртуальной Windows вполне оправданно.
Ещё не редко бывает ситуация когда некоторая Windows программа должна выполнять некоторые продолжительные интенсивные вычисления или обработку некоторого списка задач в не интерактивном режиме и в этом случае можно воспользовать возможностями нашего открытого и супер удобного Линукса чтобы организовать эффективное управление виртуальной машиной. Суть такого управления сводится к тому, что гостевая машина с ОС Windows работает только в моменты когда хостова Линукс машина простаивает.
Осуществить такое управление можно с помощью одного bash скрипта и небольшой самодельной программки на Си. Принцип управления так же прост как и простейший скринсейвер: в бесконечном цикле вычисляем время простоя главного окна в Иксах и при достижении желаемого периода простоя выполняем команду приоставливающую виртуальную машину, а idle меньше заданного времени простоя включаем виртуальную машину. Для вычисления idle главного окна необходимо скомпилировать вот эту программу (cat getIdleTime.c)
#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);
}
для сборки потребуется установить пакет с заголовками от скринсейвера
а затем собрать программу вот таким образом
для запуска необходимо создать bash скрипт со следующим текстом (cat control_vm.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 и дав скрипту права выполнения
После запуска виртуальная машина должна остановиться, а если перестать размахивать мышкой и топтать клавиши, то через минуту виртуалка опять заработает и будет работать до тех пор пока снова не появится активновность на рабочем столе.
Комментариев 2
Вахрушева Юлия Владимировна
2016-02-03
./control_vm.sh
Илья Басманов
2016-02-03
что это значит?