From 416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 Mon Sep 17 00:00:00 2001 From: Sebastian Schmelzer Date: Thu, 2 Sep 2010 17:50:49 +0200 Subject: change dir structure --- .../plugins/virtualbox/OpenSLX/Distro/Base.pm | 59 ++++ .../plugins/virtualbox/OpenSLX/Distro/Debian.pm | 52 +++ .../plugins/virtualbox/OpenSLX/Distro/Suse.pm | 48 +++ .../plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm | 54 +++ .../virtualbox/OpenSLX/OSPlugin/virtualbox.pm | 284 ++++++++++++++++ src/os-plugins/plugins/virtualbox/XX_virtualbox.sh | 98 ++++++ .../plugins/virtualbox/files/empty-diff.vdi.gz | Bin 0 -> 282 bytes .../plugins/virtualbox/files/machine.include | 132 ++++++++ .../plugins/virtualbox/files/run-virt.include | 372 +++++++++++++++++++++ .../plugins/virtualbox/files/rwimg.vdi.gz | Bin 0 -> 268 bytes .../plugins/virtualbox/files/virtualbox.include | 47 +++ .../init-hooks/20-nw-bridge-config/bridge.sh | 30 ++ 12 files changed, 1176 insertions(+) create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm create mode 100644 src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm create mode 100644 src/os-plugins/plugins/virtualbox/XX_virtualbox.sh create mode 100644 src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz create mode 100644 src/os-plugins/plugins/virtualbox/files/machine.include create mode 100644 src/os-plugins/plugins/virtualbox/files/run-virt.include create mode 100644 src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz create mode 100644 src/os-plugins/plugins/virtualbox/files/virtualbox.include create mode 100644 src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh (limited to 'src/os-plugins/plugins/virtualbox') diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm new file mode 100644 index 00000000..d26cdfcc --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Base.pm @@ -0,0 +1,59 @@ +# Copyright (c) 2009 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# virtualbox/OpenSLX/Distro/Base.pm +# - provides base implementation of the Distro API for the VirtualBox plugin. +# ----------------------------------------------------------------------------- +package virtualbox::OpenSLX::Distro::Base; + +use strict; +use warnings; + +our $VERSION = 1.01; # API-version . implementation-version + +use Scalar::Util qw( weaken ); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ +sub new +{ + my $class = shift; + my $self = {}; + return bless $self, $class; + +} + +sub initialize +{ + my $self = shift; + $self->{engine} = shift; + weaken($self->{engine}); + # avoid circular reference between plugin and its engine + + return 1; +} + +sub installVbox +{ + my $self = shift; + + my $engine = $self->{'engine'}; + + # lets try it... we can't loose anything :) + $engine->installPackages('virtualbox-ose'); + + return; +} + +1; diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm new file mode 100644 index 00000000..edd117ca --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Debian.pm @@ -0,0 +1,52 @@ +# Copyright (c) 2009 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# virtualbox/OpenSLX/Distro/debian.pm +# - provides Debian-specific overrides of the Distro API for the VirtualBox +# plugin. +# ----------------------------------------------------------------------------- +package virtualbox::OpenSLX::Distro::Debian; + +use strict; +use warnings; + +use base qw(virtualbox::OpenSLX::Distro::Base); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ + +sub installVbox +{ + my $self = shift; + + my $engine = $self->{'engine'}; + my $release = `lsb_release -rs`; + chomp($release); + + # lenny(5.0) has v1.6 + # testing is ok. but no clue which lsb_release -rs it has... + if ( $release eq "999999.0") { + #the usual "in stage1 chroot we get another kernel vers. problem" + # kernel modules need to be installed from the cloned system + #$engine->installPackages('virtualbox-ose'); + #system('/etc/init.d/virtualbox-ose setup'); + } else { + print "Couldn't install VirtualBox, no package from distribution\n"; + exit; + } + + return; +} + +1; diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm new file mode 100644 index 00000000..9af3191e --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Suse.pm @@ -0,0 +1,48 @@ +# Copyright (c) 2009 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# virtualbox/OpenSLX/Distro/Suse.pm +# - provides SUSE specific overrides of the distro API for the VirtualBox +# plugin. +# ----------------------------------------------------------------------------- +package virtualbox::OpenSLX::Distro::Suse; + +use strict; +use warnings; + +use base qw(virtualbox::OpenSLX::Distro::Base); + +use OpenSLX::Basics; +use OpenSLX::Utils; + +################################################################################ +### interface methods +################################################################################ + +sub installVbox +{ + my $self = shift; + + my $engine = $self->{'engine'}; + # should be replaced by proper function + my $release = `lsb_release -rs`; + chomp($release); + + if ( $release eq "11.1" || $release eq "11.0" || $release eq "10.3") { + $engine->installPackages('virtualbox-ose'); + } else { + print "Couldn't install VirtualBox, no package from distribution\n"; + exit; + } + + return; +} + +1; diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm new file mode 100644 index 00000000..44695680 --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/Distro/Ubuntu.pm @@ -0,0 +1,54 @@ +# Copyright (c) 2008 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# virtualbox/OpenSLX/Distro/Ubuntu.pm +# - provides Ubuntu-specific overrides of the Distro API for the virtualbox +# plugin. +# ----------------------------------------------------------------------------- +package virtualbox::OpenSLX::Distro::Ubuntu; + +use strict; +use warnings; + +# inherit everything from Debian (as Ubuntu is based on it anyway) +use base qw(virtualbox::OpenSLX::Distro::Debian); +use base qw(virtualbox::OpenSLX::Distro::Base); + +use OpenSLX::Basics; +use OpenSLX::Utils; + + +################################################################################ +#### interface methods +################################################################################ +sub installVbox +{ + my $self = shift; + + my $engine = $self->{'engine'}; + my $release = `lsb_release -rs`; + chomp($release); + + # hardy (8.04LTS): only version VBox v1.5 + if ( $release eq "8.10" || $release eq "9.04") { + #the usual "in stage1 chroot we get another kernel vers. problem" + # kernel modules need to be installed from the cloned system + #$engine->installPackages("virtualbox-ose"); + #system('/etc/init.d/virtualbox-ose setup'); + } else { + print "Couldn't install VirtualBox, no package from distribution!\n"; + exit; + } + + + return; +} + +1; diff --git a/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm new file mode 100644 index 00000000..07ec9dc0 --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm @@ -0,0 +1,284 @@ +# Copyright (c) 2009..2010 - RZ Uni Freiburg +# Copyright (c) 2009..2010 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your suggestions, praise, or complaints to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org/ +# ----------------------------------------------------------------------------- +# virtualbox.pm +# - declares necessary information for the virtualbox plugin +# ----------------------------------------------------------------------------- +package OpenSLX::OSPlugin::virtualbox; + +use strict; +use warnings; + +use base qw(OpenSLX::OSPlugin::Base); + +use File::Basename; +use File::Path; + +use OpenSLX::Basics; +use OpenSLX::Utils; +use OpenSLX::DistroUtils; + +sub new +{ + my $class = shift; + my $self = { + name => 'virtualbox', + }; + + return bless $self, $class; +} + +sub getInfo +{ + my $self = shift; + + return { + description => unshiftHereDoc(<<' End-of-Here'), + Module for enabling services for the VirtualBox on an OpenSLX + stateless client. + End-of-Here + precedence => 70, + # headless mode does not require a desktop! + #required => [ qw( desktop ) ], + }; +} + +sub getAttrInfo +{ + # Returns a hash-ref with information about all attributes supported + # by this specific plugin + my $self = shift; + + # This default configuration will be added as attributes to the default + # system, such that it can be overruled for any specific system by means + # of slxconfig. + return { + # attribute 'active' is mandatory for all plugins + 'virtualbox::active' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + should the 'virtualbox'-plugin be executed during boot? + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '1 for active, 0 for inactive', + default => '1', + }, + # attribute 'imagesrc' defines where we can find virtualbox images + 'virtualbox::imagesrc' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Where do we store our virtualbox images? NFS? Filesystem? + End-of-Here + content_regex => qr{^(/|nfs://)}, + content_descr => 'local path or URI or "-" (unset)', + default => undef, + }, + # attribute 'bridge' defines if bridged network mode should be + # switched on + # TODO: change to net -> nat, bridge, hostonly? + # TODO: since we use def in XML maybe use to override + 'virtualbox::bridge' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Should the bridging (direct access of the virtualbox clients + to the ethernet the host is connected to) be enabled + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '0 or 1', + default => '1', + }, + # attribute 'mem' defines if memory should be forced + 'virtualbox::mem' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to force a ralative amount of RAM? + (Not implemented right now!) + End-of-Here + content_regex => qr{^(\d\d??)$}, + content_descr => 'Between 0 - 99', + default => undef, + }, + # attribute 'kvm' defines if KVM modules should be forced + 'virtualbox::kvm' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to force the usage of KVM modules where applicable? + (Not implemented right now!) + End-of-Here + content_regex => qr{^(0|1)$}, + content_descr => '0 or 1', + default => undef, + }, + # attribute 'tftpdir' defines TFTP dir for network boots /w NAT + 'virtualbox::tftpdir' => { + applies_to_systems => 1, + applies_to_clients => 1, + description => unshiftHereDoc(<<' End-of-Here'), + Do you want to define a stage 4 TFTP dir for netwoork boots when + using NAT? + Hint: Mount your TFTP ro via NFS to a local dir + End-of-Here + content_regex => qr{^(/)}, + content_descr => 'local path or "-" (unset)', + default => '/var/lib/virt/virtualbox', + }, + }; +} + +sub installationPhase +{ + my $self = shift; + my $info = shift; + + $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'}; + $self->{pluginTempPath} = $info->{'plugin-temp-path'}; + $self->{openslxBasePath} = $info->{'openslx-base-path'}; + $self->{openslxConfigPath} = $info->{'openslx-config-path'}; + $self->{attrs} = $info->{'plugin-attrs'}; + + my $engine = $self->{'os-plugin-engine'}; + + # Different names of the tool (should be unified somehow!?) + if (!isInPath('VirtualBox')) { + # todo: fix this + $self->{distro}->installVbox(); + } + if (!isInPath('VirtualBox')) { + print + "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n" + ; + #exit + } + + $self->_writeRunlevelScript(); + + # Copy run-virt.include and template files to the appropriate place for + # inclusion in stage4 + my $pluginName = $self->{'name'}; + my $pluginBasePath = + "$self->{openslxBasePath}/lib/plugins/$pluginName/files"; + foreach my $file ( qw( run-virt.include virtualbox.include machine.include + empty-diff.vdi.gz rwimg.vdi.gz ) ) { + copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/"); + chmod 0644, "$self->{pluginRepositoryPath}/$file"; + } + + return; +} + +sub removalPhase +{ + my $self = shift; + my $info = shift; + + return; +} + +sub checkStage3AttrValues +{ + my $self = shift; + my $stage3Attrs = shift; + my $vendorOSAttrs = shift; + #my @problems; + + #my $vmimg = $stage3Attrs->{'virtualbox::imagesrc'} || ''; + + return; +} + +# Write the runlevelscript +sub _writeRunlevelScript +{ + my $self = shift; + my $initfile = newInitFile(); + my $script = ""; + + $initfile->setName("vbox-slx"); + $initfile->setDesc("Setup environment for virtualbox. Part of OpenSLX virtualbox plugin."); + + # todo: Function need to be formated proper... not important right now + $initfile->addFunction( + 'running', + 'lsmod | grep -q "$1[^_-]"' + ); + # + $script = unshiftHereDoc(<<' End-of-Here'); + if running vboxdrv; then + if running vboxnetflt; then + echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded." + else + echo "VirtualBox kernel module is loaded." + fi + #TODO: check it: ignore user check. handling our own way: + for i in /tmp/.vbox-*-ipc; do + echo "Running: " + $(VBoxManage -q list runningvms | sed -e 's/^".*"//' 2>/dev/null) + done + else + echo "VirtualBox kernel module(s) are not loaded." + fi + End-of-Here + $initfile->addFunction( + "vmstatus", + "$script" + ); + $initfile->addFunction( + 'start', + ' modprobe -qa vboxdrv vboxnetflt vboxnetadp', + ); + $initfile->addFunction( + 'stop', + ' rmmod vboxnetadp vboxnetflt vboxdrv', + ); + $initfile->addToCase( + 'start', + 'start' + ); + $initfile->addToCase( + 'stop', + 'stop' + ); + $initfile->addToCase( + 'status', + 'vmstatus' + ); + $initfile->addToCase( + 'restart', + 'stop && start' + ); + + # get distro version + my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0]; + my $runlevelscript = getInitFileForDistro($initfile, $distro); + + spitFile("$self->{'pluginRepositoryPath'}/vbox-slx", $runlevelscript); +} + +# The bridge configuration needs the bridge module to be present in early +# stage3 +sub suggestAdditionalKernelModules +{ + my $self = shift; + my $makeInitRamFSEngine = shift; + + my @suggestedModules; + + push @suggestedModules, qw( bridge ); + + return @suggestedModules; +} + +1; diff --git a/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh b/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh new file mode 100644 index 00000000..b54b4bec --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/XX_virtualbox.sh @@ -0,0 +1,98 @@ +# Copyright (c) 2009..2010 - RZ Uni Freiburg +# Copyright (c) 2009..2010 - OpenSLX GmbH +# +# This program/file is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your feedback to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org +# +# script is included from init via the "." load function - thus it has all +# variables and functions available + +# include default directories +. /etc/openslx.conf + +CONFFILE=/initramfs/plugin-conf/virtualbox.conf +PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox +PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox +VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/virtualbox + +# check if the configuration file is available +if [ -e ${CONFFILE} ]; then + + # load needed variables + . ${CONFFILE} + + # Test if this plugin is activated... more or less useless with the + # new plugin system + if [ $virtualbox_active -ne 0 2>/dev/null ]; then + + [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'virtualbox' os-plugin ..."; + + # load general configuration + . /etc/initramfs-setup + + # get source of virtualbox image server (get type, server and path) + if strinstr "/" "${virtualbox_imagesrc}" ; then + vbimgprot=$(uri_token ${virtualbox_imagesrc} prot) + vbimgserv=$(uri_token ${virtualbox_imagesrc} server) + vbimgpath="$(uri_token ${virtualbox_imagesrc} path)" + fi + if [ -n "${vbimgserv}" ] ; then + # directory where qemu images are expected in + mnttarget=${VIRTDIR} + # mount the virtualbox image source readonly (ro) + fsmount ${vbimgprot} ${vbimgserv} ${vbimgpath} ${mnttarget} ro + else + [ $DEBUGLEVEL -gt 1 ] && \ + error " * Incomplete information in variable ${virtualbox_imagesrc}." \ + nonfatal + fi + + # copy virtualization include files to config dir + testmkd ${PLUGINCONFDIR} + cp ${PLUGINDIR}/*.include ${PLUGINCONFDIR} + # copy ${CONFFILE} to ${PLUGINCONFDIR} just in case + cp ${CONFFILE} ${PLUGINCONFDIR} + +# # TODO: create rawdisk if requested +# # create raw disk +# for part in $(grep -qE " 44 | 45 " /etc/disk.partition); do +# case "${part}" in +# * 45 *) +# id4x=$(grep " 45 " /etc/disk.partition | grep -E " 44 | 45 " \ +# | awk '{print $1}' | cut -c -8) +# break +# ;; +# * 44 *) +# id4x=$(grep " 44 " /etc/disk.partition | grep -E " 44 | 45 " \ +# | awk '{print $1}' | cut -c -8) +# break +# ;; +# esac +# if [ -n "${id4x}" ]; then +# mount --bind /dev /mnt/dev +# chroot /mnt VBoxManage -q internalcommands createrawvmdk -filename \ +# ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk -rawdisk ${id4x} +# chmod 777 ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk +# umount -f /mnt/dev 2>/dev/null +# fi + + # copy and activate init file + cp ${PLUGINDIR}/vbox-slx /mnt/etc/init.d/ + chmod 755 /mnt/etc/init.d/vbox-slx + rllinker "vbox-slx" 20 2 + + mknod -m 0660 /dev/vboxdrv c 10 59 + chown root:vboxusers /dev/vboxdrv + + # finished ... + [ $DEBUGLEVEL -gt 0 ] && echo "done with 'virtualbox' os-plugin ..." + fi +else + [ $DEBUGLEVEL -gt 0 ] \ + && echo " * Configuration of 'virtualbox' plugin failed" +fi diff --git a/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz b/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz new file mode 100644 index 00000000..24697b58 Binary files /dev/null and b/src/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz differ diff --git a/src/os-plugins/plugins/virtualbox/files/machine.include b/src/os-plugins/plugins/virtualbox/files/machine.include new file mode 100644 index 00000000..96acd7a2 --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/files/machine.include @@ -0,0 +1,132 @@ +# Include file (machine template) for run-virt.include of the virtualbox plugin +cat << EOF > "${machconfig}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <${network_kind}/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EOF diff --git a/src/os-plugins/plugins/virtualbox/files/run-virt.include b/src/os-plugins/plugins/virtualbox/files/run-virt.include new file mode 100644 index 00000000..53120f2c --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/files/run-virt.include @@ -0,0 +1,372 @@ +# run-virt.include +# ----------------------------------------------------------------------------- +# Copyright (c) 2009..2010 - RZ Uni Freiburg +# Copyright (c) 2009..2010 - OpenSLX GmbH +# +# This program/file is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your feedback to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org +# ----------------------------------------------------------------------------- +# run-virt.include +# - Include script for running the VirtualBox on an OpenSLX client via the +# run-virt.sh or run-vmgrid.sh +################################################################################ + +################################################################################ +### Include general configuration +################################################################################ +if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then + . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf +else + writelog "Problems reading config file of ${self} plugin" + exit 1 +fi + +################################################################################ +### Declaration of default variables +################################################################################ + +PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}" +PLUGINDIRVIRTUALBOX="${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}" +# create TMPDIR for all users +TMPDIR=/tmp/${self} +mkdir -m 1777 ${TMPDIR} 2>/dev/null +# dir for configs +confdir="/tmp/${self}/${USER}/${VM_ID}" +# use alternate configuration directory instead of $HOME/.VirtualBox +export VBOX_USER_HOME=${confdir} +# define dirs and files which can be removed after exit, be carefull! +RMDIRS="${snapshotdir} ${confdir} /tmp/.vbox-${USER}-ipc" +rm -rf ${RMDIRS} 2>/dev/null +machfolder="${confdir}/Machines" +# use vm_shortname for dir and config names since vm_name can be very long +machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml" +diskfolder="${confdir}/HardDisks" +snapshotdir=${machfolder}/${vm_shortname}/Snapshots +mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null +# check if diskless var empty? +[ -z "${diskless}" ] && diskless=0 + +# configure our own rwimg, empty image which we support +if [ "${imgmode}" = "rwimg" ]; then + # what is our rwimg called? + imgname="${vm_shortname}.vdi" + vmpath=${imgpath}/${imgname} + if ! [ -e "${vmpath}" ]; then + cat ${PLUGINDIRVIRTUALBOX}/rwimg.vdi.gz | gunzip > "${vmpath}" + fi +fi + +# link to image +diskfile="${diskfolder}/${imgname}" +[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile} + +# check the file type +if echo ${imgname} | grep -qiE "vdi|vmdk|vhd" && [ ${diskless} -eq 0 ]; then + imgfmt=$(echo ${imgname##*.} | tr [a-z] [A-Z]) +elif [ ${diskless} -eq 0 ]; then + writelog "${imgname} is not a valid image format (vdi|vmdk|vhd), exiting!" + cleanexit 1 +fi + +# TODO: maybe rewrite, to reduce checks, merge it with network option, +# so we can have a "compatibility to vmware config" section +case "${vmostype}" in + winxp*|windowsxp*) + vmostype="WindowsXP" + ;; + winvista*|windowsvista*) + vmostype="WindowsVista" + ;; + windows7*) + vmostype="Windows7" + ;; + linux*|*ubuntu*|*suse*|debian*|*sci*) + if echo "${vmostype}" | grep -q "64"; then + vmostype="Linux26_64" + # check for vtflag + if [ ${vtflag} -ne 1 ]; then + writelog "You are trying to boot a 64 bit OS without a VT enabled CPU" + writelog "This is not supported, exiting!" + cleanexit 1 + fi + # check if host is only 32 bit, then use only 1 cpu (only 1 supported) + if echo "${host_arch}" | grep -qE "i.86"; then + cpu_cores=1 + fi + else + vmostype="Linux26" + fi + ;; +esac + +writelog "Directories:" +writelog "\tConfig dir:\t\t$confdir" +writelog "\tMachines dir:\t\t$machfolder" +writelog "\tMachine config:\t\t$machconfig" +[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder" + +################################################################################ +### Hardware checks +################################################################################ + +# remove ':' from MAC addr for vbox +macaddr=$(echo ${macaddr} | sed 's/://g') + +# machine UUID, MAC addr part of it +machineuuid="00000000-0000-0000-0000-${macaddr}" +# cosmetical, since UUID in lower case +machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z]) +# get UUID of VBox image, if not diskless +[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \ + | grep UUID | awk '{print $2}') +# make disk immutable +imgtype="Immutable" +# snapshot UUID is static +snapshotuuid="88bc8b6d-f248-468a-95fe-318084904f8b" +# imageuuid in machine.include, dafault snapshotuuid +imageuuid=${snapshotuuid} + +# check if rw image +# remove disk and add rwimg if set +if echo "${imgmode}" | grep -q rw; then + # lock existing? + if [ -e "${vmpath}.lock" ]; then + writelog "This rw image is already in use." + writelog "Found lock: ${vmpath}.lock, exiting!" + writelog "Remove lock if you are sure that this is not the case" + cleanexit 1 + # image rw? + elif ! [ -w ${vmpath} ]; then + writelog "You defined mode rw, but image ${vmpath} is not rw! \c" + writelog "Please correct, exiting!" + cleanexit 1 + fi + # add lock + touch "${vmpath}.lock" + # remove lock after VM stopped + RMDIRS="${RMDIRS} ${vmpath}.lock" + imgtype="Normal" + # replace image uuid in machine config + imageuuid=${diskuuid} +elif [ ${diskless} -eq 0 ]; then + # use temp disk as snapshot + cat ${PLUGINDIRVIRTUALBOX}/empty-diff.vdi.gz \ + | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi" +fi + +# TODO: MEM muss noch angepasst werden. Maschine crasht wenn nehr als 50% MEM +# memory part equal to vmware plugin +# percentage of memory to use for virtualbox in standard case +#if [ -n "${forcemem}" ]; then +# mem="${forcemem}" +#else +# permem=30 +# if [ "${totalmem}" -ge "1600" ]; then +# permem=40 +# fi +# # check if /tmp is on harddisk +# if grep -qe "/dev/.* /tmp " /proc/mounts ; then +# permem=60 +# id44="1" +# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well +# # (40% vmware | 40% confdir(vmem...) | 20% host +# # VMplayer 2+ issue +# # TODO: makes this sense for vbox? +# #if [ "${totalmem}" -ge "2500" ]; then +# #permem=40 +# #rmdir ${snapshotdir} +# #snapshotdirold=${snapshotdir} +# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID} +# #mkdir -p ${snapshotdir} +# #ln -sf ${snapshotdir} ${snapshotdirold} +# #fi +# fi +# mem=$(expr ${totalmem} / 100 \* ${permem}) +# if [ "${id44}" = "1" ]; then +# hostmem=$(expr ${totalmem} - ${mem}) +# else +# hostmem=$(expr ${totalmem} - ${mem} - ${mem}) +# fi +# #permem=40 +# #mem=$(expr ${totalmem} * ${permem}) +# if [ "${mem}" -lt "256" ] || [ "${hostmem}" -lt "256" ]; then +# writelog "Memory out of range: ${mem} MB (guest) / ${hostmem} MB (host)!" +# writelog "Min. 256 MB for host and guest!" +# cleanexit 1 +# fi +#fi + +# translate network cards +case "${network_card}" in + e1000) + vb_network_card="82540EM" + ;; + virtio) + vb_network_card="virtio" + ;; + *) + network_card="pcnet" + vb_network_card="Am79C973" +esac + +# translate network kinds (nat, bridged, host-only) +case "${network_kind}" in + bridge*) + network_kind='BridgedInterface name="br0"' + ;; + host*) + network_kind='HostOnlyInterface name="vboxnet0"' + ;; + *) + network_kind="NAT" +esac + +# translate boot, use if set else set to HardDisk +# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network +# support nfs and tftp as well +case ${boot} in + n*|tftp) + boot="Network" + if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then + # use vm_shortname to avoid Problems /w TFTP in NAT + vm_name=${vm_shortname} + # link TFTP dir for NAT TFTP boots + mkdir -p ${confdir}/TFTP + if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then + cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe + else + writelog "${virtualbox_tftpdir}/pxelinux.0 not found!" + writelog "Network boot won't work, exiting!" + cleanexit 1 + fi + for i in $(ls ${virtualbox_tftpdir}); do + ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i} + done + fi + ;; + # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM + *) + boot="HardDisk" + ;; +esac + +# nested paging +npaging="false" +# enable VT +enablevt="false" +# check for VT, if not available use only 1 cpu (only 1 supported) +[ ${vtflag} -eq 0 ] && cpu_cores=1 +[ ${vtflag} -eq 1 ] && enablevt="true" + +# external GUI +vrdpport=${remotedesktopport} + +[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir" +writelog "Diskimage:" +[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile" +[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt" +[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype" + writelog "\tVMostype:\t\t$vmostype" + writelog "\tMachine UUID:\t\t$machineuuid" +[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid" +writelog "Virtual Hardware:" +writelog "\tCPU cores:\t\t${cpu_cores}\c" +[ ${vtflag} -eq 0 ] && writelog "" +[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)" +writelog "\tGuest RAM:\t\t${mem} MB" +# echo nur wenn hostmem gesetzt +[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB" +writelog "\tMAC address:\t\t$macaddr" +writelog "\tNetwork card:\t\t${vb_network_card}" +writelog "\tNetwork kind:\t\t${network_kind}" +writelog "\tBooting from:\t\t${boot}\c" +[ ${diskless} -eq 0 ] && writelog "" +[ ${diskless} -eq 1 ] && writelog " 'diskless'" +# TODO: server start activate via xml, etc... +#writelog "\tGuest VRDP port:\t${vrdpport}" +writelog "\tCD-ROM1:\t\t${cdrom0}" +#writelog "\tCD-ROM2:\t\t${cdrom1}" +#writelog "\tFloppy_A:\t\t${floppy0}" +#writelog "\tFloppy_B:\t\t${floppy1}" +# defined in run-virt.sh and run-vmgrid.sh +writelog "\tShared Folders '${sharename}':\t${sharepath}" + +################################################################################ +### Pepare and configure virtual machine and disk image +################################################################################ + +# create Virtualbox.xml +. ${PLUGINCONFVIRTUALBOX}/virtualbox.include + +# remove snapshot disk when using rw images +if [ "${imgtype}" != "Immutable" ]; then + sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml" +fi + +# TODO: add rawdisk if requested +#"raw.vmdk" format="VMDK" type="Writethrough"/> + +# create machine.xml +. ${PLUGINCONFVIRTUALBOX}/machine.include + +# remove CD-ROM +if [ "${cdrom0}" != "TRUE" ]; then + sed -i "/HostDrive/d" ${machconfig} + sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig} + sed -i "//d" ${machconfig} +fi + +# if diskless remove all disks +if [ ${diskless} -eq 1 ]; then + sed -i "//d" ${machconfig} +fi + +# define redirects +if [ ${redirects} -ge 1 ]; then + (( i=1 )) + writelog "\tGuest redirects:\t\c" + while [ ${i} -le ${redirects} ]; do + extradataitem='" + extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>" + extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>" + sed -i "s,, ${extradataitem}${extradataguestport}\n\ + ${extradataitem}${extradatahostport}\n\ + ${extradataitem}${extradataprotocol}\n\ + ," "${machconfig}" + writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}" + tabspace='\t\t\t\t' + (( i=$i+1 )) + done +fi + +################################################################################ +### finally set env for run-virt.sh +################################################################################ + +# wait for a certain command to settle +# get the PID of the right process +# kill PID, seems to work +VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\ + | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/") +for i in $(echo ${VBMANPID}); do + kill -9 ${VBMANPID} >/dev/null 2>&1 +done + +# set the variables appropriately (several interfaces with different names) +VIRTCMD=$(which VirtualBox 2>/dev/null) +VIRTCMDOPTS="--startvm ${machineuuid} --start-running" + +# set headless mode (-v off to disable vrdp) +VIRTCMDHL=$(which VBoxHeadless 2>/dev/null) +VIRTCMDOPTSHL="-s ${machineuuid}" diff --git a/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz b/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz new file mode 100644 index 00000000..e2133d6d Binary files /dev/null and b/src/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz differ diff --git a/src/os-plugins/plugins/virtualbox/files/virtualbox.include b/src/os-plugins/plugins/virtualbox/files/virtualbox.include new file mode 100644 index 00000000..9576fc9c --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/files/virtualbox.include @@ -0,0 +1,47 @@ +# Include file (general template) for run-virt.include of the virtualbox plugin +cat << EOF > "${confdir}/VirtualBox.xml" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EOF diff --git a/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh b/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh new file mode 100644 index 00000000..a6d335c5 --- /dev/null +++ b/src/os-plugins/plugins/virtualbox/init-hooks/20-nw-bridge-config/bridge.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# Copyright (c) 2010 - OpenSLX GmbH +# +# This program is free software distributed under the GPL version 2. +# See http://openslx.org/COPYING +# +# If you have any feedback please consult http://openslx.org/feedback and +# send your feedback to feedback@openslx.org +# +# General information about OpenSLX can be found at http://openslx.org +# +# Init hook to create a bridge on the active network interface +# (should be kept identical to the files of virtualbox and qemukvm plugins) +############################################################################# + +local bridge=br0 +local brnwif=${nwif} +local nwifmac=${macaddr} + +# bridge 0 already defined or some other problem +brctl addbr ${bridge} || exit 0 +brctl stp ${bridge} 0 +brctl setfd ${bridge} 0.000000000001 +ip link set addr ${nwifmac} ${bridge} +ip link set dev ${nwif} up +brctl addif ${bridge} ${nwif} + +# fixme: sending back the variable to init does not work properly at the +# moment +nwif=${bridge} -- cgit v1.2.3-55-g7522