Release new version 0.9.46
[grml-autoconfig.git] / autoconfig.functions
index 3cc12ee..42c03bd 100755 (executable)
@@ -7,7 +7,7 @@
 ################################################################################
 
 # {{{ 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)"
 ARCH="$(uname -m)"
 DEBUG="/dev/null"
 KERNEL="$(uname -r)"
 ARCH="$(uname -m)"
@@ -98,10 +98,6 @@ checkgrmlsmall(){
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
   grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
 }
 
-# execute flite only if it's present
-flitewrapper() {
-   [ -x /usr/bin/flite ] && flite -o play -t "$*"
-}
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
 ### }}}
 
 # {{{ filesystems (proc, pts, sys) and fixes
@@ -121,10 +117,6 @@ mount_sys(){
 # {{{ Check if we are running in live mode or from HD
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
 # {{{ Check if we are running in live mode or from HD
 INSTALLED=""
 [ -e /etc/grml_cd ] || INSTALLED="yes"
-
-# testcd
-TESTCD=""
-checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes"
 # }}}
 
 # {{{ source lsb-functions , color handling
 # }}}
 
 # {{{ source lsb-functions , color handling
@@ -176,7 +168,7 @@ if checkbootparam 'log' || checkbootparam 'debug' ; then
    einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
    eindent
      einfo "Starting bootlogd." # known to be *very* unreliable :(
    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"
@@ -189,7 +181,7 @@ config_fwtimeout(){
  if checkbootparam 'fwtimeout' ; then
    TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
    einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
  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
+   rmmod firmware_class >>$DEBUG 2>&1
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
    modprobe firmware_class ; eend $?
  fi
  if [ -z "$TIMEOUT" ] ; then
@@ -197,7 +189,7 @@ config_fwtimeout(){
  fi
  if [ -f /sys/class/firmware/timeout ] ; then
    einfo "Setting timeout for firmware loading to ${TIMEOUT}."
  fi
  if [ -f /sys/class/firmware/timeout ] ; then
    einfo "Setting timeout for firmware loading to ${TIMEOUT}."
-   echo 100 > /sys/class/firmware/timeout ; eend $?
+   echo $TIMEOUT > /sys/class/firmware/timeout ; eend $?
  fi
 }
 # }}}
  fi
 }
 # }}}
@@ -208,16 +200,14 @@ config_language(){
  einfo "Activating language settings:"
  eindent
 
  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:
+ # check for bootoption which overrides config from /etc/grml/autoconfig
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
 
  BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
  [ -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
     [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
  if [ -z "$INSTALLED" ] ; then
     [ -n "$LANGUAGE" ] || LANGUAGE='en'
  fi
@@ -235,8 +225,6 @@ config_language(){
  # set console font
  if [ -z "$CONSOLEFONT" ] ; then
     if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
  # 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 [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
        if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
           CONSOLEFONT='Uni3-Terminus16'
        else
@@ -306,7 +294,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
 
@@ -318,17 +306,36 @@ 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
 
@@ -336,12 +343,19 @@ config_language(){
     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
 
@@ -353,6 +367,11 @@ config_language(){
 config_hostname(){
  if checkbootparam 'hostname' ; then
   HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
 config_hostname(){
  if checkbootparam 'hostname' ; then
   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."
   grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
   [ "$RC" = "0" ] && hostname $HOSTNAME
   einfo "Setting hostname to $HOSTNAME as requested."
   grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
   [ "$RC" = "0" ] && hostname $HOSTNAME
@@ -376,6 +395,23 @@ config_userfstab(){
 }
 # }}}
 
 }
 # }}}
 
+# {{{ mount configfs
+config_configfs() {
+  einfo "Mounting configfs"
+  CONFIGFS_DIR=/sys/kernel/config/
+  modprobe configfs 2>/dev/null 1>&2
+  if ! [  -d "$CONFIGFS_DIR" ] ; then
+    eindent
+    einfo "$CONFIGFS_DIR does not exist, can't mount directory"
+    eend 1
+    eoutdent
+  else
+    mount -t configfs configfs "$CONFIGFS_DIR" 2>/dev/null 1>&2
+    eend $?
+  fi
+}
+# }}}
+
 # {{{ Set clock (Local time is more often used than GMT, so it is default)
 config_time(){
  # don't touch the files if running from harddisk:
 # {{{ Set clock (Local time is more often used than GMT, so it is default)
 config_time(){
  # don't touch the files if running from harddisk:
@@ -434,41 +470,6 @@ config_kernel(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ 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 || checkbootparam "BOOT_IMAGE=vmware" ; 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
 # {{{ ld.so.cache + depmod
 config_ld_mod(){
 if [ -n "$INSTALLED" ]; then
@@ -563,7 +564,7 @@ eoutdent
 config_fast(){
 if checkbootparam 'fast'; then
   ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
 config_fast(){
 if checkbootparam 'fast'; then
   ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
-    sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
+    sed -i '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab
   /sbin/telinit q ; eend $?
 fi
 }
   /sbin/telinit q ; eend $?
 fi
 }
@@ -572,66 +573,56 @@ fi
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
 # 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
-}
-# }}}
+  local line
+  local ws
+  ws='  '
 
 
-# {{{ 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
-}
-# }}}
+  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
 }
 # }}}
 
 }
 # }}}
 
@@ -646,18 +637,30 @@ config_fix_passwd(){
 
 # {{{ CD Checker
 config_testcd(){
 
 # {{{ CD Checker
 config_testcd(){
-if [ -n "$TESTCD" ]; then
+if checkbootparam 'testcd' ; then
    einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
    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
+   ERROR=0
+   FOUND_FILE=0
+
+   rm -f /tmp/md5sum.log
+   for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
+      einfo "Checking files against $md5, this may take a while..."
+
+      FOUND_FILE=1
+      ( cd $(dirname "$md5") && md5sum -c $(basename "$md5") ; RC=$?)  |& tee -a /tmp/md5sum.log
+
+      if [ $RC -ne 0 ] ; then
+         ERROR=1
+      fi
+   done
+
+   if [ $FOUND_FILE -eq 0 ] ; then
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
       echo "${RED} *** Error: Could not find md5sum file.                           ***"
+      return
    fi
 
    fi
 
-   if [ "$RC" = "0" ]; then
+   if [ "$ERROR" -eq 0 ]; then
       einfo "Everything looks OK" ; eend 0
    else
       eerror 'Checksum failed for theses files:' ; eend 1
       einfo "Everything looks OK" ; eend 0
    else
       eerror 'Checksum failed for theses files:' ; eend 1
@@ -673,86 +676,6 @@ fi
 }
 # }}}
 
 }
 # }}}
 
-# {{{ 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
-}
-# }}}
-
-# {{{ 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
-}
-# }}}
-
-# {{{ 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
-  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
-}
-# }}}
-
-# {{{ 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
-  else
-    ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
-  fi
-fi
-}
-# }}}
-
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 if checkbootparam 'blacklist' ; then
 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
 config_blacklist(){
 if checkbootparam 'blacklist' ; then
@@ -782,289 +705,39 @@ 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
-  fi
-fi
-}
-# }}}
-
-# {{{ run software synthesizer via speakup
-config_swspeak(){
-   if checkbootparam 'swspeak' ; then
-      einfo "Bootoption swspeak found."
-
-      if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
-         ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
-         eindent
-         einfo "Loading speakup_soft"
-         if modprobe speakup_soft ; then
-            eend 0
-         else
-            flitewrapper "Fatal error setting up software speakup"
-            eend 1
-            return 1
-         fi
-         eoutdent
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
-         einfo "Kernel supports speakup." ; eend 0
-         eindent
-            einfo "Just run swspeak if you want to use software synthesizer via speakup."
-            flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
-         eoutdent
-      else
-         eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
-         flitewrapper "Kernel does not seem to support speakup. Sorry."
-      fi
-   fi
-}
-# }}}
-
-# {{{ support hardware synthesizer via speakup
-config_hwspeak(){
-   if checkbootparam 'speakup.synth' ; then
-      einfo "Bootoption speakup.synth found."
-      eindent
-
-      module="$(getbootparam 'speakup.synth' 2>>$DEBUG)"
-      if [ -z "$module" ] ; then
-         eerror "Sorry, no speakup module specified for bootoption speakup.synth."
-         flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
-      else
-         einfo "Trying to load $module"
-         modprobe "speakup_${module}"
-         eend $?
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
-         einfo "Kernel should support speakup now." ; eend 0
-         flitewrapper "Kernel should support speakup now."
-      else
-         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
-         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
-      fi
-
-      eoutdent
-
-   # hwspeak:
-   elif checkbootparam 'hwspeak' ; then
-      einfo "Bootoption hwspeak found."
-
-      if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
-         ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
-         eindent
-         if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
-            eerror "Kernel does not provide speakup modules, sorry." ; eend 1
-         else
-           for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
-                           sed 's#.*speakup/##g ; s#.ko$##g' | \
-                           grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
-              einfo "Trying to load $module"
-              modprobe $module
-              eend $?
-           done
-         fi
-         eoutdent
-      fi
-
-      if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
-         einfo "Kernel should support speakup now." ; eend 0
-         flitewrapper "Kernel should support speakup now."
-      else
-         eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
-         flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
-      fi
-   fi
-}
-# }}}
-
-# {{{ 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"
-    eend 0
+    ewarn "(none)" ; eend 1
   fi
   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
-  grep -q "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"
-    grep -q "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
-    AUTOMOUNTS="$AUTOMOUNTS $d"
-    new="$1 /mnt/auto/$d  auto   users,noauto,exec,$2 0 0"
+  if ! pgrep acpid >/dev/null ; then
+    einfo "Starting acpi daemon."
+    /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
   else
   else
-    [ -d /mnt/$d ] && mkdir -p /mnt/$d
-    new="$1 /mnt/$d  auto   users,noauto,exec,$2 0 0"
+    ewarn "acpi daemon already running."
+    eend 0
   fi
   fi
-  grep -q "$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 $?
+  eoutdent
 fi
 }
 # }}}
 fi
 }
 # }}}
@@ -1086,7 +759,15 @@ done <<EOT
 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
 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"
+check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
+# }}}
+
+# {{{ Start brltty
+config_brltty() {
+  if checkbootparam 'brltty' ; then
+    [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
+  fi
+}
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
 # }}}
 
 # {{{ Enable DMA for all IDE drives now if not disabled
@@ -1119,19 +800,6 @@ if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 fi
 
    checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
 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."
 # Scan for swap, config, homedir - but only in live-mode
 if [ -z "$INSTALLED" ] ; then
    [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
@@ -1273,181 +941,74 @@ 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 --script=/usr/lib/grml-autoconfig/pump-runparts >>$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
-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
-}
-
-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
-}
-
-# 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
-}
-# }}}
-
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
   ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
+  return 0
+fi
+
+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
 else
-  # check module dependencies
-  cpufreq_check() {
-   if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
-      if [ -e /lib64 ] ; then
-         [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
+   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
+
+# no cpufreq setup inside VirtualBox
+if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
+   einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
+   return 0
+fi
+
+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
       else
-         [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
+         SKIP_CPU_GOVERNOR=1
+         ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
       fi
    fi
       fi
    fi
-  }
 
 
-  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
+   rm -f $LOADCPUFREQ
 
 
-  # 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 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
-     # Virtual Box supports ACPI and laptop-detect would return 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
+   if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
+     if grep -vq ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
+       einfo "Loading cpufreq_ondemand"
+       modprobe cpufreq_ondemand
+       eend $?
      fi
      fi
-     einfo "Trying to set up 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
 
 
-     eoutdent
+     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 # cpu-governor
 
 
-  fi # cpufreq_check
-fi # checkbootparam nocpu
+   eoutdent
+fi
 }
 # }}}
 
 }
 # }}}
 
@@ -1492,8 +1053,8 @@ if checkbootparam 'ssh' ; then
    fi
 
    einfo 'Starting secure shell server in background.'
    fi
 
    einfo 'Starting secure shell server in background.'
-   /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
-   /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
+   /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
+   /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
    eend $?
 
    eindent
    eend $?
 
    eindent
@@ -1549,6 +1110,15 @@ if checkbootparam 'vnc' ; then
          /bin/chown -R "$USER": "$VNCDIR"
       fi
    fi
          /bin/chown -R "$USER": "$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/${USER}/.vnc"
+      [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
+      echo " --connect $VNC_CONNECT " >> $VNCDIR/options
+   fi
 fi
 }
 # }}}
 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
-}
-# }}}
-
 # {{{ Sound
 # {{{ 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
-
-  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
-  fi
-
-  if checkbootparam 'nosound' ; then
-    einfo "Muting sound devices on request."
-
-    fix_ibm_sound 0
-    # mute the master, this should be sufficient
-    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}."
-
-      fix_ibm_sound ${VOL}
-
-      # 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:
-      RC=0
-      for CONTROL in Master PCM ; do
-         amixer -q set ${CONTROL} ${VOL}%
-         if [ $? -ne 0 ] ; then RC=$? ; fi
-      done
-      # dont know how to set microphone volume for all soundcards with amixer,
-      # so use aumix instead :/
-      if [ ${MICVOL} -ne 0 -a -x /usr/bin/aumix ] ; then
-         aumix -m $MICVOL &>/dev/null
-         if [ $? -ne 0 ] ; then RC=$? ; fi
+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
 
