Як автоматично запускати та вимикати машини VirtualBox?


52

Мені потрібно запустити програмну систему, яка призначена для встановлення в якості пристрою на спеціальній машині. З метою економії енергії я планую замість цього запустити систему на VM VirtualBox.

Хост - це стандартне поле Linux із системою SysV-Init, гість - сильно модифікований Linux, і я вважаю за краще не змінювати його далі. VirtualBox використовується у версії OSE.

Я вже придумав, як запустити VM, коли хост завантажується ( Edit: це робиться, як Ніхіл згадував нижче, за допомогою команди VBoxManager startvm), але як я можу витончено вимкнути VM? Будь-який сценарій, що працює на хості, повинен зачекати, поки гість повністю не вимкнеться.

Хтось може підказати, як, наприклад, повинен виглядати файл служби, що робить це?


ви можете дати сценарію запуску для запуску віртуальної машини під час завантаження
початківців

Відповіді:


34

Ви пробували acpipowerbuttonз цього набору команд?

VBoxManage controlvm        <uuid>|<name>
                            pause|resume|reset|poweroff|savestate|
                            acpipowerbutton|acpisleepbutton|

Редагувати після прочитання коментарів:

Ви можете використовувати acpidабо інші утиліти acpi, щоб зробити це витонченим. Також, чи можете ви надати більше інформації про те, як ви вимикаєте машину в даний момент?

Звичайна shutdownне чекала б незавершених робіт, тимчасова затримка може бути занадто довгою.

Я припускаю, що ви не використовуєте менеджер вікон, тому спробуйте цей інструмент.

Щойно бачив цей демон . Ви можете вважати його корисним.


Дякуємо за вашу відповідь і ласкаво просимо на unix.stackexchange.com! Однак я боюся, що ваша відповідь також не стосується мого питання: acpipowerbutton імітує натискання кнопки живлення на реальній машині, але після видачі цієї команди на хості, VM знову потребує деякого часу, щоб вимкнутись.
jstarek

4
Звичайно. Отже, ви повинні написати цикл, який перевіряє, чи працює ще VM. ACPI - це точно той самий метод, який я використовую в своїх сценаріях для цього. vboxmanage list runningvmsдоти, поки ваш ВМ не зникне.
Нілс

Гаразд, хоча я думаю, що я погоджуся на обгортку управління на практиці, +50 до вас за вказівку на Initscript!
jstarek

16

Замість того, щоб кодувати це самостійно, розгляньте можливість використання Vagrant , який створений для інстанції та контролю екземплярів virtualbox. Документація відмінна, і я пропоную вам перевірити її, а не намагатися розгорнути свою.

Довгий і короткий варіант полягає в тому, що ви створюєте простий керуючий файл, а потім запускаєте, vagrant upщоб запустити стільки екземплярів VirtualBox, скільки вам потрібно. Ви можете використовувати vagrant sshдля входу в хости та vagrant haltвимикати хост (без завершення). vagrant destroyпозбудеться екземплярів.

Він підтримує забезпечення лялькою, Ansible або шеф-кухарем і дозволяє контролювати більшість експонованих параметрів конфігурації VBox.


2
Я шанувальник бродяг, але в цьому випадку чого б ти цього хотів? ОП працює на приладі, не створює власну систему, тому резервування повністю пропускає точку. І навіщо йти і створювати власну «коробку» з пристрою, просто використовувати бродячі, коли ви в основному переходите через процес створення системи з virtualbox для цього?
mc0e

10

У мене аналогічний додаток, як і у вас, з однією різницею: мені потрібно перезапустити систему та відновитись після знімка.

Те, що вас цікавить, це режим без голови .

У мене є кілька таких служб, тому я використовую наступний сценарій:

VBox_StopRestoreStart.sh

#!/bin/bash
if [ -z "$1" ]; then
        echo "Usage: $0 VMNAME_or_UUID"
        exit 1
fi
set -x
VBoxManage controlvm  "$1" poweroff  #enforce turnoff
VBoxManage snapshot   "$1" restorecurrent   #retore state
VBoxManage showvminfo "$1" | grep State   #display state to ensure
VBoxHeadless -s       "$1"  #run in headless mode in background

як я можу витончено вимкнути ВМ?

Якщо ви хочете вимкнути VM граціозно, у вас є два варіанти, залежно від вашої програми:

  • Емуляція "кнопки вимкнення" або "кнопки сну" і підготуйте VM до її реагування (граціозно закрити)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Збережіть стан VM, щоб потім відновити
    • VBoxManage controlvm <uuid>|<VMname> savestate

