VirtualBox makineleri otomatik olarak nasıl başlatılır ve kapatılır?


52

Özel bir makineye cihaz olarak monte edilmesi amaçlanan bir yazılım sistemi çalıştırmam gerekiyor. Enerjiden tasarruf etmek için, sistemi bunun yerine bir VirtualBox VM'de çalıştırmayı planlıyorum.

Ev sahibi, SysV-Init sistemine sahip standart bir Linux kutusudur, konuk ağır şekilde değiştirilmiş bir Linux'tur ve daha fazla değiştirmek zorunda kalmamayı tercih ederim. OSE sürümünde VirtualBox kullanılır.

Ana bilgisayar önyükleme yaparken VM'nin nasıl başlatılacağını çoktan öğrendim ( Düzenleme: Bu, Nikhil komutunda aşağıda belirtildiği gibi yapılır VBoxManager startvm), ancak VM'yi zarifçe nasıl kapatabilirim? Ana bilgisayarda çalışan herhangi bir komut dosyasının, konuk tamamen kapanana kadar beklemesi gerekir.

Birisi, örneğin, bunu yapan bir servis dosyasının nasıl görünmesi gerektiğini önerebilir mi?


önyükleme yaparken sanal makineyi başlatmak için başlangıç ​​komut dosyasını verebilir misiniz
Beginner

Yanıtlar:


34

acpipowerbuttonBu komut setinden denedin mi?

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

Yorumları okuduktan sonra düzenleyin:

Sen kullanabilirsiniz acpidveya diğer acpi araçlar, zarif hale getirmek için. Ayrıca, şu anda makineyi nasıl kapattığınız hakkında daha fazla bilgi verebilir misiniz?

Düz shutdownbitmemiş işler için beklemiyor, bir zaman gecikmesi çok uzun olabilir.

Bir pencere yöneticisi kullanmadığınızı farz ediyorum, bu yüzden bu aracı deneyin .

Sadece bu cini gördüm . Faydalı bulabilirsin.


Cevabınız için teşekkürler ve unix.stackexchange.com'a hoş geldiniz! Bununla birlikte, cevabınız da sorunumu çözmedi: acpipowerbutton, gerçek bir makinedeki güç düğmesine basmayı taklit ediyor, ancak bu komutu ana bilgisayara verdikten sonra, VM'nin kapatılması biraz zaman alacaktır.
jstarek

4
Elbette. Bu yüzden, VM'nin hala çalışıp çalışmadığını kontrol eden bir döngü yazmalısınız. ACPI, komut dosyalarımda bunun için kullandığım yöntemle tamamen aynı. vboxmanage list runningvmsVM'niz gidene kadar.
Nils

Tamam, sanırım pratikte bir yönetim paketleyicisine karar vereceğim, sizin için +50'ye bakın.
jstarek

16

Aksine kod Kendini yukarı daha kullanmayı düşünün serseri örneğini ve kontrol virtualbox örnekleri için inşa edilmiştir. Belgeler mükemmel ve kendi yayınınızı atmaya çalışmak yerine kontrol etmenizi öneririm.

Bunun kısa ve özeti, basit bir kontrol dosyası oluşturup daha sonra vagrant upistediğiniz kadar VirtualBox örneği başlatmak için çalıştırmanızdır. Sen kullanabilirsiniz vagrant sshana oturum ve vagrant halt(sonlandırma olmadan) ana kapatmaya. vagrant destroyörnekleri kurtulacak.

Kukla, Ansible veya Chef ile provizyonu destekliyor ve açığa çıkan VBox konfigürasyon ayarlarının çoğunu kontrol etmenizi sağlıyor.


2
Ben serseri bir hayranıyım, ama bu durumda, ne için yeryüzünde istiyorsun? OP, kendi sistemini kurmayan bir cihaz kullanıyor, bu nedenle provizyon tamamen özlüyor. Ve neden temelde sistemi sanal kutu ile yapmak için sistemi kurmaya gittiğinde sadece serseri kullanmak için, cihazdan özel bir 'kutu' yapalım?
Mc0e