-      eend $RC
-  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
 
 
-fi
-}
+         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
 
 
-# on some IBM notebooks the front control has to be toggled
-fix_ibm_sound() {
- if [ -z $1 ] ; then
-    return
- 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}."
 
 
- VOL=${1}
+            if checkbootparam 'micvol' ; then
+               MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+               einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
+            else
+               MICVOL=0
+            fi
 
 
- if [ -x /usr/bin/amixer ] ; then
-    if amixer -q get Front 1>/dev/null 2>>$DEBUG ; then
-       amixer -q set Front unmute &>/dev/null
-       amixer -q set Front ${VOL}% &>/dev/null
-    fi
- fi
+            CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
+            IFSOLD=${IFS:-}
+            IFS='
+'
+            for CONTROL in ${=CONTROLS} ; do
+               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
 }
 # }}}
 
 }
 # }}}
 
@@ -1753,34 +1234,6 @@ 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
-}
-# }}}
-
 # {{{ wondershaper
 config_wondershaper(){
  if checkbootparam 'wondershaper' ; then
 # {{{ wondershaper
 config_wondershaper(){
  if checkbootparam 'wondershaper' ; then
@@ -1829,7 +1282,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
@@ -1845,8 +1298,8 @@ config_gpm(){
       eerror "No mouse found - not starting GPM." ; eend 1
    else
       einfo "Starting gpm in background."
       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
@@ -1859,11 +1312,18 @@ config_services(){
     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
     SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
     SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
     SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
     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
 }
 # }}}
  fi
 }
 # }}}
@@ -1918,30 +1378,41 @@ config_netscript() {
 
   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
     chmod +x ${SCRIPTFILE}
 
   if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
     chmod +x ${SCRIPTFILE}
-    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && ${SCRIPTFILE} ; eend $?
+    einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
   fi
 
  fi
 }
 # }}}
 
   fi
 
  fi
 }
 # }}}
 
-# {{{ blindsound
-config_blindsound(){
- if checkbootparam 'blind' ; then
-    beep
-    flitewrapper "welcome to the gremel system"
- fi
-}
-# }}}
+# {{{ 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" " " )"
 
 
-# {{{ welcome sound
-config_welcome(){
- if checkbootparam 'welcome' ; then
-    flitewrapper "welcome to the gremel system"
+   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
 }
 # }}}
  fi
 }
 # }}}
