upstart 작업, 시작 및 중지 스크립트를 포함하여보다 정교한 접근 방식을 권장합니다. 예를 들어 Windows XP를 사용하고 있습니다. 홈 디렉토리에서 tombert를 사용할 수 있습니다 . 그것은 당신이 무엇을 하든지 (재부팅, 셧다운, 전원 버튼 누름) 가상 머신을 잘 처리한다는 이점이 있습니다 .
먼저 시작 작업을 /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
upstart 작업은 가상 머신을 런레벨 2 (그래픽 모드)에서 시작하며 제 경우에는로 우선 순위를 높입니다 nice
. 가상 머신을 제대로 종료하려면 kill signal SIGCONT
명령문을 사용하여 가동 중지를 "비활성화"해야 합니다. 그러면 가상 머신이 처음에 실행됩니다 (기본값 SIGTERM
제외). 120 초 후에 SIGKILL
는 어쨌든 전송됩니다. 대신 winxpvm-stop.sh
스크립트를 실행하고 있습니다.
부가 정보 1 : 스탠자 start on started runlevel [2]
및 stop on starting runlevel [!2]
작동하지 않습니다. 그 일을 구체적으로 언급해야한다 rc
.
참고 2 : 업 스타트 매뉴얼에서도 혼동되는 부분 : kill signal
스탠자는 5 초 후에 전송되는 신호를 지정합니다. 이 예에서는 SIGTERM
(기본값)에서 SIGCONT로 설정 했지만 5 초 시간 초과를 변경할 수 없습니다. kill timeout
절은이 후 타임 아웃 지정 SIGKILL
하나가 변경할 수없는 신호 - 전송된다. 개선 그러므로 새로운 스탠자를 정의하는 것 term signal
등을 term timeout
.
다음은 시작 스크립트 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
모든 설정 등은 사용자 모드 (내 로그인이 tombert이므로 )에서 수행되므로 root로 실행하더라도 계정을 tombert로 변경합니다 . 물론 사용자는 시작 구성에서 변경 될 수 있지만이 솔루션을 사용하면 콘솔에서 "수동으로"가상 머신을 시작 / 중지 할 수 있습니다.
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
먼저 시작 스크립트에서와 동일한 작업을 수행합니다. 사용자를 root에서 내 계정 tombert 로 변경하고 있습니다 . 이제 함수를 보자 dostop
. 먼저 가상 머신이 실행 중인지 확인하고 있습니다. 그런 다음을 사용하여 종료를 WinXP로 직접 보내서 "부드럽게"종료하려고합니다 guestcontrol
. 여기에서는 WinXP 계정의 자격 증명을 제공해야합니다. 제 경우에는 tombert 와 암호입니다. Windows shutdown
는 모든 응용 프로그램을 정상적으로 닫고 운영 체제의 전원을 끕니다 (일반적으로). 그런 다음을 사용하여 가상 머신 상태를 계속 확인하십시오 showvminfo
. 1 초 시간 초과 (적절한 것으로 생각되는 모든 작업 수행)로 60 회 이상이 작업을 수행하면 가상 시스템이 정상적으로 종료 될 수있는 충분한 시간이 남습니다. 에 대한 호출showvminfo
또한 1 초 미만 (적어도 내 컴퓨터에서는)보다 조금 걸리므로 제 경우에는 ~ 120 초가 걸립니다. 모든 것이 제동되면 poweroff
명령문을 사용하여 강제로 종료 할 수 있습니다 .
또한 표시 acpipowerbutton
되지만 사용하지 않아야합니다 . 안정적으로 작동하지 않기 때문입니다. Windows에 로그온했거나 여러 사용자가 더 나쁜 경우 Windows는 시스템 종료를 방해하는 확인 종료 대화 상자를 표시합니다. 이것은 또한 이유이다 acpibutton
에서는 /etc/default/virtualbox
100 % 신뢰할 수있는 작동하지 않습니다. 또한 poweroff
길게 누르면 전원 버튼과 마찬가지로 가상 머신이 강제로 종료됩니다. 따라서 이것을 비워 두는 것이 가장 좋습니다 :
/ 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=""
완벽하게하려면 전원 버튼 동작을 변경하고 싶을 수 있습니다.
/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
...
...
하나의 작은 단점이 남아 있습니다. 가상 머신이 여전히 부팅 중이고 게스트 제어 서비스가 작동하지 않으면 (가상 머신에서) shutdown 명령을받지 않습니다. 드문 경우이지만 ... 생각하십시오.
그게 도움이되기를 바랍니다.
reboot
12.10 의 매뉴얼 페이지에 "--force로 호출되거나 런레벨 0 또는 6에있을 때이 도구는 reboot (2) 시스템 호출 자체를 호출하고 시스템을 직접 재부팅합니다. 그렇지 않으면 간단히 shutdown (8) 도구를 호출합니다. 적절한 주장. "; 그리고 맨 페이지는shutdown
"시간이 경과되면, 종료가 적절한 실행 레벨에 이르기까지 시스템을 가지고 (8) 데몬은 init에 요청을 보냅니다."라고