Bagaimana saya bisa menjalankan mesin VirtualBox sebagai layanan pada Windows XP?


13

Saya memiliki mesin VirtualBox dengan Windows XP pada Host Windows XP.

Bagaimana saya bisa memulai VirtualBox sebagai layanan, jadi saya bisa mendapatkan mesin virtual di bawah tenda, dan saya tidak harus memulai VirtualBox untuk mengakses mesin virtual saya (melalui VNC dari jaringan)?

Saya menemukan bahwa VirtualBox Manage mungkin cara untuk pergi, tetapi karena saya pemula dengan ini, saya tidak tahu harus mulai dari mana.

Ada ide?

Jawaban:


0

Buat Jalan Pintas ke C:\Program Files\innotek VirtualBox\VBoxManage.exe

Setelah tanda kutip masuk: startvm <your virtual machine name>

Contoh:

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

Salin / Pindahkan pintasan ke folder startup Anda.

ps: jika Anda ingin menunda Mesin Virtual sampai sistem Anda sepenuhnya boot, Anda dapat melakukan ini di XP melalui Startup Delayer .


Tampaknya berfungsi dengan baik, Apakah ada pula untuk "menyembunyikan" jendela untuk mesin virtual juga, sehingga berjalan lebih seperti layanan windows?
Jhonny D. Cano -Leftware-

menjalankan VBox sebagai layanan tidak akan menyembunyikan jendela. Anda dapat meminimalkan secara otomatis ke sistem tray dengan AWM meskipun: eusing.com/WindowManager/WindowManager.htm

15
checkout "VBoxHeadless" untuk meluncurkan VM tanpa UI. Anda harus menggunakan RDP jika Anda ingin melihat layar VM.
Mark Porter

13
Ini bukan layanan. Ini hanya menjalankan VBox saat Anda masuk - bukan saat mesin dinyalakan. VBoxHeadless adalah cara untuk menjalankan sebagai layanan. Lihat jawaban saya di bawah ini (yang saya akan tingkatkan sesuai komentar Aaron Copley).
John Hart

Jawabannya tidak ada hubungannya dengan menjalankan sebagai layanan. Startup terjadi setelah login pengguna, sama sekali berbeda dari perilaku layanan.
Felice Pollano

10

Perhatikan bahwa jawaban yang saat ini diterima (Molly7244) sebenarnya memulai VM ketika Anda login - bukan ketika Anda mem-boot mesin. Dengan kata lain, itu bukan layanan.

Untuk layanan aktual yang berjalan saat mesin melakukan boot, saya menggunakan dua skrip (asal dari sini ) bersamaan dengan cygwin (cygrunsrv). Memanfaatkan mode VBoxHeadless seperti yang disebutkan di tempat lain di halaman ini.

Script pertama menjalankan VM Anda melalui VBoxHeadless; itu mendapatkan nama VM yang tepat untuk dijalankan (dan info lainnya seperti direktori home VBOX Anda) dari variabel lingkungan. Skrip kedua menginstal layanan untuk VM tertentu (dengan menggunakan cygrunsrv untuk memanggil skrip pertama dengan env. Vars set yang tepat). Akhirnya ada file ketiga yang berisi fungsi-fungsi umum. Jika Anda memasukkan semua ini ke dalam direktori, Anda dapat menginstal vm baru seperti:

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

Dan kemudian mulai layanan dengan "net start vboxd-MyVMName" atau "cygrunsrv -S vboxd-MyVMName".

Berikut ini skrip yang menjalankan VM, "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"

Dan inilah skrip penginstalnya, "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"

Dan, akhirnya, inilah skrip ".libcommon" yang dirujuk oleh keduanya:

# -*-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\""
}

Solusi ini sangat bagus untuk saya; semoga Anda akan memiliki keberuntungan yang sama.


4
+1 untuk "bukan layanan" ... -1 untuk menautkan ke solusi daripada memasukkannya dalam jawaban. Vote adalah nol. :) Pertimbangkan untuk merevisi untuk memasukkan solusi karena tautan busuk akan merusak umur panjang jawaban ini.
Aaron Copley

8

Sepertinya jawaban paling sederhana pada saat ini adalah VBoxVMService . Saya belum mencobanya, saya akan mencoba mengingat untuk datang ke sini dan memperbarui jawabannya jika / ketika saya lakukan.


1
itu tidak bekerja dengan 4.2.x meskipun
Archimedes Trajano