-
 # {{{ fix/workaround for unionfs
 fix_unionfs(){
   if [ -z "$INSTALLED" ]; then
 # {{{ fix/workaround for unionfs
 fix_unionfs(){
   if [ -z "$INSTALLED" ]; then
@@ -1950,41 +1421,32 @@ fix_unionfs(){
 }
 # }}}
 
 }
 # }}}
 
-# {{{ 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
-}
-# }}}
-
 # {{{ start X window system via grml-x
 config_x_startup(){
 # 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
 # {{{ start X window system via grml-x
 config_x_startup(){
 # 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 [ -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."
+   einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
    config_userfstab || fstabuser='grml'
  cat>|/etc/init.d/xstartup<<EOF
 #!/bin/sh
    config_userfstab || fstabuser='grml'
  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 $fstabuser -c "/usr/bin/grml-x"
 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 $?
@@ -2000,7 +1462,7 @@ EOF
     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
   fi
  else
     eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
   fi
  else
-   eerror "/usr/X11R6/bin/X is not present on this grml flavour."
+   eerror "/usr/bin/X is not present on this grml flavour."
    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
  fi
 fi
    eerror "  -> Boot parameter startx does not work therefore." ; eend 1
  fi
 fi
@@ -2027,8 +1489,11 @@ config_finddcsdir() {
 #    foo, even if a GRMLCFG partition is present.
 DCSDIR=""
 DCSMP="/mnt/grml"
 #    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' || checkbootparam 'forensic' ; then
 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
-  ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
+  ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
 else
   if [ -z "$INSTALLED" ] ; then
     if checkbootparam 'myconfig' ; then
 else
   if [ -z "$INSTALLED" ] ; then
     if checkbootparam 'myconfig' ; then
@@ -2037,16 +1502,16 @@ else
         eerror "Error: No device for bootoption myconfig provided." ; eend 1
       fi # [ -z "$DCSDEVICE" ]
     elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
         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
+      einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
       eindent
       # We do need the following fix so floppy disk is available to blkid in any case :-/
       if [ -r /dev/fd0 ] ; then
         einfo "Floppy device detected. Trying to access floppy disk."
       eindent
       # We do need the following fix so floppy disk is available to blkid in any case :-/
       if [ -r /dev/fd0 ] ; then
         einfo "Floppy device detected. Trying to access floppy disk."
-        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
+        if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
+           blkid /dev/fd0 >>$DEBUG 2>&1
         fi
       fi
         fi
       fi
-      DCSDEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
+      DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
       if [ -n "$DCSDEVICE" ]; then
         DCSMP="/mnt/grmlcfg"
       fi
       if [ -n "$DCSDEVICE" ]; then
         DCSMP="/mnt/grmlcfg"
       fi
@@ -2064,7 +1529,7 @@ else
         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
       else
         [ -d $DCSMP ] || mkdir $DCSMP
         ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
       else
         [ -d $DCSMP ] || mkdir $DCSMP
-        umount $DCSMP 1>>$DEBUG 2>&1 # make sure it is not mounted
+        umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
         if [[ $RC == 0 ]]; then
           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
         mount -o ro -t auto $DCSDEVICE  $DCSMP ; RC="$?"
         if [[ $RC == 0 ]]; then
           einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
@@ -2113,7 +1578,11 @@ fi
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
 # {{{ /cdrom/.*-options
 config_debs(){
 if checkbootparam 'debs' ; then
+   iszsh && setopt localoptions shwordsplit
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
    DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
+   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"
    if ! echo $DEBS | grep -q '/'; then
      # backwards compatibility: if no path is given get debs from debs/
      DEBS="debs/$DEBS"
@@ -2176,9 +1645,13 @@ if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
     fi
   fi
 fi
     fi
   fi
 fi
-# umount $DCSMP if it was mounted by finddcsdir
-# this doesn't really belong here
-grep -q '$DCSMP' /proc/mounts && umount $DCSMP
+}
+# }}}
+
+# {{{ confing_umount_dcsdir
+config_umount_dcsdir(){
+   # umount $DCSMP if it was mounted by finddcsdir
+   grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
 }
 # }}}
 
 }
 # }}}
 
@@ -2248,7 +1721,7 @@ if checkbootparam 'distcc' ; then
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
     )
 
     einfo "Starting distcc for network ${NET}, listening on ${IP}."
-   /etc/init.d/distcc start 1>/dev/null ; eend $?
+   /etc/init.d/distcc start >/dev/null ; eend $?
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
    eoutdent
  else
    eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
@@ -2309,38 +1782,6 @@ 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(){
   [ -n "$INSTALLED" ] && return 0
 # {{{ SW-RAID
 config_swraid(){
   [ -n "$INSTALLED" ] && return 0
@@ -2350,6 +1791,7 @@ config_swraid(){
      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
      ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
   else
      checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
      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
@@ -2435,6 +1877,10 @@ config_dmraid(){
 
     for line in $(dmraid $1 ; echo errcode:$?); do
       case $line in
 
     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
         *'no raid disks'*)
           einfo "No active dmraid devices found" ; eend 0
           break
@@ -2487,7 +1933,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."
@@ -2506,62 +1952,12 @@ config_lvm(){
 # {{{ debnet: setup network based on an existing one found on a partition
 config_debnet(){
 if checkbootparam 'debnet' ; then
 # {{{ 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=""
-
  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."
-       invoke-rc.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(){
 if checkbootparam 'noblank' ; then
 # {{{ disable console blanking
 config_blanking(){
 if checkbootparam 'noblank' ; then
@@ -2612,62 +2008,10 @@ config_tohd()
 }
 # }}}
 
 }
 # }}}
 
-# {{{ grml2hd: automatic installation
-config_grml2hd(){
-
-if checkbootparam "BOOT_IMAGE=grml2hd" ; 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 checkbootparam "BOOT_IMAGE=grml2hd ...
-}
-# }}}
-
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
 # {{{ debootstrap: automatic installation
 config_debootstrap(){
 
-if checkbootparam "BOOT_IMAGE=debian2hd" ; 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
 
@@ -2756,6 +2100,45 @@ fi # checkbootparam "BOOT_IMAGE=debian2hd
 }
 # }}}
 
 }
 # }}}
 
+config_virtualbox_shared_folders() {
+if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
+  einfo "VirtualBox detected, trying to set up Shared Folders."
+  if ! modprobe -l | grep -q vboxsf.ko ; 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 $?
+
+      if [ -n "$CONFIG_FSTAB_USER" ] ; then
+        fstabuser="$CONFIG_FSTAB_USER"
+      else
+        fstabuser=$(getent passwd 1000 | cut -d: -f1)
+      fi
+      einfo "Adding $fstabuser to group vboxsf."
+      adduser grml vboxsf &>/dev/null
+      eend $?
+
+      einfo "Starting VBoxService."
+      VBoxService >/dev/null &
+      eend $?
+
+    eoutdent
+  fi
+fi
+}
+
 # {{{ Support customization
 config_distri(){
 if checkbootparam 'distri'; then
 # {{{ Support customization
 config_distri(){
 if checkbootparam 'distri'; then
@@ -2770,14 +2153,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 #################################################################
 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3
 ## END OF FILE #################################################################
 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3