Digital Note

Grab a coffe, take a seat, maybe listen to some music and relax by reading our digital daily diary. We want to share our minds and know how with you and the whole world!

Blog phones

Script Autostart VirtualBox Machine di Ubuntu

Ini adalah lanjutan dari proyek membuat pc-remote, yang didalemnya terdapat virtul box untuk menjalankan windows xp. Dan ternyata tulisan saya tentang autostart virtual box virtual machine (VM), tidak seperti yang saya harapkan, karena startupĀ  application hanya akan dijalankan kalo kita login ke host nya terlebih dahulu. Sedangkan yang saya inginkan dari pc remote ini, yaitu hostnya (ubuntu) dan guestnya (windows) bisa langsung bisa diremote tanpa saya harus login ke guinya host. Jadi tulisan ini tentang bagaimana guest VM nya ikutan start dan stop jika Hostnya reboot, shutdown atau start.
Solusinya adalah dengan membuat init.d script , sehingga guest VM nya akan dikontrol sebagai sistem service.

Instal VirtualBox VM Service Script

Script ini saya modifikasi dari script nya Kevin Swanson yang ditampilkan disini.

Buat config file untuk vboxcontrol init.d script

# mkdir /etc/virtualbox
# touch /etc/virtualbox/machines_enabled

file machines_enabled ini berisi daftar nama dari Guest VM yang akan dijalankan secara otomatis. Daftarnya bisa kita dapatkan dari perintah :

$ VBoxManage list vms
"Mikrotik3.10" {1e8dfce2-2068-4922-9ce1-86925e31b5cf}
"Ubuntu 8.04" {c4050afb-7077-4c60-83e5-898d4ff8508e}
"HS-Win" {75d80d99-d9c5-41cf-9e88-1d1c3ef5dd4c}

Sehingga isi file machines_enabled adalah

# nano /etc/virtualbox/machines_enabled
"Mikrotik3.10"
"Ubuntu 8.04"
"HS-Win"

Buat VirtualBox VM init.d script
Buat script init.d baru dan beri permition untuk di eksekusi

# touch /etc/init.d/vboxcontrol
# chmod 755 /etc/init.d/vboxcontrol

Kopi script berikut ke /etc/init.d/vboxcontrol

#   Startup script for VirtualBox Virtual Machines
#
# update-rc.d defaults 98 02
# chkconfig: 345 98 02
# description: Manages VirtualBox VMs
# processname: vboxcontrol
#
# pidfile: /var/run/vboxcontrol/vboxcontrol.pid
#
### BEGIN INIT INFO
# Provides:       vboxcontrol
# Required-Start: $remote_fs $network
# Required-Stop:  $remote_fs
# Default-Start:  3 4 5 6
# Default-Stop:   0 1 6
# Short-Description: VirtualBox Linux kernel module
### END INIT INFO
#
# Version 20171126 by Aldo Expert  base on;
# Version 20120302 by ahmad basuki  base on:
# Version 20090301 by Kevin Swanson  based on:
# Version 2008051100 by Jochem Kossen
# http://farfewertoes.com
#
# Released in the public domain
#
# This file came with a README file containing the instructions on how
# to use this script.
#

################################################################################
# INITIAL CONFIGURATION
VBOXDIR="/etc/virtualbox"
VM_USER="vmadmin"
USE_NAT="no"

if [ `whoami` != "root" ]; then
	echo "Please root user or use sudo";
	echo "";
	exit;
fi

export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin"

if [ -f $VBOXDIR/config ]; then
. $VBOXDIR/config
fi

SU="su $VM_USER -c"
VBOXMANAGE="VBoxManage"

################################################################################
# FUNCTIONS

# Determine if USE_NAT is set to "yes"
use_nat() {
	if [ "$USE_NAT" = "yes" ]; then
	return `true`
	else
	return `false`
	fi
}

log_failure_msg() {
	echo $1
}

log_action_msg() {
	echo $1
}