2
@ArchimedesTrajano Saya sudah mencoba versi saat ini (4.1) dengan VirtualBox 4.3.6 dan berjalan dengan baik. Halaman proyek mengklaim itu "ditulis ulang hampir dari awal" .
Melebius

1
Yup, saya baru mengujinya tadi malam dan berhasil! Ingatlah untuk REBOOT.
Archimedes Trajano

4

Setuju pada VBoxVMService. Ini sangat mudah diatur dan tampaknya berfungsi dengan baik. Anda dapat menemukan cara mengaturnya di sini:

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

**** EDIT **** Sesuai permintaan di bawah ini, ringkasan tautan. Meskipun solusinya bekerja untuk saya, kreditnya diberikan kepada Peter Upfold - http://peter.upfold.org.uk/

  • Instal Virtualbox dan atur VM untuk menerima sesi RDP.
  • Unduh dan instal VBoxVmService ke C: \ vms. Hanya Google VBoxVmService untuk tautan unduhan (maaf, tidak cukup perwakilan untuk memposting lebih dari 2 tautan).
  • Edit file VBoxVmService ini di bawah C: \ vms:

[Pengaturan]

ServiceName = VBoxVmService

VBOX_USER_HOME = C: \ Users \ Administrator.VirtualBox

RunAsUser =. \ Administrator

UserPassword = enteryourpassworddi sini

RunWebService = tidak

PauseShutdown = 5000

[Vm0] VmName = nama vm di VirtualBox

ShutdownMethod = berhemat

AutoStart = ya

  • Ganti di VBOX_USER_HOME dengan folder .VirtualBox di direktori home pengguna yang benar, serta arahan RunAsUser dan UserPassword, dan tetapkan nama mesin virtual target di aplikasi VirtualBox di VmName. Anda juga dapat menambahkan bagian [Vmx] tambahan setelah [Vm0] dengan mesin virtual lain untuk memulai ketika mesin melakukan booting.

  • Ketika Anda puas dengan konfigurasi Anda, dari Command Prompt yang didukung Administrator, jalankan perintah berikut untuk menginstal layanan. Setelah layanan diinstal, Anda dapat menghapus kata sandi pengguna dari file INI, karena disimpan dalam konfigurasi Layanan:

C: \ vms \ VmServiceControl.exe -i

  • Sekarang, Anda harus me-reboot komputer sebelum mencoba memulai layanan untuk pertama kalinya, atau ia tidak akan dapat menemukan VM.

  • Setelah reboot, layanan akan mulai (tunduk pada penundaan 'Otomatis (Mulai Tertunda)') dan VM Anda akan dimulai saat boot.


1
Bisakah Anda meringkas tautan dalam jawaban Anda kalau-kalau mati?
jonsca

Pos diedit sesuai permintaan.
RooiWillie

apakah ini berfungsi pada versi 4.2.x dari VirtualBox?
Archimedes Trajano

Instruksi ini mungkin berlaku untuk beberapa versi yang lebih lama, versi saat ini dari VBoxVmService (4.1) lebih mudah untuk diatur dan itu akan memandu Anda melalui proses.
Melebius

2

Hanya menawarkan ini sebagai opsi lain:

Gunakan perintah builtin Windows 'sc' untuk membuat layanan. Kombinasikan ini dengan 'vboxheadless' akan membawa Anda ke tempat yang Anda inginkan.

Belum diuji dengan vboxheadless secara khusus, tapi saya memang membuat layanan tes yang menjalankan calc.exe Anda harus melakukan sesuatu seperti ini:

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

Lihat dokumentasi untuk sc untuk informasi lebih lanjut. Catatan: Ruang-ruang itu setelah tanda sama dengan disengaja.


Ini akan memulai layanan dengan benar, tetapi akan crash VM ketika layanan dihentikan - VBoxHeadless tidak dapat dengan benar menafsirkan kontrol berhenti layanan, jadi Windows akan menunggu sampai batas waktu dan kemudian secara paksa membunuh proses, yang kurang dari ideal. Lihat jawaban lain untuk skrip pembungkus untuk mencegah hal itu terjadi.
Aaron Miller

Terima kasih atas komentarnya. Semoga ini diajukan ke pengembang sebagai permintaan perbaikan / fitur bug.
Aaron Copley

1

Jika skrip vboxd memberi Anda banyak masalah seperti yang saya lakukan, Anda mungkin ingin mencoba ini; ini adalah solusi yang lebih sederhana, diimplementasikan dalam Perl, yang menyediakan fungsionalitas yang sama. Secara khusus, VM memulai dengan sistem (dengan asumsi layanan diatur untuk memulai secara otomatis, yang merupakan default), dan turun dengan bersih ketika layanan dihentikan.

