diff options
author | Michael Janczyk | 2010-03-26 22:09:31 +0100 |
---|---|---|
committer | Michael Janczyk | 2010-03-26 22:09:31 +0100 |
commit | 3e8723555bb0a1be3e27330275c4d6b2da9945df (patch) | |
tree | bd85d3e02dda631f32f2c69ff3fae27836c13a71 /os-plugins/plugins/virtualbox | |
parent | added support for rw disks and netboot (diff) | |
download | core-3e8723555bb0a1be3e27330275c4d6b2da9945df.tar.gz core-3e8723555bb0a1be3e27330275c4d6b2da9945df.tar.xz core-3e8723555bb0a1be3e27330275c4d6b2da9945df.zip |
NAT TFTP boot with VBox.
rwimg support added
Diffstat (limited to 'os-plugins/plugins/virtualbox')
6 files changed, 111 insertions, 93 deletions
diff --git a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm index be7f2cb5..900d08a9 100644 --- a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm +++ b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm @@ -45,7 +45,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 +68,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,10 +78,9 @@ 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 @@ -92,10 +92,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 => undef, + }, }; } diff --git a/os-plugins/plugins/virtualbox/XX_virtualbox.sh b/os-plugins/plugins/virtualbox/XX_virtualbox.sh index 4599b197..07e58428 100644 --- a/os-plugins/plugins/virtualbox/XX_virtualbox.sh +++ b/os-plugins/plugins/virtualbox/XX_virtualbox.sh @@ -30,8 +30,9 @@ if [ -e ${CONFFILE} ]; 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 @@ -55,7 +56,7 @@ if [ -e ${CONFFILE} ]; then 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 diff --git a/os-plugins/plugins/virtualbox/files/VirtualBox.xml b/os-plugins/plugins/virtualbox/files/VirtualBox.xml deleted file mode 100644 index d9a36795..00000000 --- a/os-plugins/plugins/virtualbox/files/VirtualBox.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0"?> -<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux"> - <Global> - <ExtraData> - <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/> - <ExtraDataItem name="GUI/Input/HostKey" value="65300"/> - <ExtraDataItem name="GUI/LastVMSelected" value="00000000-0000-0000-0000-00505601fe23"/> - <ExtraDataItem name="GUI/LastWindowPostion" value="455,235,770,550"/> - <ExtraDataItem name="GUI/LicenseAgreed" value="7"/> - <ExtraDataItem name="GUI/MaxGuestResolution" value="any"/> - <ExtraDataItem name="GUI/SUNOnlineData" value="triesLeft=0"/> - <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,confirmInputCapture,remindAboutWrongColorDepth,confirmGoingFullscreen,remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,showRuntimeError.warning.DevATA_DISKFULL,remindAboutPausedVMInput,confirmVMReset"/> - <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/> - <ExtraDataItem name="GUI/UpdateCheckCount" value="2"/> - <ExtraDataItem name="GUI/UpdateDate" value="never"/> - </ExtraData> - <MachineRegistry> - <MachineEntry uuid="{00000000-0000-0000-0000-00505601fe23}" src="Machines/WinXP-Standard-01/WinXP-Standard-01.xml"/> - </MachineRegistry> - <MediaRegistry> - <HardDisks> - <HardDisk uuid="{9cc859b2-955c-4047-9c34-8e3cb164f50e}" location="/tmp/virtualbox/np4/HardDisks/WinXP-Standard-01.vdi" format="VDI" type="Normal"> - <HardDisk uuid="{88bc8b6d-f248-468a-95fe-318084904f8b}" location="/tmp/virtualbox/np4/HardDisks/empty-diff-00.vdi" format="VDI"/> - <HardDisk uuid="{42f5033e-9913-41ff-8cba-1c986ba5db8d}" location="/tmp/virtualbox/np4/HardDisks/empty-diff-01.vdi" format="VDI"/> - <HardDisk uuid="{1b66fdcb-8ede-4bb8-aaec-417bc2074633}" location="/tmp/virtualbox/np4/HardDisks/empty-diff-02.vdi" format="VDI"/> - <HardDisk uuid="{563d2c5e-c9a2-4fbb-be51-8d279a558e6c}" location="/tmp/virtualbox/np4/HardDisks/empty-diff-03.vdi" format="VDI"/> - <HardDisk uuid="{efff0c85-c1c8-420d-a25f-6e66f117e1f2}" location="/tmp/virtualbox/np4/HardDisks/empty-diff-04.vdi" format="VDI"/> - </HardDisk> - </HardDisks> - <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"/> - </DHCPServers> - </NetserviceRegistry> - <SystemProperties defaultMachineFolder="/tmp/virtualbox/np4/Machines" defaultHardDiskFolder="/tmp/virtualbox/np4/HardDisks" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VRDPAuth" webServiceAuthLibrary="VRDPAuth" LogHistoryCount="3"/> - <USBDeviceFilters/> - </Global> -</VirtualBox> diff --git a/os-plugins/plugins/virtualbox/files/machine.include b/os-plugins/plugins/virtualbox/files/machine.include index e11f95c5..125e45cd 100644 --- a/os-plugins/plugins/virtualbox/files/machine.include +++ b/os-plugins/plugins/virtualbox/files/machine.include @@ -1,5 +1,5 @@ # Include file (machine template) for run-virt.include of the virtualbox plugin -cat <<EOF +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}"> <!-- stateFile="Snapshots/{1e5f5eb0-6b13-4407-9906-36114eca1e61}.sav" lastStateChange="2010-03-09T19:48:32Z"> --> @@ -110,7 +110,7 @@ cat <<EOF <StorageControllers> <StorageController name="IDE-Controller" type="PIIX4" PortCount="2"> <AttachedDevice type="HardDisk" port="0" device="0"> - <Image uuid="{${snapshotuuid}}"/> + <Image uuid="{${imageuuid}}"/> </AttachedDevice> <!-- <AttachedDevice passthrough="false" type="DVD" port="0" device="0"> diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include b/os-plugins/plugins/virtualbox/files/run-virt.include index 11f8d0eb..6d300044 100644 --- a/os-plugins/plugins/virtualbox/files/run-virt.include +++ b/os-plugins/plugins/virtualbox/files/run-virt.include @@ -31,6 +31,7 @@ fi ################################################################################ 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 @@ -48,15 +49,14 @@ diskfolder="${confdir}/HardDisks" snapshotdir=${machfolder}/${vm_shortname}/Snapshots mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null -# configure rwimg -if [ "${imgmode}" = "rwimg" ] && ! [ -e "${vmpath}" ]; then +# configure our own rwimg, empty image which we support +if [ "${imgmode}" = "rwimg" ]; then # what is our rwimg called? - imgname="${imgname}.vdi" + imgname="${vm_shortname}.vdi" vmpath=${imgpath}/${imgname} - cat ${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}/rwimg.vdi.gz \ - | gunzip > "${vmpath}" - # static rw share image uuid - #rwimguuid="ab20cb01-2d08-4d73-a33c-5594c5d0b8cb" + if ! [ -e "${vmpath}" ]; then + cat ${PLUGINDIRVIRTUALBOX}/rwimg.vdi.gz | gunzip > "${vmpath}" + fi fi # link to image @@ -65,9 +65,9 @@ ln -sf ${vmpath} ${diskfile} # check the file type if echo ${imgname} | grep -iE "vdi|vmdk|vhd" >/dev/null 2>&1; then - imgtype=$(echo ${imgname##*.} | tr [a-z] [A-Z]) + imgfmt=$(echo ${imgname##*.} | tr [a-z] [A-Z]) else - writelog "${imgname} is not a valid image type (vdi|vmdk|vhd), exiting!" + writelog "${imgname} is not a valid image format (vdi|vmdk|vhd), exiting!" exit 1 fi @@ -105,11 +105,42 @@ macaddr=$(echo ${macaddr} | sed 's/://g') 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, only if rwimg.vdi not used +# get UUID of VBox image 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: ${vmpath}, exiting!" + writelog "Remove lock if you are shure that this is not the case" + exit 1 + # image rw? + elif ! [ -w ${vmpath} ]; then + writelog "You defined mode rw, but image is not rw! \c" + writelog "Please correct, exiting!" + exit 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} +else + # 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 @@ -171,7 +202,6 @@ case "${network_kind}" in ;; *) network_kind="NAT" - ;; esac # external GUI @@ -207,6 +237,16 @@ if [ -n "${boot}" ]; then case ${boot} in n*) # usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network boot="Network" + if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then + # remove spaces from VM name to avoid Problems /w TFTP in NAT + vm_name=$(echo ${vm_name} | sed -e "s, ,-,g") + # link TFTP dir for NAT TFTP boots + mkdir -p ${confdir}/TFTP + cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe + 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 *) @@ -219,8 +259,9 @@ fi writelog "\tSnapshots dir:\t\t$snapshotdir" writelog "Diskimage:" -writelog "\tDisk type:\t\t$imgtype" writelog "\tDisk file:\t\t$diskfile" +writelog "\tDisk format:\t\t$imgfmt" +writelog "\tDisk type:\t\t$imgtype" writelog "\tVMostype:\t\t$vmostype" writelog "\tMachine UUID:\t\t$machineuuid" writelog "\tDisk UUID:\t\t$diskuuid" @@ -246,35 +287,19 @@ writelog "\tShared Folders '${sharename}':\t${sharepath}" ### Pepare and configure virtual machine and disk image ################################################################################ -# TODO: date wichtig? -#date="$(date +%Y-%m-%dT%H:%M:%SZ)" -. ${PLUGINCONFVIRTUALBOX}/virtualbox.include > "${confdir}/VirtualBox.xml" +# create Virtualbox.xml +. ${PLUGINCONFVIRTUALBOX}/virtualbox.include -# remove disk and add rwimg if set -if echo "${imgmode}" | grep -q rw; then - if [ -e "${vmpath}.lock" ]; then - writelog "This rw image is already in use: ${vmpath}, exiting!" - writelog "Remove lock if you are shure that this is not the case" - exit 1 - fi - # add lock - touch "${vmpath}.lock" - # remove lock after VM stopped - RMDIRS="${RMDIRS} ${vmpath}.lock" - rwimghd="<HardDisk uuid=\"{${diskuuid}}\" location=\"${diskfile}\"" - rwimghd="${rwimghd} format=\"VDI\" type=\"Normal\"/>" - sed -i "/<HardDisk uuid/d;s,</HardDisk>,${rwimghd}," \ - "${confdir}/VirtualBox.xml" - # replace image uuid in machine config - snapshotuuid=${diskuuid} +# 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"/> -# shortened date YYYY-MM-DD -#date=${date%T*} -. ${PLUGINCONFVIRTUALBOX}/machine.include > "${machconfig}" +# create machine.xml +. ${PLUGINCONFVIRTUALBOX}/machine.include # add ssh port if linux and NAT if [ "${vmostype}" = "Linux26" ] && [ "${network_kind}" = "NAT" ]; then @@ -291,9 +316,6 @@ if [ "${vmostype}" = "Linux26" ] && [ "${network_kind}" = "NAT" ]; then writelog "\tGuest SSH port:\t\t${vmsshport}" fi -cat ${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}/empty-diff.vdi.gz | \ - gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi" - ################################################################################ ### finally set env for run-virt.sh ################################################################################ diff --git a/os-plugins/plugins/virtualbox/files/virtualbox.include b/os-plugins/plugins/virtualbox/files/virtualbox.include index e0c41290..49b3ce61 100644 --- a/os-plugins/plugins/virtualbox/files/virtualbox.include +++ b/os-plugins/plugins/virtualbox/files/virtualbox.include @@ -1,5 +1,5 @@ # Include file (general template) for run-virt.include of the virtualbox plugin -cat <<EOF +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> @@ -20,7 +20,7 @@ cat <<EOF </MachineRegistry> <MediaRegistry> <HardDisks> - <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgtype}" type="Immutable"> + <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}"> <HardDisk uuid="{${snapshotuuid}}" location="${snapshotdir}/{${snapshotuuid}}.vdi" format="VDI" autoReset="true"/> </HardDisk> </HardDisks> |