VirtualBox makinesini Windows XP'de nasıl servis olarak çalıştırabilirim?


13

Windows XP Ana Bilgisayarında Windows XP yüklü bir VirtualBox makinem var.

Hizmet olarak VirtualBox'ı nasıl başlatabilirim, bu yüzden kaputun altına sanal bir makine alabilirim ve sanal makineme (ağdan VNC aracılığıyla) erişmek için VirtualBox'ı başlatmam gerekmez mi?

VirtualBox Manage'in bir yol olabileceğini fark ettim, ama bununla yeni başlayan biri olduğum için nereden başlayacağımı bilmiyorum.

Herhangi bir fikir?

Yanıtlar:


0

İçin bir kısayol oluştur C:\Program Files\innotek VirtualBox\VBoxManage.exe

Tırnak işaretleri girildikten sonra: startvm <your virtual machine name>

Misal:

“C:\Program Files\innotek VirtualBox\VBoxManage.exe” startvm XP

Kısayolu başlangıç ​​klasörünüze kopyalayın / taşıyın.

ps: Sisteminiz tamamen önyükleninceye kadar Sanal Makineyi geciktirmek istiyorsanız, bunu Başlangıç ​​Delayer'ı kullanarak XP'de yapabilirsiniz .


İyi çalışıyor gibi görünüyor, Ayrıca sanal makine için pencereyi "gizlemek" yine de, bu yüzden daha bir windows hizmeti gibi çalışıyor?
Jhonny D. Cano -Yazılım-

VBox'ı bir hizmet olarak çalıştırmak pencereyi gizlemez. AWM ile otomatik olarak sistem tepsisine küçültebilirsiniz

15
kullanıcı arayüzü olmayan VM'leri başlatmak için "VBoxHeadless" kasası. VM ekranını görmek istiyorsanız RDP kullanmanız gerekecektir.
Mark Porter

13
Bu bir hizmet değil. Bu, yalnızca oturum açtığınızda VBox'ı çalıştırır - makine açıldığında değil. VBoxHeadless bir hizmet olarak çalıştırmak için gitmek için bir yoldur. Aşağıdaki yanıtıma bakın (ki bu Aaron Copley'nin yorumuna göre gelişmek üzereyim).
John Hart

Cevabın bir hizmet olarak çalışmakla hiçbir ilgisi yoktur. Bir kullanıcı oturum açtıktan sonra, hizmet davranışından tamamen farklı olan başlatma gerçekleşir.
Felice Pollano

10

Şu anda kabul edilen cevabın (Molly7244) oturum açtığınızda sanal makineyi başlattığını unutmayın - makineyi başlattığınızda değil. Başka bir deyişle, bir hizmet değildir.

Makine önyüklendiğinde çalışan gerçek bir hizmet için , cygwin (cygrunsrv) ile birlikte iki komut dosyası (başlangıçta buradan ) kullanıyorum. Bu sayfada başka bir yerde belirtildiği gibi VBoxHeadless modunu kullanır.

İlk komut dosyası VM'nizi VBoxHeadless üzerinden çalıştırır; ortam değişkenlerinden çalıştırılacak doğru VM'nin adını (ve VBOX giriş dizininiz gibi diğer bilgileri) alır. İkinci komut dosyası, belirli bir VM için bir hizmet yükler (ilk komut dosyasını doğru ortam kümesi ile çağırmak için cygrunsrv komutunu kullanarak). Son olarak, ortak işlevleri içeren üçüncü bir dosya var. Tüm bunları bir dizine bir araya getirirseniz, aşağıdaki gibi yeni bir vm yükleyebilirsiniz:

$ VBOX_USER_HOME="/path/to/.VirtualBox/" vboxd-install MyVMName 3333

Ve sonra hizmeti "net start vboxd-MyVMName" veya "cygrunsrv -S vboxd-MyVMName" ile başlatın.

İşte VM çalışan komut dosyası "vboxd":

#!/bin/bash
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Manages start / stop of VirtualBox virtual machines
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## parse arguments
parseArg vmName "$1" "$VBOXD_VM_NAME"
parseArg vmPort "$2" "$VBOXD_VM_PORT"

VBOX_INSTALL_PATH="$(cygpath "$VBOX_MSI_INSTALL_PATH")"

