/etc/default/rcS no longer exists in recent initscripts versions
[grml-autoconfig.git] / autoconfig.functions
index 94f786c..d518584 100755 (executable)
@@ -1,22 +1,24 @@
 #!/bin/zsh
 # Filename:      autoconfig.functions
 # Purpose:       basic system configuration and hardware setup for grml system
 #!/bin/zsh
 # Filename:      autoconfig.functions
 # Purpose:       basic system configuration and hardware setup for grml system
-# Authors:       grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
+# Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Mon Jun 09 17:05:42 CEST 2008 [mika]
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
 ################################################################################
 
 # {{{ path, variables, signals, umask, zsh
-export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
+export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
 DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 DEBUG="/dev/null"
 KERNEL="$(uname -r)"
+ARCH="$(uname -m)"
 umask 022
 
 # old linuxrc version:
 [ -d /cdrom ]      && export LIVECD_PATH=/cdrom
 umask 022
 
 # old linuxrc version:
 [ -d /cdrom ]      && export LIVECD_PATH=/cdrom
-# new initramfs layout:
+# initramfs layout until around December 2012:
 [ -d /live/image ] && export LIVECD_PATH=/live/image
 [ -d /live/image ] && export LIVECD_PATH=/live/image
+# initramfs layout since around December 2012:
+[ -d /lib/live/mount/medium ] && export LIVECD_PATH=/lib/live/mount/medium
 
 # 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
@@ -33,50 +35,103 @@ fi
 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
 # }}}
 
 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
 # }}}
 
-### {{{ Utility Functions
-
-# Simple shell grep
-stringinfile(){
-  case "$(cat $2)" in *$1*) return 0;; esac
-  return 1
-}
+# {{{ Read in boot parameters
+if [ -z "$CMDLINE" ]; then
+  # if CMDLINE was set from the outside, we're debugging.
+  # otherwise, take CMDLINE from Kernel and config files.
+  CMDLINE="$(cat /proc/cmdline)"
+  [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
+  modprobe 9p 2>/dev/null || true
+  if grep -q 9p /proc/filesystems ; then
+      TAG="grml-parameters"
+      if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
+          MOUNTDIR="$(mktemp -d)"
+          mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
+          CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
+          umount "$MOUNTDIR"
+          rmdir "$MOUNTDIR"
+      fi
+  fi
+fi
+# }}}
 
 
-# same for strings
-stringinstring(){
-  case "$2" in *$1*) return 0;; esac
-  return 1
-}
+### {{{ Utility Functions
 
 
-# Reread boot command line; echo last parameter's argument or return false.
+# Get a bootoption's parameter: read boot command line and either
+# echo last parameter's argument or return false.
 getbootparam(){
 getbootparam(){
-  stringinstring " $1=" "$CMDLINE" || return 1
-  result="${CMDLINE##*$1=}"
-  result="${result%%[  ]*}"
-  echo "$result"
-  return 0
+  local line
+  local ws
+  ws='  '
+  line=" $CMDLINE "
+  case "$line" in
+    *[${ws}]"$1="*)
+      result="${line##*[$ws]$1=}"
+      result="${result%%[$ws]*}"
+      echo "$result"
+      return 0 ;;
+    *) # no match?
+      return 1 ;;
+  esac
 }
 
 # Check boot commandline for specified option
 checkbootparam(){
 }
 
 # Check boot commandline for specified option
 checkbootparam(){
-  stringinstring " $1" "$CMDLINE"
-  return "$?"
+  [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
+  local line
+  local ws
+  ws='  '
+  line=" $CMDLINE "
+  case "$line" in
+    *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
+      return 0 ;;
+    *)
+      return 1 ;;
+  esac
 }
 
 }
 
+# Check if currently using a framebuffer
+hasfb() {
+    [ -e /dev/fb0 ] && return 0 || return 1
+}
+
+# Check wheter a configuration variable (like $CONFIG_TOHD) is
+# enabled or not
 checkvalue(){
 checkvalue(){
-  if [ "$1" = "yes" ] ; then
-    return 0
-  else
-    return 1
-  fi
+  case "$1" in
+    [yY][eE][sS])     return 0 ;; # it's set to 'yes'
+    [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
+                   *) return 1 ;; # default
+  esac
 }
 
 }
 
+# Are we using grml-small?
 checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
 checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
-checkgrmlusb(){
-  grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
+# if no password is set return a random password
+set_passwd() {
+  [ -n "$PASSWD" ] && return 0
+
+  if [ -x /usr/bin/apg ] ; then
+    PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
+  elif [ -x /usr/bin/gpw ] ; then
+    PASSWD="$(gpw 1)"
+  elif [ -x /usr/bin/pwgen ] ; then
+    PASSWD="$(pwgen -1 8)"
+  elif [ -x /usr/bin/hexdump ] ; then
+    PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
+  elif [ -n "$RANDOM" ] ; then
+    PASSWD="grml${RANDOM}"
+  else
+    PASSWD=''
+    eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
+    eend 1
+    return 1
+  fi
 }
 }
