Bump Standard Version to 3.8.1 and Compat Version to 5
[grml-autoconfig.git] / autoconfig.functions
index f4cb8fc..af4ce8a 100755 (executable)
@@ -4,7 +4,6 @@
 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 # Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Don Sep 06 23:57:02 CEST 2007 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
@@ -13,6 +12,11 @@ DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 umask 022
 
 KERNEL="$(uname -r)"
 umask 022
 
+# old linuxrc version:
+[ -d /cdrom ]      && export LIVECD_PATH=/cdrom
+# new initramfs layout:
+[ -d /live/image ] && export LIVECD_PATH=/live/image
+
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
@@ -45,7 +49,7 @@ stringinstring(){
 # Reread boot command line; echo last parameter's argument or return false.
 getbootparam(){
   stringinstring " $1=" "$CMDLINE" || return 1
 # Reread boot command line; echo last parameter's argument or return false.
 getbootparam(){
   stringinstring " $1=" "$CMDLINE" || return 1
-  result="${CMDLINE##*$1=}"
+  result="${CMDLINE##* $1=}"
   result="${result%%[  ]*}"
   echo "$result"
   return 0
   result="${result%%[  ]*}"
   echo "$result"
   return 0
@@ -72,6 +76,11 @@ checkgrmlsmall(){
 checkgrmlusb(){
   grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 checkgrmlusb(){
   grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
+
+# execute flite only if it's present
+flitewrapper() {
+   [ -x /usr/bin/flite ] && flite -o play -t "$*"
+}
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -91,7 +100,7 @@ mount_sys(){
 # {{{ Read in boot parameters
 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
 CMDLINE="$(cat /proc/cmdline)"
 # {{{ Read in boot parameters
 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
 CMDLINE="$(cat /proc/cmdline)"
-[ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
+[ -d "${LIVECD_PATH}"/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
 # }}}
 
 # {{{ Check if we are running from the grml-CD or HD
 # }}}
 
 # {{{ Check if we are running from the grml-CD or HD
@@ -116,26 +125,29 @@ fi
 
 # {{{ debug
 config_debug(){
 
 # {{{ debug
 config_debug(){
- if checkbootparam "debug"; then
-   BOOTDEBUG="yes"
- fi
- if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
-   BOOTDEBUG="yes"
- fi
+ checkbootparam "debug"                        && BOOTDEBUG="yes"
+ stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && BOOTDEBUG="yes"
+
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
-    einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
-    eindent
-    if [ -r /etc/grml/screenrc ] ; then
-       einfo "Starting GNU screen to be able to use a full featured shell environment."
-       einfo "Just exit the shells (and therefore screen) to continue boot process..."
-       /bin/zsh -c "screen -c /etc/grml/screenrc"
-    else
-      einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
-      einfo "Just exit the shell to continue boot process..."
-      /bin/zsh
-    fi
-    eoutdent
+     einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
+     if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
+        einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
+        einfo "Just exit the shell to continue boot process..."
+        /bin/zsh
+     else
+        eindent
+        if [ -r /etc/grml/screenrc ] ; then
+           einfo "Starting GNU screen to be able to use a full featured shell environment."
+           einfo "Just exit the shells (and therefore screen) to continue boot process..."
+           /bin/zsh -c "screen -c /etc/grml/screenrc"
+        else
+           einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
+           einfo "Just exit the shell to continue boot process..."
+           /bin/zsh
+        fi
+        eoutdent
+     fi
   fi
  }
 }
   fi
  }
 }
@@ -143,16 +155,16 @@ config_debug(){
 
 # {{{ log
 config_log(){
 
 # {{{ log
 config_log(){
-if checkbootparam "log"; then
-  export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
-  touch $DEBUG
-  einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
-  eindent
-    einfo "Starting bootlogd."
-    bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
-  eoutdent
+if checkbootparam "log" || checkbootparam "debug" ; then
+   export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
+   touch $DEBUG
+   einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
+   eindent
+     einfo "Starting bootlogd." # known to be *very* unreliable :(
+     bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
+   eoutdent
 else
 else
-  DEBUG="/dev/null"
+   DEBUG="/dev/null"
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -192,12 +204,16 @@ config_language(){
 
  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
  if [ -z "$INSTALLED" ] ; then
 
  # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
  if [ -z "$INSTALLED" ] ; then
-    [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
+    [ -n "$LANGUAGE" ] || LANGUAGE='us'
  fi
 
  # if bootoption lang is used update /etc/default/locale, otherwise *not*!
  fi
 
  # if bootoption lang is used update /etc/default/locale, otherwise *not*!
- if [ -n "$BOOT_LANGUAGE" ] ; then
-    [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
+ if [ -n "$BOOT_LANGUAGE" -a -x /usr/sbin/grml-setlang ] ; then
+    if checkgrmlsmall ; then
+       /usr/sbin/grml-setlang "POSIX"
+    else
+       /usr/sbin/grml-setlang "$LANGUAGE"
+    fi
  fi
 
  # set console font
  fi
 
  # set console font
@@ -270,12 +286,8 @@ config_language(){
  # activate unicode console if running within utf8 environment
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
  # activate unicode console if running within utf8 environment
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
-       if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
-          ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
-       else
-          einfo "Setting up unicode environment."
-          unicode_start 2>>$DEBUG ; eend $?
-       fi
+       einfo "Setting up unicode environment."
+       unicode_start 2>>$DEBUG ; eend $?
     fi
  fi
 
     fi
  fi
 
@@ -287,22 +299,31 @@ config_language(){
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
  fi
 
  # we have to set up all consoles, therefore loop it over all ttys:
- NUM_CONSOLES=`fgconsole --next-available`
- NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
+ NUM_CONSOLES=$(fgconsole --next-available)
+ NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
  [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ CUR_CONSOLE=$(fgconsole)
+
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
  if [ -n "$CHARMAP" ] ; then
     einfo "Running consolechars for ${CHARMAP}"
     for vc in `seq 0 ${NUM_CONSOLES}`  ; do
         consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
     done
+    [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
     eend $RC
  fi
     eend $RC
  fi
- if [ -n "$CONSOLEFONT" ] ; then
-    einfo "Running consolechars using ${CONSOLEFONT}"
-    for vc in `seq 0 ${NUM_CONSOLES}`  ; do
-        consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
-    done
-    eend $?
+
+ if checkbootparam noconsolefont ; then
+    ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
+ else
+    if [ -n "$CONSOLEFONT" ] ; then
+       einfo "Running consolechars using ${CONSOLEFONT}"
+       for vc in `seq 0 ${NUM_CONSOLES}`  ; do
+           consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
+       done
+       [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+       eend $?
+    fi
  fi
 
  eoutdent
  fi
 
  eoutdent
@@ -339,26 +360,36 @@ config_userfstab(){
 config_time(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
 config_time(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-    UTC=""
-    checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
-    checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
+    # The default hardware clock timezone is stated as representing local time.
+    UTC="--localtime"
+    grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
+    checkbootparam utc       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
+    checkbootparam gmt       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
+    checkbootparam localtime >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|"  /etc/default/rcS
+    grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
     # hwclock uses the TZ variable
     # hwclock uses the TZ variable
-    [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
-    [ -n "$TZ" ] || TZ=Europe/Vienna
+    KTZ="$(getbootparam tz 2>>$DEBUG)"
+    [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
+    if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
+       ewarn "Warning: unknown timezone $KTZ" ; eend 1
+       KTZ="Europe/Vienna"
+       ewarn "Falling back to timezone $KTZ" ; eend 0
+    fi
 
     if ! [ -r /dev/rtc ] ; then
 
     if ! [ -r /dev/rtc ] ; then
-      ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
-    else
-      ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
-      if [ -n "$ERROR" ] ; then
-         eindent
-         ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
-         if [ -n "$ERROR" ] ; then
-            eerror "Problem running hwclock: $ERROR" ; eend 1
-         fi
-         eoutdent
-      fi
+      ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
     fi
     fi
+
+    ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
+    if [ -n "$ERROR" ] ; then
+       eindent
+       ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
+       if [ -n "$ERROR" ] ; then
+          eerror "Problem running hwclock: $ERROR" ; eend 1
+       fi
+       eoutdent
+    fi
+
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -390,12 +421,17 @@ if checkbootparam novmware ; then
 else
    if [ -z "$INSTALLED" ] ; then
       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
 else
    if [ -z "$INSTALLED" ] ; then
       if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
-              if ! checkbootparam qemu ; then
+         if ! checkbootparam qemu ; then
             if [ -r /etc/X11/xorg.conf.vmware ] ; then
                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
             fi
          fi
             if [ -r /etc/X11/xorg.conf.vmware ] ; then
                einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
                cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
             fi
          fi
+      elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
+         if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
+            einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
+            cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
+         fi
       fi
    fi
 fi
       fi
    fi
 fi
@@ -430,23 +466,27 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# update_progress {{{
-update_progress(){
-  # be sure we are non-blocking
-  (echo "$1" > /etc/sysconfig/progress) &
-}
-# }}}
-
 # {{{ timezone
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
     KTZ="$(getbootparam tz 2>>$DEBUG)"
     if [ -n "$KTZ" ] ; then
 # {{{ timezone
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
     KTZ="$(getbootparam tz 2>>$DEBUG)"
     if [ -n "$KTZ" ] ; then
-       einfo "Setting timezone."
-       [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
-       rm -f /etc/localtime
-       cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
+       if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
+       then
+          ewarn "Warning: unknown timezone $KTZ"; eend 0
+       else
+          einfo "Setting timezone."
+          # update debconf
+          area=$(echo $KTZ | cut -d '/' -f1)
+          zone=$(echo $KTZ | cut -d '/' -f2)
+          echo "tzdata tzdata/Areas       select $area" | debconf-set-selections
+          echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
+          # update files
+          echo $KTZ > /etc/timezone
+          rm -f /etc/localtime
+          cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
+       fi
     fi
  fi
 }
     fi
  fi
 }
@@ -591,25 +631,20 @@ if [ -n "$TESTCD" ]; then
    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
    echo -n "${RED}"
 
    einfo "Reading files and checking against GRML/md5sums, this may take a while..."
    echo -n "${RED}"
 
-   # /linuxrc grml version:
-   [ -d /cdrom/GRML ]      && TESTCD_PATH=/cdrom/GRML
-   # live-initramfs version:
-   [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
-
-   if [ -n "$TESTCD_PATH" ] ; then
-      ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
+   if [ -n "${LIVECD_PATH}"/GRML ] ; then
+      ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
    else
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
    fi
 
    else
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
    fi
 
-   if [ "$?" = "0" ]; then
-     echo " ${GREEN}Everything looks OK${NORMAL}"
-     else
-     echo "${RED} *** CHECKSUM FAILED FOR THESE FILES:                          ***"
-     egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
-     echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
-     echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM.                             ***${NORMAL}"
-     echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}"
+   if [ "$RC" = "0" ]; then
+      einfo "Everything looks OK" ; eend 0
+   else
+      eerror 'Checksum failed for theses files:' ; eend 1
+      egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
+      eerror 'Data on the grml medium is possibly incomplete/damaged or...'
+      eerror '... RAM of your computer is broken.' ; eend 1
+      einfon "Hit return to continue, or press the reset button to quit."
      read a
    fi
 
      read a
    fi
 
@@ -705,18 +740,20 @@ if checkbootparam "blacklist" ; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
   if [ -n "$BLACK" ] ; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
   if [ -n "$BLACK" ] ; then
-    einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
-    echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
-    echo "blacklist $BLACK"     >> /etc/modprobe.d/grml
-    echo "alias     $BLACK off" >> /etc/modprobe.d/grml
-    echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
+    for module in $(echo ${BLACK//,/ }) ; do
+        einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
+        echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
+        echo "blacklist $module"     >> /etc/modprobe.d/grml
+        echo "alias     $module off" >> /etc/modprobe.d/grml
+        echo "# end   entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
+    done
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
   fi
  else
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
   fi
  else
-  ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
+  ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
   eindent
   eindent
-   einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
+   einfo "Please blacklist the module(s) manually using the 'blacklist' script."
   eoutdent
  fi
 fi
   eoutdent
  fi
 fi
@@ -748,10 +785,10 @@ if [ -d /proc/acpi ]; then
     else
       ewarn "(none)" ; eend 1
     fi
     else
       ewarn "(none)" ; eend 1
     fi
-    if ! [ -S /var/run/acpid.socket ] ; then
+    if ! ps x | grep -q /usr/sbin/acpid ; then
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
       if ! [ -r /var/run/dbus/pid ] ; then
         einfo "Starting acpi daemon."
-        /etc/init.d/acpid start >>$DEBUG ; eend $?
+        /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
       else
         eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
         eerror "Solution: please activate acpid via /etc/runlevel.conf"
@@ -811,27 +848,92 @@ fi
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
 
 # {{{ run software synthesizer via speakup
 config_swspeak(){
-if checkbootparam swspeak ; then
- if [ -d /proc/speakup/ ] ; then
-  einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
-  eindent
-   if [ -x /etc/init.d/speech-dispatcher ] ; then
-     einfo "Starting speech-dispatcher."
-     /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
-     einfo "Activating sftsyn in Kernel."
-     echo sftsyn >/proc/speakup/synth_name ; eend $?
-     einfo "Just run swspeak if you want to use software synthesizer via speakup."
-     flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
-   else
-    eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
-    flite -o play -t "speech-dispatcher not available. speakup will not work without it."
+   if checkbootparam swspeak ; then
+      einfo "Bootoption swspeak found."
+
+      if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
+         ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
+         eindent
+         einfo "Loading speakup_soft"
+         if modprobe speakup_soft ; then
+            eend 0
+         else
+            flitewrapper "Fatal error setting up software speakup"
+            eend 1
+            return 1
+         fi
+         eoutdent
+      fi
+
+      if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
+         einfo "Kernel supports speakup." ; eend 0
+         eindent
+            einfo "Just run swspeak if you want to use software synthesizer via speakup."
+            flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
+         eoutdent
+      else
+         eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
+         flitewrapper "Kernel does not seem to support speakup. Sorry."
+      fi
+   fi
+}
+# }}}
+
+# {{{ support hardware synthesizer via speakup
+config_hwspeak(){
+   if checkbootparam speakup.synth ; then
+      einfo "Bootoption speakup.synth found."
+      eindent
+
+      module="$(getbootparam speakup.synth 2>>$DEBUG)"
+      if [ -z "$module" ] ; then
+         eerror "Sorry, no speakup module specified for bootoption speakup.synth."
+         flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
+      else
+         einfo "Trying to load $module"
+         modprobe "speakup_${module}"
+         eend $?
+      fi
+
+      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
+         einfo "Kernel should support speakup now." ; eend 0
+         flitewrapper "Kernel should support speakup now."
+      else
+         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
+         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
+      fi
+
+      eoutdent
+
+   # hwspeak:
+   elif checkbootparam hwspeak ; then
+      einfo "Bootoption hwspeak found."
+
+      if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
+         ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
+         eindent
+         if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
+            eerror "Kernel does not provide speakup modules, sorry." ; eend 1
+         else
+           for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
+                           sed 's#.*speakup/##g ; s#.ko$##g' | \
+                           grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
+              einfo "Trying to load $module"
+              modprobe $module
+              eend $?
+           done
+         fi
+         eoutdent
+      fi
+
+      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
+         einfo "Kernel should support speakup now." ; eend 0
+         flitewrapper "Kernel should support speakup now."
+      else
+         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
+         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
+      fi
    fi
    fi
-  eoutdent
- else
-  eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
-  flite -o play -t "Kernel does not seem to support speakup. Sorry."
- fi
-fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1234,10 +1336,12 @@ if checkbootparam "nocpu"; then
 else
   # check module dependencies
   cpufreq_check() {
 else
   # check module dependencies
   cpufreq_check() {
-   if [ -e /lib64 ] ; then
-      [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
-   else
-      [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+   if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
+      if [ -e /lib64 ] ; then
+         [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
+      else
+         [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+      fi
    fi
   }
 
    fi
   }
 
@@ -1331,20 +1435,46 @@ fi # checkbootparam nocpu
 # {{{ autostart of ssh
 config_ssh(){
 if checkbootparam ssh ; then
 # {{{ autostart of ssh
 config_ssh(){
 if checkbootparam ssh ; then
-  SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
-  einfo "Bootoption passwd found."
-  if [ -n "$SSH_PASSWD" ] ; then
-    echo "grml:$SSH_PASSWD" | chpasswd -m
-    einfo "Starting secure shell server in background."
-    /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
-    /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
-    eend 0
-  else
-    eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
-  fi
-  eindent
-    ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
-  eoutdent
+   SSH_PASSWD=''
+   SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
+   einfo "Bootoption ssh found, trying to set password for user grml."
+   eindent
+   if [ -z "$SSH_PASSWD" ] ; then
+      if [ -x /usr/bin/apg ] ; then
+         SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
+      elif [ -x /usr/bin/gpw ] ; then
+         SSH_PASSWD="$(gpw 1)"
+      elif [ -x /usr/bin/pwgen ] ; then
+         SSH_PASSWD="$(pwgen -1 8)"
+      elif [ -x /usr/bin/hexdump ] ; then
+         SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
+      elif [ -n "$RANDOM" ] ; then
+         SSH_PASSWD="grml${RANDOM}"
+      else
+         SSH_PASSWD=''
+         eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
+         eend 1
+      fi
+
+      if [ -n "$SSH_PASSWD" ] ; then
+         ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
+      fi
+   fi
+   eoutdent
+
+   # finally check if we have a password we can use:
+   if [ -n "$SSH_PASSWD" ] ; then
+      echo "grml:$SSH_PASSWD" | chpasswd -m
+   fi
+
+   einfo 'Starting secure shell server in background.'
+   /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
+   eend $?
+
+   eindent
+   ewarn 'Warning: please change the password for user grml as soon as possible!'
+   eoutdent
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -1453,10 +1583,10 @@ fi # checkbootparam home
 # {{{ Check for scripts on CD-ROM
 config_cdrom_scripts(){
 if checkbootparam "script"; then
 # {{{ Check for scripts on CD-ROM
 config_cdrom_scripts(){
 if checkbootparam "script"; then
-  for script in /cdrom/scripts/* ; do
-    einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
-    . $script
-  done
+   for script in "${LIVECD_PATH}"/scripts/* ; do
+       einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
+       . $script
+   done
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -1507,7 +1637,15 @@ else
             amixer set Front ${VOL}% 1>/dev/null
          fi
       fi
             amixer set Front ${VOL}% 1>/dev/null
          fi
       fi
-      ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
+      # by default assume '0' as volume for microphone:
+      if checkbootparam micvol ; then
+         MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+      else
+         MICVOL=0
+      fi
+
+      # finally set the volumes:
+      ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
       if [ -n "$ERROR" ] ; then
          eindent
          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
       if [ -n "$ERROR" ] ; then
          eindent
          eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
@@ -1598,11 +1736,22 @@ config_wondershaper(){
 # {{{ syslog-ng
 config_syslog(){
  if checkbootparam "nosyslog"; then
 # {{{ syslog-ng
 config_syslog(){
  if checkbootparam "nosyslog"; then
-  ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
+    ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
  else
-  einfo "Starting syslog-ng in background."
-  /etc/init.d/syslog-ng start 1>>$DEBUG &
-  eend 0
+    SYSLOGD=''
+    [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
+    [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
+    [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
+    [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
+    [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
+
+    if [ -z "$SYSLOGD" ] ; then
+       eerror "No syslog daemon found." ; eend 1
+    else
+       einfo "Starting $SYSLOGD in background."
+       /etc/init.d/$SYSLOGD start 1>>$DEBUG &
+       eend 0
+    fi
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1612,10 +1761,14 @@ config_gpm(){
  if checkbootparam "nogpm"; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
  if checkbootparam "nogpm"; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
-  einfo "Starting gpm in background."
-#  /etc/init.d/gpm start 1>>$DEBUG &
-  ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
-  eend 0
+   if ! [ -r /dev/input/mice ] ; then
+      eerror "No mouse found - not starting GPM." ; eend 1
+   else
+      einfo "Starting gpm in background."
+      /etc/init.d/gpm start 1>>$DEBUG &
+      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
+      eend 0
+   fi
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1668,7 +1821,7 @@ config_netconfig(){
 config_blindsound(){
  if checkbootparam "blind" ; then
     beep
 config_blindsound(){
  if checkbootparam "blind" ; then
     beep
-    flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1676,7 +1829,7 @@ config_blindsound(){
 # {{{ welcome sound
 config_welcome(){
  if checkbootparam welcome ; then
 # {{{ welcome sound
 config_welcome(){
  if checkbootparam welcome ; then
-  flite -o play -t "welcome to the gremel system"
+    flitewrapper "welcome to the gremel system"
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -1752,50 +1905,70 @@ if checkbootparam extract ; then
 fi
 }
 
 fi
 }
 
+config_unpack(){
+MOUNTDEVICE="$1"
+MESSAGE="$2"
+
+if [ ! -b "$MOUNTDEVICE" ] ; then
+   return;
+fi
+
+
+[ -d /mnt/grml ] || mkdir /mnt/grml
+umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
+mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
+if [[ $RC == 0 ]]; then
+   einfo "Successfully mounted $MOUNTDEVICE $MESSAGE to /mnt/grml (readonly)." ; eend 0
+   eindent
+   CONFIG=''
+   CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
+   if checkbootparam config ; then
+      FILENAME="$(getbootparam 'config' 2>>$DEBUG)"
+      if [ -e /mnt/grml/${FILENAME} ] ; then
+         einfo "Using /mnt/grml/$FILENAME instead of config.tbz"
+         CONFIG="/mnt/grml/$FILENAME"
+      fi
+   fi
+   if [ -n "$CONFIG" ]; then
+     einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
+     cd /
+     unp $CONFIG $EXTRACTOPTIONS ; eend $?
+   else
+     ewarn "Sorry, could not find file $FILENAME on device $MOUNTDEVICE $MESSAGE label GRMLCFG." ; eend 1
+   fi
+
+   SCRIPT=''
+   SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
+   if [ -n "$SCRIPT" ]; then
+     einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
+     $SCRIPT ; eend $?
+   fi
+   eoutdent
+   else
+   einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
+fi # mount $MOUNTDEVICE
+grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
+
+}
+
 config_automount(){
 if checkbootparam noautoconfig || checkbootparam forensic ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
 config_automount(){
 if checkbootparam noautoconfig || checkbootparam forensic ; then
   ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
 else
  if [ -z "$INSTALLED" ] ; then
-  einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
-  eindent
-  [ -d /mnt/grml ] || mkdir /mnt/grml
-  umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
-# We do need the following fix so floppy disk is available to blkid in any case :-/
-  if [ -r /dev/fd0 ] ; then
-     einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
-#     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
-     if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
-        blkid /dev/fd0 1>>$DEBUG 2>&1
+     einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
+     eindent
+   # We do need the following fix so floppy disk is available to blkid in any case :-/
+     if [ -r /dev/fd0 ] ; then
+        einfo "Floppy device detected. Trying to access floppy disk."
+   #     dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
+        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
+           blkid /dev/fd0 1>>$DEBUG 2>&1
+        fi
      fi
      fi
+     DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
+     config_unpack "$DEVICE" "labeled GRMCFG"
   fi
   fi
-  DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
-  [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
-  if [[ $RC == 0 ]]; then
-    einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
-
-    CONFIG=''
-    CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
-    if [ -n "$CONFIG" ]; then
-      einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
-      cd /
-      unp $CONFIG $EXTRACTOPTIONS ; eend $?
-    else
-      ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
-    fi
-
-    SCRIPT=''
-    SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
-    if [ -n "$SCRIPT" ]; then
-      einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
-      $SCRIPT ; eend $?
-    fi
-    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
-  else
-    ewarn "No devices with label GRMLCFG found." ; eend 0
-  fi
-  eoutdent
- fi
 fi
 }
 
 fi
 }
 
@@ -1807,44 +1980,14 @@ if checkbootparam "config" ; then
   einfo "Bootoption config found. config is set to: $CONFIG"
   eindent
     einfo "Trying to extract configuration file ${CONFIG}:"
   einfo "Bootoption config found. config is set to: $CONFIG"
   eindent
     einfo "Trying to extract configuration file ${CONFIG}:"
-    cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
+    cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
   eoutdent
 fi
 
 if checkbootparam myconfig ; then
  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
   eoutdent
 fi
 
 if checkbootparam myconfig ; then
  MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
-   if checkbootparam file ; then
-    FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
-    [ -n "$FILENAME" ] || FILENAME='config.tbz'
-   fi
-   [ -d /mnt/grml ] || mkdir /mnt/grml
-   umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
-   mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
-    if [[ $RC == 0 ]]; then
-      einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
-      eindent
-      CONFIG=''
-      CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
-      if [ -n "$CONFIG" ]; then
-        einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
-        cd /
-        unp $CONFIG $EXTRACTOPTIONS ; eend $?
-      else
-        ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
-      fi
-
-      SCRIPT=''
-      SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
-      if [ -n "$SCRIPT" ]; then
-        einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
-        $SCRIPT ; eend $?
-      fi
-      eoutdent
-    else
-      einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
-    fi # mount $MOUNTDEVICE
-   grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
+     config_unpack "$MOUNTDEVICE"
  else
    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
  fi # [ -n "$MOUNTDEVICE" ]
  else
    einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
  fi # [ -n "$MOUNTDEVICE" ]
@@ -1876,18 +2019,39 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam "debs" ; then
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam "debs" ; then
-  DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
-  einfo "Tring to install debian package(s) ${DEBS}"
-  dpkg -i /cdrom/debs/$DEBS* ; eend $?
+   DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   einfo "Tring to install debian package(s) ${DEBS}"
+   dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
 fi
 }
 
 config_scripts(){
 if checkbootparam "scripts" ; then
 fi
 }
 
 config_scripts(){
 if checkbootparam "scripts" ; then
-  SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
-  [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
-  einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
-  sh -c /cdrom/scripts/$SCRIPTS ; eend $?
+   SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
+   [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
+   einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
+   sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
+fi
+}
+# }}}
+
+# {{{ mypath
+config_mypath(){
+if checkbootparam "mypath" ; then
+   MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
+   einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
+   touch /etc/grml/my_path
+   chmod 644 /etc/grml/my_path
+   # make sure the directories exist:
+   eindent
+   for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
+       if ! [ -d "$i" ] ; then
+          einfo "Creating directory $i"
+          mkdir -p "$i" ; eend $?
+       fi
+   done
+   grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
+   eoutdent
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -2106,7 +2270,8 @@ config_lvm(){
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
-    if ! [ -x /sbin/lvm -a -x /etc/init.d/lvm2 -a -x /sbin/lvdisplay ] ; then
+    # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
+    if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
        if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
@@ -2194,6 +2359,47 @@ fi
 }
 # }}}
 
 }
 # }}}
 
+# {{{ tohd= bootoption
+config_tohd()
+{
+  if checkbootparam "tohd" ; then
+     local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
+     if [ -z "$TARGET" ] ; then
+        eerror "Error: tohd specified without any partition, can not continue." ; eend 1
+        eerror "Please use something like tohd=/dev/sda9." ; eend 1
+        return 1
+     fi
+
+     if ! [ -b "$TARGET" ] ; then
+        eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
+        return 1
+     fi
+
+     if grep -q $TARGET /proc/mounts ; then
+       eerror "$TARGET already mounted, skipping execution of tohd therefore."
+       eend 1
+       return 1
+     fi
+
+     local MOUNTDIR=$(mktemp -d)
+
+     if mount -o rw "$TARGET" "$MOUNTDIR" ; then
+        einfo "Copyring live system to $TARGET - this might take a while"
+        rsync -a --progress /live/image/live $MOUNTDIR
+       sync
+       umount "$MOUNTDIR"
+        eend $?
+       einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
+     else
+        eerror "Error when trying to mount $TARGET, sorry."; eend 1
+        return 1
+     fi
+
+     rmdir "$MOUNTDIR"
+  fi
+}
+# }}}
+
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
 # {{{ grml2hd: automatic installation
 config_grml2hd(){
 
@@ -2342,11 +2548,11 @@ fi # stringinstring "BOOT_IMAGE=debian2hd
 config_distri(){
 if checkbootparam "distri"; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
 config_distri(){
 if checkbootparam "distri"; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
-  if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
-     [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
+  if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
+     [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
      # make sure the desktop.jpg file is not a symlink, so copying does not file then
      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
      # make sure the desktop.jpg file is not a symlink, so copying does not file then
      [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
-     cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
+     cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
   fi
 fi
 }
   fi
 fi
 }