## define signal handler
function onHalt {
    warn "Stopping virtual machine '$vmName'"
    "$VBOX_INSTALL_PATH/VBoxManage" controlvm "$vmName" savestate
    exit 0
}

## install signal handler; cygrunsrv uses SIGTERM by default
trap 'onHalt' TERM

## hardcode this path if you like; it's required for VBox* utils to
## find the correct VirtualBox.xml config file and is usually set
## during a call to vboxd-install.
#export VBOX_USER_HOME="$USERPROFILE\\.VirtualBox"

## default VBoxHeadless port specification
portSpec="-e \"TCP/Ports=$vmPort\""

## determine vm state
info "Querying virtual machine '$vmName' state"
vmState=$( \
    "$VBOX_INSTALL_PATH/VBoxManage" showvminfo "$vmName" \
    | grep '^State:' \
    | sed 's/State: *//' )
info "Virtual machine '$vmName' is $vmState"

## if vm state is saved, we can't specify port without an exception,
## as port spec requires modification of the (immutable) saved machine
## state. See http://www.virtualbox.de/ticket/3609
if  [ "${vmState##saved}" != "$vmState" ]; then
    ## state is saved; clear port specification
    warn "Port specification is not allowed for saved vms"
    portSpec=""
fi

## start the VM
info "Starting virtual machine '$vmName' on port $vmPort"
"$VBOX_INSTALL_PATH/VBoxHeadless" -s "$vmName" $portSpec &

## record pid of VBoxHeadless child process and wait on it
pid="$!"
info "Waiting on VBoxHeadless child process $pid"
wait "$pid"

Ve yükleyici komut dosyası "vboxd-install":

#!/bin/bash
# http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

##
## Registers a VirtualBox virtual machine to start as a service via cygrunsrv
##

## load common functions
basedir="$(readlink -f $(dirname $0))"
source "$basedir/.libcommon" || exit 1

## test for presence of cygrunsrv utility
if [ ! -x "$(which cygrunsrv)" ]; then
    die "Utility 'cygrunsrv' is not in path"
fi

## test VirtualBox configuration
if [ -z "$VBOX_USER_HOME" ]; then
    die "Required environment variable 'VBOX_USER_HOME' is undefined. " \
     "Please ensure this variable is set to point to the directory " \
     "containing your VirtualBox.xml configuration file."
fi
configFile=$(cygpath -u "$VBOX_USER_HOME\\VirtualBox.xml")
if [ ! -e "$configFile" ]; then
    die "VirtualBox configuration file '$(cygpath -w $configFile)' not found"
fi

## parse arguments
parseArg vmName "$1"
parseArg vmPort "$2"
parseArg vmUser "$3" "SYSTEM"

## if vmUser is not SYSTEM, update userSpec
userSpec="--interactive"
if [ "$vmUser" != "SYSTEM" ]; then
    ## "interactive" option disallowed when user is specified
    userSpec="--user \"$vmUser\""
fi

## install the service
cygrunsrv \
    --install "vboxd-$vmName" \
    --path "$basedir/vboxd" \
    --env "VBOXD_VM_NAME=$vmName" \
    --env "VBOXD_VM_PORT=$vmPort" \
    --env "VBOX_USER_HOME=$VBOX_USER_HOME" \
    --desc "VirtualBox virtual machine '$vmName' on port $vmPort" \
    $userSpec \
    --type auto \
    --termsig TERM \
    --shutsig TERM \
    --neverexits \
    --preshutdown \
    || die "Failed to install service"

Ve son olarak, her ikisi tarafından başvurulan ".libcommon" betiği:

# -*-shell-script-*-
# from http://forums.virtualbox.org/viewtopic.php?f=1&t=23536

SCRIPT="$(basename $0)"
BASEDIR="$(readlink -f $(dirname $0))"
[ -z "$LOGLEVEL" ] && LOGLEVEL=2
[ -z "$LOGDATEFORMAT" ] && LOGDATEFORMAT="%Y-%m-%d %H:%M:%S "

function log {
    local now=""
    [ -n "$LOGDATEFORMAT" ] && now=$(date +"$LOGDATEFORMAT")
    echo "$SCRIPT $now$@" >&2
}