ПОРАДИ: Вам можуть бути корисні:

  • VBoxManage list vms - список доступних vms
  • rdesktop IP-ADDR:3389або rdesktop-vrdp IP-ADDR:3389- коли ви хочете GUI (навіть віддалено ), коли ви працюєте в режимі без голови:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - почніть з GUI для локальної налагодження

Пов'язана глава посібника VirtualBox: Розділ 7. Віддалені віртуальні машини - Крок за кроком: створення віртуальної машини на безголовому сервері

PS Якщо вас цікавлять повнофункціональні вже реалізовані рішення, OpenStack здається цікавим вибором.


10

Переглянувши документацію щодо управління VirtualBox VM за адресою http://www.virtualbox.org/manual/ch08.html

Для переліку VM використовуйте команду VBoxManage list vms

Для запуску VM використовуйте команду VBoxManage startvm

http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

Для управління VM використовуйте VBoxManage controlvm

controlvmСубкоманди дозволяє змінити стан віртуальної машини , яка в даний час працює. Можна вказати наступне:

VBoxManage controlvm <vm> pauseтимчасово переводить віртуальну машину в режим очікування, не змінюючи її стану назавжди. Вікно VM буде пофарбовано в сірий колір, щоб вказати, що VM в даний час призупинено. (Це еквівалентно вибору елемента "Пауза" в меню "Машина" графічного інтерфейсу.)

Використовуйте VBoxManage controlvm <vm> resumeдля скасування попередньої команди паузи. (Це еквівалентно вибору елемента "Відновити" в меню "Машина" графічного інтерфейсу.)

VBoxManage controlvm <vm> resetнадає такий же ефект на віртуальну машину, як натискання кнопки «Скинути» на справжньому комп’ютері: холодна перезавантаження віртуальної машини, яка негайно знову перезапустить і запустить гостьову операційну систему. Стан ВМ заздалегідь не зберігається, і дані можуть бути втрачені. (Це еквівалентно вибору елемента "Скидання" в меню "Машина" GUI.)

VBoxManage controlvm <vm> poweroffмає такий же ефект на віртуальну машину, як і підтягування кабелю живлення на справжньому комп’ютері. Знову ж, стан VM заздалегідь не зберігається, і дані можуть бути втрачені. (Це еквівалентно вибору елемента "Закрити" в меню "Машина" графічного інтерфейсу або натискання кнопки закриття вікна, а потім вибору "Вимкнути машину" у діалоговому вікні.)

Після цього стан VM буде "живленням".


Зауважте, що в деяких системах це так vboxmanage(всі малі регістри).
Арседж

2
Дякую за вашу відповідь, але, на жаль, це не стосується мого питання: мені потрібно витончено закрити гостя, тобто надіслати "вимкнення -h зараз" всередині гостя, і хазяїн чекає, поки гість повністю не закриється. Жоден з VBoxManage controlvmпідкоманд цього не робить.
jstarek

Ви можете переконатися, що повторна перевірка всіх vms знизиться в хості, перш ніж хост знизиться. Якщо вам потрібно керувати хостом зсередини гостя, то virtualbox.org/manual/ch08.html#vboxmanage-guestcontrol, але це може не дати вам того, що ви шукаєте. Вам слід написати сценарій запуску, як /etc/init.d/vboxvms-serviceскрипт у хост-системі, який після запуску зробить всі vms увімкненими та зупиненими, змусить усі vms знизитись.
Nikhil Mulley

VBoxManage controlvm savestateце ще одна можливість (принаймні, мені говорить Google), вона зберігає стан машин і чисто вимикає її, але все ще не може змусити хоста чекати.
Baarn

5

Для системи, що базується на системі, ви можете спробувати це.

Крок №1: створіть файл служби

