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 efivars &>/dev/null ; then
553 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
557 if [ -x /usr/bin/mokutil ] ; then
558 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
559 if [ -n "$secstate" ] ; then
565 if modprobe efivars &>/dev/null ; then
566 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
576 if running_under_secureboot ; then
577 einfo "SecureBoot is enabled" ; eend 0
579 einfo "SecureBoot not detected" ; eend 0
586 # don't touch the files if running from harddisk:
587 if [ -z "$INSTALLED" ]; then
588 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
589 if [ -n "$KTZ" ] ; then
590 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
592 ewarn "Warning: unknown timezone $KTZ"; eend 0
594 einfo "Setting timezone."
596 area=$(echo $KTZ | cut -d '/' -f1)
597 zone=$(echo $KTZ | cut -d '/' -f2)
598 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
599 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
601 echo $KTZ > /etc/timezone
603 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
610 # activate serial console {{{
612 if checkbootparam 'console'; then
613 # this hack is no longer necessary with systemd
622 einfo "Bootoption for serial console detected:"
626 line="${line#*[$ws]}"
628 while [ -n "$line" ]; do
632 local device="${this%%,*}"
633 local device="${device##*=}"
634 if echo $serial | grep -q ttyS ; then
635 local option="${serial##*,}"
636 # default (works for kvm & CO):
637 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
638 # ... unless overriden by command line:
640 115200*) speed=115200 ;;
641 57600*) speed=57600 ;;
642 38400*) speed=38400 ;;
643 19200*) speed=19200 ;;
650 einfo "Activating console login on device ${device} with speed ${speed}."
651 local number="${device#ttyS}"
652 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
659 this="${line%%[$ws]*}"
660 line="${line#*[$ws]}"
663 if [ -n "$telinitq" ]; then
673 if checkbootparam 'testcd' ; then
674 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
678 local FOUND_FILE=false
679 local logfile='/tmp/md5sum.log'
683 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
684 einfo "Checking files against $md5, this may take a while..."
689 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
690 if [ $pipestatus[1] -eq 0 ] ; then
696 if ! $FOUND_FILE ; then
697 eerror 'Error: Could not find md5sum file' ; eend 1
702 einfo "Everything looks OK" ; eend 0
704 eerror 'Checksum failed for theses files:' ; eend 1
705 egrep -v '(^md5sum:|OK$)' "${logfile}"
706 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
707 einfon "Hit return to continue, or press the power button to shut down system."
716 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
718 if checkbootparam 'blacklist' ; then
719 if [ -z "$INSTALLED" ]; then
720 einfo "Bootoption blacklist found."
721 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
722 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
723 if [ -n "$BLACK" ] ; then
724 for module in $(echo ${BLACK//,/ }) ; do
725 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
726 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
727 echo "blacklist $module" >> "$BLACKLIST_FILE"
728 echo "alias $module off" >> "$BLACKLIST_FILE"
729 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
732 eerror "No given module for blacklist found. Blacklisting will not work therefore."
735 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
737 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
747 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
751 if checkbootparam 'noacpi'; then
752 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
753 elif checkbootparam 'nogrmlacpi' ; then
754 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
755 elif [ ! -d /proc/acpi ] ; then
756 ewarn "ACPI: Kernel support not present." ; eend 0
758 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
761 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
763 basename="${basename%%.*}"
764 case "$basename" in *_acpi)
765 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
767 modprobe $basename >>$DEBUG 2>&1 && found="yes"
768 local BASE="$BASE $basename"
770 if [ -n "$found" ] ; then
771 einfo "$BASE" ; eend 0
773 ewarn "(none)" ; eend 1
775 if ! pgrep acpid >/dev/null ; then
776 einfo "Starting acpi daemon."
777 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
778 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
780 ewarn "acpi daemon already running."
790 if checkbootparam 'brltty' ; then
791 einfo "Starting brltty service as requested on boot commandline."
792 service_wrapper brltty start ; eend $?
797 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
800 NOSWAP="yes" # we do not use swap by default!
801 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
803 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
806 # Scan for swap, config, homedir - but only in live-mode
807 if [ -z "$INSTALLED" ] ; then
808 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
811 HOMEDIR="$(getbootparam 'home')"
812 if [ -n "$partitions" ]; then
813 while read p m f relax; do
814 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
815 partoptions="users,exec"
817 # it's a swap partition?
820 if [ -n "$NOSWAP" ]; then
821 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
824 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
825 S1SUSP|S2SUSP|pmdisk|[zZ]*)
826 if [ -n "$ANYSWAP" ] ; then
827 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
828 swapon $p 2>>$DEBUG ; eend $?
830 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
834 if [[ "$p" == LABEL* ]] ; then
835 p=$(blkid -t $p | awk -F: '{print $1}')
837 if grep -q $p /proc/swaps ; then
838 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
840 if [ -b "$p" ] ; then
841 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
842 swapon $p 2>>$DEBUG ; eend $?
844 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
853 esac # it's a swap partition?
858 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
859 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
861 # *) NONEFOUND='1'; continue ;;
865 if [ -z "$NOSWAP" ] ; then
866 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
867 # Activate swapfile, if exists
868 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
870 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
871 mount -o remount,rw $m && MOUNTED=1
872 if swapon "$SWAPFILE" 2>>$DEBUG ; then
874 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
876 fnew="$SWAPFILE swap swap defaults 0 0"
877 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
878 GRML_SWP="$GRML_SWP $SWAPFILE"
881 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
884 # use a image as home
885 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
886 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
887 if [ -n "$HOMEDIR" ]; then
888 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
892 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
894 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
899 # Umount, if not in use
900 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
912 if checkbootparam 'nocpu'; then
913 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
917 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
919 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)
920 echo $CPU | sed 's/ \{1,\}/ /g'
923 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
928 # {{{ autostart of ssh
930 if checkbootparam 'ssh' ; then
932 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
935 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
936 [ -z "$localuser" ] && eend 1
939 if [ -z "$PASSWD" ] ; then
940 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
944 if [ -n "$PASSWD" ] ; then
946 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
950 echo "$localuser:$PASSWD" | chpasswd $chpass_options
951 echo "root:$PASSWD" | chpasswd $chpass_options
954 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
958 einfo "Starting secure shell server in background for root and user $localuser"
959 service_wrapper haveged start >>$DEBUG 2>>$DEBUG
960 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
961 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
969 # {{{ display hostkeys of SSH server
970 config_display_ssh_fingerprints() {
971 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
972 return 0 # no SSH host keys present
975 einfo "SSH key fingerprints:"
976 for file in /etc/ssh/ssh_host_*_key ; do
978 ssh-keygen -l -f $file
984 # {{{ autostart of x11vnc
986 if checkbootparam 'vnc' ; then
989 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
990 einfo "Bootoption vnc found, trying to set password for user $localuser."
992 if [ -z "$VNC_PASSWD" ] ; then
993 if [ -x /usr/bin/apg ] ; then
994 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
995 elif [ -x /usr/bin/gpw ] ; then
996 VNC_PASSWD="$(gpw 1)"
997 elif [ -x /usr/bin/pwgen ] ; then
998 VNC_PASSWD="$(pwgen -1 8)"
999 elif [ -x /usr/bin/hexdump ] ; then
1000 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1001 elif [ -n "$RANDOM" ] ; then
1002 VNC_PASSWD="${localuser}${RANDOM}"
1005 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1009 if [ -n "$VNC_PASSWD" ] ; then
1010 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1015 # finally check if we have a password we can use:
1016 if [ -n "$VNC_PASSWD" ] ; then
1018 VNCDIR="/home/${localuser}/.vnc"
1019 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1021 if [ ! -x /usr/bin/x11vnc ] ; then
1022 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1025 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1026 /bin/chown -R "$localuser": "$VNCDIR"
1029 if checkbootparam 'vnc_connect' ; then
1031 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1032 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1033 #store the options in a file
1034 VNCDIR="/home/${localuser}/.vnc"
1035 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1036 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1042 # {{{ set password for root and default user
1044 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1046 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1049 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1050 [ -z "$localuser" ] && eend 1
1053 if [ -z "$PASSWD" ] ; then
1054 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1058 if [ -n "$PASSWD" ] ; then
1060 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1064 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1065 echo "root:$PASSWD" | chpasswd $chpass_options
1068 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1074 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1076 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1078 if [ -z "$PASSWD" ] ; then
1079 eerror "No hashed password found, can not set password."
1085 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1086 [ -z "$localuser" ] && eend 1
1088 if [ -n "$PASSWD" ] ; then
1091 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1092 echo "root:$PASSWD" | chpasswd $chpass_options
1095 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1105 if ! [ -x /usr/bin/amixer ] ; then
1106 logger -t grml-autoconfig "amixer binary not available"
1110 if ! [ -r /proc/asound/cards ] ; then
1111 ewarn "No soundcard present, skipping mixer settings therefore."
1116 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1117 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1120 if checkbootparam 'vol' ; then
1121 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1122 if [ -z "$VOL" ] ; then
1123 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1131 if checkbootparam 'nosound' ; then
1132 einfo "Muting sound devices on request."
1133 ERROR=$(amixer -q set Master mute)
1135 if [ -n "$ERROR" ] ; then
1137 eerror "Problem muting sound devices: $ERROR"
1141 elif [ -z "$INSTALLED" ] ; then
1142 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1144 if checkbootparam 'micvol' ; then
1145 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1146 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1151 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1154 for CONTROL in ${=CONTROLS} ; do
1155 # such devices can not be controlled with amixer ... unmute
1156 [[ "$CONTROL" == *Console* ]] && continue
1158 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1159 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1160 amixer -c $card -q set "${CONTROL}" unmute
1162 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1163 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1167 if [ ${MICVOL} -ne 0 ] ; then
1168 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1169 amixer -c $card -q set "${CONTROL}" unmute
1171 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1172 amixer -c $card -q set "${CONTROL}" $MICVOL%
1178 fi # checkbootparam 'nosound'
1184 # {{{ syslog service
1186 if checkbootparam 'nosyslog'; then
1187 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1189 einfo "Starting rsyslog in background."
1190 service_wrapper rsyslog start >>$DEBUG
1198 if checkbootparam 'nogpm'; then
1199 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1201 if ! [ -r /dev/input/mice ] ; then
1202 eerror "No mouse found - not starting GPM." ; eend 1
1204 einfo "Starting gpm in background."
1205 service_wrapper gpm start background >>$DEBUG
1214 if checkbootparam 'services' ; then
1215 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1216 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1217 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1218 for service in $(echo -e $SERVICELIST) ; do
1219 # support running (custom) init scripts in non-blocking mode
1220 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1221 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1222 einfo "Starting service ${service}."
1223 service_wrapper "${service}" start >>$DEBUG
1225 einfo "Starting service ${service} in background."
1226 service_wrapper "${service}" start background >>$DEBUG
1236 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1237 SOURCE=$(eval echo "$1")
1240 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1241 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1243 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1245 if checkbootparam 'getfile.retries' ; then
1246 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1251 while ! getconfig && [[ "$counter" != 0 ]] ; do
1252 echo -n "Sleeping for 1 second and trying to get config again... "
1253 counter=$(( counter-1 ))
1254 echo "$counter tries left" ; sleep 1
1256 if [ -s "$TARGET" ] ; then
1257 einfo "Downloading was successfull." ; eend 0
1258 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1259 md5sum ${TARGET} ; eend 0
1262 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1270 if checkbootparam 'netconfig' ; then
1271 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1272 CONFIGFILE='/tmp/netconfig.grml'
1274 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1275 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1282 # {{{ remote scripts
1283 config_netscript() {
1284 if checkbootparam 'netscript' ; then
1285 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1286 SCRIPTFILE='/tmp/netscript.grml'
1288 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1289 chmod +x ${SCRIPTFILE}
1290 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1297 # {{{ start X window system via grml-x
1301 # make sure we start X only if startx is used *before* a nostartx option
1302 # so it's possible to disable automatic X startup using nostart
1303 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1304 if [ -x "$(which X)" ] ; then
1305 if [ -z "$INSTALLED" ] ; then
1306 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1307 if [ -z "$WINDOWMANAGER" ] ; then
1308 einfo "No window manager specified. Using default one." && eend 0
1310 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1312 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1315 if [ -n "$WINDOWMANAGER" ] ; then
1316 mkdir -p /var/run/grml-x/
1317 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1322 cat>|/etc/init.d/startx<<EOF
1324 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1326 chmod 755 /etc/init.d/startx
1328 # adjust inittab for startx
1329 if grep -q '^6:' /etc/inittab ; then
1330 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
1331 else # just append tty6 to inittab if no definition is present:
1332 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
1335 /sbin/telinit q ; eend $?
1337 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1338 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1340 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1344 eerror "We are not running in live mode - startx will not work, skipping it."
1345 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1348 eerror "/usr/bin/X is not present on this grml flavour."
1349 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1355 # {{{ configuration framework
1357 if checkbootparam 'extract' ; then
1358 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1359 EXTRACTOPTIONS="-- -x $EXTRACT"
1363 config_finddcsdir() {
1364 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1365 # on the command line, nothing is changed and the dcs files are
1366 # searched within the .iso, $dcs-dir is set to the root directory
1368 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1369 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1370 # set, $dcs-dir is set to the root directory within the .iso.
1371 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1372 # foo, even if a GRMLCFG partition is present.
1375 # autoconfig, see issue673
1376 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1377 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1378 if checkbootparam 'noautoconfig' ; then
1379 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1380 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1382 if [ -z "$INSTALLED" ] ; then
1383 if checkbootparam 'myconfig' ; then
1384 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1385 if [ -z "$DCSDEVICE" ]; then
1386 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1387 fi # [ -z "$DCSDEVICE" ]
1388 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1389 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1391 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1393 modprobe 9p 2>/dev/null || true
1394 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1395 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1396 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1397 DCSDEVICE="$GRMLCFG"
1398 MOUNTOPTIONS="ro,trans=virtio"
1403 if [ -n "$DCSDEVICE" ]; then
1404 DCSMP="/mnt/grmlcfg"
1409 # if not specified/present then assume default:
1410 if [ -z "$DCSDEVICE" ]; then
1411 DCSDIR="${LIVECD_PATH}"
1414 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1415 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1416 if [ -n "$DCSDIR" ]; then
1417 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1419 [ -d $DCSMP ] || mkdir $DCSMP
1420 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1421 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1422 if [[ $RC == 0 ]]; then
1423 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1425 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1434 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1435 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1436 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1437 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1443 if checkbootparam 'partconf' ; then
1444 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1445 if [ -n "$MOUNTDEVICE" ]; then
1446 [ -d /mnt/grml ] || mkdir /mnt/grml
1447 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1448 if [[ $RC == 0 ]]; then
1449 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1450 einfo "Copying files from $MOUNTDEVICE over grml system."
1451 for file in `cat /etc/grml/partconf` ; do
1452 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1453 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1456 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1457 fi # mount $MOUNTDEVICE
1458 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1460 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1461 fi # [ -n "$MOUNTDEVICE" ]
1466 # {{{ /cdrom/.*-options
1468 if checkbootparam 'debs' ; then
1469 iszsh && setopt localoptions shwordsplit
1470 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1471 if [ -z "$DEBS" ] ; then
1474 if ! echo $DEBS | grep -q '/'; then
1475 # backwards compatibility: if no path is given get debs from debs/
1478 einfo "Trying to install Debian package(s) ${DEBS}"
1479 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1480 dpkg -i $DEBS ; eend $?
1485 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1486 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1487 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1488 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1490 if ! echo $SCRIPTS | grep -q '/'; then
1491 # backwards compatibility: if no path is given get scripts from scripts/
1492 SCRIPTS="scripts/$SCRIPTS"
1494 if [ -n "$SCRIPTS" ]; then
1495 SCRIPTS="${DCSDIR}/$SCRIPTS"
1496 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1497 einfo "Trying to execute ${SCRIPTS}"
1500 elif [ -d "$SCRIPTS" ]; then
1501 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1502 run-parts --regex '.*' $SCRIPTS
1505 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1514 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1515 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1516 if [ -z "$CONFIG" ]; then
1517 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1519 if [ -n "$CONFIG" ]; then
1520 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1521 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1523 cp -a ${DCSDIR}/${CONFIG}/* /
1524 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1525 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1528 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1530 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1537 # {{{ confing_umount_dcsdir
1538 config_umount_dcsdir(){
1539 # umount $DCSMP if it was mounted by finddcsdir
1540 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1546 if checkbootparam 'mypath' ; then
1547 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1548 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1549 touch /etc/grml/my_path
1550 chmod 644 /etc/grml/my_path
1551 # make sure the directories exist:
1553 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1554 if ! [ -d "$i" ] ; then
1555 einfo "Creating directory $i"
1556 mkdir -p "$i" ; eend $?
1559 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1567 [ -n "$INSTALLED" ] && return 0
1569 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1570 checkbootparam 'raid=noautodetect' ; then
1571 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1573 [ -e /proc/mdstat ] || modprobe md_mod
1574 if ! [ -x /sbin/mdadm ] ; then
1575 eerror "mdadm not available, can not execute it." ; eend 1
1578 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1579 # find out whether we have a valid configuration file already
1580 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1581 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1582 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1583 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1585 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1588 if ! checkbootparam 'swraid' ; then
1591 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1593 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1597 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1601 for line in $(mdadm --assemble --scan 2>&1) ; do
1603 *'No arrays found'*)
1604 ewarn "$line" ; eend 0
1607 einfo "$line" ; eend 0
1614 if [ -r /proc/mdstat ] ; then
1616 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1617 if [ -z "$MDSTAT" ] ; then
1618 ewarn "No active arrays found" ; eend 0
1622 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1623 einfo "active arrays: $line" ; eend 0
1629 fi # bootoption swraid
1631 fi # is /sbin/mdadm executable?
1632 fi # check for bootoptions
1638 [ -n "$INSTALLED" ] && return 0
1640 if checkbootparam 'nodmraid' ; then
1641 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1645 if ! [ -x /sbin/dmraid ] ; then
1646 ewarn "dmraid not available, can not execute it." ; eend 1
1651 # usage: dmraid_wrapper <dmraid_option>
1652 [ -n "$1" ] || return 1
1658 for line in $(dmraid $1 ; echo errcode:$?); do
1660 *'no block devices found'*)
1661 einfo "No block devices found" ; eend 0
1665 einfo "No active dmraid devices found" ; eend 0
1684 if checkbootparam 'dmraid' ; then
1685 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1686 if [ "$ACTION" = "off" ] ; then
1687 # Deactivates all active software RAID sets:
1688 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1691 # Activate all software RAID sets discovered:
1692 einfo "Activating present dmraid sets (as requested via dmraid):"
1699 # by default (no special bootoptions) discover all software RAID devices:
1700 einfo "Searching for any present dmraid sets:"
1705 # {{{ LVM (Logical Volumes)
1707 [ -n "$INSTALLED" ] && return 0
1709 if checkbootparam 'nolvm' ; then
1710 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1712 if ! [ -x /sbin/lvm ] ; then
1713 eerror "LVM not available, can not execute it." ; eend 1
1715 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1716 einfo "You seem to have logical volumes (LVM) on your system."
1719 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1721 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1724 if checkbootparam 'lvm' ; then
1726 einfo "Bootoption LVM found, enabling related services."
1727 if [ -r /etc/init.d/lvm2-lvmetad ] ; then
1728 service_wrapper lvm2-lvmetad start ; eend $?
1730 if [ -r /etc/init.d/lvm2-lvmpolld ] ; then
1731 service_wrapper lvm2-lvmpolld start ; eend $?
1733 einfo "Searching for logical volumes and enabling them:"
1734 vgchange -ay ; eend $?
1736 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1737 service_wrapper lvm2 start ; eend $?
1742 fi # check for lvm binary
1743 fi # check for bootoption nolvm
1747 # {{{ debnet: setup network based on an existing one found on a partition
1749 if checkbootparam 'debnet' ; then
1750 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1756 # {{{ disable console blanking
1758 if checkbootparam 'noblank' ; then
1759 einfo "Bootoption noblank found. Disabling monitor blanking."
1760 setterm -blank 0 ; eend $?
1765 # {{{ debootstrap: automatic installation
1766 config_debootstrap(){
1768 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1770 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1772 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1774 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1779 if checkbootparam 'target' ; then
1781 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1782 # notice: the following checks whether the given partition is available, if not the skip
1783 # execution of grml-debootstrap as it might result in data loss...
1784 if ! [ -r "$TARGET" ] ; then
1785 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1789 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1794 if checkbootparam 'grub' ; then
1796 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1799 if checkbootparam 'groot' ; then
1801 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1804 if checkbootparam 'release' ; then
1806 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1809 if checkbootparam 'mirror' ; then
1811 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1814 if checkbootparam 'boot_append' ; then
1816 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1819 if checkbootparam 'password' ; then
1821 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1824 # now check which options are available
1825 if [ -n "TARGET" ] ; then
1826 TARGETCMD="--target $TARGET"
1830 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1834 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1835 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1836 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1837 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1838 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1839 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1841 # and finally write script and execute it
1842 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1844 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1847 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1849 screen /usr/bin/grml-debootstrap_noninteractive
1850 einfo "Invoking a shell, just exit to continue booting..."
1853 fi # checkbootparam "BOOT_IMAGE=debian2hd
1857 # {{{ virtualbox shared folders
1858 config_virtualbox_shared_folders() {
1859 if ! $VIRTUALBOX ; then
1863 if checkbootparam 'novboxsf' ; then
1864 ewarn "Skipping VirtualBox Shared Folders setup as requested on boot commandline." ; eend 0
1866 einfo "VirtualBox detected, trying to set up Shared Folders."
1867 if ! modinfo vboxsf &>/dev/null ; then
1868 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1870 elif ! [ -x /usr/sbin/VBoxService ] ; then
1871 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1876 einfo "Loading vboxsf driver."
1877 lsmod | grep -q vboxsf || modprobe vboxsf
1880 einfo "Adjusting /dev/vboxguest."
1881 chown root:vboxsf /dev/vboxguest
1882 chmod 660 /dev/vboxguest
1887 einfo "Adding user ${fstabuser:-grml} to group vboxsf."
1888 adduser "${fstabuser:-grml}" vboxsf >>"${DEBUG}" 2>&1
1891 einfo "Starting VBoxService."
1892 VBoxService >/dev/null
1895 local vbautomation='automation'
1896 if checkbootparam 'vbautomation'; then
1897 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1900 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}(\s+|$)" ; then
1901 ewarn "No automount shared folder '$vbautomation' available"
1904 einfo "Found automount shared folder '$vbautomation'"
1907 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1908 [ -n "$distri" ] || distri='grml'
1910 local vbox_auto_sf="/media/sf_${vbautomation}"
1912 sleep 1 # ugly but necessary
1916 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1917 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1919 counter=$(( counter-1 ))
1924 if ! [ -d "${vbox_auto_sf}" ] ; then
1925 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1928 einfo "Found shared folders automation directory $vbox_auto_sf"
1932 if checkbootparam 'novbautomation' ; then
1933 einfo "Bootoption novbautomation found. Disabling automation script execution."
1936 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1937 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1940 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1941 "${vbox_auto_sf}/${distri}"
1955 # {{{ VirtualBox application
1956 config_virtualbox_setup() {
1957 if checkbootparam 'novbox' ; then
1958 ewarn "Skipping VirtualBox setup as requested on boot commandline." ; eend 0
1962 if ! [ -x /usr/bin/VBox ] ; then
1966 if running_under_secureboot ; then
1967 ewarn "VirtualBox service can not be started as running under enabled Secure Boot." ; eend 0
1971 einfo "VirtualBox service detected, trying to set up."
1972 service_wrapper vboxdrv restart >>"${DEBUG}" 2>&1 ; eend $?
1976 einfo "Adding user ${fstabuser:-grml} to group vboxusers."
1977 adduser "${fstabuser:-grml}" vboxusers >>"${DEBUG}" 2>&1
1982 # {{{ Support customization
1984 if checkbootparam 'distri'; then
1985 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1986 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1987 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1988 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1989 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1995 ## END OF FILE #################################################################
1996 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2