diff options
Diffstat (limited to 'os-plugins/plugins/virtualbox')
14 files changed, 1136 insertions, 186 deletions
diff --git a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm index fd1424f1..07ec9dc0 100644 --- a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm +++ b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm @@ -1,3 +1,4 @@ +# Copyright (c) 2009..2010 - RZ Uni Freiburg # Copyright (c) 2009..2010 - OpenSLX GmbH # # This program is free software distributed under the GPL version 2. @@ -45,7 +46,8 @@ sub getInfo stateless client. End-of-Here precedence => 70, - required => [ qw( desktop ) ], + # headless mode does not require a desktop! + #required => [ qw( desktop ) ], }; } @@ -67,7 +69,7 @@ sub getAttrInfo should the 'virtualbox'-plugin be executed during boot? End-of-Here content_regex => qr{^(0|1)$}, - content_descr => '1 means active - 0 means inactive', + content_descr => '1 for active, 0 for inactive', default => '1', }, # attribute 'imagesrc' defines where we can find virtualbox images @@ -77,13 +79,14 @@ sub getAttrInfo description => unshiftHereDoc(<<' End-of-Here'), Where do we store our virtualbox images? NFS? Filesystem? End-of-Here - #TODO: check if the input is valid - #content_regex => qr{^(0|1)$}, - content_descr => 'Allowed values: local path or URI', - default => '', + 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, @@ -92,10 +95,46 @@ sub getAttrInfo to the ethernet the host is connected to) be enabled End-of-Here content_regex => qr{^(0|1)$}, - content_descr => 'Allowed values: 0 or 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', + }, }; } @@ -103,7 +142,7 @@ 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'}; @@ -111,22 +150,31 @@ sub installationPhase $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(); + $self->{distro}->installVbox(); } if (!isInPath('VirtualBox')) { - print "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n"; -# exit - } + print + "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n" + ; + #exit + } $self->_writeRunlevelScript(); - # Copy run-virt.include to the appropriate place for inclusion in stage4 - copyFile("$self->{openslxBasePath}/lib/plugins/virtualbox/files/run-virt.include", - "$self->{pluginRepositoryPath}/"); + # 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; } @@ -155,8 +203,8 @@ sub checkStage3AttrValues 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."); @@ -166,30 +214,34 @@ sub _writeRunlevelScript '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', - '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 --nologo list runningvms | sed -e \'s/^".*"//\' 2>/dev/null) - done - else - echo "VirtualBox kernel module is not loaded." - fi' + "vmstatus", + "$script" ); $initfile->addFunction( 'start', - ' modprobe vboxdrv && modprobe vboxnetflt', + ' modprobe -qa vboxdrv vboxnetflt vboxnetadp', ); $initfile->addFunction( 'stop', - ' rmmod vboxnetflt && rmmod vboxdrv', + ' rmmod vboxnetadp vboxnetflt vboxdrv', ); $initfile->addToCase( 'start', @@ -212,8 +264,6 @@ sub _writeRunlevelScript my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0]; my $runlevelscript = getInitFileForDistro($initfile, $distro); - # todo: because we dont have distribution or version dependend - # init scripts we could put it directly into /etc/init.d... spitFile("$self->{'pluginRepositoryPath'}/vbox-slx", $runlevelscript); } diff --git a/os-plugins/plugins/virtualbox/XX_virtualbox.sh b/os-plugins/plugins/virtualbox/XX_virtualbox.sh index 38dd80ec..b54b4bec 100644 --- a/os-plugins/plugins/virtualbox/XX_virtualbox.sh +++ b/os-plugins/plugins/virtualbox/XX_virtualbox.sh @@ -1,4 +1,5 @@ -# Copyright (c) 2009 - OpenSLX GmbH +# 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 @@ -11,19 +12,28 @@ # 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 /initramfs/plugin-conf/virtualbox.conf ]; then +if [ -e ${CONFFILE} ]; then # load needed variables - . /initramfs/plugin-conf/virtualbox.conf + . ${CONFFILE} # Test if this plugin is activated... more or less useless with the # new plugin system - if [ $virtualbox_active -ne 0 ]; then + if [ $virtualbox_active -ne 0 2>/dev/null ]; then [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'virtualbox' os-plugin ..."; + # load general configuration - . /initramfs/machine-setup + . /etc/initramfs-setup # get source of virtualbox image server (get type, server and path) if strinstr "/" "${virtualbox_imagesrc}" ; then @@ -33,28 +43,56 @@ if [ -e /initramfs/plugin-conf/virtualbox.conf ]; then fi if [ -n "${vbimgserv}" ] ; then # directory where qemu images are expected in - mnttarget=/mnt/var/lib/virt/virtualbox + 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 + [ $DEBUGLEVEL -gt 1 ] && \ + error " * Incomplete information in variable ${virtualbox_imagesrc}." \ + nonfatal fi - # copy version depending files - the vmchooser expects for every virtua- - # lization plugin a file named after it (here run-virtualbox.include) - testmkd /mnt/etc/opt/openslx - cp /mnt/opt/openslx/plugin-repo/virtualbox/run-virt.include \ - /mnt/etc/opt/openslx/run-virtualbox.include + + # 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 /mnt/opt/openslx/plugin-repo/virtualbox/vbox-slx \ - /mnt/etc/init.d + 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" + [ $DEBUGLEVEL -gt 0 ] \ + && echo " * Configuration of 'virtualbox' plugin failed" fi diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz Binary files differnew file mode 100644 index 00000000..24697b58 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz Binary files differnew file mode 100644 index 00000000..138e51e8 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz Binary files differnew file mode 100644 index 00000000..1355f373 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz Binary files differnew file mode 100644 index 00000000..6e66af70 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz Binary files differnew file mode 100644 index 00000000..ddb8bb5f --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz Binary files differnew file mode 100644 index 00000000..24697b58 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/machine.include b/os-plugins/plugins/virtualbox/files/machine.include new file mode 100644 index 00000000..8d1e23c4 --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/machine.include @@ -0,0 +1,134 @@ +# Include file (machine template) for run-virt.include of the virtualbox plugin +cat << EOF > "${machconfig}" +<?xml version="1.0"?> +<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux"> + <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}"> + <ExtraData> + <ExtraDataItem name="GUI/AutoresizeGuest" value="on"/> + <ExtraDataItem name="GUI/Fullscreen" value="on"/> + <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/> + <ExtraDataItem name="GUI/MiniToolBarAlignment" value="top"/> + <ExtraDataItem name="GUI/MiniToolBarAutoHide" value="on"/> + <ExtraDataItem name="GUI/SaveMountedAtRuntime" value="yes"/> + <ExtraDataItem name="GUI/Seamless" value="off"/> + <ExtraDataItem name="GUI/ShowMiniToolBar" value="yes"/> + </ExtraData> + <Hardware version="2"> + <CPU count="${cpu_cores}"> + <HardwareVirtEx enabled="${enablevt}" exclusive="true"/> + <HardwareVirtExNestedPaging enabled="${npaging}"/> + <HardwareVirtExVPID enabled="false"/> + <PAE enabled="true"/> + </CPU> + <Memory RAMSize="${mem}"/> + <Boot> + <Order position="1" device="${boot}"/> <!-- HardDisk, DVD, Network, Floppy --> + <Order position="2" device="None"/> + <Order position="3" device="None"/> + <Order position="4" device="None"/> + </Boot> + <Display VRAMSize="24" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/> + <!-- authType="External", "Guest", "Null" --> + <RemoteDisplay enabled="false" port="${vrdpport}" authType="Null" authTimeout="5000"/> + <BIOS> + <ACPI enabled="true"/> + <IOAPIC enabled="true"/> + <Logo fadeIn="false" fadeOut="false" displayTime="0"/> + <BootMenu mode="MessageAndMenu"/> + <TimeOffset value="0"/> + <PXEDebug enabled="false"/> + </BIOS> + <USBController enabled="true" enabledEhci="true"/> + <Network> + <Adapter slot="0" enabled="true" MACAddress="${macaddr}" cable="true" speed="0" type="${vb_network_card}"> + <${network_kind}/> + </Adapter> + <Adapter slot="1" enabled="false" MACAddress="0800279312FB" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="2" enabled="false" MACAddress="080027A3A3CA" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="3" enabled="false" MACAddress="0800277356F6" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="4" enabled="false" MACAddress="080027CEA83A" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="5" enabled="false" MACAddress="0800271B8D7A" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="6" enabled="false" MACAddress="08002771BBD7" cable="true" speed="0" type="Am79C973"/> + <Adapter slot="7" enabled="false" MACAddress="080027EB6A12" cable="true" speed="0" type="Am79C973"/> + </Network> + <UART> + <Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/> + <Port slot="1" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/> + </UART> + <LPT> + <Port slot="0" enabled="false" IOBase="0x378" IRQ="4"/> + <Port slot="1" enabled="false" IOBase="0x378" IRQ="4"/> + </LPT> + <AudioAdapter controller="AC97" driver="Alsa" enabled="${audio}"/> <!-- OSS, Alsa, Pulse (HANGS!) --> + <SharedFolders> + <SharedFolder name="${sharename}" hostPath="${sharepath}" writable="true"/> + </SharedFolders> + <Clipboard mode="Bidirectional"/> + <Guest memoryBalloonSize="0" statisticsUpdateInterval="0"/> + <!-- + <GuestProperties> + <GuestProperty name="/VirtualBox/HostGuest/SysprepExec" value="" timestamp="1268140071072779000" flags="TRANSIENT, RDONLYGUEST"/> + <GuestProperty name="/VirtualBox/HostGuest/SysprepArgs" value="" timestamp="1268140071072939000" flags="TRANSIENT, RDONLYGUEST"/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Linux" timestamp="1268140265864540000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="2.6.27.21" timestamp="1268140265894019000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/Version" value="#3 SMP Fri Feb 26 16:38:21 CET 2010" timestamp="1268140265898448000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/ServicePack" value="" timestamp="1268140265899571000" flags=""/> + <GuestProperty name="/VirtualBox/GuestAdd/Revision" value="57640" timestamp="1268140265900144000" flags=""/> + <GuestProperty name="/VirtualBox/GuestAdd/Version" value="3.1.4" timestamp="1268140265899937000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsers" value="1" timestamp="1268164075148440000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/Count" value="4" timestamp="1268164075148790000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/IP" value="132.230.4.224" timestamp="1268164075149053000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Broadcast" value="132.230.4.255" timestamp="1268164075149297000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Netmask" value="255.255.255.0" timestamp="1268164075149596000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/0/Status" value="Up" timestamp="1268164075149829000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/IP" value="192.168.112.1" timestamp="1268164075150037000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Broadcast" value="192.168.112.255" timestamp="1268164075150238000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Netmask" value="255.255.255.0" timestamp="1268164075150439000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/1/Status" value="Up" timestamp="1268164075150635000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/IP" value="192.168.54.1" timestamp="1268164075150835000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Broadcast" value="192.168.54.255" timestamp="1268164075151072000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Netmask" value="255.255.255.0" timestamp="1268164075151282000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/2/Status" value="Up" timestamp="1268164075151479000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/NoLoggedInUsers" value="false" timestamp="1268140276063587000" flags=""/> + <GuestProperty name="/VirtualBox/GuestAdd/Vbgl/Video/SavedMode" value="1024x768x32" timestamp="1268140287190297000" flags=""/> + <GuestProperty name="/VirtualBox/GuestAdd/HostVerLastChecked" value="3.1.4" timestamp="1268140310962236000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/IP" value="192.168.122.1" timestamp="1268164075152293000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Broadcast" value="192.168.122.255" timestamp="1268164075152615000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Netmask" value="255.255.255.0" timestamp="1268164075152828000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/3/Status" value="Up" timestamp="1268164075153029000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/IP" value="169.254.4.104" timestamp="1265728007966805000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Broadcast" value="169.254.255.255" timestamp="1265728007967184000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Netmask" value="255.255.0.0" timestamp="1265728007967487000" flags=""/> + <GuestProperty name="/VirtualBox/GuestInfo/Net/4/Status" value="Up" timestamp="1265728007967829000" flags=""/> + <GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="de_DE" timestamp="1268140070610343000" flags=""/> + <GuestProperty name="/VirtualBox/HostInfo/VBoxVer" value="3.1.4" timestamp="1268154582522485000" flags="TRANSIENT, RDONLYGUEST"/> + <GuestProperty name="/VirtualBox/HostInfo/VBoxRev" value="57640" timestamp="1268154582522507000" flags="TRANSIENT, RDONLYGUEST"/> + <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsersList" value="vmuser" timestamp="1268164075147867000" flags=""/> + </GuestProperties> + --> + </Hardware> + <StorageControllers> + <StorageController name="IDE-Controller" type="PIIX4" PortCount="2"> + <AttachedDevice type="HardDisk" port="0" device="0"> + <Image uuid="{${imageuuid}}"/> + </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT!!! --> + <!-- + <AttachedDevice passthrough="false" type="DVD" port="0" device="0"> + <Image uuid="{dcd1e32a-729f-4faa-b319-67adca15e4a4}"/> + </AttachedDevice> + --> + </StorageController> + <!-- + <StorageController name="Disketten-Controller" type="I82078" PortCount="1"> + <AttachedDevice type="Floppy" port="0" device="0"/> + </StorageController> + <StorageController name="SCSI-Controller" type="LsiLogic" PortCount="16"> + <AttachedDevice type="HardDisk" port="0" device="0"> + <Image uuid="{812c82bf-bd1a-4f59-a5b6-b54ae2f6c669}"/> + </AttachedDevice> + </StorageController> + --> + </StorageControllers> + </Machine> +</VirtualBox> +EOF diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include b/os-plugins/plugins/virtualbox/files/run-virt.include index e16e2edf..9dbe47ac 100644 --- a/os-plugins/plugins/virtualbox/files/run-virt.include +++ b/os-plugins/plugins/virtualbox/files/run-virt.include @@ -1,6 +1,7 @@ -# run-virtualbox.include -# -# Copyright (c) 2009 - OpenSLX GmbH +# 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 @@ -9,53 +10,264 @@ # send your feedback to feedback@openslx.org # # General information about OpenSLX can be found at http://openslx.org -# -# Include script for running the Virtual Box on an OpenSLX client via the -# run-virt.sh. The stuff is copied to /etc/opt/openslx/run-virtualbox.include -# during stage3. +# ----------------------------------------------------------------------------- +# 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 from vmchooser -. /etc/opt/openslx/run-virt.include +################################################################################ +### 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 -# memory part equal to vmware plugin -# percentage of memory to use for virtualbox in standard case -permem=30 -if [ "${totalmem}" -ge "1600" ]; then - permem=40 +################################################################################ +### 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 -# 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 - if [ "${totalmem}" -ge "2500" ]; then - permem=40 - mkdir /dev/shm/vbox/${USER} - snapshotdir=/dev/shm/vbox/$USER + +# 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 -mem=$(expr ${totalmem} / 100 \* ${permem}) -if [ "${id44}" = "1" ]; then - memhost=$(expr ${totalmem} - ${mem}) + +# 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 - memhost=$(expr ${totalmem} - ${mem} - ${mem}) + 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 -#permem=40 -#mem=$(expr ${totalmem} * ${permem}) +# 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 -if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then - writelog "\tMemory out of range: ${mem} MB (guest) / ${memhost} MB (host)!" - writelog "\tMin. 256 MB for host and guest!" - exit 1 -fi +# 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" -# most of the following does not make much sense yet ... -# +# external GUI +vrdpport=${remotedesktopport} + +# TODO: nur bei vmchooser +# TODO: most of the following does not make much sense yet ... # virtual fd/cd/dvd and drive devices, floppy b: for configuration # if $floppy_0 from run-virt.include set then fdtest="TRUE" fdtest= @@ -78,115 +290,102 @@ cdrom1=${cdtest:-"FALSE"} # be done while creating the runscripts ... ide="TRUE" hddrv="ide" +audio=${audio:-"true"} +[ ${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${cdrom0}" +#writelog "\tCD-ROM2:\t${cdrom1}" +#writelog "\tFloppy_A:\t${floppy0}" +#writelog "\tFloppy_B:\t${floppy1}" +# defined in run-virt.sh and run-vmgrid.sh +writelog "\tShared Folders '${sharename}':\t${sharepath}" ################################################################################ -### Pepare env and and configure Image +### Pepare and configure virtual machine and disk image ################################################################################ -# Current ID, to make sure it won't run into conflicts if started more -# as once at the same time, else delete would make the trick... -ID=$$ -# Don't use $HOME/.VirtualBox! -export VBOX_USER_HOME="/tmp/vbox-${USER}-${ID}" - -# Import Image to VirtualBox, which won't get changed -VBoxManage -nologo registerimage disk ${diskfile} -type immutable - -# Get ID of VBox Image... -diskuid="$(VBoxManage -nologo showvdiinfo ${diskfile} |grep UUID|awk '{ print $2; }')" -# Create Image and register it, so we are able to modify and start it -VBoxManage -nologo createvm -name "${ID}" -register - -################################################################################ -### -### Modify VM -### -################################################################################ - -## Add harddisk -VBoxManage -nologo modifyvm "${ID}" -hda ${diskuid} - -## Configure VM memory -VBoxManage -nologo modifyvm "${ID}" -memory ${mem} +# create Virtualbox.xml +. ${PLUGINCONFVIRTUALBOX}/virtualbox.include -## Add cddrives -## TODO: merge to new version, where run-virt.include has our drives -#VBoxManage -nologo modifyvm "${ID}" -dvd host:${cdrs} - -# Enable hardware virtualization -# TODO: check if CPU supports hw virtualization -#VBoxManage -nologo modifyvm "${ID}" -hwvirtex on - -# HDD as boot device -VBoxManage -nologo modifyvm "${ID}" -boot1 disk - -# enable audio (oss|null|none|alsa|pulse). OSS is backwardcompatible to v2.0 -VBoxManage -nologo modifyvm "${ID}" -audio oss - -# supress License and Message -# TODO: Not clear if we are allowed to do this -VBoxManage -nologo setextradata global "GUI/LicenseAgreed" "7" -VBoxManage -nologo setextradata global "GUI/SuppressMessages" ",remindAboutAutoCapture" -VBoxManage -nologo setextradata global "GUI/RegistrationData" "triesLeft=0" - -# if we have enough memory, we can put the snapshots (changes on immutable -# disk) there -if [ -n ${snapshotdir} ]; then - VBoxManage -nologo modifyvm "${ID}" -snapshotfolder "${snapshotdir}" +# remove snapshot disk when using rw images +if [ "${imgtype}" != "Immutable" ]; then + sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml" fi -# Operating system. Possible: VBoxManage -nologo list ostypes -# WindowsXP, WindowsVista, Windows7, Linux26 etc. -# keep compatibility to VMware -# Todo: maybe rewrite, to reduce checks, merge it with network option, -# so we can have a "compatibility to vmware config" section. Or include -# it into vmchooser? -if [ "${vmostype}" = "winxppro" -o "${vmostype}" = "WindowsXP" ]; then - VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsXP" -elif [ "${vmostype}" = "winvista" -o "${vmostype}" = "WindowsVista" ]; then - VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsVista" -elif [ "${vmostype}" = "Windows7" ]; then - VBoxManage -nologo modifyvm "${ID}" -ostype "Windows7" -elif [ "${vmostype}" = "linux" -o "${vmostype}" = "Linux26" ]; then - VBoxManage -nologo modifyvm "${ID}" -ostype "Linux26" -elif [ -n "${vmostype}" ]; then - VBoxManage -nologo modifyvm "${ID}" -ostype "${vmostype}" -fi +# TODO: add rawdisk if requested +#"raw.vmdk" format="VMDK" type="Writethrough"/> +# create machine.xml +. ${PLUGINCONFVIRTUALBOX}/machine.include -# Network Configuration -# only bridge differes to vmware. Compatibility option -if [ "${network_kind}" = "bridge" ]; then - network_kind="bridged" -fi -VBoxManage -nologo modifyvm "${ID}" -nic1 "${network_kind}" -if [ "${network_kind}" = "bridged" ]; then - VBoxManage -nologo modifyvm "${ID}" -bridgeadapter1 "eth1" +# if diskless remove all disks +if [ ${diskless} -eq 1 ]; then + sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml" + sed -i "/${imageuuid}/d" ${machconfig} + sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig} + sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT!!! -->/d" ${machconfig} fi -if [ "${network_kind}" = "hostonly" ]; then - VBoxManage -nologo modifyvm "${ID}" -hostonlyadapter1 "vboxnet0" -fi - -# modify macaddress -mac=$(echo ${mac}|sed 's/://') # ${mac/:/} -VBoxManage -nologo modifyvm "${ID}" -macaddress1 "0050560D${mac}" - - -# usb configuration -# not available in free -ose version -#VBoxManage -nologo modifyvm "${ID}" -usb on -#VBoxManage -nologo modifyvm "${ID}" -usbehci on +# define redirects +if [ ${redirects} -ge 1 ]; then + (( i=1 )) + writelog "\tGuest redirects:\t\c" + while [ ${i} -le ${redirects} ]; do + extradataitem='<ExtraDataItem name="VBoxInternal/Devices' + extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config" + extradataitem="${extradataitem}/${redirect_name[$i]}/" + extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>" + extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>" + extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>" + sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\ + ${extradataitem}${extradatahostport}\n\ + ${extradataitem}${extradataprotocol}\n\ + </ExtraData>," "${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 ################################################################################ +### 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) -VIRTCMD=$(which VBoxManage -nologo 2>/dev/null) -VIRTCMDOPTS="startvm ${ID} -type gui" +VIRTCMD=$(which VirtualBox 2>/dev/null) +VIRTCMDOPTS="--startvm ${machineuuid} --start-running" -# todo: for debugging purpose during development -echo "\n export VBOX_USER_HOME=\"/tmp/vbox-${USER}-${ID}\"" -echo " VBoxManage -nologo $VIRTCMDOPTS\n\n" +# set headless mode (-v off to disable vrdp) +VIRTCMDHL=$(which VBoxHeadless 2>/dev/null) +VIRTCMDOPTSHL="-s ${machineuuid}" diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include.bak b/os-plugins/plugins/virtualbox/files/run-virt.include.bak new file mode 100644 index 00000000..2fd81f6b --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/run-virt.include.bak @@ -0,0 +1,159 @@ +# run-virtualbox.include +# +# 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 +# +# Include script for running the Virtual Box on an OpenSLX client via the +# run-virt.sh. The stuff is copied to /etc/opt/openslx/virtualbox/run- +# virtualbox.include during stage3. + +################################################################################ +### General settings +################################################################################ + +# include general configuration from vmchooser +. /etc/opt/openslx/plugins/virtualbox/virtualbox.conf + +# Current ID, to make sure it won't run into conflicts if started more +# as once at the same time, else delete would make the trick... +ID=$$ +machname="$(basename ${diskfile})" +machname=${machname%.*} +# use alternate configuration directory instead of $HOME/.VirtualBox +export VBOX_USER_HOME="/tmp/vbox-${USER}" +rm -rf ${VBOX_USER_HOME}/* /tmp/.vbox-${USER}-ipc +machfolder="${VBOX_USER_HOME}/Machines" +machconfig="${machfolder}/${machname}/${machname}.xml" +diskfolder="${VBOX_USER_HOME}/HardDisks" +mkdir -p ${machfolder}/${machname}/Snapshots ${diskfolder} +ln -sf ${diskfile} ${diskfolder}/${machname}.vdi +# Get ID of VBox Image... +diskuid="$(VBoxManage -nologo showvdiinfo ${diskfile} |grep UUID|awk '{ print $2; }')" +# produce proper mac address format +mac="0050560d$(echo ${mac}|sed 's/://;y/ABCDEF/abcdef/')" +date="$(date +%Y-%m-%dT%H:%M:%SZ)" + +# Operating system. Possible: VBoxManage -nologo list ostypes: WindowsXP, +# WindowsVista, Windows7, Linux26 etc. +# keeps compatibility to vmware plugin run-virt.include +# Todo: maybe rewrite, to reduce checks, merge it with network option, +# so we can have a "compatibility to vmware config" section +if [ "${vmostype}" = "winxppro" ]; then vmostype="WindowsXP" +elif [ "${vmostype}" = "winvista" ]; then vmostype="WindowsVista" +elif [ "${vmostype}" = "Windows7" ]; then vmostype="Windows7" +elif [ "${vmostype}" = "linux" ]; then vmostype="Linux26" +elif [ -n "${vmostype}" ]; then vmostype="${vmostype}" +fi +# translate network kinds (nat, bridged, host-only) +if [ "${network_kind}" = "nat" ]; then network_kind="NAT" +elif [ "${network_kind}" = "bridged" ]; then network_kind="" +elif [ "${network_kind}" = "host-only" ]; then network_kind="" +fi + +# memory part equal to vmware plugin +# percentage of memory to use for virtualbox in standard case +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 + if [ "${totalmem}" -ge "2500" ]; then + permem=40 + #mkdir /dev/shm/vbox/${USER} + snapshotdir=/dev/shm/vbox/$USER + fi +fi +mem=$(expr ${totalmem} / 100 \* ${permem}) +if [ "${id44}" = "1" ]; then + memhost=$(expr ${totalmem} - ${mem}) +else + memhost=$(expr ${totalmem} - ${mem} - ${mem}) +fi + +#permem=40 +#mem=$(expr ${totalmem} * ${permem}) + +if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then + writelog "\tMemory out of range: ${mem} MB (guest) / ${memhost} MB (host)!" + writelog "\tMin. 256 MB for host and guest!" + exit 1 +fi + +# most of the following does not make much sense yet ... +# +# virtual fd/cd/dvd and drive devices, floppy b: for configuration +# if $floppy_0 from run-virt.include set then fdtest="TRUE" +fdtest= +fdtest=${floppy_0:+"TRUE"} +# if $fdtest not set floppy0="FALSE", else "TRUE" +floppy0=${fdtest:-"FALSE"} +floppy1="TRUE" +floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img" +# if $cdrom_0 from run-virt.include set then cdtest="TRUE" +cdtest= +cdtest=${cdrom_0:+"TRUE"} +# if $cdtest not set cdrom0="FALSE", else "TRUE" +cdrom0=${cdtest:-"FALSE"} +# if $cdrom_1 from run-virt.include set then cdtest="TRUE" +cdtest= +cdtest=${cdrom_1:+"TRUE"} +# if $cdtest not set cdrom1="FALSE", else "TRUE" +cdrom1=${cdtest:-"FALSE"} +# ide is expected default, test for the virtual disk image type should +# be done while creating the runscripts ... +ide="TRUE" +hddrv="ide" + + +################################################################################ +### Pepare and configure virtual machine and disk image +################################################################################ + +# produce the machine configuration XML +sed -e "s,MACHINE,${machname},g;s,OSTYPE,${vmostype},;s,MEMSIZE,${mem}," \ + -e "s,DISKUID,${diskuid},;s,MACADDR,${mac},;s,DATE,${date}," \ + -e "s,NETTYPE,${network_kind},;s,OPTDEVICE,/dev/sr0," \ + /etc/opt/openslx/plugins/virtualbox/MachineTemplate.xml \ + >${machconfig} + +# shortened date YYYY-MM-DD +date=${date%T*} +# produce the general and containers configuration file +sed -e "s,DISKUID,${diskuid},;s,FD1NAME,${floppy1name},;s,DATE,${date}," \ + -e "s,DISKFILE,${diskfolder}/${machname}.vdi,;s,MACHINE,${machname},g;s,MACADDR,${mac}," \ + -e "s,MACHFOLDER,${machfolder},;s,DISKFOLDER,${diskfolder}," \ + /etc/opt/openslx/plugins/virtualbox/VirtualBox.xml \ + >${VBOX_USER_HOME}/VirtualBox.xml + +cat /opt/openslx/plugin-repo/virtualbox/empty-diff.vdi.gz | \ + gunzip >${machfolder}/${machname}/Snapshots/{88bc8b6d-f248-468a-95fe-318084904f8b}.vdi + + +#<DHCPServers>\t<DHCPServer\ +# networkName=\"HostInterfaceNetworking-vboxnet0\" IPAddress=\"192.168.56.100\"\ +# networkMask=\"255.255.255.0\" lowerIP=\"192.168.56.101\"\ +# upperIP=\"192.168.56.254\" enabled=\"1\"/> </DHCPServers> + +# finally set env for run-virt.sh +################################################################################ + +# wait for a certain command to settle +while [ TRUE ] ; do + ps aux|grep -v grep|grep -q VBoxSVC || break +done +# set the variables appropriately (several interfaces with different names) +VIRTCMD=$(which VirtualBox 2>/dev/null) +VIRTCMDOPTS="--startvm 00000000-1111-2222-3456-${mac} --start-running" diff --git a/os-plugins/plugins/virtualbox/files/run-virt2.include b/os-plugins/plugins/virtualbox/files/run-virt2.include new file mode 100644 index 00000000..4f885abd --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/run-virt2.include @@ -0,0 +1,323 @@ +# 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 Virtual Box 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}" +# create TMPDIR for all users +mkdir -m 1777 /tmp/${self} 2>/dev/null +# dir for configs +confdir="/tmp/${self}/${USER}" +# use alternate configuration directory instead of $HOME/.VirtualBox +export VBOX_USER_HOME=${confdir} + +# imgname is the name of the virtual image file +imgnamebase=${imgname%.*} +imgnameending=${imgname#*.} +# use vm_shortname since vm_name can be very long + VM_ID +vm_shortname="$(echo ${imgnamebase} | sed -e "s, ,-,g")-${VM_ID}" + +# mach folders config +machfolder="${confdir}/Machines" +machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml" +diskfolder="${confdir}/HardDisks" +snapshotdir=${machfolder}/${vm_shortname}/Snapshots +diskfile="${diskfolder}/${imgname}" + +# remove old stuff, RMDIRS can be used in calling script as well +RMDIRS="${machfolder}/${vm_shortname} ${diskfile}" +rm -rf ${RMDIRS} +# create new stuff +mkdir -p ${diskfolder} ${snapshotdir} +# check if image already existing +if [ "$(readlink -f ${diskfile})" = "${vmpath}" ]; then + diskuuid=$(grep "${diskfile}" "${confdir}/VirtualBox.xml" | \ + sed -e "s,.*HardDisk uuid=\"{\(.*\)}\" location=.*,\1,") + diskexisting=1 +else + ln -sf ${vmpath} ${diskfile} +fi + +# check the file type +if echo ${imgname} | grep -iE "vdi" >/dev/null 2>&1; then #vmdk|vhd + imgtype=$(echo ${imgnameending} | tr [a-z] [A-Z]) +else + writelog "${imgname} is not a valid image type (vdi)" #vmdk|vhd +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*) + vmostype="WindowsXP" + ;; + winvista*) + vmostype="WindowsVista" + ;; + Windows7*) + vmostype="Windows7" + ;; + linux*) + vmostype="Linux26" + ;; +esac + +writelog "Directories:" +writelog "\tConfig dir:\t\t$confdir" +writelog "\tMachines dir:\t\t$machfolder" +writelog "\tMachine config:\t\t$machconfig" +writelog "\tHardDisks dir:\t\t$diskfolder" + +################################################################################ +### Hardware checks +################################################################################ + +# remove ':' from MAC addr for vbox +macaddr=$(echo ${macaddr} | sed 's/://g') + +# 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} + #mkdir -p ${snapshotdir} + #ln -sf ${snapshotdir} ${snapshotdirold} + #fi + fi + mem=$(expr ${totalmem} / 100 \* ${permem}) + if [ "${id44}" = "1" ]; then + memhost=$(expr ${totalmem} - ${mem}) + else + memhost=$(expr ${totalmem} - ${mem} - ${mem}) + fi + #permem=40 + #mem=$(expr ${totalmem} * ${permem}) + if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then + writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!" + writelog "Min. 256 MB for host and guest!" + exit 1 + fi +fi + +# 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 +[ -z "${diskuuid}" ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} | \ + grep UUID | awk '{print $2}') +# snapshot UUIDs (static) +snapshotuuid[00]="88bc8b6d-f248-468a-95fe-318084904f8b" +snapshotuuid[01]="42f5033e-9913-41ff-8cba-1c986ba5db8d" +snapshotuuid[02]="1b66fdcb-8ede-4bb8-aaec-417bc2074633" +snapshotuuid[03]="563d2c5e-c9a2-4fbb-be51-8d279a558e6c" +snapshotuuid[04]="efff0c85-c1c8-420d-a25f-6e66f117e1f2" +snapshotuuid=${snapshotuuid[$VM_ID]} + +cat ${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox/empty-diff-${VM_ID}.vdi.gz | \ + gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi" + +#snapshotuuid=$(VBoxManage -q showvdiinfo \ +# "${snapshotdir}/${snapshotuuid}.vdi" | grep UUID | awk '{print $2}') + +# translate network cards +if [ "${network_card}" = "e1000" ]; then + vb_network_card="82540EM" +else + network_card="pcnet" + vb_network_card="Am79C973" +fi + +# translate network kinds (nat, bridged, host-only) +case "${network_kind}" in + bridged) + network_kind='BridgedInterface name="br0"' + ;; + host-only) + network_kind='HostOnlyInterface name="vboxnet0"' + ;; + *) + network_kind="NAT" + ;; +esac + +vrdpport="590${VM_ID}" + +# TODO: most of the following does not make much sense yet ... +# virtual fd/cd/dvd and drive devices, floppy b: for configuration +# if $floppy_0 from run-virt.include set then fdtest="TRUE" +fdtest= +fdtest=${floppy_0:+"TRUE"} +# if $fdtest not set floppy0="FALSE", else "TRUE" +floppy0=${fdtest:-"FALSE"} +floppy1="TRUE" +floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img" +# if $cdrom_0 from run-virt.include set then cdtest="TRUE" +cdtest= +cdtest=${cdrom_0:+"TRUE"} +# if $cdtest not set cdrom0="FALSE", else "TRUE" +cdrom0=${cdtest:-"FALSE"} +# if $cdrom_1 from run-virt.include set then cdtest="TRUE" +cdtest= +cdtest=${cdrom_1:+"TRUE"} +# if $cdtest not set cdrom1="FALSE", else "TRUE" +cdrom1=${cdtest:-"FALSE"} +# ide is expected default, test for the virtual disk image type should +# be done while creating the runscripts ... +ide="TRUE" +hddrv="ide" + +writelog "\tSnapshots dir:\t\t$snapshotdir" +writelog "Diskimage:" +writelog "\tDisk type:\t\t$imgtype" +writelog "\tDisk file:\t\t$diskfile" +writelog "\tVMostype:\t\t$vmostype" +writelog "\tMachine UUID:\t\t$machineuuid" +writelog "\tDisk UUID:\t\t$diskuuid" +writelog "\tSnapshot UUID:\t\t$snapshotuuid" +writelog "Virtual Hardware:" +writelog "\tGuest RAM:\t\t${mem} MB" +# echo nur wenn memhost gesetzt +[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB" +writelog "\tMAC address:\t\t$macaddr" +writelog "\tNetwork card:\t\t${vb_network_card}" +writelog "\tNetwork kind:\t\t${network_kind}" +#writelog "\tCD-ROM1:\t${cdrom0}" +#writelog "\tCD-ROM2:\t${cdrom1}" +#writelog "\tFloppy_A:\t${floppy0}" + +################################################################################ +### Pepare and configure virtual machine and disk image +################################################################################ + +# TODO: date wichtig? +#date="$(date +%Y-%m-%dT%H:%M:%SZ)" +# check if VirtualBox.xml already existing +# TODO: geht nicht!!! +if grep -q "<HardDisk uuid=" "${confdir}/VirtualBox.xml"; then + # check if our HD and location present + extrahd="<HardDisk uuid=\"{${diskuuid}}\" location=\"${diskfile}\"" \ + extrahd="${extrahd} format=\"${imgtype}\" type=\"Immutable\">" + extdiff="<HardDisk uuid=\"{${snapshotuuid}}\" location=\"${snapshotdir}" \ + extdiff="${extdiff}/{${snapshotuuid}}.vdi\" format=\"VDI\"" \ + extdiff="${extdiff} autoReset=\"true\"/>" + if [ -z "${diskexisting}" ]; then + sed -i "s,</HardDisks>, ${extrahd}\n ${extdiff}\n\ + </HardDisk>\n </HardDisks>," \ + "${confdir}/VirtualBox.xml" + elif [ ${diskexisting} -eq 1 2>/dev/null ]; then + sed -i "s,\(<HardDisk uuid="{${diskuuid}}".*\),\1\n ${extdiff}\n,"\ + "${confdir}/VirtualBox.xml" + fi + # check if our machine and location present + extramach="<MachineEntry uuid=\"{${machineuuid}}\" src=\"Machines" \ + extramach="${extramach}/${vm_shortname}/${vm_shortname}.xml\"/>" + if ! grep -q "${extramach}" "${confdir}/VirtualBox.xml"; then + sed -i "s,</MachineRegistry>, ${extramach}\n </MachineRegistry>," \ + "${confdir}/VirtualBox.xml" + fi +else + . ${PLUGINCONFVIRTUALBOX}/virtualbox.include > \ + "${confdir}/VirtualBox.xml" +fi + +# shortened date YYYY-MM-DD +#date=${date%T*} +. ${PLUGINCONFVIRTUALBOX}/machine.include >"${machconfig}" + +# add ssh port if linux and NAT +if [ "${vmostype}" = "Linux26" ] && [ "${network_kind}" = "NAT" ]; then + vmsshport="220${VM_ID}" + extradataitem='<ExtraDataItem name="VBoxInternal/Devices' \ + extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config/ssh/" + extradataguestport='GuestPort" value="22"/>' + extradatahostport="HostPort\" value=\"${vmsshport}\"/>" + extradataprotocol='Protocol" value="TCP"/>' + sed -ni "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\ + ${extradataitem}${extradatahostport}\n\ + ${extradataitem}${extradataprotocol}\n\ + </ExtraData>," "${machconfig}" + writelog "\tGuest SSH port:\t\t${vmsshport}" +fi + +################################################################################ +# finally set env for run-virt.sh +################################################################################ + +# wait for a certain command to settle +# get the PID of the right process +# TODO: not very good! But seems to work +# TODO: not needed? KILL!!! +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 +# TODO: OLD Version, NOW: KILL process +#VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\ +# | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/" | tail -n 1) +#for i in {0..999}; do +# ps aux | grep -v grep | grep VBoxXPCOMIPCD | grep -q " ${VBMANPID} " || break +# if [ $i -eq 999 ]; then +# kill -9 ${VBMANPID} >/dev/null 2>&1 +# writelog "Process ID ${VBMANPID} did not finish, killing!" +# fi +#done + +# set the variables appropriately (several interfaces with different names) +VIRTCMD=$(which VirtualBox 2>/dev/null) +VIRTCMDOPTS="--startvm ${machineuuid} --start-running" + +# SDL tests +#VIRTCMDSDL=$(which VBoxSDL 2>/dev/null) +#VIRTCMDOPTSSDL="--startvm ${machineuuid} --fullscreen --hwvirtex --memory 1024 \ +# --fixedmode 1680 1050 24 --hostkey 302 0" + +# set headless mode +VIRTCMDHL=$(which VBoxHeadless 2>/dev/null) +VIRTCMDOPTSHL="-s ${machineuuid}" + diff --git a/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz b/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz Binary files differnew file mode 100644 index 00000000..e2133d6d --- /dev/null +++ b/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz diff --git a/os-plugins/plugins/virtualbox/files/virtualbox.include b/os-plugins/plugins/virtualbox/files/virtualbox.include new file mode 100644 index 00000000..2a7af026 --- /dev/null +++ b/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" +<?xml version="1.0"?> +<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux"> <!-- 1.7-linux --> + <Global> + <ExtraData> + <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/> + <ExtraDataItem name="GUI/Input/HostKey" value="65300"/> <!-- scroll lock / Rollen --> + <ExtraDataItem name="GUI/LastVMSelected" value="${machineuuid}"/> + <ExtraDataItem name="GUI/LicenseAgreed" value="7"/> + <ExtraDataItem name="GUI/MaxGuestResolution" value="any"/> <!-- auto, width,height --> + <ExtraDataItem name="GUI/SUNOnlineData" value="triesLeft=0"/> + <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,confirmInputCapture,remindAboutWrongColorDepth,confirmGoingFullscreen,remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,showRuntimeError.warning.DevATA_DISKFULL,remindAboutPausedVMInput,confirmVMReset,showRuntimeError.warning.HostAudioNotResponding"/> + <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/> + <ExtraDataItem name="GUI/UpdateCheckCount" value="2"/> + <ExtraDataItem name="GUI/UpdateDate" value="never"/> + </ExtraData> + <MachineRegistry> + <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/> + </MachineRegistry> + <MediaRegistry> + <HardDisks> + <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}"> + <HardDisk uuid="{${snapshotuuid}}" location="${snapshotdir}/{${snapshotuuid}}.vdi" format="VDI" autoReset="true"/> + </HardDisk> + </HardDisks> + <!-- + <DVDImages> + <Image uuid="{dcd1e32a-729f-4faa-b319-67adca15e4a4}" location="/.../gpxe-1.0.0+-virtio-net.iso"/> + <Image uuid="{b71450c6-b8ff-43c1-a290-2a793b3023d8}" location="/.../gpxe-1.0.0+-e1000.iso"/> + </DVDImages> + --> + <FloppyImages/> + </MediaRegistry> + <NetserviceRegistry> + <DHCPServers> + <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/> + <!-- + <DHCPServer networkName="HostInterfaceNetworking-vboxnet1" IPAddress="0.0.0.0" networkMask="0.0.0.0" lowerIP="0.0.0.0" upperIP="0.0.0.0" enabled="0"/> + --> + </DHCPServers> + </NetserviceRegistry> + <SystemProperties defaultMachineFolder="${machfolder}" defaultHardDiskFolder="${diskfolder}" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VRDPAuth" webServiceAuthLibrary="VRDPAuth" LogHistoryCount="3"/> + <USBDeviceFilters/> + </Global> +</VirtualBox> +EOF |