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-terminus." ; 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
547 # systemd does this for us, but if we are not running under systemd then mokutil
548 # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
549 # /sys/firmware/efi/vars would exist)
551 if modprobe efivars &>/dev/null ; then
552 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
556 if [ -x /usr/bin/mokutil ] ; then
557 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
558 if [ -n "$secstate" ] ; then
559 einfo "SecureBoot is enabled" ; eend 0
561 einfo "SecureBoot not detected" ; eend 0
564 if modprobe efivars &>/dev/null ; then
565 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
566 einfo "SecureBoot is enabled" ; eend 0
568 einfo "SecureBoot not detected" ; eend 0
577 # don't touch the files if running from harddisk:
578 if [ -z "$INSTALLED" ]; then
579 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
580 if [ -n "$KTZ" ] ; then
581 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
583 ewarn "Warning: unknown timezone $KTZ"; eend 0
585 einfo "Setting timezone."
587 area=$(echo $KTZ | cut -d '/' -f1)
588 zone=$(echo $KTZ | cut -d '/' -f2)
589 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
590 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
592 echo $KTZ > /etc/timezone
594 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
601 # activate serial console {{{
603 if checkbootparam 'console'; then
604 # this hack is no longer necessary with systemd
613 einfo "Bootoption for serial console detected:"
617 line="${line#*[$ws]}"
619 while [ -n "$line" ]; do
623 local device="${this%%,*}"
624 local device="${device##*=}"
625 if echo $serial | grep -q ttyS ; then
626 local option="${serial##*,}"
627 # default (works for kvm & CO):
628 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
629 # ... unless overriden by command line:
631 115200*) speed=115200 ;;
632 57600*) speed=57600 ;;
633 38400*) speed=38400 ;;
634 19200*) speed=19200 ;;
641 einfo "Activating console login on device ${device} with speed ${speed}."
642 local number="${device#ttyS}"
643 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
650 this="${line%%[$ws]*}"
651 line="${line#*[$ws]}"
654 if [ -n "$telinitq" ]; then
664 if checkbootparam 'testcd' ; then
665 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
669 local FOUND_FILE=false
670 local logfile='/tmp/md5sum.log'
674 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
675 einfo "Checking files against $md5, this may take a while..."
680 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
681 if [ $pipestatus[1] -eq 0 ] ; then
687 if ! $FOUND_FILE ; then
688 eerror 'Error: Could not find md5sum file' ; eend 1
693 einfo "Everything looks OK" ; eend 0
695 eerror 'Checksum failed for theses files:' ; eend 1
696 egrep -v '(^md5sum:|OK$)' "${logfile}"
697 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
698 einfon "Hit return to continue, or press the power button to shut down system."
707 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
709 if checkbootparam 'blacklist' ; then
710 if [ -z "$INSTALLED" ]; then
711 einfo "Bootoption blacklist found."
712 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
713 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
714 if [ -n "$BLACK" ] ; then
715 for module in $(echo ${BLACK//,/ }) ; do
716 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
717 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
718 echo "blacklist $module" >> "$BLACKLIST_FILE"
719 echo "alias $module off" >> "$BLACKLIST_FILE"
720 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
723 eerror "No given module for blacklist found. Blacklisting will not work therefore."
726 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
728 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
738 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
742 if checkbootparam 'noacpi'; then
743 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
744 elif checkbootparam 'nogrmlacpi' ; then
745 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
746 elif [ ! -d /proc/acpi ] ; then
747 ewarn "ACPI: Kernel support not present." ; eend 0
749 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
752 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
754 basename="${basename%%.*}"
755 case "$basename" in *_acpi)
756 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
758 modprobe $basename >>$DEBUG 2>&1 && found="yes"
759 local BASE="$BASE $basename"
761 if [ -n "$found" ] ; then
762 einfo "$BASE" ; eend 0
764 ewarn "(none)" ; eend 1
766 if ! pgrep acpid >/dev/null ; then
767 einfo "Starting acpi daemon."
768 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
769 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
771 ewarn "acpi daemon already running."
781 if checkbootparam 'brltty' ; then
782 einfo "Starting brltty service as requested on boot commandline."
783 service_wrapper brltty start ; eend $?
788 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
791 NOSWAP="yes" # we do not use swap by default!
792 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
794 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
797 # Scan for swap, config, homedir - but only in live-mode
798 if [ -z "$INSTALLED" ] ; then
799 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
802 HOMEDIR="$(getbootparam 'home')"
803 if [ -n "$partitions" ]; then
804 while read p m f relax; do
805 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
806 partoptions="users,exec"
808 # it's a swap partition?
811 if [ -n "$NOSWAP" ]; then
812 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
815 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
816 S1SUSP|S2SUSP|pmdisk|[zZ]*)
817 if [ -n "$ANYSWAP" ] ; then
818 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
819 swapon $p 2>>$DEBUG ; eend $?
821 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
825 if [[ "$p" == LABEL* ]] ; then
826 p=$(blkid -t $p | awk -F: '{print $1}')
828 if grep -q $p /proc/swaps ; then
829 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
831 if [ -b "$p" ] ; then
832 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
833 swapon $p 2>>$DEBUG ; eend $?
835 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
844 esac # it's a swap partition?
849 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
850 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
852 # *) NONEFOUND='1'; continue ;;
856 if [ -z "$NOSWAP" ] ; then
857 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
858 # Activate swapfile, if exists
859 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
861 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
862 mount -o remount,rw $m && MOUNTED=1
863 if swapon "$SWAPFILE" 2>>$DEBUG ; then
865 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
867 fnew="$SWAPFILE swap swap defaults 0 0"
868 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
869 GRML_SWP="$GRML_SWP $SWAPFILE"
872 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
875 # use a image as home
876 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
877 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
878 if [ -n "$HOMEDIR" ]; then
879 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
883 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
885 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
890 # Umount, if not in use
891 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
903 if checkbootparam 'nocpu'; then
904 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
908 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
910 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)
911 echo $CPU | sed 's/ \{1,\}/ /g'
914 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
919 # {{{ autostart of ssh
921 if checkbootparam 'ssh' ; then
923 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
926 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
927 [ -z "$localuser" ] && eend 1
930 if [ -z "$PASSWD" ] ; then
931 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
935 if [ -n "$PASSWD" ] ; then
937 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
941 echo "$localuser:$PASSWD" | chpasswd $chpass_options
942 echo "root:$PASSWD" | chpasswd $chpass_options
945 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
949 einfo "Starting secure shell server in background for root and user $localuser"
950 service_wrapper haveged start >>$DEBUG 2>>$DEBUG
951 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
952 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
960 # {{{ display hostkeys of SSH server
961 config_display_ssh_fingerprints() {
962 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
963 return 0 # no SSH host keys present
966 einfo "SSH key fingerprints:"
967 for file in /etc/ssh/ssh_host_*_key ; do
969 ssh-keygen -l -f $file
975 # {{{ autostart of x11vnc
977 if checkbootparam 'vnc' ; then
980 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
981 einfo "Bootoption vnc found, trying to set password for user $localuser."
983 if [ -z "$VNC_PASSWD" ] ; then
984 if [ -x /usr/bin/apg ] ; then
985 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
986 elif [ -x /usr/bin/gpw ] ; then
987 VNC_PASSWD="$(gpw 1)"
988 elif [ -x /usr/bin/pwgen ] ; then
989 VNC_PASSWD="$(pwgen -1 8)"
990 elif [ -x /usr/bin/hexdump ] ; then
991 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
992 elif [ -n "$RANDOM" ] ; then
993 VNC_PASSWD="${localuser}${RANDOM}"
996 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1000 if [ -n "$VNC_PASSWD" ] ; then
1001 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1006 # finally check if we have a password we can use:
1007 if [ -n "$VNC_PASSWD" ] ; then
1009 VNCDIR="/home/${localuser}/.vnc"
1010 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1012 if [ ! -x /usr/bin/x11vnc ] ; then
1013 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1016 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1017 /bin/chown -R "$localuser": "$VNCDIR"
1020 if checkbootparam 'vnc_connect' ; then
1022 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1023 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1024 #store the options in a file
1025 VNCDIR="/home/${localuser}/.vnc"
1026 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1027 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1033 # {{{ set password for root and default user
1035 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1037 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1040 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1041 [ -z "$localuser" ] && eend 1
1044 if [ -z "$PASSWD" ] ; then
1045 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1049 if [ -n "$PASSWD" ] ; then
1051 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1055 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1056 echo "root:$PASSWD" | chpasswd $chpass_options
1059 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1065 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1067 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1069 if [ -z "$PASSWD" ] ; then
1070 eerror "No hashed password found, can not set password."
1076 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1077 [ -z "$localuser" ] && eend 1
1079 if [ -n "$PASSWD" ] ; then
1082 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1083 echo "root:$PASSWD" | chpasswd $chpass_options
1086 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1096 if ! [ -x /usr/bin/amixer ] ; then
1097 logger -t grml-autoconfig "amixer binary not available"
1101 if ! [ -r /proc/asound/cards ] ; then
1102 ewarn "No soundcard present, skipping mixer settings therefore."
1107 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1108 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1111 if checkbootparam 'vol' ; then
1112 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1113 if [ -z "$VOL" ] ; then
1114 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1122 if checkbootparam 'nosound' ; then
1123 einfo "Muting sound devices on request."
1124 ERROR=$(amixer -q set Master mute)
1126 if [ -n "$ERROR" ] ; then
1128 eerror "Problem muting sound devices: $ERROR"
1132 elif [ -z "$INSTALLED" ] ; then
1133 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1135 if checkbootparam 'micvol' ; then
1136 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1137 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1142 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1145 for CONTROL in ${=CONTROLS} ; do
1146 # such devices can not be controlled with amixer ... unmute
1147 [[ "$CONTROL" == *Console* ]] && continue
1149 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1150 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1151 amixer -c $card -q set "${CONTROL}" unmute
1153 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1154 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1158 if [ ${MICVOL} -ne 0 ] ; then
1159 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1160 amixer -c $card -q set "${CONTROL}" unmute
1162 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1163 amixer -c $card -q set "${CONTROL}" $MICVOL%
1169 fi # checkbootparam 'nosound'
1175 # {{{ syslog service
1177 if checkbootparam 'nosyslog'; then
1178 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1180 einfo "Starting rsyslog in background."
1181 service_wrapper rsyslog start >>$DEBUG
1189 if checkbootparam 'nogpm'; then
1190 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1192 if ! [ -r /dev/input/mice ] ; then
1193 eerror "No mouse found - not starting GPM." ; eend 1
1195 einfo "Starting gpm in background."
1196 service_wrapper gpm start background >>$DEBUG
1205 if checkbootparam 'services' ; then
1206 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1207 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1208 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1209 for service in $(echo -e $SERVICELIST) ; do
1210 # support running (custom) init scripts in non-blocking mode
1211 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1212 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1213 einfo "Starting service ${service}."
1214 service_wrapper "${service}" start >>$DEBUG
1216 einfo "Starting service ${service} in background."
1217 service_wrapper "${service}" start background >>$DEBUG
1227 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1228 SOURCE=$(eval echo "$1")
1231 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1232 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1234 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1236 if checkbootparam 'getfile.retries' ; then
1237 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1242 while ! getconfig && [[ "$counter" != 0 ]] ; do
1243 echo -n "Sleeping for 1 second and trying to get config again... "
1244 counter=$(( counter-1 ))
1245 echo "$counter tries left" ; sleep 1
1247 if [ -s "$TARGET" ] ; then
1248 einfo "Downloading was successfull." ; eend 0
1249 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1250 md5sum ${TARGET} ; eend 0
1253 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1261 if checkbootparam 'netconfig' ; then
1262 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1263 CONFIGFILE='/tmp/netconfig.grml'
1265 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1266 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1273 # {{{ remote scripts
1274 config_netscript() {
1275 if checkbootparam 'netscript' ; then
1276 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1277 SCRIPTFILE='/tmp/netscript.grml'
1279 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1280 chmod +x ${SCRIPTFILE}
1281 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1288 # {{{ start X window system via grml-x
1292 # make sure we start X only if startx is used *before* a nostartx option
1293 # so it's possible to disable automatic X startup using nostart
1294 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1295 if [ -x "$(which X)" ] ; then
1296 if [ -z "$INSTALLED" ] ; then
1297 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1298 if [ -z "$WINDOWMANAGER" ] ; then
1299 einfo "No window manager specified. Using default one." && eend 0
1301 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1303 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1306 if [ -n "$WINDOWMANAGER" ] ; then
1307 mkdir -p /var/run/grml-x/
1308 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1313 cat>|/etc/init.d/startx<<EOF
1315 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1317 chmod 755 /etc/init.d/startx
1319 # adjust inittab for startx
1320 if grep -q '^6:' /etc/inittab ; then
1321 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
1322 else # just append tty6 to inittab if no definition is present:
1323 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
1326 /sbin/telinit q ; eend $?
1328 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1329 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1331 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1335 eerror "We are not running in live mode - startx will not work, skipping it."
1336 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1339 eerror "/usr/bin/X is not present on this grml flavour."
1340 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1346 # {{{ configuration framework
1348 if checkbootparam 'extract' ; then
1349 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1350 EXTRACTOPTIONS="-- -x $EXTRACT"
1354 config_finddcsdir() {
1355 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1356 # on the command line, nothing is changed and the dcs files are
1357 # searched within the .iso, $dcs-dir is set to the root directory
1359 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1360 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1361 # set, $dcs-dir is set to the root directory within the .iso.
1362 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1363 # foo, even if a GRMLCFG partition is present.
1366 # autoconfig, see issue673
1367 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1368 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1369 if checkbootparam 'noautoconfig' ; then
1370 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1371 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1373 if [ -z "$INSTALLED" ] ; then
1374 if checkbootparam 'myconfig' ; then
1375 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1376 if [ -z "$DCSDEVICE" ]; then
1377 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1378 fi # [ -z "$DCSDEVICE" ]
1379 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1380 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1382 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1384 modprobe 9p 2>/dev/null || true
1385 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1386 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1387 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1388 DCSDEVICE="$GRMLCFG"
1389 MOUNTOPTIONS="ro,trans=virtio"
1394 if [ -n "$DCSDEVICE" ]; then
1395 DCSMP="/mnt/grmlcfg"
1400 # if not specified/present then assume default:
1401 if [ -z "$DCSDEVICE" ]; then
1402 DCSDIR="${LIVECD_PATH}"
1405 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1406 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1407 if [ -n "$DCSDIR" ]; then
1408 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1410 [ -d $DCSMP ] || mkdir $DCSMP
1411 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1412 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1413 if [[ $RC == 0 ]]; then
1414 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1416 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1425 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1426 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1427 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1428 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1434 if checkbootparam 'partconf' ; then
1435 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1436 if [ -n "$MOUNTDEVICE" ]; then
1437 [ -d /mnt/grml ] || mkdir /mnt/grml
1438 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1439 if [[ $RC == 0 ]]; then
1440 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1441 einfo "Copying files from $MOUNTDEVICE over grml system."
1442 for file in `cat /etc/grml/partconf` ; do
1443 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1444 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1447 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1448 fi # mount $MOUNTDEVICE
1449 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1451 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1452 fi # [ -n "$MOUNTDEVICE" ]
1457 # {{{ /cdrom/.*-options
1459 if checkbootparam 'debs' ; then
1460 iszsh && setopt localoptions shwordsplit
1461 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1462 if [ -z "$DEBS" ] ; then
1465 if ! echo $DEBS | grep -q '/'; then
1466 # backwards compatibility: if no path is given get debs from debs/
1469 einfo "Trying to install Debian package(s) ${DEBS}"
1470 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1471 dpkg -i $DEBS ; eend $?
1476 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1477 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1478 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1479 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1481 if ! echo $SCRIPTS | grep -q '/'; then
1482 # backwards compatibility: if no path is given get scripts from scripts/
1483 SCRIPTS="scripts/$SCRIPTS"
1485 if [ -n "$SCRIPTS" ]; then
1486 SCRIPTS="${DCSDIR}/$SCRIPTS"
1487 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1488 einfo "Trying to execute ${SCRIPTS}"
1491 elif [ -d "$SCRIPTS" ]; then
1492 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1493 run-parts --regex '.*' $SCRIPTS
1496 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1505 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1506 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1507 if [ -z "$CONFIG" ]; then
1508 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1510 if [ -n "$CONFIG" ]; then
1511 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1512 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1514 cp -a ${DCSDIR}/${CONFIG}/* /
1515 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1516 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1519 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1521 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1528 # {{{ confing_umount_dcsdir
1529 config_umount_dcsdir(){
1530 # umount $DCSMP if it was mounted by finddcsdir
1531 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1537 if checkbootparam 'mypath' ; then
1538 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1539 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1540 touch /etc/grml/my_path
1541 chmod 644 /etc/grml/my_path
1542 # make sure the directories exist:
1544 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1545 if ! [ -d "$i" ] ; then
1546 einfo "Creating directory $i"
1547 mkdir -p "$i" ; eend $?
1550 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1558 [ -n "$INSTALLED" ] && return 0
1560 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1561 checkbootparam 'raid=noautodetect' ; then
1562 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1564 [ -e /proc/mdstat ] || modprobe md_mod
1565 if ! [ -x /sbin/mdadm ] ; then
1566 eerror "mdadm not available, can not execute it." ; eend 1
1569 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1570 # find out whether we have a valid configuration file already
1571 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1572 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1573 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1574 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1576 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1579 if ! checkbootparam 'swraid' ; then
1582 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1584 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1588 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1592 for line in $(mdadm --assemble --scan 2>&1) ; do
1594 *'No arrays found'*)
1595 ewarn "$line" ; eend 0
1598 einfo "$line" ; eend 0
1605 if [ -r /proc/mdstat ] ; then
1607 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1608 if [ -z "$MDSTAT" ] ; then
1609 ewarn "No active arrays found" ; eend 0
1613 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1614 einfo "active arrays: $line" ; eend 0
1620 fi # bootoption swraid
1622 fi # is /sbin/mdadm executable?
1623 fi # check for bootoptions
1629 [ -n "$INSTALLED" ] && return 0
1631 if checkbootparam 'nodmraid' ; then
1632 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1636 if ! [ -x /sbin/dmraid ] ; then
1637 eerror "dmraid not available, can not execute it." ; eend 1
1642 # usage: dmraid_wrapper <dmraid_option>
1643 [ -n "$1" ] || return 1
1649 for line in $(dmraid $1 ; echo errcode:$?); do
1651 *'no block devices found'*)
1652 einfo "No block devices found" ; eend 0
1656 einfo "No active dmraid devices found" ; eend 0
1675 if checkbootparam 'dmraid' ; then
1676 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1677 if [ "$ACTION" = "off" ] ; then
1678 # Deactivates all active software RAID sets:
1679 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1682 # Activate all software RAID sets discovered:
1683 einfo "Activating present dmraid sets (as requested via dmraid):"
1690 # by default (no special bootoptions) discover all software RAID devices:
1691 einfo "Searching for any present dmraid sets:"
1696 # {{{ LVM (Logical Volumes)
1698 [ -n "$INSTALLED" ] && return 0
1700 if checkbootparam 'nolvm' ; then
1701 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1703 if ! [ -x /sbin/lvm ] ; then
1704 eerror "LVM not available, can not execute it." ; eend 1
1706 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1707 einfo "You seem to have logical volumes (LVM) on your system."
1710 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1712 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1715 if checkbootparam 'lvm' ; then
1716 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1718 service_wrapper lvm2-lvmetad start
1722 service_wrapper lvm2 start ; eend $?
1727 fi # check for lvm binary
1728 fi # check for bootoption nolvm
1732 # {{{ debnet: setup network based on an existing one found on a partition
1734 if checkbootparam 'debnet' ; then
1735 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1741 # {{{ disable console blanking
1743 if checkbootparam 'noblank' ; then
1744 einfo "Bootoption noblank found. Disabling monitor blanking."
1745 setterm -blank 0 ; eend $?
1750 # {{{ debootstrap: automatic installation
1751 config_debootstrap(){
1753 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1755 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1757 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1759 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1764 if checkbootparam 'target' ; then
1766 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1767 # notice: the following checks whether the given partition is available, if not the skip
1768 # execution of grml-debootstrap as it might result in data loss...
1769 if ! [ -r "$TARGET" ] ; then
1770 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1774 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1779 if checkbootparam 'grub' ; then
1781 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1784 if checkbootparam 'groot' ; then
1786 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1789 if checkbootparam 'release' ; then
1791 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1794 if checkbootparam 'mirror' ; then
1796 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1799 if checkbootparam 'boot_append' ; then
1801 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1804 if checkbootparam 'password' ; then
1806 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1809 # now check which options are available
1810 if [ -n "TARGET" ] ; then
1811 TARGETCMD="--target $TARGET"
1815 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1819 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1820 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1821 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1822 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1823 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1824 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1826 # and finally write script and execute it
1827 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1829 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1832 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1834 screen /usr/bin/grml-debootstrap_noninteractive
1835 einfo "Invoking a shell, just exit to continue booting..."
1838 fi # checkbootparam "BOOT_IMAGE=debian2hd
1842 # {{{ virtualbox shared folders
1843 config_virtualbox_shared_folders() {
1844 if $VIRTUALBOX ; then
1845 einfo "VirtualBox detected, trying to set up Shared Folders."
1846 if ! modinfo vboxsf &>/dev/null ; then
1847 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1849 elif ! [ -x /usr/sbin/VBoxService ] ; then
1850 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1855 einfo "Loading vboxsf driver."
1856 lsmod | grep -q vboxsf || modprobe vboxsf
1859 einfo "Adjusting /dev/vboxguest."
1860 chown root:vboxsf /dev/vboxguest
1861 chmod 660 /dev/vboxguest
1866 einfo "Adding $fstabuser to group vboxsf."
1867 adduser grml vboxsf &>/dev/null
1870 einfo "Starting VBoxService."
1871 VBoxService >/dev/null
1874 local vbautomation='automation'
1875 if checkbootparam 'vbautomation'; then
1876 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1879 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1880 ewarn "No automount shared folder '$vbautomation' available"
1883 einfo "Found automount shared folder '$vbautomation'"
1886 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1887 [ -n "$distri" ] || distri='grml'
1889 local vbox_auto_sf="/media/sf_${vbautomation}"
1891 sleep 1 # ugly but necessary
1895 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1896 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1898 counter=$(( counter-1 ))
1903 if ! [ -d "${vbox_auto_sf}" ] ; then
1904 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1907 einfo "Found shared folders automation directory $vbox_auto_sf"
1911 if checkbootparam 'novbautomation' ; then
1912 einfo "Bootoption novbautomation found. Disabling automation script execution."
1915 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1916 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1919 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1920 "${vbox_auto_sf}/${distri}"
1934 # {{{ Support customization
1936 if checkbootparam 'distri'; then
1937 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1938 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1939 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1940 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1941 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1947 ## END OF FILE #################################################################
1948 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2