[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=user
Group=vboxusers
ExecStart=/usr/bin/VBoxHeadless -s %i
ExecStop=/usr/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target

Крок №2: Увімкніть сервісний файл

$ sudo systemctl enable vboxvmservice@vm_name.service

Список літератури


1
Тут бажано включити відповідь і необов'язково надати посилання на більш детальну інформацію. Цілі посилання зникають без попереднього повідомлення, роблячи вашу відповідь нікчемною.
Антон

Ну, проблема полягає в тому, що я не можу реально скопіювати весь системний файл у посилання 1 сюди, або я повинен це зробити?
Ян Рюегг

Ну, на жаль, "гниття посилань" є величезною проблемою в тих випадках ... Я думаю, що для нащадків наступні два рядки вловлюють основну ідею вашого Link: Це створення служби, яка використовує VBoxHeadless -s %iдля запуску та VBoxManage controlvm %i savestateзупинки VM.
jstarek

Спробував це у Дебіана Джессі, але це не вийшло. Створено користувачем і групою, встановіть право власності на всі файли (включаючи / dev / vbox *). Але коли служба запускається, вона не може знайти VM, навіть якщо ім'я є правильним. Зрештою буде використовувати звичайний скрипт init.
mivk

3

Як щодо відправки команди через ssh від хоста до гостя?

Я не впевнений, чи працює він і чи зможете ви перевірити стан машини згодом або отримати щось на зразок статусу виходу, але він повинен знизитись чистим.


Хороша думка, але це може гарантувати, що гостьовий VM буде доступний через мережу від хоста, принаймні до ssh-порту (22).
Нікхіл Маллі

В основному це буде спрацьовувати, пристрій можна отримати у всій локальній мережі через його запис DNS. Однак, припустимо, я написав сценарій, який ssh'd в пристрій кожного разу, коли хост вийде з ладу - його все одно доведеться заблокувати (призупинити), поки гість повністю не вимкнеться. Це саме питання мого питання: Як скрипт може знати, коли гість не працює, щоб він міг повернути контрольний потік назад до SysV-Init і хост може продовжувати закриватися?
jstarek

1
Ваш коментар передбачає, що все буде працювати плавно на хост-системі, а не на гостьовій системі. Що робити, якщо кабель живлення підключено до системи хосту? Це різне обговорення. Ваш SysV-init на хост-системі буде чекати, коли сервісний скрипт зупинить VM до тих пір, поки сервісний скрипт зрозуміє логіку правильного відключення гостьових віртуальних машин (вимкнення програми на віддаленому хості або просто вимкнення живлення через інтерфейс vbox) та тоді повернення повертає стан успіху чи відмови назад до консолі чи init.
Nikhil Mulley

1
Що стосується того: як сценарій знає, коли гість не працює, спробуйте перевірити, чи vm увімкнено чи вимкнено з інтерфейсу VboxManager та чи гість ssh'able. Крім того, розмістіть деякий моніторинг на хост-системі, яка буде виконувати, чи VM доступна від Vboxmanager та її ssh'able вчасно.
Нікхіл Маллі

1

Моє рішення: У цьому оболонковому скрипті «root» - це виклик, а «theuser» - власник «thevm»

Я знаю, що vms закінчився, коли висновок команди VBoxManage list runningvmsповертає порожній рядок.

...
start(){
    su -c "VBoxHeadless --startvm thevm" -s /bin/bash theuser &
    # maybe another vbox command
}

stop(){
    su -c "VBoxManage controlvm thevm acpipowerbutton" -s /bin/bash theuser
    # maybe another vbox command
    while [ "`su -c 'VBoxManage list runningvms' -s /bin/bash theuser`" != "" ]
    do
        echo waiting for VMs to shutdown
        sleep 3
    done
}
...

1

Для запуску vm:

VBoxManage startvm VMNAME --type headless

Щоб зупинити vm:

VBoxManage controlvm VMNAME savestate

Список усіх запущених програм:

VBoxManage list runningvms

0

Можливо, це допоможе як частина рішення.

VBoxManage list runningvms | tr -s '\" {' '%{' | cut -d '%' -f3  | while read uuid; do
   VBoxManage controlvm $uuid savestate; 
done

0

Чому ви не увійдете до свого гостя і не зупинитесь звідти?

Якщо у вас немає вагомих причин не встановити sshd та отримати доступ до VM реально через VBox, я б попросив сценарій, який просто видає ssh shutdown -h now. Якщо чесно, я створив би сценарій для кожної машини, яка належним чином вимкне його та виконала деякі перевірки, перебуваючи на ньому.

Просто запакуйте /etc/init.d/shutdown_vm скрипт, який викликає інший від хоста, виклик буде заблокований, поки не буде готовий. Цей процес (як описано) додає залежність linux у гостя, але видаляє залежність VBox у хоста.

Вирішення для погони: вам не потрібно отримувати доступ до VBox для вимкнення машини, якщо у вас є якісь засоби доступу до нього (тобто ssh), ОС завжди матиме для цього певні засоби (включення його, звичайно, відрізняється)


Дві причини: По-перше, як зазначено в оригінальному запитанні, я не хотів змінювати сильно модифіковану гостьову ОС, якщо це було насправді не потрібно. По-друге, і що ще важливіше, це мало на меті забезпечити чистий спосіб автоматичного вимкнення всіх запущених VM, якщо хост був відключений.
jstarek

@jstarek Але вам не доведеться змінювати вашу гостьову ОС, якщо ви не хочете (99,99% часу у вас є засоби для входу, або це виняток). І саме в цьому ідея, якщо хост знизиться, відповідний скрипт буде викликаний при зміні режиму виконання, і він просто ввійде до гостя і закриє його "всередині", що і робить бродяга все одно ... перед тим, як піти "грубо сила ", тобто ...
estani
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.