+
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -85,7 +140,7 @@ mount_proc(){
 }
 
 mount_pts(){
 }
 
 mount_pts(){
-  stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
+  grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
 }
 
 mount_sys(){
 }
 
 mount_sys(){
@@ -93,23 +148,30 @@ 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)"
-[ -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 in live mode or from HD
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
+# }}}
 
 
-# testcd
-TESTCD=""
-checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
+# {{{ provide information about virtual environments
+VIRTUAL=false # assume physical system by default
+KVM=false
+VIRTUALBOX=false
+VMWARE=false
+
+if vmware-detect &>/dev/null; then
+  VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
+elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
+   [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
+  VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
+elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
+   [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
+  VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
+fi
 # }}}
 
 # {{{ source lsb-functions , color handling
 # }}}
 
 # {{{ source lsb-functions , color handling
-if checkbootparam "nocolor"; then
+if checkbootparam 'nocolor'; then
   RC_NOCOLOR=yes
   . /etc/grml/lsb-functions
   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
   RC_NOCOLOR=yes
   . /etc/grml/lsb-functions
   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
@@ -121,8 +183,8 @@ fi
 
 # {{{ debug
 config_debug(){
 
 # {{{ debug
 config_debug(){
- checkbootparam "debug"                        && BOOTDEBUG="yes"
stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && BOOTDEBUG="yes"
+ checkbootparam 'debug'            && BOOTDEBUG="yes"
checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
 
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
 
  rundebugshell(){
   if [ -n "$BOOTDEBUG" ]; then
@@ -151,13 +213,13 @@ config_debug(){
 
 # {{{ log
 config_log(){
 
 # {{{ log
 config_log(){
-if checkbootparam "log" || checkbootparam "debug" ; then
+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 :(
    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 $?
+     bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
    eoutdent
 else
    DEBUG="/dev/null"
    eoutdent
 else
    DEBUG="/dev/null"
@@ -165,75 +227,57 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ set firmware timeout via bootparam
-config_fwtimeout(){
- if checkbootparam fwtimeout ; then
-   TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
-   einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
-   rmmod firmware_class 1>>$DEBUG 2>&1
-   modprobe firmware_class ; eend $?
- fi
- if [ -z "$TIMEOUT" ] ; then
-   TIMEOUT="100" # linux kernel default: 10
- fi
- if [ -f /sys/class/firmware/timeout ] ; then
-   einfo "Setting timeout for firmware loading to ${TIMEOUT}."
-   echo 100 > /sys/class/firmware/timeout ; eend $?
- fi
-}
-# }}}
-
 ### {{{ language configuration / localization
 config_language(){
 
  einfo "Activating language settings:"
  eindent
 
 ### {{{ language configuration / localization
 config_language(){
 
  einfo "Activating language settings:"
  eindent
 
- # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
+ # people can specify $LANGUAGE and $CONSOLEFONT in a config file
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
 
- grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
-
- # check for bootoption which overrides config from /etc/grml/autoconfig:
- BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
+ # check for bootoption which overrides config from /etc/grml/autoconfig
+ BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
- # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
+ # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
  if [ -z "$INSTALLED" ] ; then
  if [ -z "$INSTALLED" ] ; then
-    [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
+    [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
 
  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 [ -x /usr/sbin/grml-setlang ] ; then
+   # if bootoption lang is used update /etc/default/locale accordingly
+   if [ -n "$BOOT_LANGUAGE" ] ; then
+     /usr/sbin/grml-setlang "$LANGUAGE"
+   # otherwise default to lang=en
+   else
+     /usr/sbin/grml-setlang "en"
+   fi
  fi
 
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
  fi
 
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
-    if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
-       # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
-       # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
+    if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
        fi
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
           ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
        fi
+       if ! hasfb ; then
+          CONSOLEFONT='Lat15-Terminus16'
+       fi
     fi
  fi
 
  # export it now, so error messages get translated, too
     fi
  fi
 
  # export it now, so error messages get translated, too
- if checkgrmlsmall ; then
-    export LANG='C' # grml-small does not provide any further locales
- else
-    [ -r /etc/default/locale ] && . /etc/default/locale
-    export LANG LANGUAGE
- fi
+ [ -r /etc/default/locale ] && . /etc/default/locale
+ export LANG LANGUAGE
 
  # configure keyboard layout, read in already set values first:
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
 
  # now allow keyboard override by boot commandline for later use:
 
  # configure keyboard layout, read in already set values first:
  [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
 
  # now allow keyboard override by boot commandline for later use:
- KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
+ KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
  [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
  # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
  [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
@@ -245,7 +289,7 @@ config_language(){
    local LANGUAGE="$BOOT_LANGUAGE"
    . /etc/grml/language-functions
    # allow setting xkeyboard explicitly different than console keyboard
    local LANGUAGE="$BOOT_LANGUAGE"
    . /etc/grml/language-functions
    # allow setting xkeyboard explicitly different than console keyboard
-   KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
+   KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
    if [ -n "$KXKEYBOARD" ]; then
       XKEYBOARD="$KXKEYBOARD"
       KDEKEYBOARD="$KXKEYBOARD"
    if [ -n "$KXKEYBOARD" ]; then
       XKEYBOARD="$KXKEYBOARD"
       KDEKEYBOARD="$KXKEYBOARD"
@@ -257,7 +301,7 @@ config_language(){
    # duplicate of previous code to make sure /etc/grml/language-functions
    # does not overwrite our values....
    # now allow keyboard override by boot commandline for later use:
    # duplicate of previous code to make sure /etc/grml/language-functions
    # does not overwrite our values....
    # now allow keyboard override by boot commandline for later use:
-   KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
+   KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
    [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
    # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
    [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
@@ -279,7 +323,7 @@ config_language(){
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
  if [ -r /etc/default/locale ] ; then
     if grep -q "LANG=.*UTF" /etc/default/locale ; then
        einfo "Setting up unicode environment."
-       unicode_start 2>>$DEBUG ; eend $?
+       unicode_start >>$DEBUG 2>&1 ; eend $?
     fi
  fi
 
     fi
  fi
 
@@ -291,30 +335,56 @@ 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} -eq 1 ] && NUM_CONSOLES=6
- CUR_CONSOLE=$(fgconsole)
+ NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
+ if [ -n "$NUM_CONSOLES" ] ; then
+    NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
+    [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ fi
+ CUR_CONSOLE=$(fgconsole 2>/dev/null)
+
+ if [ -x "$(which setfont)" ] ; then
+    use_setfont=true
+ elif [ -x "$(which consolechars)" ] ; then
+    use_consolechars=true
+ else
+    eerror "Neither setfont nor consolechars tool present, can not set font."
+    eend 1
+    return 1
+ fi
 
  if [ -n "$CHARMAP" ] ; then
 
  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=$?
+    einfo "Setting font to ${CHARMAP}"
+    RC=0
+    for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+        if $use_setfont ; then
+          setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
+        elif $use_consolechars ; then
+          consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
+        fi
     done
     done
-    [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+    if [ -n "$CUR_CONSOLE" ] ; then
+       [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+    fi
     eend $RC
  fi
 
     eend $RC
  fi
 
- if checkbootparam noconsolefont ; then
+ if checkbootparam 'noconsolefont' ; then
     ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
  else
     if [ -n "$CONSOLEFONT" ] ; 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=$?
+       einfo "Setting font to ${CONSOLEFONT}"
+       RC=0
+       for vc in $(seq 0 ${NUM_CONSOLES}) ; do
+           if $use_setfont ; then
+             setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
+           elif $use_consolechars ; then
+             consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
+           fi
        done
        done
-       [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
-       eend $?
+       if [ -n "$CUR_CONSOLE" ] ; then
+          [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+       fi
+       eend $RC
     fi
  fi
 
     fi
  fi
 
@@ -324,27 +394,57 @@ config_language(){
 
 # {{{ Set hostname
 config_hostname(){
 
 # {{{ Set hostname
 config_hostname(){
- if checkbootparam hostname ; then
+  if ! checkbootparam 'hostname' ; then
+    return 0
+  fi
+
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
+  if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
+    einfo "Generating random hostname as no hostname was specified."
+    HOSTNAME="$(/usr/bin/random-hostname)"
+    eend $?
+  fi
+
   einfo "Setting hostname to $HOSTNAME as requested."
   einfo "Setting hostname to $HOSTNAME as requested."
-  sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
-  hostname $HOSTNAME ; eend $?
- else
-  hostname --file /etc/hostname
- fi
+  grml-hostname $HOSTNAME >>$DEBUG
+  eend $?
 }
 # }}}
 
 # fstabuser (needed when running from harddisk with username != grml {{{
 config_userfstab(){
 }
 # }}}
 
 # fstabuser (needed when running from harddisk with username != grml {{{
 config_userfstab(){
+  # force load of build-in and local config
   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
   [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
+  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
+
+  # 1st. try configured fstab user
   if [ -n "$CONFIG_FSTAB_USER" ] ; then
   if [ -n "$CONFIG_FSTAB_USER" ] ; then
-     fstabuser="$CONFIG_FSTAB_USER"
-  else
-     fstabuser=$(getent passwd 1000 | cut -d: -f1)
+     fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
   fi
   fi
-  # if not yet set fall back to default 'grml' user
-  [ -n "$fstabuser" ] || fstabuser='grml'
+
+  # 2nd. use standard user id
+  [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
+
+  # 3rd. use standard user name
+  [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
+
+  # if not yet set fall back to 'root' user, avoid bad /etc/fstab
+  [ -n "$fstabuser" ] || fstabuser='root'
+}
+# }}}
+
+# local_user (needed when running with username != grml {{{
+config_userlocal() {
+
+  # force load of build-in and local config
+  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
+  [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
+
+  # 1st. try id of primary user
+  localuser=$(getent passwd 1000 | cut -d: -f1)
+
+  # 2nd. use name standard user
+  [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
 }
 # }}}
 
 }
 # }}}
 
@@ -352,371 +452,215 @@ 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"
+
+    if [ -f /etc/default/rcS ] ; then
+      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"
+    # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
+    elif [ -f /etc/adjtime ] ; then
+      checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
+      checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
+      checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
+      grep -q "^UTC$" /etc/adjtime && UTC="-u"
+    fi
+
     # 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="UTC"
+       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
 }
 # }}}
 
 # {{{ print kernel info
 config_kernel(){
  fi
 }
 # }}}
 
 # {{{ print kernel info
 config_kernel(){
-  vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
-  [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
-  einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
+  if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
+    einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
+  else
+    einfo "Running Linux Kernel $KERNEL" ; eend 0
+  fi
+
   if [ -r /proc/cpuinfo ] ; then
   if [ -r /proc/cpuinfo ] ; then
-     if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
-       eindent
-       einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
-       eoutdent
-     fi
+    if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
+      eindent
+      einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
+      eoutdent
+    fi
   fi
   fi
+
   if [ -d /proc/xen ] ; then
   if [ -d /proc/xen ] ; then
-     eindent
-     einfo 'Running kernel featuring support for Xen detected' ; eend 0
-     eoutdent
+    eindent
+    einfo 'Running kernel featuring support for Xen detected' ; eend 0
+    eoutdent
   fi
 }
 # }}}
 
   fi
 }
 # }}}
 
-# {{{ vmware specific stuff
-config_vmware(){
-if checkbootparam novmware ; then
-   ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
-else
-   if [ -z "$INSTALLED" ] ; then
-      if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; 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
-      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
-}
-# }}}
-
-# {{{ qemu specific stuff
-config_qemu(){
-if checkbootparam qemu ; then
-   if [ -r /etc/X11/xorg.conf.example ] ; then
-      einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
-      cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
-   fi
-fi
-}
-# }}}
-
-# {{{ ld.so.cache + depmod
-config_ld_mod(){
-if [ -n "$INSTALLED" ]; then
- if ! [ -r /etc/grml.first.boot ] ; then
-  einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
-  eindent
-# Regenerate ld.so.cache and module dependencies on HD
-    einfo "Running ldconfig" ; ldconfig  ; eend $?
-    einfo "Running depmod"   ; depmod -a ; eend $?
-    touch /etc/grml.first.boot
-    eend 0
-  eoutdent
- fi
-fi
-}
-# }}}
-
 # {{{ timezone
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
 # {{{ timezone
 config_timezone(){
  # don't touch the files if running from harddisk:
  if [ -z "$INSTALLED" ]; then
-    KTZ="$(getbootparam tz 2>>$DEBUG)"
+    KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
     if [ -n "$KTZ" ] ; then
     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
 }
 # }}}
 
-# small computer / nearly no ram {{{
-config_small(){
-
-RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
-# MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
-eindent
-
-if checkbootparam "small"; then
-  einfo "Information: ${RAM} kB of RAM available." ; eend 0
-  einfo "Bootoption small detected. Activating small system."
-  if [ -r /etc/inittab.small ] ; then
-    mv /etc/inittab /etc/inittab.normal
-    mv /etc/inittab.small /etc/inittab
-  else
-    sed -i 's/^9/#&/' /etc/inittab
-    sed -i 's/^10/#&/' /etc/inittab
-    sed -i 's/^11/#&/' /etc/inittab
-    sed -i 's/^12/#&/' /etc/inittab
-  fi
-  /sbin/telinit q ; eend $?
-else
-  if checkgrmlsmall ; then
-    if [[ $RAM -lt 25000 ]] ; then
-      ewarn "Information: ${RAM} kB of RAM available." ; eend 1
-      ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
-      ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
-      ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
-      /bin/zsh --login
-    else
-      einfo "Information: ${RAM} kB of RAM available." ; eend 0
-    fi
-  else
-    if [[ $RAM -lt 58000 ]] ; then
-      ewarn "Information: ${RAM} kB of RAM available." ; eend 1
-      ewarn "At least 64MB of RAM should be available for grml." ; eend 1
-      ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
-      ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
-      /bin/zsh --login
-    else
-      einfo "Information: ${RAM} kB of RAM available." ; eend 0
-    fi
-  fi
-fi
-eoutdent
-}
-# }}}
-
-# skip startup of w3m {{{
-config_fast(){
-if checkbootparam "fast"; then
-  ewarn "Bootoption fast detected. Skipping startup of w3m."
-    sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
-  /sbin/telinit q ; eend $?
-fi
-}
-# }}}
-
 # activate serial console {{{
 config_console(){
 # activate serial console {{{
 config_console(){
-if checkbootparam "console"; then
-  einfo "Bootoption (for serial) console detected."
-  eindent
-    if [ -r /etc/mgetty/mgetty.config ] ; then
-       MODE=$(getbootparam console | awk -F, '{print $2}')
-       MODE=${MODE%%n*}
-       [ -n "$MODE" ] || MODE=9600 # default mode
-       einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
-       sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
-    fi
-
-    einfo "Activating mgetty."
-    sed -i 's/^#T0/T0/' /etc/inittab
-    sed -i 's/^#T1/T1/' /etc/inittab
-    /sbin/telinit q ; eend $?
-  eoutdent
-fi
-}
-# }}}
-
-# For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
-config_cdrom_perm(){
-CDROMS=""
-for DEVICE in /proc/ide/hd?; do
- [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
-done
-[ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
-}
-# }}}
-
-# {{{ Bring up loopback interface now
-config_local_net(){
- if [ -z "$INSTALLED" ] ; then
-    if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
-       grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
-    else
-       ifconfig lo up
-    fi
- fi
-}
-# }}}
+if checkbootparam 'console'; then
+  local line
+  local ws
+  ws='  '
+
+  einfo "Bootoption for serial console detected:"
+
+  line="$CMDLINE x "
+  this=""
+  line="${line#*[$ws]}"
+  local telinitq=""
+  while [ -n "$line" ]; do
+    case "$this" in
+      console=*)
+        local serial="$this"
+        local device="${this%%,*}"
+        local device="${device##*=}"
+        if echo $serial | grep -q ttyS ; then
+          local option="${serial##*,}"
+          # default (works for kvm & CO):
+          local speed="115200,57600,38400,19200,9600,4800,2400,1200";
+          # ... unless overriden by command line:
+          case "$option" in
+            115200*) speed=115200 ;;
+             57600*) speed=57600 ;;
+             38400*) speed=38400 ;;
+             19200*) speed=19200 ;;
+              9600*) speed=9600 ;;
+              4800*) speed=4800 ;;
+              2400*) speed=2400 ;;
+              1200*) speed=1200 ;;
+          esac
+          eindent
+            einfo "Activating console login on device ${device} with speed ${speed}."
+            local number="${device#ttyS}"
+            sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab
+            eend $?
+            telinitq="1"
+          eoutdent
+        fi
+        ;;
+    esac
+    this="${line%%[$ws]*}"
+    line="${line#*[$ws]}"
+  done
 
 
-# firewire devices {{{
-# the raw1394 driver does not yet export info into SYSFS,
-# so let's create raw1394 device manually
-# http://www.michael-prokop.at/blog/index.php?p=352
-config_firewire_dev(){
-if checkbootparam "nofirewiredev" ; then
-  ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
-else
-#if [ "${KERNEL%-*}" == "2.6.11" ] ; then
-  einfo "Creating some firewire devices (fix kernel 2.6-bug)."
-#  cd /dev && MAKEDEV video1394 raw1394
-  [ -r /dev/raw1394 ]   || mknod /dev/raw1394 c 171 0
-  [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
-# mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
-  [ -r /dev/dv1394 ]    || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
-  chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
-  chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
+  if [ -n "$telinitq" ]; then
+    /sbin/telinit q
+  fi
+  eend $?
 fi
 fi
-#fi
-}
-# }}}
-
-# {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
-# otherwise we will get: passwd: Authentication token lock busy
-config_fix_passwd(){
- if [ -z "$INSTALLED" ] ; then
-  touch /etc/.pwd.lock
- fi
 }
 # }}}
 
 # {{{ CD Checker
 config_testcd(){
 }
 # }}}
 
 # {{{ CD Checker
 config_testcd(){
-if [ -n "$TESTCD" ]; then
-   einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
-   einfo "Reading files and checking against GRML/md5sums, this may take a while..."
-   echo -n "${RED}"
-
-   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
-
-   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
+if checkbootparam 'testcd' ; then
+  einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
+  eindent
 
 
-   eend 0
-fi
-}
-# }}}
+  local ERROR=true
+  local FOUND_FILE=false
+  local logfile='/tmp/md5sum.log'
 
 
-# {{{ hardware detection via discover
-config_discover(){
-if checkbootparam "nodisc" ; then
-  ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
-else
- if [ -x /sbin/discover ] ; then
-  einfo "Discovering hardware. Trying to load the following modules in background:"
-   eindent
-   einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
-   eoutdent
-  /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
-  eend 0
- else
-  eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
- fi
-fi
-}
-# }}}
+  rm -f "$logfile"
 
 
-# {{{ hardware detection via hwinfo
-config_hwinfo(){
-if checkbootparam hwinfo >>$DEBUG 2>&1; then
-  einfo "Discovering hardware via hwinfo:"
-  MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
-  echo -n "  Loading modules: "
-  for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
-  eend 0
-fi
-}
-# }}}
+  for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
+    einfo "Checking files against $md5, this may take a while..."
 
 
-# {{{ disable hotplug agents on request
-config_hotplug_agent(){
-if checkbootparam "noagent" ; then
-  AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
-  AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
-  AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
-  einfo "Disabling hotplug-agent(s) $AGENTNL"
-  for agent in $(echo -e $AGENTLIST) ; do
-    mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
+    FOUND_FILE=true
+    OLD_PWD=$(pwd)
+    cd $(dirname "$md5")
+    md5sum -c $(basename "$md5") |& tee -a "${logfile}"
+    if [ $pipestatus[1] -eq 0 ] ; then
+      ERROR=false
+    fi
+    cd "${OLD_PWD}"
   done
   done
-  [ "$?" == "0" ] ; eend $?
-fi
-}
-# }}}
 
 
-# {{{ blacklist of hotplug-modules
-config_hotplug_blacklist(){
-if checkbootparam "black" ; then
-  BLACK="$(getbootparam 'black' 2>>$DEBUG)"
-  BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
-  BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
-  einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
-  echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
-  echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
-  eend 0
-fi
-}
-# }}}
+  if ! $FOUND_FILE ; then
+    eerror 'Error: Could not find md5sum file' ; eend 1
+    return
+  fi
 
 
-# {{{ run hotplug
-config_hotplug(){
-if checkbootparam "nohotplug" ; then
-  ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
-else
-  if [ -r /etc/init.d/hotplug ] ; then
-    einfo "Starting hotplug system in background."
-    /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
-    eend 0
-  elif [ -r /etc/init.d/hotplug-light ] ; then
-    einfo "Starting hotplug-light system in background."
-    /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
-    eend 0
+  if ! $ERROR ; then
+    einfo "Everything looks OK" ; eend 0
   else
   else
-    ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
+    eerror 'Checksum failed for theses files:' ; eend 1
+    egrep -v '(^md5sum:|OK$)' "${logfile}"
+    eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
+    einfon "Hit return to continue, or press the power button to shut down system."
+    read a
   fi
   fi
+
+  eoutdent
 fi
 }
 # }}}
 
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 fi
 }
 # }}}
 
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
-if checkbootparam "blacklist" ; then
+if checkbootparam 'blacklist' ; then
  if [ -z "$INSTALLED" ]; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
  if [ -z "$INSTALLED" ]; then
   einfo "Bootoption blacklist found."
   BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
+  BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
   if [ -n "$BLACK" ] ; then
     for module in $(echo ${BLACK//,/ }) ; do
   if [ -n "$BLACK" ] ; then
     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 $?
+        einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
+        echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
+        echo "blacklist $module"     >> "$BLACKLIST_FILE"
+        echo "alias     $module off" >> "$BLACKLIST_FILE"
+        echo "# end   entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
     done
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
     done
   else
    eerror "No given module for blacklist found. Blacklisting will not work therefore."
@@ -732,266 +676,48 @@ fi
 # }}}
 
 # {{{ ACPI
 # }}}
 
 # {{{ ACPI
-config_acpi_apm(){
-if [ -d /proc/acpi ]; then
-  if checkbootparam "noacpi"; then
-    ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
-  elif checkbootparam "nogrmlacpi" ; then
-    ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
-  else
-    einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
-    eindent
-    found=""
-    for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
-      basename="${a##*/}"
-      basename="${basename%%.*}"
-      case "$basename" in *_acpi)
-       egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
-      esac
-      modprobe $basename >>$DEBUG 2>&1 && found="yes"
-      local BASE="$BASE $basename"
-    done
-    if [ -n "$found" ] ; then
-      einfo "$BASE"  ; eend 0
-    else
-      ewarn "(none)" ; eend 1
-    fi
-    if ! ps x | grep -q /usr/sbin/acpid ; then
-      if ! [ -r /var/run/dbus/pid ] ; then
-        einfo "Starting acpi daemon."
-        /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"
-        eend 1
-      fi
-    else
-      ewarn "acpi daemon already running."
-      eend 0
-    fi
-    eoutdent
-  fi
+config_acpi(){
+if checkbootparam 'noacpi'; then
+  ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
+elif checkbootparam 'nogrmlacpi' ; then
+  ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
+elif [ ! -d /proc/acpi ] ; then
+  ewarn "ACPI: Kernel support not present." ; eend 0
 else
 else
-# APM
-  if checkbootparam "noapm"; then
-    ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
+  einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
+  eindent
+  found=""
+  for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
+    basename="${a##*/}"
+    basename="${basename%%.*}"
+    case "$basename" in *_acpi)
+     egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
+    esac
+    modprobe $basename >>$DEBUG 2>&1 && found="yes"
+    local BASE="$BASE $basename"
+  done
+  if [ -n "$found" ] ; then
+    einfo "$BASE"  ; eend 0
   else
   else
-    modprobe apm power_off=1 >>$DEBUG 2>&1
-    if [ "$?" = "0" ] ; then
-       if [ -x /etc/init.d/apmd ] ;then
-          einfo "APM Bios found, enabling power management functions."
-          /etc/init.d/apmd start ; eend $?
-       fi
-    else
-      eerror "Loading apm module failed." ; eend 1
-    fi
-  fi
-fi
-}
-# }}}
-
-# {{{ PCMCIA Check/Setup
-# This needs to be done before other modules are being loaded (by hwsetup)
-config_pcmcia(){
-if checkbootparam "nopcmcia"; then
-  ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
-else
-  if /usr/sbin/laptop-detect ; then
-    einfo "Detected Laptop - checking for PCMCIA." && eend 0
-    modprobe pcmcia_core >>$DEBUG 2>&1
-    # Try Cardbus or normal PCMCIA socket drivers
-    modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
-    if [ "$?" = "0" ]; then
-      modprobe ds >>$DEBUG 2>&1
-      if [ -d /proc/bus/pccard ] ; then
-       if [ -x /sbin/cardmgr ] ; then
-        einfo "PCMCIA found, starting cardmgr."
-        cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
-       else
-        eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
-       fi
-      fi
-    fi
+    ewarn "(none)" ; eend 1
   fi
   fi
-fi
-}
-# }}}
-
-# {{{ 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."
-   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
-}
-# }}}
-
-# {{{ Check for blind option or brltty
-config_blind(){
-BLIND=""
-checkbootparam "blind" && BLIND="yes"
-BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
-
-if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
-  if [ -x /sbin/brltty ]; then
-    # Blind option detected, start brltty now.
-    # modprobe serial_core parport_serial generic_serial && echo "done"
-    CMD=brltty
-    BRLTYPE=""
-    BRLDEV=""
-    BRLTEXT=""
-    if [ -n "$BRLTTY" ]; then
-      # Extra options
-      BRLTYPE="${BRLTTY%%,*}"
-      R="${BRLTTY#*,}"
-      if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
-        BRLTTY="$R"
-        BRLDEV="${BRLTTY%%,*}"
-        R="${BRLTTY#*,}"
-        if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
-          BRLTTY="$R"
-          BRLTEXT="${BRLTTY%%,*}"
-          R="${BRLTTY#*,}"
-        fi
-      fi
-    fi
-    [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
-    [ -n "$BRLDEV"  ] && CMD="$CMD -d $BRLDEV"
-    [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
-    einfo "Starting braille-display manager."
-#    ( exec $CMD & )
-    ( sh -c "$CMD" & )
-    sleep 2 && BLINDSOUND="yes"
+  if ! pgrep acpid >/dev/null ; then
+    einfo "Starting acpi daemon."
+    /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
+  else
+    ewarn "acpi daemon already running."
     eend 0
   fi
     eend 0
   fi
+  eoutdent
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
-# {{{ Interactive configuration
-config_interactive(){
-  ewarn "config_interactive is deprecated nowadays."
-  ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
-}
-# }}}
-
-# {{{ AGP
-config_agp(){
-if checkbootparam forceagp ; then
-# Probe for AGP. Hope this can fail safely
-  stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
-fi
-}
-# }}}
-
-# {{{ automount(er)
-config_automounter(){
-if checkbootparam automounter ; then
-  RUNLEVEL="$(runlevel)"
-  AUTOMOUNTER=""
-  [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
-
-addautomount(){
-# /dev/ice  options
-  d="${1##*/}"
-  if [ -n "$AUTOMOUNTER" ]; then
-    [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
-    [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
-    [ -L "/mnt/$d" ]      || ln -s "/mnt/auto/$d" "/mnt/$d"
-    anew="$d        -fstype=auto,$2 :$i"
-    stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
-    AUTOMOUNTS="$AUTOMOUNTS $d"
-    new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
-  else
-    [ -d /mnt/$d ] && mkdir -p /mnt/$d
-    new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
+# {{{ Start brltty
+config_brltty() {
+  if checkbootparam 'brltty' ; then
+    [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
   fi
   fi
-  stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
-}
-
-  AUTOMOUNTS="floppy cdrom"
-# Add new devices to /etc/fstab and /etc/auto.mnt
-  for i in /dev/cdrom?*; do
-    if [ -L $i ]; then
-      addautomount "$i" "ro"
-    fi
-  done
-fi
-
-if [ -n "$AUTOMOUNTER" ]; then
-# Check for floppy dir, reinstall with automounter
-  [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
-  [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
-  [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
-  [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
-  [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
-  [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
-  rm -f /etc/fstab.new
-# Replace paths from bootfloppy
-  sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
-  mv -f /etc/fstab.new /etc/fstab
-# Start automounter now
-  einfo "Starting automounter for ${AUTOMOUNTS}."
-  /etc/init.d/autofs start >>$DEBUG ; eend $?
-fi
-}
-# }}}
-
-# {{{ Collect partitions from /proc/partitions first for enabling DMA
-check_partitions(){
-partitions=""
-IDEDISKS=""
-while read major minor blocks partition relax; do
-  partition="${partition##*/}"
-  [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
-  case "$partition" in
-    hd?) IDEDISKS="$IDEDISKS $partition";;                # IDE  Harddisk, entire disk
-    sd?) ;;                                               # SCSI Harddisk, entire disk
-#    [hs]d*) partitions="$partitions /dev/$partition";;    # IDE or SCSI disk partition
-    [hs]d*|ub*) partitions="$partitions /dev/$partition";;    # IDE, USB or SCSI disk partition
-  esac
-done <<EOT
-$(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
-EOT
-}
-check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
-# }}}
-
-# {{{ Enable DMA for all IDE drives now if not disabled
-# Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
-config_dma(){
-if checkbootparam "nodma"; then
-  ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
-else
-  for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
-    if test -d /proc/ide/$d; then
-      if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
-        MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
-        test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
-        einfo "Enabling DMA acceleration for: ${WHITE}$d        ${YELLOW}[${MODEL}]${NORMAL}"
-        echo "using_dma:1" >/proc/ide/$d/settings
-        eend 0
-      fi
-    fi
-  done
-fi
 }
 # }}}
 
 }
 # }}}
 
@@ -999,30 +725,17 @@ fi
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
 config_fstab(){
 
 NOSWAP="yes" # we do not use swap by default!
-if checkbootparam "swap" || checkbootparam "anyswap" ; then
+if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
    NOSWAP=''
    NOSWAP=''
-   checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
+   checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
 fi
 
-if checkbootparam "nofstab" || checkbootparam "forensic" ; then
-  ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
-else
-  einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
-  iszsh && setopt nonomatch
-  if [ -x /usr/sbin/rebuildfstab ] ; then
-     config_userfstab || fstabuser=grml
-     /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
-  else
-     ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
-  fi
-fi # checkbootparam nofstab/forensic
-
 # Scan for swap, config, homedir - but only in live-mode
 if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
    GRML_IMG=""
    GRML_SWP=""
 # Scan for swap, config, homedir - but only in live-mode
 if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
    GRML_IMG=""
    GRML_SWP=""
-   HOMEDIR="$(getbootparam home)"
+   HOMEDIR="$(getbootparam 'home')"
    if [ -n "$partitions" ]; then
       while read p m f relax; do
         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
    if [ -n "$partitions" ]; then
       while read p m f relax; do
         case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
@@ -1088,7 +801,7 @@ if [ -z "$INSTALLED" ] ; then
                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
               eoutdent
               fnew="$SWAPFILE swap swap defaults 0 0"
                 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
               eoutdent
               fnew="$SWAPFILE swap swap defaults 0 0"
-              stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
+              grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
               GRML_SWP="$GRML_SWP $SWAPFILE"
               eend 0
            fi
               GRML_SWP="$GRML_SWP $SWAPFILE"
               eend 0
            fi
@@ -1121,499 +834,336 @@ fi # -z $INSTALLED
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Mouse
-config_mouse(){
-if [ -n "$MOUSE_DEVICE" ] ; then
-  einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
+# {{{ CPU-detection
+config_cpu(){
+if checkbootparam 'nocpu'; then
+  ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
+  return 0
 fi
 fi
-}
-# }}}
 
 
-# {{{ IPv6 configuration
-# Load IPv6 kernel module and print IP adresses
-config_ipv6(){
-if checkbootparam "ipv6"; then
-  einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
-  modprobe ipv6
-  # we probably need some time until stateless autoconfiguration has happened
-  sleep 2
-  NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
-  for DEVICE in `echo "$NETDEVICES"`; do
-    eindent
-      einfo "$DEVICE:"
-      ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
-      COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
-      eindent
-        for ADDR in `echo "$ADDRESSES"` ; do
-            einfo "$ADDR"
-        done
-        if [ "$COUNT" -eq "0" ] ; then
-           einfo "(none)" ; eend 1
-        fi
-      eoutdent
-    eoutdent
-  done
-  eend 0
+if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
+   einfo "Found CPU:"
+   CPU=$(awk -F: '/^processor/{printf "        Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG)
+   echo $CPU | sed 's/ \{1,\}/ /g'
+   eend 0
+else
+   einfo "Found CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0
 fi
 fi
-}
-# }}}
 
 
-# {{{ Fat-Client-Version: DHCP Broadcast for IP address
-config_dhcp(){
-if checkbootparam "nodhcp"; then
-  ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
-else
-  NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
-  rm -rf /etc/network/status ; mkdir -p /etc/network/status
-  for DEVICE in `echo "$NETDEVICES"` ; do
-    einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
-    trap 2 3 11
-    ifconfig $DEVICE up >>$DEBUG 2>&1
-    ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
-    trap "" 2 3 11
-    sleep 1
-    eend 0
-  done
-  if [ -n "$INSTALLED" ] ; then
-     ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
-     eend 0
-  fi
+# no cpufreq setup inside VirtualBox
+if $VIRTUALBOX ; then
+   einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
+   return 0
 fi
 fi
-}
-# }}}
 
 
-# {{{ helper functions
-findfile(){
-FOUND=""
-# search all partitions for a file in the root directory
-for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
-# See if it's already mounted
-  [ -f "$i/$1" ] &&  { echo "$i/$1"; return 0; }
-  if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
-    [ -f "$i/$1" ] && FOUND="$i/$1"
-    umount -l "$i" 2>>$DEBUG
-    [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
-  fi
-done
-return 2
-}
+if [ -x /etc/init.d/loadcpufreq ] ; then
+   einfo "Trying to set up cpu frequency scaling:"
+   eindent
+   SKIP_CPU_GOVERNOR=''
+   LOADCPUFREQ=$(mktemp)
+   /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
+   if grep -q FATAL "$LOADCPUFREQ" ; then
+      eindent
+        SKIP_CPU_GOVERNOR=1
+        oldIFS="$IFS"
+        IFS="
+"
+         for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
+             eerror "$line" ; eend $RC
+         done
+         IFS="$oldIFS"
+      eoutdent
+   elif grep -q done "$LOADCPUFREQ" ; then
+      MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
+      if [ -n "$MODULE" -a "$MODULE" != none ]; then
+         einfo "Loading cpufreq kernel module $MODULE" ; eend 0
+      else
+         SKIP_CPU_GOVERNOR=1
+         ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
+      fi
+   fi
 
 
-fstype(){
-case "$(file -s $1)" in
-  *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
-  *[Rr][Ee][Ii][Ss][Ee][Rr]*)  echo "reiserfs"; return 0;;
-  *[Xx][Ff][Ss]*)  echo "xfs"; return 0;;
-  *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
-  *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
-  *data*)          echo "invalid"; return 0;;
-  *) echo "auto"; return 0;;
-esac
-}
+   rm -f "$LOADCPUFREQ"
 
 
-# Try to mount this filesystem read-only, without or with encryption
-trymount(){
-# Check if already mounted
-case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
-# Apparently, mount-aes DOES autodetect AES loopback files.
-[ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# We need to mount crypto-loop files with initial rw support
-[ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# Mount succeeded?
-[ "$RC" = "0" ] && return 0
-echo ""
-einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
-a="y"
-while [ "$a" != "n" -a "$a" != "N" ]; do
-# We need to mount crypto-loop files with initial rw support
- mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
- echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
- # Problem with ioctl() from getpasswd()?
- # read a
- read a
-done
-return 1
+   if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
+     if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
+       if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
+         einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
+       else
+         einfo "Setting ondemand governor"
+         RC=0
+         for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
+           echo ondemand > $file || RC=1
+         done
+         eend $RC
+       fi
+     fi
+   fi
+
+   eoutdent
+fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ CPU-detection
-config_cpu(){
-if checkbootparam "nocpu"; then
-  ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
-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
+# {{{ autostart of ssh
+config_ssh(){
+if checkbootparam 'ssh' ; then
+   local PASSWD
+   PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
+
+   config_userlocal
+   einfo "Bootoption ssh found, trying to set password for root and user $localuser"
+   [ -z "$localuser" ] && eend 1
+
+   eindent
+   if [ -z "$PASSWD" ] ; then
+     set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
    fi
    fi
-  }
+   eoutdent
 
 
-  if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
-     einfo "Detecting CPU:"
-     CPU=$(awk -F: '/^processor/{printf "      Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG)
-     echo $CPU | sed 's/ \{1,\}/ /g'
-     eend 0
-  else
-     einfo "Detecting CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0
-  fi
+   if [ -n "$PASSWD" ] ; then
+      chpass_options=""
+      if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
+        chpass_options="-m"
+      fi
 
 
-  # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
-  # * it only if we have the according kernel modules available
-  # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
-  # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
-  #   -> parse output of the initscript and output it according to our look'n'feel
-  # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
-  if ! cpufreq_check ; then
-    ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
-  else
-    if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
-       # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
-       if [ -r /proc/acpi/battery/BAT0/info ] ; then
-          if grep -q 'OEM info:                innotek' /proc/acpi/battery/BAT0/info ; then
-             einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
-             return 0
-          fi
-       fi
-       einfo "Detected Laptop - trying to use cpu frequency scaling:"
-       eindent
-       if [ -x /etc/init.d/loadcpufreq ] ; then
-          SKIP_CPU_GOVERNOR=''
-          LOADCPUFREQ=$(mktemp)
-          /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
-          if grep -q FATAL "$LOADCPUFREQ" ; then
-             eindent
-               SKIP_CPU_GOVERNOR=1
-               oldIFS="$IFS"
-               IFS="
-"
-                for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
-                    eerror "$line" ; eend $RC
-                done
-                IFS="$oldIFS"
-             eoutdent
-           elif grep -q done "$LOADCPUFREQ" ; then
-             MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
-             if [ -n "$MODULE" -a "$MODULE" != none ]; then
-                einfo "Loading cpufreq kernel module $MODULE" ; eend 0
-             else
-                ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
-             fi
-          fi
-          rm -f $LOADCPUFREQ
-       elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
-          . /usr/bin/cpufreq-detect.sh
-          if [ -n "$MODULE" -a "$MODULE" != none ]; then
-             einfo "Loading modules ${MODULE}"
-             modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
-             RC=$?
-             if [[ $RC == 0 ]]; then
-                eend 0
-             else
-                SKIP_CPU_GOVERNOR=1
-                eend $1
-             fi
-          else
-             ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
-          fi # $MODULE
-       fi # loadcpufreq
-
-       if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
-          einfo "Loading cpufreq_ondemand, setting ondemand governor"
-          if modprobe cpufreq_ondemand ; RC=$? ; then
-             for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
-                 echo ondemand > $file
-             done
-          fi
-          eend $RC
-       fi # cpu-governor
+      echo "$localuser:$PASSWD" | chpasswd $chpass_options
+      echo "root:$PASSWD" | chpasswd $chpass_options
 
 
-       eoutdent
+      eindent
+      ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
+      eoutdent
+   fi
 
 
-    fi # laptop-detect
-  fi # cpufreq_check
-fi # checkbootparam nocpu
-}
-# }}}
+   einfo "Starting secure shell server in background for root and user $localuser"
+   /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
+   eend $?
 
 
-# {{{ 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
 fi
 }
 fi
 }
+
 # }}}
 
 # }}}
 
-# {{{ set password for user grml
-config_passwd(){
-if checkbootparam passwd >>$DEBUG 2>&1; then
-  einfo "Bootoption passwd found."
-  PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
-  if [ -n "$PASSWD" ] ; then
-    echo "grml:$PASSWD" | chpasswd -m ; eend $?
-  else
-    eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
+# {{{ display hostkeys of SSH server
+config_display_ssh_fingerprints() {
+  if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
+    return 0 # no SSH host keys present
   fi
   fi
-  eindent
-    ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
-  eoutdent
-fi
-}
-# }}}
 
 
-# {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
-config_homedir(){
-if checkbootparam home ; then
-   HOMEDIR="$(getbootparam home)"
-   MYHOMEDEVICE=""
-   MYHOMEMOUNTPOINT=""
-   MYHOMEDIR=""
-   if [ -n "$HOMEDIR" ]; then
-      einfo "Bootoption home detected." && eend 0
-      case "$HOMEDIR" in
-        /dev/*)
-        MYHOMEDEVICE="${HOMEDIR##/dev/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
-      ;;
-        /mnt/*)
-        MYHOMEDEVICE="${HOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-        MYHOMEDIR="$HOMEDIR"
-      ;;
-        [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
-        MYHOMEDIR="$(findfile grml.img)"
-        MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
-        MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
-        MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
-      ;;
-      *)
-        eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
-        eerror "Option ignored." ; eend 1
-      ;;
-      esac
-   fi # -n $HOMEDIR
-
-   if [ -n "$MYHOMEDIR" ]; then
-      if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
-         [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
-         while read device mountpoint fs relax; do
-           case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-             case "$fs" in
-               *[Nn][Tt][Ff][Ss]*)
-                 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
-                 break
-                 ;;
-               *[Ff][Aa][Tt]*)
-                 # Note: This currently won't work with encrypted partitions
-                 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
-                 if [ ! -f "$MYHOMEDIR" ]; then
-                    ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
-                    ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
-                 fi
-                 ;;
-             esac
-
-             if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
-                einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
-                if [ -f "$MYHOMEDIR" ]; then
-                   # It's a loopback file, mount it over the /home/grml directory
-                   trymount "$MYHOMEDIR" /home/grml
-                   RC="$?"
-                   [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
-                   RC="$?"
-                else
-                   # Do a --bind mount
-                   ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
-                   RC="$?"
-                fi # -f $MYHOMEDIR
-
-                [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
-
-             fi #  mount -o remount,rw,...
-           break
-           ;;
-           esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
-         done <<EOT
-         $(cat /proc/mounts)
-EOT
-     fi # if trymount ...
-   fi # -n $MYHOMEDIR
-fi # checkbootparam home
+  einfo "SSH key fingerprints:"
+  for file in /etc/ssh/ssh_host_*_key ; do
+    einfon
+    ssh-keygen -l -f $file
+  done | column -t
+  eend $?
 }
 # }}}
 
 }
 # }}}
 
-# {{{ Check for scripts on CD-ROM
-config_cdrom_scripts(){
-if checkbootparam "script"; then
-   for script in "${LIVECD_PATH}"/scripts/* ; do
-       einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
-       . $script
-   done
+# {{{ autostart of x11vnc
+config_vnc(){
+if checkbootparam 'vnc' ; then
+   config_userlocal
+   VNC_PASSWD=''
+   VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
+   einfo "Bootoption vnc found, trying to set password for user $localuser."
+   eindent
+   if [ -z "$VNC_PASSWD" ] ; then
+      if [ -x /usr/bin/apg ] ; then
+         VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
+      elif [ -x /usr/bin/gpw ] ; then
+         VNC_PASSWD="$(gpw 1)"
+      elif [ -x /usr/bin/pwgen ] ; then
+         VNC_PASSWD="$(pwgen -1 8)"
+      elif [ -x /usr/bin/hexdump ] ; then
+         VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
+      elif [ -n "$RANDOM" ] ; then
+         VNC_PASSWD="${localuser}${RANDOM}"
+      else
+         VNC_PASSWD=''
+         eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
+         eend 1
+      fi
+
+      if [ -n "$VNC_PASSWD" ] ; then
+         ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
+      fi
+   fi
+   eoutdent
+
+   # finally check if we have a password we can use:
+   if [ -n "$VNC_PASSWD" ] ; then
+
+      VNCDIR="/home/${localuser}/.vnc"
+      [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
+
+      if [ ! -x /usr/bin/x11vnc ] ; then
+         eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
+         eend 1
+      else
+         /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
+         /bin/chown -R "$localuser": "$VNCDIR"
+      fi
+   fi
+   if checkbootparam 'vnc_connect' ; then
+      VNC_CONNECT=''
+      VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
+      einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
+      #store the options in a file
+      VNCDIR="/home/${localuser}/.vnc"
+      [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
+      echo " --connect $VNC_CONNECT " >> $VNCDIR/options
+   fi
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
-# {{{ Sound
-config_mixer(){
-if ! [ -x /usr/bin/aumix ] ; then
-  eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
-else
+# {{{ set password for root and default user
+config_passwd(){
+if checkbootparam 'passwd' >>$DEBUG 2>&1; then
+  local PASSWD
+  PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
 
 
-  if ! [ -r /proc/asound/cards ] ; then
-     ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
-     return
-  fi
+  config_userlocal
+  einfo "Bootoption passwd found, trying to set password for root and user $localuser"
+  [ -z "$localuser" ] && eend 1
 
 
-  if checkbootparam vol ; then
-    VOL="$(getbootparam 'vol' 2>>$DEBUG)"
-    if [ -z "$VOL" ] ; then
-      eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
-      VOL='75' # default
-    fi
-  else
-    VOL='75' # default
+  eindent
+  if [ -z "$PASSWD" ] ; then
+    set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
   fi
   fi
+  eoutdent
 
 
-  if checkbootparam nosound ; then
-    einfo "Muting sound devices on request."
-    # some IBM notebooks require the following stuff:
-    if [ -x /usr/bin/amixer ] ; then
-       if amixer get Front 1>/dev/null 2>>$DEBUG ; then
-          amixer set Front unmute 1>/dev/null
-          amixer set Front 0% 1>/dev/null
-       fi
-    fi
-    ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
-    if [ -n "$ERROR" ] ; then
-       eindent
-       eerror "Problem muting sound devices: $ERROR"
-       eoutdent
+  if [ -n "$PASSWD" ] ; then
+    chpass_options=""
+    if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
+      chpass_options="-m"
     fi
     fi
-    eend $RC
-  elif [ -z "$INSTALLED" ]; then
-      einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
-      # some IBM notebooks require the following stuff:
-      if [ -x /usr/bin/amixer ] ; then
-         if amixer get Front 1>/dev/null 2>>$DEBUG ; then
-            amixer set Front unmute 1>/dev/null
-            amixer set Front ${VOL}% 1>/dev/null
-         fi
-      fi
-      # 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?)"
-         eoutdent
-      fi
-      eend $RC
+    echo "$localuser:$PASSWD" | chpasswd $chpass_options
+    echo "root:$PASSWD" | chpasswd $chpass_options
+
+    eindent
+    ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
+    eoutdent
   fi
 
 fi
   fi
 
 fi
-}
-# }}}
 
 
-# {{{ modem detection
-config_modem(){
-if checkbootparam "nomodem"; then
-  ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
-else
-  if [ -x /etc/init.d/sl-modem-daemon ] ; then
-     if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
-        einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
-        eend 0
-     fi
+if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
+  local PASSWD
+  PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
+
+  if [ -z "$PASSWD" ] ; then
+    eerror "No hashed password found, can not set password."
+    eend 1
+    return
+  fi
+
+  config_userlocal
+  einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
+  [ -z "$localuser" ] && eend 1
+
+  if [ -n "$PASSWD" ] ; then
+    chpass_options="-e"
+
+    echo "$localuser:$PASSWD" | chpasswd $chpass_options
+    echo "root:$PASSWD" | chpasswd $chpass_options
+
+    eindent
+    ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
+    eoutdent
   fi
   fi
-fi
-}
-# }}}
 
 
-# {{{ keyboard add-ons
-config_setkeycodes(){
-if checkbootparam "setkeycodes" ; then
- einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
-  # MS MM keyboard add-on
-  # fix
-  setkeycodes e001 126 &>/dev/null
-  setkeycodes e059 127 &>/dev/null
-  # fn keys
-  setkeycodes e03b 59 &>/dev/null
-  setkeycodes e008 60 &>/dev/null
-  setkeycodes e007 61 &>/dev/null
-  setkeycodes e03e 62 &>/dev/null
-  setkeycodes e03f 63 &>/dev/null
-  setkeycodes e040 64 &>/dev/null
-  setkeycodes e041 65 &>/dev/null
-  setkeycodes e042 66 &>/dev/null
-  setkeycodes e043 67 &>/dev/null
-  setkeycodes e023 68 &>/dev/null
-  setkeycodes e057 87 &>/dev/null
-  setkeycodes e058 88 &>/dev/null
-  # hp keycodes
-  setkeycodes e00a 89 e008 90 &>/dev/null
- eend 0
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
-# {{{ wondershaper
-config_wondershaper(){
- if checkbootparam "wondershaper" ; then
-    WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
-    CMD=wondershaper
-    DEVICE=""
-    DOWNSTREAM=""
-    UPSTREAM=""
-    if [ -n "$WONDER" ]; then
-      # Extra options
-      DEVICE="${WONDER%%,*}"
-      R="${WONDER#*,}"
-      if [ -n "$R" -a "$R" != "$WONDER" ]; then
-        WONDER="$R"
-        DOWNSTREAM="${WONDER%%,*}"
-        R="${WONDER#*,}"
-        if [ -n "$R" -a "$R" != "$WONDER" ]; then
-          WONDER="$R"
-          UPSTREAM="${WONDER%%,*}"
-          R="${WONDER#*,}"
-        fi
+# {{{ Sound
+config_mixer () {
+   if ! [ -x /usr/bin/amixer ] ; then
+      eerror "amixer binary not available. Can not set sound volumes therefore."
+      eend 1
+   else
+      if ! [ -r /proc/asound/cards ] ; then
+         ewarn "No soundcard present, skipping mixer settings therefore."
+         eend 0
+         return
       fi
       fi
-    fi
-    [ -n "$DEVICE" ]     && CMD="$CMD $DEVICE"
-    [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
-    [ -n "$UPSTREAM" ]   && CMD="$CMD $UPSTREAM"
-    einfo "Starting wondershaper (${CMD}) in background."
-    ( sh -c $CMD & ) && eend 0
- fi
+
+      for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
+         einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
+         eindent
+
+         if checkbootparam 'vol' ; then
+            VOL="$(getbootparam 'vol' 2>>$DEBUG)"
+            if [ -z "$VOL" ] ; then
+               eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
+               VOL='75'
+               eend 1
+            fi
+         else
+            VOL='75'
+         fi
+
+         if checkbootparam 'nosound' ; then
+            einfo "Muting sound devices on request."
+            ERROR=$(amixer -q set Master mute)
+            RC=$?
+            if [ -n "$ERROR" ] ; then
+               eindent
+               eerror "Problem muting sound devices: $ERROR"
+               eoutdent
+            fi
+            eend $RC
+         elif [ -z "$INSTALLED" ] ; then
+            einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
+
+            if checkbootparam 'micvol' ; then
+               MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+               einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
+            else
+               MICVOL=0
+            fi
+
+            CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
+            IFSOLD=${IFS:-}
+            IFS='
+'
+            for CONTROL in ${=CONTROLS} ; do
+               # such devices can not be controlled with amixer ... unmute
+               [[ "$CONTROL" == *Console* ]] && continue
+
+               if ! echo "${CONTROL}" | grep -q -i "mic" ; then
+                   if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
+                      amixer -c $card -q set "${CONTROL}" unmute
+                   fi
+                   if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
+                      amixer -c $card -q set "${CONTROL}" "${VOL}"%
+                   fi
+               fi
+
+               if [ ${MICVOL} -ne 0 ] ; then
+                  if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
+                     amixer -c $card -q set "${CONTROL}" unmute
+                  fi
+                  if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
+                     amixer -c $card -q set "${CONTROL}" $MICVOL%
+                  fi
+                  eend $?
+               fi
+            done
+            IFS=$IFSOLD
+         fi # checkbootparam 'nosound'
+         eoutdent
+      done
+   fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ syslog-ng
+# {{{ syslog service
 config_syslog(){
 config_syslog(){
- if checkbootparam "nosyslog"; then
+ if checkbootparam 'nosyslog'; then
     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
     SYSLOGD=''
     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
     SYSLOGD=''
@@ -1627,7 +1177,7 @@ config_syslog(){
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
        eerror "No syslog daemon found." ; eend 1
     else
        einfo "Starting $SYSLOGD in background."
-       /etc/init.d/$SYSLOGD start 1>>$DEBUG &
+       /etc/init.d/$SYSLOGD start >>$DEBUG &
        eend 0
     fi
  fi
        eend 0
     fi
  fi
@@ -1636,15 +1186,15 @@ config_syslog(){
 
 # {{{ gpm
 config_gpm(){
 
 # {{{ gpm
 config_gpm(){
- if checkbootparam "nogpm"; then
+ if checkbootparam 'nogpm'; then
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
    if ! [ -r /dev/input/mice ] ; then
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
   ewarn "Not starting GPM as requested on boot commandline." ; eend 0
  else
    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 ) &
+      /etc/init.d/gpm start >>$DEBUG &
+      # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
       eend 0
    fi
  fi
       eend 0
    fi
  fi
@@ -1653,106 +1203,144 @@ config_gpm(){
 
 # {{{ services
 config_services(){
 
 # {{{ services
 config_services(){
- if checkbootparam "services" ; then
-    SERVICE="$(getbootparam services 2>>$DEBUG)"
+ if checkbootparam 'services' ; then
+    SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
-    einfo "Starting service(s) ${SERVICENL} in background."
     for service in $(echo -e $SERVICELIST) ; do
     for service in $(echo -e $SERVICELIST) ; do
-       /etc/init.d/${service} start 1>>$DEBUG &
+      # support running (custom) init scripts in non-blocking mode
+      # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
+      if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
+        einfo "Starting service ${service}."
+        /etc/init.d/${service} start >>$DEBUG
+      else
+        einfo "Starting service ${service} in background."
+        /etc/init.d/${service} start >>$DEBUG &
+      fi
     done
     done
-    [ "$?" == "0" ] ; eend $?
+    eend $?
+ fi
+}
+# }}}
+
+# {{{ remote files
+get_remote_file() {
+  [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
+  SOURCE=$(eval echo "$1")
+  TARGET="$2"
+  getconfig() {
+  wget --timeout=10 --dns-timeout=10  --connect-timeout=10 --tries=1 \
+       --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
+  }
+  einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
+
+  if checkbootparam 'getfile.retries' ; then
+    local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
+  else
+    local counter=10
+  fi
+
+  while ! getconfig && [[ "$counter" != 0 ]] ; do
+    echo -n "Sleeping for 1 second and trying to get config again... "
+    counter=$(( counter-1 ))
+    echo "$counter tries left" ; sleep 1
+  done
+  if [ -s "$TARGET" ] ; then
+    einfo "Downloading was successfull." ; eend 0
+    einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
+    md5sum ${TARGET} ; eend 0
+    return 0;
+  else
+    einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
+    return 1;
  fi
 }
 # }}}
 
 # {{{ config files
 config_netconfig(){
  fi
 }
 # }}}
 
 # {{{ config files
 config_netconfig(){
- if checkbootparam netconfig ; then
+ if checkbootparam 'netconfig' ; then
   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
   CONFIGFILE='/tmp/netconfig.grml'
 
   CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
   CONFIGFILE='/tmp/netconfig.grml'
 
-  getconfig() {
-  wget --timeout=10 --dns-timeout=10  --connect-timeout=10 \
-       --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
-  }
-  einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
-  counter=10
-  while ! getconfig && [[ "$counter" != 0 ]] ; do
-    echo -n "Sleeping for 5 seconds and trying to get config again... "
-    counter=$(( counter-1 ))
-    echo "$counter tries left" ; sleep 1
-  done
-  if [ -r "$CONFIGFILE" ] ; then
-    einfo "Downloading was successfull." ; eend 0
-    einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
-    md5sum $CONFIGFILE ; eend 0
+  if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
     cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
-  else
-    einfo "Sorry, could not fetch $CONFIG" ; eend 1
   fi
   fi
- fi
-}
-# }}}
 
 
-# {{{ blindsound
-config_blindsound(){
- if checkbootparam "blind" ; then
-    beep
-    flite -o play -t "welcome to the gremel system"
  fi
 }
 # }}}
 
  fi
 }
 # }}}
 
-# {{{ welcome sound
-config_welcome(){
- if checkbootparam welcome ; then
-  flite -o play -t "welcome to the gremel system"
- fi
-}
-# }}}
+# {{{ remote scripts
+config_netscript() {
+ if checkbootparam 'netscript' ; then
+  CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
+  SCRIPTFILE='/tmp/netscript.grml'
 
 
-# {{{ fix/workaround for unionfs
-fix_unionfs(){
-  if [ -z "$INSTALLED" ]; then
-   touch /var/cache/apt/*cache.bin
+  if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
+    chmod +x ${SCRIPTFILE}
+    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
   fi
   fi
+
+ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ create all /mnt-directories
-create_mnt_dirs(){
-  ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
-  ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
+# {{{ stats
+config_stats() {
+ if ! checkbootparam 'nostats' ; then
+   BASE_URL="http://stats.grml.org/report/"
+   ACTION_NAME=Boot
+
+   HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
+
+   grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
+   DATE_STRING=$(date +'h=%H&m=%M&s=%S')
+   [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
+     VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
+
+   PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
+
+   echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
+   [ -z "$BOOT" ] && BOOT="local"
+
+   ADDITIONAL_PARAMS=""
+   ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
+     ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
+
+   URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\&params=$PARAMS$ADDITIONAL_PARAMS'
+
+   get_remote_file "$URI" "/dev/null"  >/dev/null 2>&1 &!
+ fi
 }
 # }}}
 
 # {{{ start X window system via grml-x
 config_x_startup(){
 }
 # }}}
 
 # {{{ start X window system via grml-x
 config_x_startup(){
-if checkbootparam startx ; then
- if [ -x /usr/X11R6/bin/X ] ; then
+# make sure we start X only if startx is used *before* a nostartx option
+# so it's possible to disable automatic X startup using nostart
+if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
+ if [ -x "$(which X)" ] ; then
   if [ -z "$INSTALLED" ] ; then
    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
    if [ -z "$WINDOWMANAGER" ] ; then
   if [ -z "$INSTALLED" ] ; then
    WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
    if [ -z "$WINDOWMANAGER" ] ; then
-     einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
-     WINDOWMANAGER="wm-ng"
+     einfo "No window manager specified. Using default one." && eend 0
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
    else
      einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
    fi
-   einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
-   config_userfstab || fstabuser='grml'
+   einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
+   config_userlocal
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
-# su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
-sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
+su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
 EOF
    chmod 755 /etc/init.d/xstartup
 
    # adjust inittab for xstartup
    if grep -q '^6:' /etc/inittab ; then
-      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
+      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
    else # just append tty6 to inittab if no definition is present:
    else # just append tty6 to inittab if no definition is present:
-      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
+      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
    fi
 
    /sbin/telinit q ; eend $?
    fi
 
    /sbin/telinit q ; eend $?
@@ -1764,12 +1352,12 @@ EOF
    fi
 
   else
    fi
 
   else
-    eerror "We are not running from CD - startx will not work, skipping it.
-     Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
+    eerror "We are not running in live mode - startx will not work, skipping it."
+    eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
   fi
  else
   fi
  else
-   eerror "/usr/X11R6/bin/X is not present on this grml flavour.
-   Boot parameter startx does not work therefore." ; eend 1
+   eerror "/usr/bin/X is not present on this grml flavour."
+   eerror "  -> Boot parameter startx does not work therefore." ; eend 1
  fi
 fi
 }
  fi
 fi
 }
 
 # {{{ configuration framework
 config_extract(){
 
 # {{{ configuration framework
 config_extract(){
-if checkbootparam extract ; then
+if checkbootparam 'extract' ; then
  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
  EXTRACTOPTIONS="-- -x $EXTRACT"
 fi
 }
 
  EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
  EXTRACTOPTIONS="-- -x $EXTRACT"
 fi
 }
 
-config_automount(){
-if checkbootparam noautoconfig || checkbootparam forensic ; then
-  ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
+config_finddcsdir() {
+#  - If no GRMLCFG partition is found and noautoconfig is _not_ given
+#    on the command line, nothing is changed and the dcs files are
+#    searched within the .iso, $dcs-dir is set to the root directory
+#    within the .iso
+#  - If a GRMLCFG partition is found, $dcs-dir is set to the root of
+#    the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
+#    set, $dcs-dir is set to the root directory within the .iso.
+#  - If myconfig=foo is set on the command line, $dcs-dir is set to
+#    foo, even if a GRMLCFG partition is present.
+DCSDIR=""
+DCSMP="/mnt/grml"
+# autoconfig, see issue673
+GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
+[ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
+if checkbootparam 'noautoconfig' ; then
+  DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
+  ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
 else
 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
-     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
+  if [ -z "$INSTALLED" ] ; then
+    if checkbootparam 'myconfig' ; then
+      DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
+      if [ -z "$DCSDEVICE" ]; then
+        eerror "Error: No device for bootoption myconfig provided." ; eend 1
+      fi # [ -z "$DCSDEVICE" ]
+    elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
+      einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
+      eindent
+      DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
+
+      modprobe 9p 2>/dev/null || true
+      if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
+          if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
+            einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
+            DCSDEVICE="$GRMLCFG"
+            MOUNTOPTIONS="ro,trans=virtio"
+            DCSFS="9p"
+          fi
+      fi
+
+      if [ -n "$DCSDEVICE" ]; then
+        DCSMP="/mnt/grmlcfg"
+      fi
+      eoutdent
     fi
 
     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 $?
+    # if not specified/present then assume default:
+    if [ -z "$DCSDEVICE" ]; then
+      DCSDIR="${LIVECD_PATH}"
+    else
+      eindent
+      einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
+      DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
+      if [ -n "$DCSDIR" ]; then
+        ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
+      else
+        [ -d $DCSMP ] || mkdir $DCSMP
+        umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
+        mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE  $DCSMP ; RC="$?"
+        if [[ $RC == 0 ]]; then
+          einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
+        else
+          eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
+        fi
+        DCSDIR="$DCSMP"
+      fi
+      eoutdent
     fi
     fi
-    grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
-  else
-    ewarn "No devices with label GRMLCFG found." ; eend 0
   fi
   fi
-  eoutdent
- fi
 fi
 fi
-}
-
-config_myconfig(){
 
 
-if checkbootparam "config" ; then
-  CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
-  [ -z "$CONFIG" ] && CONFIG='config.tbz'
-  einfo "Bootoption config found. config is set to: $CONFIG"
-  eindent
-    einfo "Trying to extract configuration file ${CONFIG}:"
-    cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
-  eoutdent
+if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
+  einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
+elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
+  einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
 fi
 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
- else
-   einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
- fi # [ -n "$MOUNTDEVICE" ]
-fi # checkbootparam myconfig
 
 
-if checkbootparam "partconf" ; then
+config_partconf() {
+if checkbootparam 'partconf' ; then
  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
    [ -d /mnt/grml ] || mkdir /mnt/grml
  MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
  if [ -n "$MOUNTDEVICE" ]; then
    [ -d /mnt/grml ] || mkdir /mnt/grml
@@ -1906,26 +1476,85 @@ fi
 
 # {{{ /cdrom/.*-options
 config_debs(){
 
 # {{{ /cdrom/.*-options
 config_debs(){
-if checkbootparam "debs" ; then
+if checkbootparam 'debs' ; then
+   iszsh && setopt localoptions shwordsplit
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
-   einfo "Tring to install debian package(s) ${DEBS}"
-   dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
+   if [ -z "$DEBS" ] ; then
+      DEBS="*.deb"
+   fi
+   if ! echo $DEBS | grep -q '/'; then
+     # backwards compatibility: if no path is given get debs from debs/
+     DEBS="debs/$DEBS"
+   fi
+   einfo "Trying to install Debian package(s) ${DEBS}"
+   DEBS="$(eval echo ${DCSDIR}/$DEBS)"
+   dpkg -i $DEBS ; eend $?
 fi
 }
 
 config_scripts(){
 fi
 }
 
 config_scripts(){
-if checkbootparam "scripts" ; then
+if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
    SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
    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 $?
+   if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
+     SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
+   fi
+   if ! echo $SCRIPTS | grep -q '/'; then
+     # backwards compatibility: if no path is given get scripts from scripts/
+     SCRIPTS="scripts/$SCRIPTS"
+   fi
+   if [ -n "$SCRIPTS" ]; then
+     SCRIPTS="${DCSDIR}/$SCRIPTS"
+     if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
+       einfo "Trying to execute ${SCRIPTS}"
+       sh -c $SCRIPTS
+       eend $?
+     elif [ -d "$SCRIPTS" ]; then
+       einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
+       run-parts --regex '.*' $SCRIPTS
+       eend $?
+     else
+       einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
+       sh -c $SCRIPTS
+       eend $?
+     fi
+   fi
+fi
+}
+
+config_config(){
+if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
+  CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
+  if [ -z "$CONFIG" ]; then
+    CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
+  fi
+  if [ -n "$CONFIG" ]; then
+    if [ -d "${DCSDIR}/${CONFIG}" ] ; then
+      einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
+
+      cp -a ${DCSDIR}/${CONFIG}/* /
+    elif [ -f "${DCSDIR}/${CONFIG}" ]; then
+      einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
+
+      cd /
+      unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
+    else
+      ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
+    fi
+  fi
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
+# {{{ confing_umount_dcsdir
+config_umount_dcsdir(){
+   # umount $DCSMP if it was mounted by finddcsdir
+   grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
+}
+# }}}
+
 # {{{ mypath
 config_mypath(){
 # {{{ mypath
 config_mypath(){
-if checkbootparam "mypath" ; then
+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
    MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
    einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
    touch /etc/grml/my_path
 }
 # }}}
 
 }
 # }}}
 
-# {{{ distcc
-config_distcc(){
-if checkbootparam "distcc" ; then
- OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
- if [ -n "$OPTIONS" ]; then
-    NET=""
-    INTERFACE=""
-    if [ -n "$OPTIONS" ]; then
-      NET="${OPTIONS%%,*}"
-      R="${OPTIONS#*,}"
-      if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
-        OPTIONS="$R"
-        INTERFACE="${OPTIONS%%,*}"
-        R="${OPTIONS#*,}"
-      fi
-    fi
- fi
- CONFIG=/etc/default/distcc
- sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#"  $CONFIG
- sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
-
- if [ -n "$INTERFACE" ] ; then
-   IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
-
-   counter=10
-   while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
-     counter=$(( counter-1 ))
-     ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
-     sleep 3
-     IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
-   done
- fi
-
- if [ -n "$IP" ] ; then
-   sed -i "s#^LISTENER=.*#LISTENER=$IP#"      $CONFIG
-
-   einfo "Bootoption distcc found. Preparing setup for distcc daemon."
-   eindent
-    id distccd >/dev/null 2>&1 || \
-    (
-      einfo "Creating distcc user" ; \
-      adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
-    )
-
-    einfo "Starting distcc for network ${NET}, listening on ${IP}."
-   /etc/init.d/distcc start 1>/dev/null ; eend $?
-   eoutdent
- else
-   eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
- fi
-fi
-
-if checkbootparam "gcc"; then
- GCC="$(getbootparam gcc 2>>$DEBUG)"
- eindent
- einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
- eoutdent
- rm -f /usr/bin/gcc
- ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
-fi
-
-if checkbootparam "gpp"; then
- GPP="$(getbootparam gpp 2>>$DEBUG)"
- eindent
-  einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
-  if [ -x /usr/bin/g++-${GPP} ] ; then
-     rm -f /usr/bin/g++
-     ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
-  fi
-  einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
-  if [ -x /usr/bin/cpp-${GPP} ] ; then
-     rm -f /usr/bin/cpp
-     ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
-  fi
- eoutdent
-fi
-
-}
-# }}}
-
-# {{{ load modules
-# Notice: use it only on live-cd system, if running from harddisk please
-# add modules to /etc/modules and activate /etc/init.d/module-init-tools
-# in /etc/runlevel.conf
-config_modules(){
-MODULES_FILE=/etc/grml/modules
-if checkbootparam nomodules ; then
-  ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
-elif [ -z "$INSTALLED" ]; then
- if [ -r $MODULES_FILE ] ; then
-  einfo "Loading modules specified in ${MODULES_FILE}:"
-  eindent
-  grep '^[^#]' $MODULES_FILE | \
-  while read module args; do
-    [ "$module" ] || continue
-      einfo "${module}"
-      modprobe $module $args ; eend $?
-  done
-  eoutdent
- else
-  ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
- fi
-fi
-}
-# }}}
-
-# {{{ 915resolution
-config_915resolution(){
-if checkbootparam "915resolution" ; then
- OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
-  if [ -x /usr/sbin/915resolution ]; then
-    CMD=915resolution
-    MODE=""
-    XRESO=""
-    YRESO=""
-    if [ -n "$OPTIONS" ]; then
-      # Extra options
-      MODE="${OPTIONS%%,*}"
-      R="${OPTIONS#*,}"
-      if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
-        OPTIONS="$R"
-        XRESO="${OPTIONS%%,*}"
-        R="${OPTIONS#*,}"
-        if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
-          OPTIONS="$R"
-          YRESO="${OPTIONS%%,*}"
-          R="${OPTIONS#*,}"
-        fi
-      fi
-    fi
-    einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
-    [ -n "$MODE" ] && [ -n "$XRESO"  ] && [ -n "$YRESO" ]  && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
-    eend 0
-  fi
-fi
-}
-# }}}
-
 # {{{ SW-RAID
 config_swraid(){
 # {{{ SW-RAID
 config_swraid(){
-  if [ -z "$INSTALLED" ] ; then
-  # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
-  if checkbootparam 'noraid'   || checkbootparam 'noswraid' -o \
-     checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
+  [ -n "$INSTALLED" ] && return 0
+
+  if checkbootparam 'noraid'   || checkbootparam 'noswraid' || \
+     checkbootparam 'raid=noautodetect' ; then
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
+    [ -e /proc/mdstat ] || modprobe md_mod
     if ! [ -x /sbin/mdadm ] ; then
        eerror "mdadm not available, can not execute it." ; eend 1
     else
     if ! [ -x /sbin/mdadm ] ; then
        eerror "mdadm not available, can not execute it." ; eend 1
     else
@@ -2147,14 +1639,83 @@ config_swraid(){
 
      fi # is /sbin/mdadm executable?
   fi # check for bootoptions
 
      fi # is /sbin/mdadm executable?
   fi # check for bootoptions
-  fi # run only in live-cd mode
+}
+# }}}
+
+# {{{ dmraid
+config_dmraid(){
+  [ -n "$INSTALLED" ] && return 0
+
+  if checkbootparam 'nodmraid' ; then
+    ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
+    return 0
+  fi
+
+  if ! [ -x /sbin/dmraid ] ; then
+    eerror "dmraid not available, can not execute it." ; eend 1
+    return
+  fi
+
+  dmraid_wrapper() {
+    # usage: dmraid_wrapper <dmraid_option>
+    [ -n "$1" ] || return 1
+
+    IFSOLD=${IFS:-}
+    IFS='
+'
+    eindent
+
+    for line in $(dmraid $1 ; echo errcode:$?); do
+      case $line in
+        *'no block devices found'*)
+          einfo "No block devices found" ; eend 0
+          break
+          ;;
+        *'no raid disks'*)
+          einfo "No active dmraid devices found" ; eend 0
+          break
+          ;;
+        errcode:0)
+          eend 0;
+          ;;
+        errcode:1)
+          eend 1
+          ;;
+        *)
+          einfo "$line"
+          ;;
+      esac
+    done
+
+    eoutdent
+    IFS=$IFSOLD
+  }
+
+  if checkbootparam 'dmraid' ; then
+    local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
+    if [ "$ACTION" = "off" ] ; then
+      # Deactivates all active software RAID sets:
+      einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
+      dmraid_wrapper -an
+    else
+      # Activate all software RAID sets discovered:
+      einfo "Activating present dmraid sets (as requested via dmraid):"
+      dmraid_wrapper -ay
+    fi
+
+    return
+  fi
+
+  # by default (no special bootoptions) discover all software RAID devices:
+  einfo "Searching for any present dmraid sets:"
+  dmraid_wrapper -r
 }
 # }}}
 
 # {{{ LVM (Logical Volumes)
 config_lvm(){
 }
 # }}}
 
 # {{{ LVM (Logical Volumes)
 config_lvm(){
-  if [ -z "$INSTALLED" ] ; then
-  # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
+  [ -n "$INSTALLED" ] && return 0
+
   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
@@ -2162,7 +1723,7 @@ config_lvm(){
     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 ! [ -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
+       if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
           einfo "You seem to have logical volumes (LVM) on your system."
           eindent
           einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
@@ -2175,134 +1736,31 @@ config_lvm(){
        fi
     fi # check for lvm binary
   fi # check for bootoption nolvm
        fi
     fi # check for lvm binary
   fi # check for bootoption nolvm
-  fi # run only in live-cd mode
 }
 # }}}
 
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 }
 # }}}
 
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
-if checkbootparam "debnet" ; then
- iszsh && setopt shwordsplit
- DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
- DEVICES="$DEVICES $(ls /dev/mapper/*)"
- FOUND_DEBNET=""
-
+if checkbootparam 'debnet' ; then
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
  einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
- eindent
- if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
-    for i in $DEVICES; do
-     if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
-         einfo "Scanning on $i"
-       if [ -f /mnt/etc/network/interfaces ]; then
-         einfo "/etc/network/interfaces found on ${i}" ; eend 0
-         FOUND_DEBNET="$i"
-         break
-       fi
-       umount /mnt
-     fi
-    done
-
-   if [ -n "$FOUND_DEBNET" ]; then
-     einfo "Stopping network."
-       pump -k 1>/dev/null 2>&1
-       /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
-     einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
-       rm -rf /etc/network/run
-       cp -a /mnt/etc/network /etc
-       rm -rf /etc/network/run
-       mkdir /etc/network/run
-       umount /mnt ; eend $?
-     einfo "Starting network."
-       /etc/init.d/networking start ; eend $?
-   else
-     eerror "/etc/network/interfaces not found." ; eend 1
-   fi
-   eoutdent
- else
-  eerror "Error: /mnt already mounted." ; eend 1
- fi
+ /usr/sbin/debnet
 fi
 }
 # }}}
 
 fi
 }
 # }}}
 
-# {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
-config_ipw3945() {
-  if grep -q ipw3945 /proc/modules ; then
-     if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
-        ewarn "Broken ipw3945 network interface found, reloading module."
-        rmmod ipw3945
-        modprobe ipw3945
-        eend $?
-     fi
-  fi
-}
-# }}}
-
 # {{{ disable console blanking
 config_blanking(){
 # {{{ disable console blanking
 config_blanking(){
-if checkbootparam "noblank" ; then
+if checkbootparam 'noblank' ; then
   einfo "Bootoption noblank found. Disabling monitor blanking."
   setterm -blank 0 ; eend $?
 fi
 }
 # }}}
 
   einfo "Bootoption noblank found. Disabling monitor blanking."
   setterm -blank 0 ; eend $?
 fi
 }
 # }}}
 
-# {{{ grml2hd: automatic installation
-config_grml2hd(){
-
-if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
-
-if checkbootparam "user" ; then
-   NEWUSER=''
-   NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
-   sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
-fi
-
-if checkbootparam "filesystem" ; then
-   FILESYSTEM=''
-   FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
-   sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
-fi
-
-if checkbootparam "partition" ; then
-   PARTITION=''
-   PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
-   # notice: the following checks whether the given partition is available, if not the skip
-   # execution of grml2hd as it might result in data loss...
-   if [ -r $PARTITION ] ; then
-      sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
-   else
-      ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
-   fi
-fi
-
-if checkbootparam "mbr" ; then
-   BOOT_PARTITION=''
-   BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
-   sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
-fi
-
-cat>|/usr/bin/grml2hd_noninteractive<<EOF
-#!/bin/sh
-GRML2HD_NONINTERACTIVE='yes' grml2hd
-EOF
-
-chmod 755 /usr/bin/grml2hd_noninteractive
-einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
-if [ -z "$GRML2HD_FAIL" ] ; then
-   screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
-else
-   ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
-fi
-
-fi # if stringinstring "BOOT_IMAGE=grml2hd ...
-}
-# }}}
-
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
-if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
+if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
 
 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
 
 
 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
 
@@ -2313,7 +1771,7 @@ if ! [ -x /usr/sbin/grml-debootstrap ] ; then
    exit 1
 fi
 
    exit 1
 fi
 
-if checkbootparam "target" ; then
+if checkbootparam 'target' ; then
   TARGET=''
   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
   # notice: the following checks whether the given partition is available, if not the skip
   TARGET=''
   TARGET="$(getbootparam 'target' 2>>$DEBUG)"
   # notice: the following checks whether the given partition is available, if not the skip
@@ -2328,32 +1786,32 @@ else
   exit 1
 fi
 
   exit 1
 fi
 
-if checkbootparam "grub" ; then
+if checkbootparam 'grub' ; then
   GRUB=''
   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
 fi
 
   GRUB=''
   GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
 fi
 
-if checkbootparam "groot" ; then
+if checkbootparam 'groot' ; then
   GROOT=''
   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
 fi
 
   GROOT=''
   GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
 fi
 
-if checkbootparam "release" ; then
+if checkbootparam 'release' ; then
   RELEASE=''
   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
 fi
 
   RELEASE=''
   RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
 fi
 
-if checkbootparam "mirror" ; then
+if checkbootparam 'mirror' ; then
   MIRROR=''
   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
 fi
 
   MIRROR=''
   MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
 fi
 
-if checkbootparam "boot_append" ; then
+if checkbootparam 'boot_append' ; then
   BOOT_APPEND=''
   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
 fi
 
   BOOT_APPEND=''
   BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
 fi
 
-if checkbootparam "password" ; then
+if checkbootparam 'password' ; then
   PASSWORD=''
   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
 fi
   PASSWORD=''
   PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
 fi
@@ -2387,13 +1845,105 @@ screen /usr/bin/grml-debootstrap_noninteractive
 einfo "Invoking a shell, just exit to continue booting..."
 /bin/zsh
 
 einfo "Invoking a shell, just exit to continue booting..."
 /bin/zsh
 
-fi # stringinstring "BOOT_IMAGE=debian2hd
+fi # checkbootparam "BOOT_IMAGE=debian2hd
+}
+# }}}
+
+# {{{ virtualbox shared folders
+config_virtualbox_shared_folders() {
+if $VIRTUALBOX ; then
+  einfo "VirtualBox detected, trying to set up Shared Folders."
+  if ! modinfo vboxsf &>/dev/null ; then
+    ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
+    eend 0
+  elif ! [ -x /usr/sbin/VBoxService ] ; then
+    ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
+    eend 0
+  else
+    eindent
+
+      einfo "Loading vboxsf driver."
+      lsmod | grep -q vboxsf || modprobe vboxsf
+      eend $?
+
+      einfo "Adjusting /dev/vboxguest."
+      chown root:vboxsf /dev/vboxguest
+      chmod 660 /dev/vboxguest
+      eend $?
+
+      config_userfstab
+
+      einfo "Adding $fstabuser to group vboxsf."
+      adduser grml vboxsf &>/dev/null
+      eend $?
+
+      einfo "Starting VBoxService."
+      VBoxService >/dev/null
+      eend $?
+
+      local vbautomation='automation'
+      if checkbootparam 'vbautomation'; then
+        vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
+      fi
+
+      if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
+        ewarn "No automount shared folder '$vbautomation' available"
+        eend 0
+      else
+        einfo "Found automount shared folder '$vbautomation'"
+        eend 0
+
+        local distri="$(getbootparam 'distri' 2>>$DEBUG)"
+        [ -n "$distri" ] || distri='grml'
+
+        local vbox_auto_sf="/media/sf_${vbautomation}"
+
+        sleep 1 # ugly but necessary
+
+        counter=10
+        eindent
+        while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
+          einfo "Waiting another second to retry access to ${vbox_auto_sf}"
+          sleep 1
+          counter=$(( counter-1 ))
+          eend 0
+        done
+        eoutdent
+
+        if ! [ -d "${vbox_auto_sf}" ] ; then
+          eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
+          eend 1
+        else
+          einfo "Found shared folders automation directory $vbox_auto_sf"
+          eend 0
+
+          eindent
+          if checkbootparam 'novbautomation' ; then
+            einfo "Bootoption novbautomation found. Disabling automation script execution."
+            eend 0
+          else
+            if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
+              ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
+              eend 1
+            else
+              einfo "Executing '${vbox_auto_sf}/${distri}' now:"
+              "${vbox_auto_sf}/${distri}"
+              eend $?
+            fi
+          fi
+          eoutdent
+        fi
+      fi
+
+    eoutdent
+  fi
+fi
 }
 # }}}
 
 # {{{ Support customization
 config_distri(){
 }
 # }}}
 
 # {{{ Support customization
 config_distri(){
-if checkbootparam "distri"; then
+if checkbootparam 'distri'; then
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
   DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
   if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
      [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
@@ -2405,14 +1955,5 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-### {{{ backwards compatible stuff
-config_environment(){
-  ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
-}
-config_keyboard(){
-  ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
-}
-# }}}
-
 ## END OF FILE #################################################################
 ## END OF FILE #################################################################
-# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3
+# vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2