Don't warn if SecureBoot is not enabled, instead only inform about current state
[grml-autoconfig.git] / autoconfig.functions
index 3ab2c02..ccf12d6 100755 (executable)
@@ -23,6 +23,28 @@ umask 022
 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
 [ -z "$PS1" ] && trap "" 2 3 11
 
+if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
+  SYSTEMD=true
+else
+  SYSTEMD=false
+fi
+
+service_wrapper() {
+  if [ "$#" -lt 2 ] ; then
+    echo "Usage: service_wrapper <service> <action>" >&2
+    return 1
+  fi
+
+  local service="$1"
+  local action="$2"
+
+  if $SYSTEMD ; then
+    systemctl "$action" "$service"
+  else
+    /etc/init.d/"$service" "$action"
+  fi
+}
+
 # zsh stuff
 iszsh(){
 if [ -n "$ZSH_VERSION" ] ; then
@@ -172,12 +194,10 @@ fi
 
 # {{{ source lsb-functions , color handling
 if checkbootparam 'nocolor'; then
-  RC_NOCOLOR=yes
   . /etc/grml/lsb-functions
   einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
 else
   . /etc/grml/lsb-functions
-  . /etc/grml_colors
 fi
 # }}}
 
@@ -227,24 +247,6 @@ 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 >>$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 $TIMEOUT > /sys/class/firmware/timeout ; eend $?
- fi
-}
-# }}}
-
 ### {{{ language configuration / localization
 config_language(){
 
@@ -466,34 +468,27 @@ config_userlocal() {
 }
 # }}}
 
-# {{{ 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:
  if [ -z "$INSTALLED" ]; then
     # The default hardware clock timezone is stated as representing local time.
     UTC="--localtime"
-    grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
-    checkbootparam 'utc'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
-    checkbootparam 'gmt'       >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
-    checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|"  /etc/default/rcS
-    grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
+
+    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
     KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
     [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
@@ -545,20 +540,24 @@ config_kernel(){
 }
 # }}}
 
-# {{{ 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
+# {{{ secure boot
+config_secureboot(){
+  if [ -x /usr/bin/mokutil ] ; then
+    local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
+    if [ -n "$secstate" ] ; then
+      einfo "SecureBoot is enabled" ; eend 0
+    else
+      einfo "SecureBoot not detected" ; eend 0
+    fi
+  else
+    if modprobe efivars &>/dev/null ; then
+      if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
+        einfo "SecureBoot is enabled" ; eend 0
+      else
+        einfo "SecureBoot not detected" ; eend 0
+      fi
+    fi
+  fi
 }
 # }}}
 
@@ -588,66 +587,14 @@ config_timezone(){
 }
 # }}}
 
-# 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 grml-quickconfig."
-    sed -i '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab
-  /sbin/telinit q ; eend $?
-fi
-}
-# }}}
-
 # activate serial console {{{
 config_console(){
 if checkbootparam 'console'; then
+  # this hack is no longer necessary with systemd
+  if $SYSTEMD ; then
+    return
+  fi
+
   local line
   local ws
   ws='  '
@@ -701,15 +648,6 @@ 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(){
 if checkbootparam 'testcd' ; then
@@ -785,21 +723,26 @@ fi
 
 # {{{ ACPI
 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
-  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 ;;
+  if $SYSTEMD ; then
+    echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
+    return
+  fi
+
+  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
+    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"
@@ -811,7 +754,8 @@ else
   fi
   if ! pgrep acpid >/dev/null ; then
     einfo "Starting acpi daemon."
-    /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
+    service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
+    service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
   else
     ewarn "acpi daemon already running."
     eend 0
@@ -942,43 +886,6 @@ fi # -z $INSTALLED
 }
 # }}}
 
-# {{{ Mouse
-config_mouse(){
-if [ -n "$MOUSE_DEVICE" ] ; then
-  einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
-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
-fi
-}
-# }}}
-
 # {{{ CPU-detection
 config_cpu(){
 if checkbootparam 'nocpu'; then
@@ -1001,7 +908,11 @@ if $VIRTUALBOX ; then
    return 0
 fi
 
-if [ -x /etc/init.d/loadcpufreq ] ; then
+if ! [ -x /etc/init.d/loadcpufreq ] ; then
+  ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
+  eend 0
+  return 0
+else
    einfo "Trying to set up cpu frequency scaling:"
    eindent
    SKIP_CPU_GOVERNOR=''
@@ -1028,22 +939,22 @@ if [ -x /etc/init.d/loadcpufreq ] ; then
       fi
    fi
 
-   rm -f $LOADCPUFREQ
+   rm -f "$LOADCPUFREQ"
 
    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 $?
+     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
-
-     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
 
    eoutdent
 fi
@@ -1081,8 +992,8 @@ if checkbootparam 'ssh' ; then
    fi
 
    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 &
+   service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
+   service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
    eend $?
 
 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
+  if ! [ -x /usr/bin/amixer ] ; then
+    logger -t grml-autoconfig "amixer binary not available"
+    return
+  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 ! [ -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 (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}."
+  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 'micvol' ; then
-               MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
-               einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
-            else
-               MICVOL=0
-            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
 
-            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
-}
-# }}}
+    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}."
 
-# {{{ 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
-  fi
-fi
-}
-# }}}
+      if checkbootparam 'micvol' ; then
+        MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
+        einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
+      else
+        MICVOL=0
+      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#*,}"
+      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
-      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
+
+        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
 }
 # }}}
 
