VirtualBox Sanal Makinalarını Servis Olarak Çalıştırmak

VirtualBoxSunucunuza kurduğunuz VirtualBox ile Headless modda sanal makinalarınızı çalıştırarak VirtualBox’ın RDP özelliği ile sanal makinalarınıza uzaktan erişim sağlamanız mümün olmakta. Peki bu sanal makinaları her seferinde sunucuya bağlanıp VBoxManage starvm komutu ile başlatmaktan kurtulmanın yolu nedir? Makinaların servis gibi çalışmasını sağlamak.

Bunu yapmak için VirtualBox makinalarını servis gibi çalıştıracak bir script yazmak gerekmekte. Çünkü şimdilik VirtulaBox’ın böyle bir özelliği malesef yok.

Herşeyden önce kurduğunuz sanal makinanın uzaktan erişim için ayarlanmış olması gerekmekte. Bu ayarı yaptıktan sonra aşağıdaki dosyaları oluşturmanız ve rc kalsörlerine eklemeniz, bilgisayar yeniden açıldığında makinaların servis olarak yeniden çalışmasını sağlayacağı gibi gerektiği zamanlarda daha akılda kalıcı komutlar ile sanal makinayı kapatmanıza olanak verecektir.

Şimdi gelelim  yapılması gerekenlere

sudo nano /etc/default/virtualbox

komutu ile /etc/default/ klasörü içerisinde yaratacağımız dosyaya sanal makinaya hükmedecek kullanıcı ve makinanın kapatılma şeklini yazacağız. Böylece servise stop komutu verdiğimiz zaman makinanın hangi şekilde kapatılacağını belirleyebileceğiz. Açtığımız dosyanın içerisine aşağıdaki satırları ekleyip kaydediyoruz.

SHUTDOWN_USERS=”user1 user2″ # boşluklarla ayrılmış, sana makinaları çalıştırma hakkına sahip kullanıcıların adlarını yazıyoruz
SHUTDOWN=savestate # Makinaların kapatılma şeklini de buraya yazıyoruz.

SHUTDOWN durumunu savestate olarak ayarlamaktaki ana amaç, asıl sunucu kapatılırken sanal makinaların tekrar açıldığında kaldığı yerden hemen devam edebilmelerini sağlamak. Bir nevi geçici olarak makinaları durdurma işlemi. Eğer makinaları tamamen kapatmak isterseniz bu işlemi sanal makinaya bağlanarak işletim sisteminden yapmanız sanal makinanın doğru şekilde kapanması ve böylece dosya sistmeindeki bozulmalar gibi sorunların da önüne geçmesini sağlar. Aksi takdirde gerçek bir makinanın çalışırken elektrik kesintisine maruz kalması gibi bir durum oluşur.

Sanal makinayı servis olarak çalıştıracak scripti oluşturmak için aşağıdaki kodlarda bulunana ‘!!’ ile başlayan kısımları gerektiği gibi değiştimeniz gerekmekte;

sudo nano /etc/init.d/virtualbox-!!KISAAD

komutu ile yine bir dosya açıp aşağıdaki kodları içindeki ‘!!’ ile başlayan yerleri gerekli şekilde değiştirerek kaydediyoruz.

#! /bin/sh
### BEGIN INIT INFO
# Provides: virtualbox-!!KISAAD
# Required-Start: $local_fs $remote_fs vboxdrv vboxnet
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: !!UZUNAD virtual machine
# Description: !!UZUNAD virtual machine hosted by VirtualBox
### END INIT INFO

# Author: Brendan Kidwell <[email protected]>
#
# Based on /etc/init.d/skeleton from Ubuntu 8.04.

# Do NOT “set -e”

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC=”!!UZUNAD virtual machine”
NAME=virtualbox-!!KISAAD
SCRIPTNAME=/etc/init.d/$NAME

MANAGE_CMD=VBoxManage
VM_OWNER=!!KULLANICI
VM_NAME=”!!SANALMAKINAADI” #This has to be the name exactly as it appears in your VirtualBox GUI control panel.

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started

sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo “$VM_NAME”|grep “^State:s*running” >/dev/null && {
echo “$VM_NAME” is already running.
return 1
}

sudo -H -u $VM_OWNER $MANAGE_CMD startvm “$VM_NAME” -type vrdp >/dev/null || {
echo Failed to start “$VM_NAME”.
return 2
}

echo “$VM_NAME” started or resumed.
return 0
}

#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred

sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo “$VM_NAME”|grep “^State:s*running” >/dev/null || {
echo “$VM_NAME” is already stopped.
return 1
}

sudo -H -u $VM_OWNER $MANAGE_CMD controlvm “$VM_NAME” savestate || {
echo Failed to stop “$VM_NAME”.
return 2
}

echo “$VM_NAME” suspended.
return 0
}

#
# Display “State” field from showinfo action
#
do_status()
{
sudo -H -u $VM_OWNER $MANAGE_CMD showvminfo “$VM_NAME”|grep “^State:s*.*$”
}

case “$1” in
start)
[ “$VERBOSE” != no ] && log_daemon_msg “Starting $DESC” “$NAME”
do_start
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ “$VERBOSE” != no ] && log_daemon_msg “Stopping $DESC” “$NAME”
do_stop
case “$?” in
0|1) [ “$VERBOSE” != no ] && log_end_msg 0 ;;
2) [ “$VERBOSE” != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the “reload” option is implemented then remove the
# ‘force-reload’ alias
#
log_daemon_msg “Restarting $DESC” “$NAME”
do_stop
case “$?” in
0|1)
do_start
case “$?” in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
status)
do_status
;;
*)
#echo “Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}” >&2
echo “Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}” >&2
exit 3
;;
esac

:

Yukarıdaki kod örneğinde ‘!!SANALMAKINAADI‘ kısmına dikkat etmek gerekmekte. Eğer VirtualBox sanal makinasının adını doğru vermezseniz script çalışmayacaktır. ‘!!KULLANICI‘ değişkenine de /etc/default/virtualbox dosyası içinde tanımladığımız kullanıcıyı belirtmemiz gerekmektedir. Bunun haricinde ki ‘!!KISAAD‘ ve ‘!!UZUNAD‘ değişkenleri tamamen sizin insiyatifinize kalmıştır.

Hazırladığınız bu scripti test etmek için

sudo /etc/init.d/virtualbox-!!KISAAD status # VM çalışıyor mu?
sudo /etc/init.d/virtualbox-!!KISAAD start # VM’i başlat.
rdesktop localhost # VM’e uzaktan eriş.
sudo /etc/inid.d/virtualbox-!!KISAAD stop # VM’i durdur.

komutlarını kullanabilirsiniz. Scriptin işlerliğini test ettikten sonra bu scripti rc’ye ekleyerek açılışta init.d ile otomatik olarak işletilmesini sağlayabilirsiniz.  Bunun için;

sudo update-rc.d virtualbox-!!KISAAD defaults

komutunu vermeniz yeterli olacaktır.

Not: Yukarıdaki kodların orjinal halini görmek için bu adrese bakınız: http://www.glump.net/howto/virtualbox_as_a_service