function debug {
    [ "$LOGLEVEL" -lt 3 ] && return
    log "[DEBUG] $@"
}

function info {
    [ "$LOGLEVEL" -lt 2 ] && return
    log "[INFO]  $@"
}

function warn {
    [ "$LOGLEVEL" -lt 1 ] && return
    log "[WARN]  $@"
}

function error {
    log "[ERROR] $@"
}

function die {
    error "$@"
    exit 1
}

function parseArg {
    local _name="$1"
    local _value="$2"
    local _default="$3"
    if [ -z "$_value" ]; then
        if [ -z "$_default" ]; then
            die "Required argument '$_name' is undefined"
        fi
     if [ "$_default" = "*EMPTY*" ]; then
         _value=""
     else
            _value="$_default"
     fi
    fi
    debug "$_name=\"$_value\""
    eval "$_name=\"$_value\""
}

Bu çözüm benim için harika çalışıyor; umarım benzer şansın olur.


4
Cevaba eklemek yerine çözümle bağlantı kurmak için +1 "hizmet değil" ... -1. Oy boş. :) Bağlantı çürümesinin bu cevabın uzun ömürlülüğüne zararlı olduğu için çözümü dahil etmeyi gözden geçirmeyi düşünün.
Aaron Copley

8

Bu noktada en basit cevap VBoxVMService gibi görünüyor . Henüz denemedim, buraya gelmeyi ve eğer yaparsam cevap güncellemeyi hatırlamaya çalışacağım.


1
4.2.x ile çalışmaz
Archimedes Trajano

2
@ArchimedesTrajano VirtualBox 4.3.6 ile mevcut sürümü (4.1) denedim ve iyi çalışıyor. Projenin sayfası "neredeyse sıfırdan yeniden yazıldı" iddia ediyor .
Melebius

1
Evet, dün gece test ettim ve işe yarıyor! Sadece yeniden başlatmayı unutmayın.
Archimedes Trajano

4

VBoxVMService üzerinde anlaştı. Kurulumu gerçekten kolay ve iyi çalışıyor gibi görünüyor. Bunu nasıl ayarlayacağınızı burada bulabilirsiniz:

http://www.windows-noob.com/forums/index.php?/topic/4931-have-virtualbox-vms-start-as-a-service-on-a-windows-host/

**** DÜZENLEME **** Aşağıdaki isteğe bağlı olarak, bağlantının bir özeti. Çözüm benim için çalışmasına rağmen, kredi Peter Upfold'a gidiyor - http://peter.upfold.org.uk/

  • Virtualbox'ı kurun ve VM'yi RDP oturumlarını kabul edecek şekilde ayarlayın.
  • VBoxVmService'i C: \ vms içine indirip yükleyin. Bir indirme bağlantısı için sadece Google VBoxVmService (üzgünüm, 2'den fazla bağlantı yayınlamak için yeterli destek yok).
  • VBoxVmService'in ini dosyasını C: \ vms altında düzenleyin:

[Ayarlar]

Servicename = VBoxVmService

VBOX_USER_HOME = C: \ Kullanıcılar \ Administrator.VirtualBox

Farklikullanici. \ Administrator

UserPassword = enteryourpasswordhere

RunWebService = no

PauseShutdown = 5000

[Vm0] VmName = VirtualBox içindeki vm adı

ShutdownMethod = Savestate

AutoStart = yes

  • VBOX_USER_HOME içinde doğru kullanıcının ana dizinindeki .VirtualBox klasörü ile RunAsUser ve UserPassword yönergelerini kullanın ve VmName'deki VirtualBox uygulamasında hedef sanal makinenin adını ayarlayın. Ayrıca, makine açıldığında başlamak için diğer sanal makinelerle [Vm0] 'den sonra ek [Vmx] bölümleri de ekleyebilirsiniz.

  • Yapılandırmanızdan memnun olduğunuzda, Yönetici tarafından etkinleştirilen bir Komut İstemi'nden, hizmeti yüklemek için aşağıdaki komutu çalıştırın. Hizmet yüklendikten sonra, Hizmet yapılandırmasına kaydedildiği için kullanıcı parolanızı INI dosyasından kaldırabilirsiniz:

C: \ vms \ VmServiceControl.exe -i

  • Şimdi, hizmeti ilk kez başlatmayı denemeden önce bilgisayarı yeniden başlatmanız gerekir, aksi takdirde VM'leri bulamaz.

  • Yeniden başlatma sonrasında hizmet başlamalıdır ('Otomatik (Gecikmeli Başlatma)' gecikmesine tabidir) ve VM'leriniz önyükleme sırasında başlatılır.


1
Öldüğü takdirde cevabınızdaki bağlantıyı özetleyebilir misiniz?
jonsca

Yayın istendiği gibi düzenlendi.
RooiWillie

Bu VirtualBox 4.2.x sürümünde çalışır?
Archimedes Trajano

Bu talimatlar muhtemelen bazı eski sürümler için geçerlidir, VBoxVmService'in (4.1) mevcut sürümünün kurulumu daha kolaydır ve işlem boyunca size rehberlik eder.
Melebius

2

Bunu başka bir seçenek olarak sunmak:

Hizmet oluşturmak için yerleşik Windows komutunu 'sc' kullanın. Bunu 'vboxheadless' ile birleştirmek sizi istediğiniz yere götürecektir.

Özellikle vboxheadless ile test edilmedi, ancak calc.exe çalıştıran bir test hizmeti oluşturdum. Bunun gibi bir şey yapmalısınız:

sc create servicenamehere start= auto binPath= "C:\path\to\vboxheadless.exe --startvm name"

Daha fazla bilgi için sc belgelerine bakın. Not: Eşittir işaretinden sonraki boşluklar kasıtlıdır.


Bu, hizmeti doğru bir şekilde başlatır, ancak hizmet durdurulduğunda VM'yi kilitler - VBoxHeadless hizmet durdurma denetimini doğru şekilde yorumlayamaz, bu nedenle Windows zaman aşımına kadar bekleyecek ve daha sonra ideal olandan daha zor olan işlemi öldürecektir. Bunun olmasını önlemek için sarmalayıcı komut dosyalarının diğer yanıtlarına bakın.
Aaron Miller

Yorum için teşekkürler. Umarım bu, geliştiricilere bir hata düzeltme / özellik isteği olarak gönderilir.
Aaron Copley

1

Vboxd komut dosyaları size yaptıkları kadar sorun veriyorsa, bunu denemek isteyebilirsiniz; aynı işlevselliği sağlayan Perl'de uygulanan oldukça basit bir çözümdür. Özellikle, VM sistemle başlar (servisin otomatik olarak başlayacak şekilde ayarlandığı varsayılır, bu varsayılan değerdir) ve servis durdurulduğunda temiz bir şekilde kapanır.

Deneyimlerimle başa çıkmak için oldukça basit olmasının yanı sıra, vboxd çözümünün önemli farklılıkları, bu komut dosyasının VBoxHeadless'a bir VRDE bağlantı noktası ayarı geçirmemesi ve VM'nin kapatılmasının "savestate" yerine "acpipowerbutton" aracılığıyla ele alınmasıdır. .

Bu amaçlarınıza uygun değilse, değiştirmek yeterince kolaydır; ilk durumda, VBoxHeadless komut satırı dizesine ($ cmd) '-e "TCP / Ports = [, port ...]"' ekleyin ve ikinci durumda "acpipowerbutton" ifadesini "savestate" olarak değiştirin. SIGTERM işleyici.

İşte Perl betiği:

 #!/usr/bin/perl
 # Service wrapper for VirtualBox VM.

 use strict;


 # Windows-style path pointing to your VirtualBox home directory
 # (i.e., where your VirtualBox.xml lives)
 my $vboxhome = 'c:\\Documents and Settings\\Aaron\\.VirtualBox';

 # Cygwin path pointing to the VirtualBox install directory
 my $vboxpath = '/cygdrive/c/Program Files/Oracle/VirtualBox';

 # Name or UUID of your virtual machine
 my $vmname = '{83dfb4b1-4243-4a07-9d37-9df5573792d8}';

 $ENV{'VBOX_USER_HOME'} = $vboxhome;

 my $exit_handler = sub {
    print "Caught SIGTERM; shutting down VM.\n";
    exec("'$vboxpath/VBoxManage.exe' controlvm $vmname acpipowerbutton");
 };

 $SIG{TERM} = $exit_handler;

 print "[debug] pid $$\n";

 # Command line for VBoxHeadless - add your VRDE port here if you want one
 my $cmd = "'$vboxpath/VBoxHeadless.exe' --startvm $vmname 2>&1 1>/dev/null";
 print "[debug] $cmd\n";
 system($cmd);

 print "VM died unexpectedly; exiting.\n";