-# {{{ syslog-ng
+# {{{ syslog service
 config_syslog(){
  if checkbootparam 'nosyslog'; then
     ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
  else
-    SYSLOGD=''
-    [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
-    [ -x /etc/init.d/rsyslog   ] && SYSLOGD='rsyslog'
-    [ -x /etc/init.d/dsyslog   ] && SYSLOGD='dsyslog'
-    [ -x /etc/init.d/sysklogd  ] && SYSLOGD='sysklogd'
-    [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
-
-    if [ -z "$SYSLOGD" ] ; then
-       eerror "No syslog daemon found." ; eend 1
-    else
-       einfo "Starting $SYSLOGD in background."
-       /etc/init.d/$SYSLOGD start >>$DEBUG &
-       eend 0
-    fi
+    einfo "Starting rsyslog in background."
+    service_wrapper rsyslog start >>$DEBUG &
+    eend 0
  fi
 }
 # }}}
 
 # {{{ gpm
 config_gpm(){
- if checkbootparam 'nogpm'; then
-  ewarn "Not starting GPM as requested on boot commandline." ; eend 0
- else
-   if ! [ -r /dev/input/mice ] ; 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
+    else
       einfo "Starting gpm in background."
-      /etc/init.d/gpm start >>$DEBUG &
+      service_wrapper gpm start >>$DEBUG &
       # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
       eend 0
-   fi
- fi
+    fi
 fi
 }
 # }}}
 
@@ -1404,10 +1257,10 @@ config_services(){
       # 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
+        service_wrapper "${service}" start >>$DEBUG
       else
         einfo "Starting service ${service} in background."
-        /etc/init.d/${service} start >>$DEBUG &
+        service_wrapper "${service}" start >>$DEBUG &
       fi
     done
     eend $?
@@ -1507,16 +1360,10 @@ config_stats() {
 }
 # }}}
 
-# {{{ fix/workaround for unionfs
-fix_unionfs(){
-  if [ -z "$INSTALLED" ]; then
-   touch /var/cache/apt/*cache.bin
-  fi
-}
-# }}}
-
 # {{{ 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
@@ -1530,17 +1377,28 @@ if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; t
    fi
    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
+   if $SYSTEMD ; then
+     cat>|/etc/init.d/startx<<EOF
+#!/bin/sh
+chgrp tty \${TTY}
+chmod g=rw \${TTY}
+sudo -u "${localuser}" /usr/bin/grml-x ${WINDOWMANAGER}
+EOF
+     chmod 755 /etc/init.d/startx
+     chvt 6
+     return
+   fi
+   cat>|/etc/init.d/startx<<EOF
 #!/bin/sh
-su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
+su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
 EOF
-   chmod 755 /etc/init.d/xstartup
+   chmod 755 /etc/init.d/startx
 
-   # adjust inittab for xstartup
+   # adjust inittab for startx
    if grep -q '^6:' /etc/inittab ; then
-      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
+      sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/startx ; /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:
-      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
+      echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/startx ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
    fi
 
    /sbin/telinit q ; eend $?
@@ -1773,112 +1631,6 @@ fi
 }
 # }}}
 
-# {{{ 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 >/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
-}
-# }}}
-
 # {{{ SW-RAID
 config_swraid(){
   [ -n "$INSTALLED" ] && return 0
@@ -1904,7 +1656,11 @@ config_swraid(){
 
        if ! checkbootparam 'swraid' ; then
           eindent
-          einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
+          if $SYSTEMD ; then
+            einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
+          else
+            einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
+          fi
           eoutdent
        else
           einfo "Bootoption swraid found. Searching for software RAID arrays:"
@@ -2025,18 +1781,25 @@ config_lvm(){
   if checkbootparam 'nolvm' ; then
      ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
   else
-    # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
-    if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
+    if ! [ -x /sbin/lvm ] ; then
        eerror "LVM not available, can not execute it." ; eend 1
     else
        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."
+          if $SYSTEMD ; then
+            einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart."
+          else
+            einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
+          fi
           eend 0
           if checkbootparam 'lvm' ; then
              einfo "Bootoption LVM found. Searching for logical volumes:"
-             /etc/init.d/lvm2 start ; eend $?
+             if $SYSTEMD ; then
+               service_wrapper lvm2-lvmetad start ; eend $?
+             else
+               service_wrapper lvm2 start ; eend $?
+             fi
           fi
           eoutdent
        fi
@@ -2063,47 +1826,6 @@ fi
 }
 # }}}
 
-# {{{ tohd= bootoption
-config_tohd()
-{
-  if checkbootparam 'tohd' ; then
-     local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
-     if [ -z "$TARGET" ] ; then
-        eerror "Error: tohd specified without any partition, can not continue." ; eend 1
-        eerror "Please use something like tohd=/dev/sda9." ; eend 1
-        return 1
-     fi
-
-     if ! [ -b "$TARGET" ] ; then
-        eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
-        return 1
-     fi
-
-     if grep -q $TARGET /proc/mounts ; then
-        eerror "$TARGET already mounted, skipping execution of tohd therefore."
-        eend 1
-        return 1
-     fi
-
-     local MOUNTDIR=$(mktemp -d)
-
-     if mount -o rw "$TARGET" "$MOUNTDIR" ; then
-        einfo "Copyring live system to $TARGET - this might take a while"
-        rsync -a --progress ${LIVECD_PATH}/live $MOUNTDIR
-        sync
-        umount "$MOUNTDIR"
-        eend $?
-        einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
-     else
-        eerror "Error when trying to mount $TARGET, sorry."; eend 1
-        return 1
-     fi
-
-     rmdir "$MOUNTDIR"
-  fi
-}
-# }}}
-
 # {{{ debootstrap: automatic installation
 config_debootstrap(){