Saya akan merekomendasikan pendekatan yang lebih canggih termasuk pekerjaan pemula, skrip start dan stop. Sebagai contoh saya menggunakan Windows XP, karena direktori home saya menggunakan tombert ... yang harus Anda ubah. Ini memiliki keuntungan dari apa pun yang Anda lakukan (reboot, shutdown, menekan tombol power) yang menangani mesin virtual Anda dengan baik .
Pertama pekerjaan pemula, masukkan /etc/init/winxpvm.conf:
description "WinXP VirtualBox job"
author "Thomas Perschak"
## 0: system halt
## 1: single-user mode
## 2: graphical multi-user plus networking
## 6: system reboot
start on started rc RUNLEVEL=[2]
stop on starting rc RUNLEVEL=[!2]
## upstart config
kill timeout 120
kill signal SIGCONT
nice -10
## start WinXP VirtualBox
exec /home/tombert/scripts/winxpvm-start.sh
## stop WinXP VirtualBox
pre-stop exec /home/tombert/scripts/winxpvm-stop.sh
Pekerjaan pemula memulai mesin virtual di runlevel 2 (yang dalam mode grafis), dan dalam kasus saya ini meningkatkan prioritas dengan nice
. Untuk mematikan mesin virtual dengan baik, saya perlu "menonaktifkan" pengakhiran pemula menggunakan kill signal SIGCONT
pernyataan. Ini membuat mesin virtual berjalan pada awalnya (menghindari default SIGTERM
). Setelah 120 detik, SIGKILL
bagaimanapun mengirim. Sebaliknya saya menjalankan winxpvm-stop.sh
skrip.
Catatan-Sisi 1: bait start on started runlevel [2]
dan stop on starting runlevel [!2]
tidak bekerja. Seseorang harus secara khusus menyebutkan pekerjaan itu rc
.
Catatan Samping 2: Yang membingungkan juga dari manual pemula: kill signal
Stanza menentukan sinyal yang dikirim setelah 5 detik. Dalam contoh ini saya mengaturnya dari SIGTERM
(default) ke SIGCONT - tetapi batas waktu 5 detik saya tidak dapat berubah. The kill timeout
bait menentukan batas waktu yang SIGKILL
dikirim - yang sinyal seseorang tidak bisa berubah. Oleh karena itu perbaikan adalah untuk mendefinisikan bait baru term signal
dan term timeout
.
Di sini skrip start winxpvm-start.sh:
#! /bin/bash -e
function dostart()
{
echo -n "Running WinXP ... "
vboxheadless --startvm WinXP
echo "now closed"
}
export -f dostart
if [ $(whoami) != "tombert" ]; then
su -c dostart tombert
else
dostart
fi
Karena semua pengaturan dll dilakukan dalam mode pengguna (karena login saya adalah Tombert ), bahkan ketika dijalankan sebagai root saya mengubah akun ke Tombert . Pengguna tentu saja dapat diubah dalam konfigurasi pemula tetapi solusi ini memberikan saya pilihan untuk memulai / menghentikan mesin virtual "dengan tangan" dari konsol.
Yang lebih menarik adalah skrip shutdown di winxpvm-stop.sh:
#! /bin/bash
function dostop()
{
## check if WinXP is running
vboxmanage showvminfo WinXP --machinereadable | grep -q 'VMState="running"' &> /dev/null
if [ $? -ne 0 ]; then
echo "WinXP not running"
exit
fi
## try gracefully shutdown
echo -n "Shutting down WinXP ... "
#vboxmanage controlvm WinXP acpipowerbutton
vboxmanage guestcontrol WinXP execute --image "%SystemRoot%\system32\shutdown.exe" --username tombert --password <mypassword> --wait-exit -- "-s" "-f" "-t" "0" &> /dev/null
## check vm status
INDEX=60
while [ $INDEX -gt 0 ]; do
echo -n "$INDEX "
vboxmanage showvminfo WinXP --machinereadable | grep -q 'VMState="running"' &> /dev/null
if [ $? -ne 0 ]; then
echo "gracefully done"
break
fi
sleep 1
let INDEX+=-1
done
## close forcefully
if [ $INDEX -eq 0 ]; then
vboxmanage controlvm WinXP poweroff &> /dev/null
echo "forcefully done"
fi
}
export -f dostop
if [ $(whoami) != "tombert" ]; then
su -c dostop tombert
else
dostop
fi
Pertama saya melakukan hal yang sama seperti pada skrip awal - saya mengubah pengguna dari root ke Tombert akun saya . Sekarang mari kita lihat fungsinya dostop
. Pertama saya memeriksa apakah mesin virtual bahkan berjalan. Kemudian saya mencoba "softly" shutdown dengan mengirimkan shutdown langsung ke WinXP menggunakan guestcontrol
. Di sini Anda harus memberikan kredensial untuk akun WinXP, yang dalam kasus saya adalah Tombert dan kata sandi. Windows shutdown
akan menutup semua aplikasi dengan anggun dan mematikan sistem operasi (biasanya). Kemudian mari kita periksa status mesin virtual terus menggunakan showvminfo
. Melakukan ini setidaknya 60 kali dengan batas waktu 1 detik (melakukan apa pun yang menurut Anda tepat ada di sini) harus meninggalkan mesin virtual cukup waktu untuk mematikan dengan anggun. Perhatikan bahwa panggilan keshowvminfo
juga membutuhkan sedikit kurang dari satu detik (setidaknya di komputer saya) jadi ini memberi ~ 120 detik dalam kasus saya. Jika semuanya mengerem, kami dapat mematikan paksa menggunakan poweroff
pernyataan.
Anda juga harus melihat acpipowerbutton
, tetapi tidak digunakan. Ini karena tidak berfungsi andal. Jika Anda masuk ke Windows, atau bahkan lebih dari satu pengguna yang lebih buruk, Windows akan menampilkan dialog shutdown konfirmasi yang mencegah sistem shutdown. Ini juga alasan mengapa acpibutton
di /etc/default/virtualbox
tidak akan bekerja 100% dapat diandalkan. Juga poweroff
secara paksa akan mematikan mesin virtual - sama seperti tombol power lama-tekan. Karena itu yang terbaik adalah mengosongkannya:
Kutipan dari / etc / default / virtualbox:
# SHUTDOWN_USERS="foo bar"
# check for running VMs of user 'foo' and user 'bar'
# 'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
# select one of these shutdown methods for running VMs
# acpibutton and savestate causes the init script to wait
# 30 seconds for the VMs to shutdown
SHUTDOWN_USERS=""
SHUTDOWN=""
Untuk membuatnya sempurna, Anda mungkin ingin mengubah perilaku tombol daya:
Kutipan dari /etc/acpi/powerbtn.sh:
#!/bin/sh
# /etc/acpi/powerbtn.sh
# Initiates a shutdown when the power putton has been
# pressed.
# @backup
# plain shutdown
/sbin/shutdown -h now "Power button pressed"
# fini
exit 0
...
...
Ada satu kekurangan kecil yang tersisa. Ketika mesin virtual masih booting dan layanan kontrol tamu tidak menyala (di mesin virtual) itu tidak akan menerima perintah shutdown. Kasus yang jarang terjadi ... tapi pikirkanlah.
Itu dia, semoga membantu.
reboot
di 12.10 mengatakan "Ketika dipanggil dengan --force atau ketika di runlevel 0 atau 6, alat ini memanggil reboot (2) system call sendiri dan langsung reboot sistem. Jika tidak, ini hanya memanggil tool shutdown (8) dengan argumen yang sesuai. "; dan halaman manual untukshutdown
mengatakan "Setelah TIME berlalu, shutdown mengirimkan permintaan ke daemon init (8) untuk membawa sistem ke runlevel yang sesuai."