2 # Filename: autoconfig.functions
3 # Purpose: basic system configuration and hardware setup for grml system
4 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports: see http://grml.org/bugs/
6 # License: This file is licensed under the GPL v2.
7 ################################################################################
9 # {{{ path, variables, signals, umask, zsh
10 export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
16 # initramfs layout since December 2012, backwards compatibility:
17 [ -d /lib/live/mount/medium ] && export LIVECD_PATH='/lib/live/mount/medium'
18 # initramfs layout since December 2018:
19 [ -d /run/live/medium ] && export LIVECD_PATH='/run/live/medium'
21 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
22 [ -z "$PS1" ] && trap "" 2 3 11
24 if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
31 if [ "$#" -lt 2 ] ; then
32 echo "Usage: service_wrapper <service> <action> [background]" >&2
41 systemctl "$action" "$service"
43 if [ "${background:-}" = "background" ] ; then
44 /etc/init.d/"$service" "$action" &
46 /etc/init.d/"$service" "$action"
53 if [ -n "$ZSH_VERSION" ] ; then
59 # avoid 'no matches found: ...'
60 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
63 # {{{ Read in boot parameters
64 if [ -z "$CMDLINE" ]; then
65 # if CMDLINE was set from the outside, we're debugging.
66 # otherwise, take CMDLINE from Kernel and config files.
67 CMDLINE="$(cat /proc/cmdline)"
68 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
69 modprobe 9p 2>/dev/null || true
70 if grep -q 9p /proc/filesystems ; then
72 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
73 MOUNTDIR="$(mktemp -d)"
74 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
75 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
83 ### {{{ Utility Functions
85 # Get a bootoption's parameter: read boot command line and either
86 # echo last parameter's argument or return false.
94 result="${line##*[$ws]$1=}"
95 result="${result%%[$ws]*}"
103 # Check boot commandline for specified option
105 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
111 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
118 # Check if currently using a framebuffer
120 [ -e /dev/fb0 ] && return 0 || return 1
123 # Check wheter a configuration variable (like $CONFIG_TOHD) is
127 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
128 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
129 *) return 1 ;; # default
133 # Are we using grml-small?
135 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
138 # if no password is set return a random password
140 [ -n "$PASSWD" ] && return 0
142 if [ -x /usr/bin/apg ] ; then
143 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
144 elif [ -x /usr/bin/gpw ] ; then
146 elif [ -x /usr/bin/pwgen ] ; then
147 PASSWD="$(pwgen -1 8)"
148 elif [ -x /usr/bin/hexdump ] ; then
149 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
150 elif [ -n "$RANDOM" ] ; then
151 PASSWD="grml${RANDOM}"
154 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
162 # {{{ filesystems (proc, pts, sys) and fixes
164 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
168 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
172 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
176 # {{{ Check if we are running in live mode or from HD
178 [ -e /etc/grml_cd ] || INSTALLED="yes"
181 # {{{ provide information about virtual environments
182 VIRTUAL=false # assume physical system by default
187 if vmware-detect &>/dev/null; then
188 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
191 if virt-what 2>/dev/null | grep -q 'kvm' || \
192 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
193 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
196 if virt-what 2>/dev/null | grep -q 'virtualbox' || \
197 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
198 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
202 # {{{ source lsb-functions , color handling
203 if checkbootparam 'nocolor'; then
204 . /etc/grml/lsb-functions
205 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
207 . /etc/grml/lsb-functions
213 if checkbootparam 'log' || checkbootparam 'debug' ; then
214 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
216 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
218 einfo "Starting bootlogd." # known to be *very* unreliable :(
219 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
227 ### {{{ language configuration / localization
230 einfo "Activating language settings:"
233 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
234 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
236 # check for bootoption which overrides config from /etc/grml/autoconfig
237 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
238 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
240 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
241 if [ -z "$INSTALLED" ] ; then
242 [ -n "$LANGUAGE" ] || LANGUAGE='en'
245 if [ -x /usr/sbin/grml-setlang ] ; then
246 # if bootoption lang is used update /etc/default/locale accordingly
247 if [ -n "$BOOT_LANGUAGE" ] ; then
248 /usr/sbin/grml-setlang "$LANGUAGE"
249 # otherwise default to lang=en
251 /usr/sbin/grml-setlang "en"
257 if [ -z "$CONSOLEFONT" ] ; then
258 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
259 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
260 CONSOLEFONT='Uni3-Terminus16'
262 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-setup-linux." ; eend 1
265 CONSOLEFONT='Lat15-Terminus16'
269 fi # not running systemd
271 # export it now, so error messages get translated, too
272 [ -r /etc/default/locale ] && . /etc/default/locale
277 KEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
278 [ -n "$KEYBOARD" ] || KEYBOARD="$LANGUAGE"
279 # "symbols/en" doesn't exist, so rewrite to "us"
280 [[ "$KEYBOARD" == 'en' ]] && KEYBOARD="us"
282 if [ -r /etc/default/keyboard ] ; then
283 sed -i "s/^XKBLAYOUT=.*/XKBLAYOUT=\"$KEYBOARD\"/" /etc/default/keyboard
287 sed -i "s/^XKBVARIANT=.*/XKBVARIANT=\"nodeadkeys\"/" /etc/default/keyboard
292 service_wrapper console-setup restart >>$DEBUG 2>&1 ; eend $?
293 else # not running systemd, keeing for backwards compatibility:
294 # configure keyboard layout, read in already set values first:
295 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
297 # now allow keyboard override by boot commandline for later use:
298 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
299 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
300 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
301 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
302 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
304 # modify /etc/sysconfig/keyboard only in live-cd mode:
305 if [ -z "$INSTALLED" ] ; then
307 local LANGUAGE="$BOOT_LANGUAGE"
308 . /etc/grml/language-functions
309 # allow setting xkeyboard explicitly different than console keyboard
310 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
311 if [ -n "$KXKEYBOARD" ]; then
312 XKEYBOARD="$KXKEYBOARD"
313 KDEKEYBOARD="$KXKEYBOARD"
314 elif [ -n "$KKEYBOARD" ]; then
315 XKEYBOARD="$KKEYBOARD"
316 KDEKEYBOARD="$KKEYBOARD"
319 # duplicate of previous code to make sure /etc/grml/language-functions
320 # does not overwrite our values....
321 # now allow keyboard override by boot commandline for later use:
322 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
323 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
324 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
325 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
326 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
328 # write keyboard related variables to file for later use
329 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
330 if ! [ -e /etc/sysconfig/keyboard ] ; then
331 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
332 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
333 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
334 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
338 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
343 # we have to set up all consoles, therefore loop it over all ttys:
344 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
345 if [ -n "$NUM_CONSOLES" ] ; then
346 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
347 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
349 CUR_CONSOLE=$(fgconsole 2>/dev/null)
351 if [ -x "$(which setfont)" ] ; then
353 elif [ -x "$(which consolechars)" ] ; then
354 use_consolechars=true
356 eerror "Neither setfont nor consolechars tool present, can not set font."
361 if [ -n "$CHARMAP" ] ; then
362 einfo "Setting font to ${CHARMAP}"
364 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
365 if $use_setfont ; then
366 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
367 elif $use_consolechars ; then
368 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
371 if [ -n "$CUR_CONSOLE" ] ; then
372 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
377 if checkbootparam 'noconsolefont' ; then
378 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
380 if [ -n "$CONSOLEFONT" ] ; then
381 einfo "Setting font to ${CONSOLEFONT}"
383 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
384 if $use_setfont ; then
385 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
386 elif $use_consolechars ; then
387 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
390 if [ -n "$CUR_CONSOLE" ] ; then
391 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
397 # Set default keyboard before interactive setup
398 if [ -n "$KEYTABLE" ] ; then
399 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
400 loadkeys -q $KEYTABLE &
404 # activate unicode console if running within utf8 environment
405 if [ -r /etc/default/locale ] ; then
406 if grep -q "LANG=.*UTF" /etc/default/locale ; then
407 einfo "Setting up unicode environment."
408 unicode_start ; eend $?
411 fi # not running systemd
419 if ! checkbootparam 'hostname' ; then
423 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
424 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
425 einfo "Generating random hostname as no hostname was specified."
426 HOSTNAME="$(/usr/bin/random-hostname)"
430 einfo "Setting hostname to $HOSTNAME as requested."
431 grml-hostname $HOSTNAME >>$DEBUG
436 # fstabuser (needed when running from harddisk with username != grml {{{
438 # force load of build-in and local config
439 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
440 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
442 # 1st. try configured fstab user
443 if [ -n "$CONFIG_FSTAB_USER" ] ; then
444 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
447 # 2nd. use standard user id
448 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
450 # 3rd. use standard user name
451 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
453 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
454 [ -n "$fstabuser" ] || fstabuser='root'
458 # local_user (needed when running with username != grml {{{
461 # force load of build-in and local config
462 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
463 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
465 # 1st. try id of primary user
466 localuser=$(getent passwd 1000 | cut -d: -f1)
468 # 2nd. use name standard user
469 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
473 # {{{ Set clock (Local time is more often used than GMT, so it is default)
475 # don't touch the files if running from harddisk:
476 if [ -z "$INSTALLED" ]; then
477 # The default hardware clock timezone is stated as representing local time.
480 if [ -f /etc/default/rcS ] ; then
481 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
482 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
483 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
484 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
485 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
486 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
487 elif [ -f /etc/adjtime ] ; then
488 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
489 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
490 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
491 grep -q "^UTC$" /etc/adjtime && UTC="-u"
494 # hwclock uses the TZ variable
495 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
496 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
497 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
498 ewarn "Warning: unknown timezone $KTZ" ; eend 1
500 ewarn "Falling back to timezone $KTZ" ; eend 0
503 if ! [ -r /dev/rtc ] ; then
504 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
507 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
508 if [ -n "$ERROR" ] ; then
510 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
511 if [ -n "$ERROR" ] ; then
512 eerror "Problem running hwclock: $ERROR" ; eend 1
521 # {{{ print kernel info
523 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
524 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
526 einfo "Running Linux Kernel $KERNEL" ; eend 0
529 if [ -r /proc/cpuinfo ] ; then
530 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
532 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
537 if [ -d /proc/xen ] ; then
539 einfo 'Running kernel featuring support for Xen detected' ; eend 0
546 # helper function to check whether we're running under (enabled) Secure Boot
547 running_under_secureboot() {
548 # systemd does this for us, but if we are not running under systemd then mokutil
549 # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
550 # /sys/firmware/efi/vars would exist)
552 if modprobe efivarfs &>/dev/null ; then
553 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
557 if [[ -x "$(command -v mokutil)" ]] ; then
558 if mokutil --sb-state 2>/dev/null | grep -q 'SecureBoot enabled' ; then
564 if modprobe efivarfs &>/dev/null ; then
565 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
575 if running_under_secureboot ; then
576 einfo "SecureBoot is enabled" ; eend 0
578 einfo "SecureBoot not detected" ; eend 0
585 # don't touch the files if running from harddisk:
586 if [ -z "$INSTALLED" ]; then
587 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
588 if [ -n "$KTZ" ] ; then
589 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
591 ewarn "Warning: unknown timezone $KTZ"; eend 0
593 einfo "Setting timezone."
595 area=$(echo $KTZ | cut -d '/' -f1)
596 zone=$(echo $KTZ | cut -d '/' -f2)
597 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
598 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
600 echo $KTZ > /etc/timezone
602 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
609 # activate serial console {{{
611 if checkbootparam 'console'; then
612 # this hack is no longer necessary with systemd
621 einfo "Bootoption for serial console detected:"
625 line="${line#*[$ws]}"
627 while [ -n "$line" ]; do
631 local device="${this%%,*}"
632 local device="${device##*=}"
633 if echo $serial | grep -q ttyS ; then
634 local option="${serial##*,}"
635 # default (works for kvm & CO):
636 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
637 # ... unless overriden by command line:
639 115200*) speed=115200 ;;
640 57600*) speed=57600 ;;
641 38400*) speed=38400 ;;
642 19200*) speed=19200 ;;
649 einfo "Activating console login on device ${device} with speed ${speed}."
650 local number="${device#ttyS}"
651 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
658 this="${line%%[$ws]*}"
659 line="${line#*[$ws]}"
662 if [ -n "$telinitq" ]; then
672 if checkbootparam 'testcd' ; then
673 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
677 local FOUND_FILE=false
678 local logfile='/tmp/md5sum.log'
682 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
683 einfo "Checking files against $md5, this may take a while..."
688 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
689 if [ $pipestatus[1] -eq 0 ] ; then
695 if ! $FOUND_FILE ; then
696 eerror 'Error: Could not find md5sum file' ; eend 1
701 einfo "Everything looks OK" ; eend 0
703 eerror 'Checksum failed for theses files:' ; eend 1
704 egrep -v '(^md5sum:|OK$)' "${logfile}"
705 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
706 einfon "Hit return to continue, or press the power button to shut down system."
715 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
717 if checkbootparam 'blacklist' ; then
718 if [ -z "$INSTALLED" ]; then
719 einfo "Bootoption blacklist found."
720 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
721 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
722 if [ -n "$BLACK" ] ; then
723 for module in $(echo ${BLACK//,/ }) ; do
724 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
725 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
726 echo "blacklist $module" >> "$BLACKLIST_FILE"
727 echo "alias $module off" >> "$BLACKLIST_FILE"
728 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
731 eerror "No given module for blacklist found. Blacklisting will not work therefore."
734 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
736 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
746 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
750 if checkbootparam 'noacpi'; then
751 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
752 elif checkbootparam 'nogrmlacpi' ; then
753 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
754 elif [ ! -d /proc/acpi ] ; then
755 ewarn "ACPI: Kernel support not present." ; eend 0
757 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
760 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
762 basename="${basename%%.*}"
763 case "$basename" in *_acpi)
764 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
766 modprobe $basename >>$DEBUG 2>&1 && found="yes"
767 local BASE="$BASE $basename"
769 if [ -n "$found" ] ; then
770 einfo "$BASE" ; eend 0
772 ewarn "(none)" ; eend 1
774 if ! pgrep acpid >/dev/null ; then
775 einfo "Starting acpi daemon."
776 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
777 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
779 ewarn "acpi daemon already running."
789 if checkbootparam 'brltty' ; then
790 einfo "Starting brltty service as requested on boot commandline."
791 service_wrapper brltty start ; eend $?
796 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
799 NOSWAP="yes" # we do not use swap by default!
800 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
802 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
805 # Scan for swap, config, homedir - but only in live-mode
806 if [ -z "$INSTALLED" ] ; then
807 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
810 HOMEDIR="$(getbootparam 'home')"
811 if [ -n "$partitions" ]; then
812 while read p m f relax; do
813 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
814 partoptions="users,exec"
816 # it's a swap partition?
819 if [ -n "$NOSWAP" ]; then
820 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
823 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
824 S1SUSP|S2SUSP|pmdisk|[zZ]*)
825 if [ -n "$ANYSWAP" ] ; then
826 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
827 swapon $p 2>>$DEBUG ; eend $?
829 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
833 if [[ "$p" == LABEL* ]] ; then
834 p=$(blkid -t $p | awk -F: '{print $1}')
836 if grep -q $p /proc/swaps ; then
837 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
839 if [ -b "$p" ] ; then
840 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
841 swapon $p 2>>$DEBUG ; eend $?
843 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
852 esac # it's a swap partition?
857 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
858 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
860 # *) NONEFOUND='1'; continue ;;
864 if [ -z "$NOSWAP" ] ; then
865 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
866 # Activate swapfile, if exists
867 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
869 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
870 mount -o remount,rw $m && MOUNTED=1
871 if swapon "$SWAPFILE" 2>>$DEBUG ; then
873 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
875 fnew="$SWAPFILE swap swap defaults 0 0"
876 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
877 GRML_SWP="$GRML_SWP $SWAPFILE"
880 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
883 # use a image as home
884 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
885 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
886 if [ -n "$HOMEDIR" ]; then
887 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
891 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
893 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
898 # Umount, if not in use
899 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
911 if checkbootparam 'nocpu'; then
912 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
916 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
918 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)
919 echo $CPU | sed 's/ \{1,\}/ /g'
922 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
927 # {{{ autostart of ssh
929 if checkbootparam 'ssh' ; then
931 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
934 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
935 [ -z "$localuser" ] && eend 1
938 if [ -z "$PASSWD" ] ; then
939 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
943 if [ -n "$PASSWD" ] ; then
945 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
949 echo "$localuser:$PASSWD" | chpasswd $chpass_options
950 echo "root:$PASSWD" | chpasswd $chpass_options
953 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
957 einfo "Starting secure shell server in background for root and user $localuser"
958 service_wrapper haveged start >>$DEBUG 2>>$DEBUG
959 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
960 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
968 # {{{ display hostkeys of SSH server
969 config_display_ssh_fingerprints() {
970 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
971 return 0 # no SSH host keys present
974 einfo "SSH key fingerprints:"
975 for file in /etc/ssh/ssh_host_*_key ; do
977 ssh-keygen -l -f $file
983 # {{{ autostart of x11vnc
985 if checkbootparam 'vnc' ; then
988 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
989 einfo "Bootoption vnc found, trying to set password for user $localuser."
991 if [ -z "$VNC_PASSWD" ] ; then
992 if [ -x /usr/bin/apg ] ; then
993 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
994 elif [ -x /usr/bin/gpw ] ; then
995 VNC_PASSWD="$(gpw 1)"
996 elif [ -x /usr/bin/pwgen ] ; then
997 VNC_PASSWD="$(pwgen -1 8)"
998 elif [ -x /usr/bin/hexdump ] ; then
999 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1000 elif [ -n "$RANDOM" ] ; then
1001 VNC_PASSWD="${localuser}${RANDOM}"
1004 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1008 if [ -n "$VNC_PASSWD" ] ; then
1009 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1014 # finally check if we have a password we can use:
1015 if [ -n "$VNC_PASSWD" ] ; then
1017 VNCDIR="/home/${localuser}/.vnc"
1018 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1020 if [ ! -x /usr/bin/x11vnc ] ; then
1021 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1024 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1025 /bin/chown -R "$localuser": "$VNCDIR"
1028 if checkbootparam 'vnc_connect' ; then
1030 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1031 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1032 #store the options in a file
1033 VNCDIR="/home/${localuser}/.vnc"
1034 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1035 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1041 # {{{ set password for root and default user
1043 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1045 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1048 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1049 [ -z "$localuser" ] && eend 1
1052 if [ -z "$PASSWD" ] ; then
1053 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1057 if [ -n "$PASSWD" ] ; then
1059 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1063 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1064 echo "root:$PASSWD" | chpasswd $chpass_options
1067 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1073 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1075 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1077 if [ -z "$PASSWD" ] ; then
1078 eerror "No hashed password found, can not set password."
1084 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1085 [ -z "$localuser" ] && eend 1
1087 if [ -n "$PASSWD" ] ; then
1090 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1091 echo "root:$PASSWD" | chpasswd $chpass_options
1094 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1104 if ! [ -x /usr/bin/amixer ] ; then
1105 logger -t grml-autoconfig "amixer binary not available"
1109 if ! [ -r /proc/asound/cards ] ; then
1110 ewarn "No soundcard present, skipping mixer settings therefore."
1115 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1116 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1119 if checkbootparam 'vol' ; then
1120 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1121 if [ -z "$VOL" ] ; then
1122 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1130 if checkbootparam 'nosound' ; then
1131 einfo "Muting sound devices on request."
1132 ERROR=$(amixer -q set Master mute)
1134 if [ -n "$ERROR" ] ; then
1136 eerror "Problem muting sound devices: $ERROR"
1140 elif [ -z "$INSTALLED" ] ; then
1141 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1143 if checkbootparam 'micvol' ; then
1144 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1145 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1150 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1153 for CONTROL in ${=CONTROLS} ; do
1154 # such devices can not be controlled with amixer ... unmute
1155 [[ "$CONTROL" == *Console* ]] && continue
1157 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1158 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1159 amixer -c $card -q set "${CONTROL}" unmute
1161 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1162 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1166 if [ ${MICVOL} -ne 0 ] ; then
1167 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1168 amixer -c $card -q set "${CONTROL}" unmute
1170 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1171 amixer -c $card -q set "${CONTROL}" $MICVOL%
1177 fi # checkbootparam 'nosound'
1183 # {{{ syslog service
1185 if checkbootparam 'nosyslog'; then
1186 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1188 einfo "Starting rsyslog in background."
1189 service_wrapper rsyslog start >>$DEBUG
1197 if checkbootparam 'nogpm'; then
1198 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1200 if ! [ -r /dev/input/mice ] ; then
1201 eerror "No mouse found - not starting GPM." ; eend 1
1203 einfo "Starting gpm in background."
1204 service_wrapper gpm start background >>$DEBUG
1213 if checkbootparam 'services' ; then
1214 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1215 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1216 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1217 for service in $(echo -e $SERVICELIST) ; do
1218 # support running (custom) init scripts in non-blocking mode
1219 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1220 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1221 einfo "Starting service ${service}."
1222 service_wrapper "${service}" start >>$DEBUG
1224 einfo "Starting service ${service} in background."
1225 service_wrapper "${service}" start background >>$DEBUG
1235 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1236 SOURCE=$(eval echo "$1")
1239 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1240 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1242 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1244 if checkbootparam 'getfile.retries' ; then
1245 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1250 while ! getconfig && [[ "$counter" != 0 ]] ; do
1251 echo -n "Sleeping for 1 second and trying to get config again... "
1252 counter=$(( counter-1 ))
1253 echo "$counter tries left" ; sleep 1
1255 if [ -s "$TARGET" ] ; then
1256 einfo "Downloading was successfull." ; eend 0
1257 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1258 md5sum ${TARGET} ; eend 0
1261 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1269 if checkbootparam 'netconfig' ; then
1270 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1271 CONFIGFILE='/tmp/netconfig.grml'
1273 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1274 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1281 # {{{ remote scripts
1282 config_netscript() {
1283 if checkbootparam 'netscript' ; then
1284 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1285 SCRIPTFILE='/tmp/netscript.grml'
1287 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1288 chmod +x ${SCRIPTFILE}
1289 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1296 # {{{ start X window system via grml-x
1300 # make sure we start X only if startx is used *before* a nostartx option
1301 # so it's possible to disable automatic X startup using nostart
1302 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1303 if [ -x "$(which X)" ] ; then
1304 if [ -z "$INSTALLED" ] ; then
1305 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1306 if [ -z "$WINDOWMANAGER" ] ; then
1307 einfo "No window manager specified. Using default one." && eend 0
1309 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1311 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1314 if [ -n "$WINDOWMANAGER" ] ; then
1315 mkdir -p /var/run/grml-x/
1316 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1321 cat>|/etc/init.d/startx<<EOF
1323 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1325 chmod 755 /etc/init.d/startx
1327 # adjust inittab for startx
1328 if grep -q '^6:' /etc/inittab ; then
1329 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
1330 else # just append tty6 to inittab if no definition is present:
1331 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
1334 /sbin/telinit q ; eend $?
1336 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1337 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1339 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1343 eerror "We are not running in live mode - startx will not work, skipping it."
1344 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1347 eerror "/usr/bin/X is not present on this grml flavour."
1348 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1354 # {{{ configuration framework
1356 if checkbootparam 'extract' ; then
1357 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1358 EXTRACTOPTIONS="-- -x $EXTRACT"
1362 config_finddcsdir() {
1363 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1364 # on the command line, nothing is changed and the dcs files are
1365 # searched within the .iso, $dcs-dir is set to the root directory
1367 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1368 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1369 # set, $dcs-dir is set to the root directory within the .iso.
1370 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1371 # foo, even if a GRMLCFG partition is present.
1374 # autoconfig, see issue673
1375 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1376 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1377 if checkbootparam 'noautoconfig' ; then
1378 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1379 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1381 if [ -z "$INSTALLED" ] ; then
1382 if checkbootparam 'myconfig' ; then
1383 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1384 if [ -z "$DCSDEVICE" ]; then
1385 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1386 fi # [ -z "$DCSDEVICE" ]
1387 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1388 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1390 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1392 modprobe 9p 2>/dev/null || true
1393 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1394 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1395 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1396 DCSDEVICE="$GRMLCFG"
1397 MOUNTOPTIONS="ro,trans=virtio"
1402 if [ -n "$DCSDEVICE" ]; then
1403 DCSMP="/mnt/grmlcfg"
1408 # if not specified/present then assume default:
1409 if [ -z "$DCSDEVICE" ]; then
1410 DCSDIR="${LIVECD_PATH}"
1413 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1414 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1415 if [ -n "$DCSDIR" ]; then
1416 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1418 [ -d $DCSMP ] || mkdir $DCSMP
1419 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1420 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1421 if [[ $RC == 0 ]]; then
1422 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1424 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1433 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1434 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1435 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1436 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1442 if checkbootparam 'partconf' ; then
1443 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1444 if [ -n "$MOUNTDEVICE" ]; then
1445 [ -d /mnt/grml ] || mkdir /mnt/grml
1446 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1447 if [[ $RC == 0 ]]; then
1448 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1449 einfo "Copying files from $MOUNTDEVICE over grml system."
1450 for file in `cat /etc/grml/partconf` ; do
1451 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1452 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1455 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1456 fi # mount $MOUNTDEVICE
1457 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1459 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1460 fi # [ -n "$MOUNTDEVICE" ]
1465 # {{{ /cdrom/.*-options
1467 if checkbootparam 'debs' ; then
1468 iszsh && setopt localoptions shwordsplit
1469 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1470 if [ -z "$DEBS" ] ; then
1473 if ! echo $DEBS | grep -q '/'; then
1474 # backwards compatibility: if no path is given get debs from debs/
1477 einfo "Trying to install Debian package(s) ${DEBS}"
1478 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1479 dpkg -i $DEBS ; eend $?
1484 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1485 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1486 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1487 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1489 if ! echo $SCRIPTS | grep -q '/'; then
1490 # backwards compatibility: if no path is given get scripts from scripts/
1491 SCRIPTS="scripts/$SCRIPTS"
1493 if [ -n "$SCRIPTS" ]; then
1494 SCRIPTS="${DCSDIR}/$SCRIPTS"
1495 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1496 einfo "Trying to execute ${SCRIPTS}"
1499 elif [ -d "$SCRIPTS" ]; then
1500 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1501 run-parts --regex '.*' $SCRIPTS
1504 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1513 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1514 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1515 if [ -z "$CONFIG" ]; then
1516 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1518 if [ -n "$CONFIG" ]; then
1519 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1520 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1522 cp -a ${DCSDIR}/${CONFIG}/* /
1523 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1524 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1527 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1529 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1536 # {{{ confing_umount_dcsdir
1537 config_umount_dcsdir(){
1538 # umount $DCSMP if it was mounted by finddcsdir
1539 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1545 if checkbootparam 'mypath' ; then
1546 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1547 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1548 touch /etc/grml/my_path
1549 chmod 644 /etc/grml/my_path
1550 # make sure the directories exist:
1552 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1553 if ! [ -d "$i" ] ; then
1554 einfo "Creating directory $i"
1555 mkdir -p "$i" ; eend $?
1558 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1566 [ -n "$INSTALLED" ] && return 0
1568 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1569 checkbootparam 'raid=noautodetect' ; then
1570 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1572 [ -e /proc/mdstat ] || modprobe md_mod
1573 if ! [ -x /sbin/mdadm ] ; then
1574 eerror "mdadm not available, can not execute it." ; eend 1
1577 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1578 # find out whether we have a valid configuration file already
1579 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1580 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1581 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1582 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1584 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1587 if ! checkbootparam 'swraid' ; then
1590 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1592 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1596 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1600 for line in $(mdadm --assemble --scan 2>&1) ; do
1602 *'No arrays found'*)
1603 ewarn "$line" ; eend 0
1606 einfo "$line" ; eend 0
1613 if [ -r /proc/mdstat ] ; then
1615 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1616 if [ -z "$MDSTAT" ] ; then
1617 ewarn "No active arrays found" ; eend 0
1621 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1622 einfo "active arrays: $line" ; eend 0
1628 fi # bootoption swraid
1630 fi # is /sbin/mdadm executable?
1631 fi # check for bootoptions
1637 [ -n "$INSTALLED" ] && return 0
1639 if checkbootparam 'nodmraid' ; then
1640 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1644 if ! [ -x /sbin/dmraid ] ; then
1645 ewarn "dmraid not available, can not execute it." ; eend 1
1650 # usage: dmraid_wrapper <dmraid_option>
1651 [ -n "$1" ] || return 1
1657 for line in $(dmraid $1 ; echo errcode:$?); do
1659 *'no block devices found'*)
1660 einfo "No block devices found" ; eend 0
1664 einfo "No active dmraid devices found" ; eend 0
1683 if checkbootparam 'dmraid' ; then
1684 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1685 if [ "$ACTION" = "off" ] ; then
1686 # Deactivates all active software RAID sets:
1687 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1690 # Activate all software RAID sets discovered:
1691 einfo "Activating present dmraid sets (as requested via dmraid):"
1698 # by default (no special bootoptions) discover all software RAID devices:
1699 einfo "Searching for any present dmraid sets:"
1704 # {{{ LVM (Logical Volumes)
1706 [ -n "$INSTALLED" ] && return 0
1708 if checkbootparam 'nolvm' ; then
1709 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1711 if ! [ -x /sbin/lvm ] ; then
1712 eerror "LVM not available, can not execute it." ; eend 1
1714 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1715 einfo "You seem to have logical volumes (LVM) on your system."
1718 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1720 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1723 if checkbootparam 'lvm' ; then
1725 einfo "Bootoption LVM found, enabling related services."
1726 if [ -r /etc/init.d/lvm2-lvmetad ] ; then
1727 service_wrapper lvm2-lvmetad start ; eend $?
1729 if [ -r /etc/init.d/lvm2-lvmpolld ] ; then
1730 service_wrapper lvm2-lvmpolld start ; eend $?
1732 einfo "Searching for logical volumes and enabling them:"
1733 vgchange -ay ; eend $?
1735 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1736 service_wrapper lvm2 start ; eend $?
1741 fi # check for lvm binary
1742 fi # check for bootoption nolvm
1746 # {{{ debnet: setup network based on an existing one found on a partition
1748 if checkbootparam 'debnet' ; then
1749 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1755 # {{{ disable console blanking
1757 if checkbootparam 'noblank' ; then
1758 einfo "Bootoption noblank found. Disabling monitor blanking."
1759 setterm -blank 0 ; eend $?
1764 # {{{ debootstrap: automatic installation
1765 config_debootstrap(){
1767 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1769 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1771 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1773 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1778 if checkbootparam 'target' ; then
1780 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1781 # notice: the following checks whether the given partition is available, if not the skip
1782 # execution of grml-debootstrap as it might result in data loss...
1783 if ! [ -r "$TARGET" ] ; then
1784 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1788 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1793 if checkbootparam 'grub' ; then
1795 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1798 if checkbootparam 'groot' ; then
1800 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1803 if checkbootparam 'release' ; then
1805 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1808 if checkbootparam 'mirror' ; then
1810 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1813 if checkbootparam 'boot_append' ; then
1815 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1818 if checkbootparam 'password' ; then
1820 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1823 # now check which options are available
1824 if [ -n "TARGET" ] ; then
1825 TARGETCMD="--target $TARGET"
1829 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1833 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1834 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1835 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1836 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1837 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1838 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1840 # and finally write script and execute it
1841 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1843 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1846 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1848 screen /usr/bin/grml-debootstrap_noninteractive
1849 einfo "Invoking a shell, just exit to continue booting..."
1852 fi # checkbootparam "BOOT_IMAGE=debian2hd
1856 # {{{ virtualbox shared folders
1857 config_virtualbox_shared_folders() {
1858 if ! $VIRTUALBOX ; then
1862 if checkbootparam 'novboxsf' ; then
1863 ewarn "Skipping VirtualBox Shared Folders setup as requested on boot commandline." ; eend 0
1865 einfo "VirtualBox detected, trying to set up Shared Folders."
1866 if ! modinfo vboxsf &>/dev/null ; then
1867 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1869 elif ! [ -x /usr/sbin/VBoxService ] ; then
1870 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1875 einfo "Loading vboxsf driver."
1876 lsmod | grep -q vboxsf || modprobe vboxsf
1879 einfo "Adjusting /dev/vboxguest."
1880 chown root:vboxsf /dev/vboxguest
1881 chmod 660 /dev/vboxguest
1886 einfo "Adding user ${fstabuser:-grml} to group vboxsf."
1887 adduser "${fstabuser:-grml}" vboxsf >>"${DEBUG}" 2>&1
1890 einfo "Starting VBoxService."
1891 VBoxService >/dev/null
1894 local vbautomation='automation'
1895 if checkbootparam 'vbautomation'; then
1896 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1899 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}(\s+|$)" ; then
1900 ewarn "No automount shared folder '$vbautomation' available"
1903 einfo "Found automount shared folder '$vbautomation'"
1906 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1907 [ -n "$distri" ] || distri='grml'
1909 local vbox_auto_sf="/media/sf_${vbautomation}"
1911 sleep 1 # ugly but necessary
1915 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1916 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1918 counter=$(( counter-1 ))
1923 if ! [ -d "${vbox_auto_sf}" ] ; then
1924 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1927 einfo "Found shared folders automation directory $vbox_auto_sf"
1931 if checkbootparam 'novbautomation' ; then
1932 einfo "Bootoption novbautomation found. Disabling automation script execution."
1935 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1936 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1939 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1940 "${vbox_auto_sf}/${distri}"
1954 # {{{ VirtualBox application
1955 config_virtualbox_setup() {
1956 if checkbootparam 'novbox' ; then
1957 ewarn "Skipping VirtualBox setup as requested on boot commandline." ; eend 0
1961 if ! [ -x /usr/bin/VBox ] ; then
1965 if running_under_secureboot ; then
1966 ewarn "VirtualBox service can not be started as running under enabled Secure Boot." ; eend 0
1970 einfo "VirtualBox service detected, trying to set up."
1971 service_wrapper vboxdrv restart >>"${DEBUG}" 2>&1 ; eend $?
1975 einfo "Adding user ${fstabuser:-grml} to group vboxusers."
1976 adduser "${fstabuser:-grml}" vboxusers >>"${DEBUG}" 2>&1
1981 # {{{ Support customization
1983 if checkbootparam 'distri'; then
1984 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1985 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1986 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1987 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1988 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1994 ## END OF FILE #################################################################
1995 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2