İşte Windows hizmetini yüklemek için kullandığım cygrunsrv komut satırı:

 cygrunsrv --install '<service-name>' --desc '<description>' \
  --path '/usr/bin/perl' --args '<full-path-to-service-script>' \
  --chdir '<path-to-service-script-dir>' --termsig TERM --shutsig TERM \
  --preshutdown --interactive

Oradan, sadece 'sc start <service-name>' yayınlamak gerekir ve gitmek için iyi olmalısınız - varsayılan olarak cygrunsrv hizmetlerinin / var / log / <service-name> .log, eğer bir şey yanlış davranırsa, bunun bir sebebini aramak için ilk yer burasıdır.

Akılda tutulması gereken bir şey, VM'yi bu şekilde çalıştırdığınızda, kendiniz yerine yerleşik SYSTEM hesabı altında çalışacağıdır. Bu durumda, bir hizmet olarak çalışırken VM'yi VirtualBox konsolu üzerinden yönetemezsiniz; "Güç kapalı" durumundaymış gibi görünür ve ayarlarına erişemezsiniz. (Bir hizmet olarak çalışırken VM'yi açmaya çalışmak önerilmez - ne olacağını bilmiyorum, ama en iyisi bir operasyon olmayacak ve en kötüsü VM'nizi hortumlayacaktır.) VM ayarlarını değiştirmeniz veya konsola erişmeniz gerekiyorsa, önce hizmeti durdurun (ve VBoxHeadless.exe dosyasının çıkmasını bekleyin) ve ardından yapılandırın / VirtualBox konsolunda normalde olduğu gibi açın.

Bu sorunu muhtemelen, VirtualBox konsolunu çalıştırmak için ikinci bir etkileşimli hizmet yükleyerek çözebilirsiniz; Konsolu SYSTEM hesabı altında da çalıştıracağından, büyük olasılıkla çalışan VM'yi görebilir ve yönetebilir. Bunu kendim yapmaya ihtiyacım olmadı, bu yüzden işe yarayacağından emin değilim, ama neden olmasın. (Eğer denerseniz, bu cevaba yapılan bir yorum için minnettar olurum, sizin için nasıl çalıştığını bana bildiririm. Teşekkürler!)

Bu yardımcı olur umarım!


Komut dosyanız daha basittir, ancak Perl gerektirir ve vboxd komut dosyasının parametre olarak kabul ettiği çeşitli özellikleri kodlar. VM, başka bir RDP sunucusunun kullandığı varsayılan bağlantı noktasını kullanmak üzere ayarlanmışsa, sanal kutu.org/manual/ch07.html'ye göre, VDEHeadless , VRDE bağlantı noktasını kabul etmeyerek VM'yi (süresiz olarak engeller) çalıştırmaz. vboxd-installyararlıdır çünkü cygrunsrv'nin argüman ayrıntılarını kolayca gizler. Kabul ediyorum, ancak, bu acpipowerbuttondaha iyi bir "dur" seçeneği savestate.
Derek Mahar

@DerekMahar Her ne pahasına olursa olsun al, sanırım. XP'den daha yeni bir şey üzerinde çalışmadığından, her durumda çok şey olduğundan şüpheliyim. ¯ \ _ (ツ) _ / ¯ Geri bildiriminiz için teşekkürler!
Aaron Miller

Aaron Miller, komut dosyanızın veya vboxd'nizin XP'den daha yeni herhangi bir Windows üzerinde çalışmadığı anlamına mı geliyor? VirtualBox 5.1.6 ile Windows 10 üzerinde çalışmak için vboxd aldım çünkü sen komut dosyası demek sanırım.
Derek Mahar

@DerekMahar Senaryomu kastediyorum, vboxd değil.
Aaron Miller
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.