LINUX.ORG.RU
ФорумAdmin

[gentoo][VirtualBox]запуск виртуальных машин при старте

 ,


0

1

есть сервер, который планируется использовать в продакшене, на нем gentoo без иксов. Нужно при старте запускать 1 или несколько VirtualBox-машин через VBoxHeadless. Как я понял после грепанья документации виртуалбокса, там автозапуск нигде не предусмотрен в принципе, так что видимо придется самому писать init-скрипт. Есть ли у кого-то подобный опыт использования виртуалбокса, будет ли это все работать ? :)

★★★★★

УМВР, причём достаточно добавить в rc.local

adriano32 ★★★
()
[ blackst0ne at blackberry: ~ ]% ll /etc/local.d/virtualbox.*    
-rwxr-xr-x 1 root root 128 Oct  3 16:40 /etc/local.d/virtualbox.start*
-rwxr-xr-x 1 root root 139 Oct  3 16:45 /etc/local.d/virtualbox.stop*
[ blackst0ne at blackberry: ~ ]% cat /etc/local.d/virtualbox.start
#! /bin/sh

# Start virtual machines

/bin/su -c 'nohup VBoxHeadless --startvm "VM_NAME" &' USER_NAME >/dev/null 2>&1
[ blackst0ne at blackberry: ~ ]% cat /etc/local.d/virtualbox.stop 
#! /bin/sh

# Stop virtual machines

/bin/su -c 'nohup VBoxManage controlvm "VM_NAME" acpipowerbutton' USER_NAME >/dev/null 2>&1

VM_NAME - имя виртуальной машины.
USER_NAME - имя пользователя, из-под которого запускается виртуальная машина.

blackst0ne ★★★★★
()

писать init-скрипт.

Всё уже украдено до нас.

/etc/init.d/virtualbox

#!/sbin/runscript

# Not sure why but gentoo forgot to add /opt/bin to the path.
VBOXPATH="/usr/bin:/opt/bin"
VBOXNAME="${SVCNAME#*.}"

depend() {
	need net
	
	if [ "${SVCNAME}" != "virtualbox" ] ; then 
		need virtualbox
	fi
}


checkconfig() {
	if [ ! -r /etc/conf.d/$SVCNAME ] ; then
		eerror "Please create /etc/conf.d/$SVCNAME"
		eerror "Sample conf: /etc/conf.d/virtualbox.example"
		return 1
	fi

	return 0
}

checkpath() {
	local r=0

	if ! su $VM_USER -c "PATH=$VBOXPATH command -v VBoxHeadless &>/dev/null" ; then
		eerror "Could not locate VBoxHeadless"
		r=1
	fi

	if ! su $VM_USER -c "PATH=$VBOXPATH command -v VBoxManage &>/dev/null" ; then
		eerror "Could not locate VBoxManage"
		r=1
	fi

	if [ $r -gt 0 ] ; then 
		eerror "Please verify the vm users path."
	fi

	return $r
}

isloaded() {
	lsmod | grep -q "$1[^_-]"
}

isvm() {
	[ $SVCNAME != "virtualbox" ]
}

loadmodules() {
	if ! isloaded vboxdrv ; then
		if ! modprobe vboxdrv > /dev/null 2>&1 ; then
			eerror "modprobe vboxdrv failed."
			return 1
		fi
	fi 

	if ! isloaded vboxnetflt ; then
		if ! modprobe vboxnetflt > /dev/null 2>&1 ; then
			eerror "modprobe vboxnetflt failed."
			return 1
		fi
	fi
	
	return 0
}

unloadmodules() {
	if isloaded vboxnetflt ; then
		if ! rmmod vboxnetflt > /dev/null 2>&1 ; then
			eerror "rmmod vboxnetflt failed."
			return 1
		fi
	fi

	if isloaded vboxdrv ; then
		if ! rmmod vboxdrv > /dev/null 2>&1 ; then
			eerror "rmmod vboxdrv failed."
			return 1
		fi
	fi 

	return 0
}

start() {
	# If we are the original virtualbox script [ $SVCNAME = "virtualbox" ]
	if ! isvm ; then
		ebegin "Starting Virtualbox"
		loadmodules
		eend $?
	else
		checkconfig || return $?
		checkpath   || return $?

		ebegin "Starting Virtualbox: $VBOXNAME"
		su $VM_USER -c "PATH=$VBOXPATH nice -n $VM_NICE VBoxHeadless -startvm \"$VM_NAME\" -vrdp on -vrdpaddress 0.0.0.0 &>/tmp/vbox.log" &
		pid=$!
		sleep 1
		
		kill -CHLD $pid &>/dev/null
		eend $?
	fi
}

stop() {
	# If we are the original virtualbox script [ $SVCNAME = "virtualbox" ]
	if ! isvm ; then
		ebegin "Stopping Virtualbox"
		unloadmodules
		eend $?
	else
		checkconfig || return $?
		checkpath   || return $?

		ebegin "Stopping Virtualbox: $VBOXNAME"
		su ${VM_USER} -c "PATH=$VBOXPATH VBoxManage controlvm \"$VM_NAME\" $VM_SHUTDOWN &>/dev/null"

                while [ "$(su ${VM_USER} -c "PATH=$VBOXPATH VBoxManage showvminfo \"$VM_NAME\" | grep State | grep runn")" != "" ]
                do
                    echo -n "."
                    sleep 1
                done

		sleep 1
                echo

		eend $?
	fi
}

/etc/conf.d/virtualbox.example

# Username to start vbox as, must be part of vboxusers group.
VM_USER="nobody"

# Virtual Machine Name
VM_NAME="Windows XP"

# Shutdown Method: pause|resume|reset|poweroff|savestate|acpipowerbutton|acpisleepbutton
VM_SHUTDOWN="savestate"

# Nice Priority: -20 (most favorable scheduling) to 19 (least favorable)
VM_NICE=0

UserUnknown ★★★★★
()
Ответ на: комментарий от AnDoR

> Тьфу, кто ж переменные в шелле так обозначает?

Это не переменные, это я вручную заменил специально для ЛОРа.
В реальном скрипте там явно указан user и явно указано настоящее название ВМ.

blackst0ne ★★★★★
()
Ответ на: комментарий от UserUnknown

спасибо, а хде копирайт, кто автор? :)

но какие-то изменения придется внести, напр. у меня модули указаны в /etc/conf.d/modules, так что нужно выпилить функцию loadmodules() и добавить в need modules.

В общем, сделаю свой вариант, покажу здесь

Harald ★★★★★
() автор топика
Ответ на: комментарий от uzbl

Ну и что? У нас сервер с вбоксом и мордой phpvirtualbox. На баги не наступали - всё работает хорошо уже около года.

sergej ★★★★★
()

#!/bin/bash
echo «стартуем витруалки»
for VB in 2003 2008 XP ; do
ssh user@server «VBoxHeadless -s $VB 2>&1 > /dev/null &»
done
echo «ждем запуска»
sleep 60
«стартуем рдп-клеенты»
for ip in {1..3}; do
xfreerdp -u <user> -p <passwd> 192.168.111.«$ip»
done

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.