# Check for running machines every few seconds; return when all machines are
# down
wait_for_closing_machines() {
	RUNNING_MACHINES=`$SU "$VBOXMANAGE list runningvms" | wc -l`
	if [ $RUNNING_MACHINES != 0 ]; then
		sleep 5
		wait_for_closing_machines
	fi
}

################################################################################
# RUN
case "$1" in
	start)
		if [ -f /etc/virtualbox/machines_enabled ]; then
			cat /etc/virtualbox/machines_enabled | while read VM; do
			log_action_msg "Starting VM: $VM ..."
			$SU "$VBOXMANAGE startvm "$VM" --type headless"
			RETVAL=$?
			done
			touch /var/lock/vboxcontrol
		fi
		;;
	stop)
		# NOTE: this stops all running VM's. Not just the ones listed in the
		# config
		$SU "$VBOXMANAGE list runningvms" |awk '{ print $1 }' | while read VM; do
			log_action_msg "Shutting down VM: $VM ..."
			$SU "$VBOXMANAGE controlvm "$VM" savestate"
			#$SU "$VBOXMANAGE controlvm "$VM" acpipowerbutton"
		done
		rm -f /var/lock/vboxcontrol
		#wait_for_closing_machines
		;;
	poweroff)
		# NOTE: this stops all running VM's. Not just the ones listed in the
		# config
		$SU "$VBOXMANAGE list runningvms" |awk '{ print $1 }' | while read VM; do
			log_action_msg "Shutting down VM: $VM ..."
			$SU "$VBOXMANAGE controlvm "$VM" poweroff"
		done
		rm -f /var/lock/vboxcontrol
		#wait_for_closing_machines
		;;
	start-vm)
		log_action_msg "Starting VM: $2 ..."
		$SU "$VBOXMANAGE startvm "$2" --type headless"
		;;
	stop-vm)
		log_action_msg "Stopping VM: $2 ..."
		$SU "$VBOXMANAGE controlvm "$2" savestate"
		;;
	poweroff-vm)
		log_action_msg "Powering off VM: $2 ..."
		$SU "$VBOXMANAGE controlvm "$2" poweroff"
		;;
	status)
		echo "The following virtual machines are currently running:"
		$SU "$VBOXMANAGE list runningvms" | while read VM; do
			echo -n "$VM ("
			echo -n `$SU "VBoxManage showvminfo ${VM%% *}|grep Name:|sed -e 's/^Name:s*//g'"`
			echo ')'
		done
		;;
	stat)
		$SU "$VBOXMANAGE list runningvms" | while read VM; do
		echo -n "$VM"
		done
		;;
	*)
		echo "Usage: $0 {start|stop|status|poweroff|start-vm|stop-vm|poweroff-vm|stat}"
		exit 3
esac

exit 0

Harap diperhatikan pada baris 28 yang bertulis VM_USER=”vmadmin supaya diganti dengan user anda yang memiliki list vm
Kemudian tambahkan vboxcontrol ke daftar startup service

# update-rc.d vboxcontrol defaults 98 02

Jika akan menghapus dari startup service

# update-rc.d -f vboxcontrol remove

Cara penggunaan:

Menjalankan semua virtual machine yang terdaftar dalam file machines_enabled

# /etc/init.d/vboxcontrol start

Mematikan semua virtual machine yang sedang running

# /etc/init.d/vboxcontrol stop

Melihat status virtual maschine yang running

# /etc/init.d/vboxcontrol status

Menyalakan virtual machine tertentu

# /etc/init.d/vboxcontrol start-vm

Mematikan virtual machine tertentu

# /etc/init.d/vboxcontrol stop-vm

Mematikan power virtual machine tertentu

# /etc/init.d/vboxcontrol poweroff-vm

Pada script asli option stop akan mengirimkan sinyal acpipowerbutton, sedangkan pada host saya option tersebut tidak jalan, sehingga saya menggantinya dengan option savestate.

Tags: , ,

Trackback from your site.

Leave a comment