10

Sizinle benzer bir uygulamaya sahibim, tek bir farkla: Sistemi yeniden başlatmam ve anlık görüntüden kurtarmam gerekiyor.

İlgilendiğiniz şey başsız mod .

Bu tür birkaç hizmetim var, bu yüzden aşağıdaki betiği kullanıyorum:

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

Sanal Makineyi nasıl inceleyerek kapatabilirim?

VM'yi dikkatlice kapatmak istiyorsanız, uygulamanıza bağlı olarak iki seçeneğiniz vardır:

  • "Kapatma düğmesini" veya "uyku düğmesini" taklit edin ve VM'yi tepki vermeye hazırlayın (incelikle kapatmak için)
    • VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
    • VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
  • Daha sonra geri yüklemek için VM durumunu kaydet
    • VBoxManage controlvm <uuid>|<VMname> savestate

İPUCU: Yararlı bulabilirsiniz:

  • VBoxManage list vms - mevcut vms listesi
  • rdesktop IP-ADDR:3389veya rdesktop-vrdp IP-ADDR:3389- kafasız modda çalışırken bir GUI (hatta uzaktan ) istediğinizde:VBoxHeadless -s <uuid>|<VMname>
  • VBoxManage startvm - yerel hata ayıklama için GUI ile başlayın

İlgili VirtualBox kılavuzunun bölümü: Bölüm 7. Uzak sanal makineler - Adım adım: başsız bir sunucuda sanal bir makine oluşturma

PS Tam özellikli zaten uygulanmış çözümlerle ilgileniyorsanız , OpenStack ilginç bir seçenek gibi görünüyor.


10

Http://www.virtualbox.org/manual/ch08.html adresindeki VirtualBox VM yönetim belgelerine bakın

VM'leri listelemek için komutu kullanın VBoxManage list vms

Sanal Makineyi başlatmak için komutu kullanın. VBoxManage startvm

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

VM'yi kontrol etmek için kullanın VBoxManage controlvm

Alt controlvmkomut, çalışmakta olan sanal makinenin durumunu değiştirmenize olanak sağlar. Aşağıdakiler belirtilebilir:

VBoxManage controlvm <vm> pausedurumunu geçici olarak değiştirmeden sanal bir makineyi geçici olarak beklemeye alır. VM penceresi, duraklatıldığını göstermek için gri renkte boyanacaktır. (Bu, GUI'nin "Makine" menüsünde "Duraklat" öğesini seçmeye eşdeğerdir.)

Kullanım VBoxManage controlvm <vm> resumeönceki duraklama komutu geri almak. (Bu, GUI'nin "Makine" menüsünde "Devam Et" öğesini seçmeye eşdeğerdir.)

VBoxManage controlvm <vm> resetGerçek bir bilgisayarda "Sıfırla" düğmesine basmakla aynı sanal makinede aynı etkiye sahiptir: sanal makinenin soğuk yeniden başlatılması, konuk işletim sistemini hemen yeniden başlatıp yeniden başlatır. Sanal Makinenin durumu önceden kaydedilmez ve veriler kaybolabilir. (Bu, GUI'nin "Makine" menüsünde "Sıfırla" öğesini seçmeye eşdeğerdir.)

VBoxManage controlvm <vm> poweroffSanal makinedeki güç kablosunu gerçek bir bilgisayara çekenle aynı etkiye sahiptir. Yine, VM'nin durumu önceden kaydedilmez ve veriler kaybolabilir. (Bu, GUI'nin "Makine" menüsünde "Kapat" öğesini seçmeye veya pencerenin kapat düğmesine basmaya ve ardından iletişim kutusundaki "Makineyi kapat" seçeneğine eşdeğerdir.)

Bundan sonra, VM'nin durumu "Kapalı" olacaktır.


Bazı sistemlerde bunun vboxmanage(tümü küçük harf) olduğunu unutmayın.
Arcege

2
Cevabınız için teşekkürler, fakat ne yazık ki, bu benim sorunumla ilgilenmiyor : Konuyu zarif bir şekilde kapatmam gerekiyor, yani konuğun içinde bir "kapanma-saat" vermem gerekiyor ve konuğun konuğu tamamen kapanana kadar bekletmesi gerekiyor. VBoxManage controlvmAlt komutanların hiçbiri bunu yapmaz.
jstarek

Ana bilgisayar aşağı inmeden önce tüm vms'lerin ana bilgisayardaki bağlantılarının aşağı olduğundan emin olabilirsiniz. Eğer konuğu konuğun içinden kontrol etmeniz gerekirse , o zaman virtualbox.org/manual/ch08.html#vboxmanage-guestcontrol, ancak bu aradığınızı vermeyebilir. /etc/init.d/vboxvms-serviceAna sistemde script gibi bir başlangıç ​​betiği yazmalısınız, başlangıçta tüm vms'leri durduracak ve tüm vms'leri durduracak.
Nikhil Mulley

VBoxManage controlvm savestatebaşka bir olasılıktır (en azından google bana söyler), makinelerin durumunu korur ve temiz bir şekilde kapatır, ancak ana bilgisayarı beklemeye zorlama yolu yoktur.
Baarn

5

Sistem tabanlı bir sistem için bunu deneyebilirsiniz.

Adım # 1: bir servis dosyası oluşturun

[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. Adım: Servis dosyasını etkinleştirin

$ sudo systemctl enable vboxvmservice@vm_name.service

Referanslar


1
Buraya bir cevap eklenmesi ve isteğe bağlı olarak daha ayrıntılı bilgilere bağlantılar sağlaması tercih edilir . Bağlantı hedefleri önceden bildirilmeksizin kaybolur ve cevabınızı değersiz hale getirir.
Anthon,

Sorun şu ki, burada link 1'deki tüm systemd dosyasını gerçekten kopyalayamıyorum, yoksa bunu yapmalı mıyım?
Jan Rüegg

Eh, ne yazık ki "bağlantı çürüklüğü" bu durumlarda çok büyük bir sorundur ... Sanırım, gelecek nesil için, aşağıdaki iki satır Bağlantınızın arkasındaki temel fikri yakalar: VM'yi VBoxHeadless -s %ibaşlatmak ve VBoxManage controlvm %i savestatedurdurmak için kullanılan bir hizmet yaratıyor .
jstarek

Bunu Debian Jessie'de denedim, ama işe yaramadı. Kullanıcı ve grup oluşturuldu, tüm dosyaların sahipliğini belirleyin (/ dev / vbox * dahil). Ancak hizmet başladığında, isim doğru olsa bile VM'yi bulamıyor. Sonuçta normal init betiğini kullanacaktır.
mivk

3

Komutu ssh üzerinden ev sahibinden konuğa göndermeye ne dersiniz?

İşe yarayıp yaramadığını sonradan makinenin durumunu kontrol edip edemediğinizden ya da çıkış durumu gibi bir şey alabildiğinden emin değilim, ancak en azından temiz olmalıdır.


İyi fikir, ancak bu, konuk VM'nin ssh limanında (22) en azından ana bilgisayardan ağ üzerinden erişilebilir olmasını garanti eder.
Nikhil Mulley,

Temel olarak, bu işe yarar, cihaza DNS girişi üzerinden tüm LAN'dan ulaşılabilir. Ancak, ana bilgisayar aşağı indiğinde cihaza sshd eden bir senaryo yazdığımı varsayalım - konuk tamamen kapanana kadar hala engellemesi gerekir (duraklatması gerekir). Bu tam olarak sorumun amacı budur: Senaryo konuğun ne zaman kapalı olduğunu nasıl anlayabilir, böylece SysV-Init'e geri dönüş akışı sağlayabilir ve ana bilgisayar kapanmaya devam edebilir?
jstarek

1
Yorumunuz, konuk sistemde değil, ana bilgisayar sisteminde her şeyin sorunsuz çalışacağını varsayar. Ana bilgisayar sistemine güç kablosu takılıysa ne olur? Bu farklı bir tartışma. Ana bilgisayar sistemindeki SysV init sisteminiz, hizmet betiğinin konuk VM'leri doğru bir şekilde kapatmak için mantığını anladığı sürece hizmet komut dosyasının VM'leri durdurmasını bekler (uzak ana bilgisayarda kapatma veya yalnızca vbox arabirimini kullanarak kapatma) ve sonra verim başarı veya başarısızlık durumunu tekrar konsola veya init'e döndürür.
Nikhil Mulley,

1
Konu ile ilgili: konuk ne zaman betiğin ne zaman olduğunu bilir, vm'nin VboxManager arayüzünden açık olup olmadığını ve misafirin ssh'able olup olmadığını basit bir kontrol edin. Ayrıca, VM'nin Vboxmanager'dan temin edilip edilemeyeceğini ve zamanında ssh'able olup olmadığını gerçekleştirecek olan ana sistem üzerinde bir miktar izleme yapın.
Nikhil Mulley,

1

Benim çözümüm: Bu komut dosyasında 'root' invoker, 'theuser' 'thevm' sahibi

Komutun çıktısı VBoxManage list runningvmsboş bir dize döndürdüğünde vms'nin bittiğini biliyorum .

...
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'yi başlatmak için:

VBoxManage startvm VMNAME --type headless

Vm'yi durdurmak için:

VBoxManage controlvm VMNAME savestate

Çalışan tüm vm'leri listele:

VBoxManage list runningvms

0

Belki bu çözümün bir parçası olarak yardımcı olacaktır.

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

0

Neden misafirinize giriş yapıp oradan ayrılmıyorsunuz?

Sshd'yi kurmamak ve VM'ye gerçekten VBox aracılığıyla erişmek için iyi bir nedeniniz yoksa, yalnızca bir komut dosyası için bir komut dosyası kullanırım ssh shutdown -h now. Dürüst olmak gerekirse, her makineye uygun şekilde kapanıp bazı kontroller gerçekleştiren bir komut dosyası hazırlardım.

Sadece diğerini ana bilgisayardan çağıran bir /etc/init.d/shutdown_vm betiği hazırlayın, hazır olana kadar arama engellenir. Bu işlem (açıklandığı gibi) konuğa linux bağımlılığı ekler ancak ana bilgisayardaki VBox bağımlılığını kaldırır.

Kovalamayı kesme: bir makineyi kapatmak için VBox'a erişmenize gerek yoktur, eğer ona erişmek için bazı araçlara sahipseniz (yani ssh), o zaman işletim sistemi her zaman bunun için bazı araçlara sahip olacaktır (açmak, elbette farklıdır).


İki sebep: İlk olarak, asıl soruda belirtildiği gibi, gerçekten gerekli değilse, büyük ölçüde değiştirilmiş konuk işletim sistemini değiştirmek istemedim. İkincisi ve daha da önemlisi, bu, ana bilgisayar kapatılmışsa çalışan tüm VM'leri otomatik olarak kapatmak için temiz bir yol sağlamaktı.
jstarek

@ jstarek Ancak istemiyorsanız konuk işletim sisteminizi değiştirmek zorunda değilsiniz (zamanın% 99,99'u giriş yapmak için bir seçeneğiniz var, ya da bu bir istisna). Ve tam olarak bu, eğer ana bilgisayar kapanırsa, çalışma zamanını değiştirirken uygun betiği çağırılır ve bu sadece konuğa giriş yapar ve "içeriden" kapatır. kuvvet "yani ...
estani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.