Perbedaan utama dari solusi vboxd, selain menjadi jauh lebih mudah untuk ditangani dalam pengalaman saya, adalah bahwa skrip ini tidak meneruskan pengaturan port VRDE ke VBoxHeadless, dan bahwa penutupan VM ditangani melalui "acpipowerbutton" daripada "savestate" .

Jika ini tidak sesuai dengan tujuan Anda, cukup mudah untuk berubah; dalam kasus pertama, tambahkan '-e "TCP / Ports = [, port ...]"' ke string baris perintah VBoxHeadless ($ cmd), dan dalam kasus kedua, cukup ubah "acpipowerbutton" menjadi "savestate" di pengendali SIGTERM.

Berikut skrip Perl:

 #!/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";

Dan inilah baris perintah cygrunsrv yang saya gunakan untuk menginstal layanan Windows:

 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

Dari sana, seharusnya hanya masalah mengeluarkan 'sc start <service-name>', dan Anda harus melakukannya dengan baik - ingat bahwa, secara default, layanan cygrunsrv masuk ke / var / log / <service-name> .log, jadi jika ada yang tidak pantas, itulah tempat pertama untuk mencari alasan mengapa.

Satu hal yang perlu diingat adalah bahwa, ketika Anda menjalankan VM dengan cara ini, itu akan berjalan di bawah akun SISTEM bawaan, bukan milik Anda. Karena itu, Anda tidak akan dapat mengelola VM melalui konsol VirtualBox saat sedang berjalan sebagai layanan; itu akan tampak dalam keadaan "dimatikan", dan Anda tidak akan bisa mendapatkan pengaturannya. (Mencoba untuk menyalakan VM saat sedang berjalan sebagai layanan tidak dianjurkan - Saya tidak tahu apa yang akan terjadi, tetapi yang terbaik itu akan menjadi no-op, dan paling buruk itu akan menyemprotkan VM Anda.) Jika Anda perlu mengubah pengaturan VM atau mengakses konsol, hentikan layanan terlebih dahulu (dan tunggu VBoxHeadless.exe untuk keluar), lalu konfigurasikan / nyalakan di konsol VirtualBox seperti biasanya.

Anda mungkin dapat mengatasi masalah ini dengan menginstal layanan interaktif kedua untuk menjalankan konsol VirtualBox; karena itu akan menjalankan konsol di bawah akun SISTEM juga, itu kemungkinan besar akan dapat melihat dan mengelola VM yang berjalan. Saya belum memiliki kebutuhan untuk melakukan itu sendiri, jadi saya tidak yakin itu akan berhasil, tetapi saya tidak melihat alasan mengapa itu tidak berhasil. (Jika Anda mencobanya, saya akan menghargai komentar untuk jawaban ini, membiarkan saya tahu bagaimana cara kerjanya untuk Anda. Terima kasih!)

Semoga ini membantu!


Skrip Anda lebih sederhana, tetapi membutuhkan Perl dan kode-keras beberapa properti yang diterima oleh skrip vboxd sebagai parameter. Menurut virtualbox.org/manual/ch07.html , dengan tidak menerima port VRDE, VBoxHeadless tidak akan menjalankan VM (itu hanya memblokir tanpa batas waktu) jika VM diatur untuk menggunakan port default yang menggunakan server RDP lain. vboxd-installberguna karena dengan mudah menyembunyikan detail argumen cygrunsrv. Saya setuju, meskipun, itu acpipowerbuttonadalah pilihan "berhenti" yang lebih baik daripada savestate.
Derek Mahar

@DerekMahar Ambillah untuk apa pun nilainya, kurasa. Karena itu tidak bekerja pada sesuatu yang lebih baru dari XP, saya ragu itu banyak dalam hal apapun. ¯ \ _ (ツ) _ / ¯ Terima kasih atas umpan baliknya!
Aaron Miller

Aaron Miller, maksud Anda skrip atau vboxd Anda tidak berfungsi pada Windows yang lebih baru dari XP? Saya kira maksud Anda skrip Anda karena saya memang mendapatkan vboxd untuk bekerja pada Windows 10 dengan VirtualBox 5.1.6.
Derek Mahar

@DerekMahar Maksud saya skrip saya, bukan vboxd.
Aaron Miller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.