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 # old linuxrc version:
17 [ -d /cdrom ] && export LIVECD_PATH=/cdrom
18 # initramfs layout until around December 2012:
19 [ -d /live/image ] && export LIVECD_PATH=/live/image
20 # initramfs layout since around December 2012:
21 [ -d /lib/live/mount/medium ] && export LIVECD_PATH=/lib/live/mount/medium
23 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
24 [ -z "$PS1" ] && trap "" 2 3 11
26 if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
33 if [ "$#" -lt 2 ] ; then
34 echo "Usage: service_wrapper <service> <action> [background]" >&2
43 systemctl "$action" "$service"
45 if [ "${background:-}" = "background" ] ; then
46 /etc/init.d/"$service" "$action" &
48 /etc/init.d/"$service" "$action"
55 if [ -n "$ZSH_VERSION" ] ; then
61 # avoid 'no matches found: ...'
62 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
65 # {{{ Read in boot parameters
66 if [ -z "$CMDLINE" ]; then
67 # if CMDLINE was set from the outside, we're debugging.
68 # otherwise, take CMDLINE from Kernel and config files.
69 CMDLINE="$(cat /proc/cmdline)"
70 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
71 modprobe 9p 2>/dev/null || true
72 if grep -q 9p /proc/filesystems ; then
74 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
75 MOUNTDIR="$(mktemp -d)"
76 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
77 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
85 ### {{{ Utility Functions
87 # Get a bootoption's parameter: read boot command line and either
88 # echo last parameter's argument or return false.
96 result="${line##*[$ws]$1=}"
97 result="${result%%[$ws]*}"
105 # Check boot commandline for specified option
107 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
113 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
120 # Check if currently using a framebuffer
122 [ -e /dev/fb0 ] && return 0 || return 1
125 # Check wheter a configuration variable (like $CONFIG_TOHD) is
129 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
130 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
131 *) return 1 ;; # default
135 # Are we using grml-small?
137 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
140 # if no password is set return a random password
142 [ -n "$PASSWD" ] && return 0
144 if [ -x /usr/bin/apg ] ; then
145 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
146 elif [ -x /usr/bin/gpw ] ; then
148 elif [ -x /usr/bin/pwgen ] ; then
149 PASSWD="$(pwgen -1 8)"
150 elif [ -x /usr/bin/hexdump ] ; then
151 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
152 elif [ -n "$RANDOM" ] ; then
153 PASSWD="grml${RANDOM}"
156 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
164 # {{{ filesystems (proc, pts, sys) and fixes
166 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
170 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
174 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
178 # {{{ Check if we are running in live mode or from HD
180 [ -e /etc/grml_cd ] || INSTALLED="yes"
183 # {{{ provide information about virtual environments
184 VIRTUAL=false # assume physical system by default
189 if vmware-detect &>/dev/null; then
190 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
193 if virt-what 2>/dev/null | grep -q 'kvm' || \
194 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
195 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
198 if virt-what 2>/dev/null | grep -q 'virtualbox' || \
199 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
200 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
204 # {{{ source lsb-functions , color handling
205 if checkbootparam 'nocolor'; then
206 . /etc/grml/lsb-functions
207 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
209 . /etc/grml/lsb-functions
215 if checkbootparam 'log' || checkbootparam 'debug' ; then
216 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
218 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
220 einfo "Starting bootlogd." # known to be *very* unreliable :(
221 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
229 ### {{{ language configuration / localization
232 einfo "Activating language settings:"
235 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
236 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
238 # check for bootoption which overrides config from /etc/grml/autoconfig
239 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
240 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
242 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
243 if [ -z "$INSTALLED" ] ; then
244 [ -n "$LANGUAGE" ] || LANGUAGE='en'
247 if [ -x /usr/sbin/grml-setlang ] ; then
248 # if bootoption lang is used update /etc/default/locale accordingly
249 if [ -n "$BOOT_LANGUAGE" ] ; then
250 /usr/sbin/grml-setlang "$LANGUAGE"
251 # otherwise default to lang=en
253 /usr/sbin/grml-setlang "en"
259 if [ -z "$CONSOLEFONT" ] ; then
260 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
261 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
262 CONSOLEFONT='Uni3-Terminus16'
264 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
267 CONSOLEFONT='Lat15-Terminus16'
271 fi # not running systemd
273 # export it now, so error messages get translated, too
274 [ -r /etc/default/locale ] && . /etc/default/locale
279 KEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
280 [ -n "$KEYBOARD" ] || KEYBOARD="$LANGUAGE"
281 # "symbols/en" doesn't exist, so rewrite to "us"
282 [[ "$KEYBOARD" == 'en' ]] && KEYBOARD="us"
284 if [ -r /etc/default/keyboard ] ; then
285 sed -i "s/^XKBLAYOUT=.*/XKBLAYOUT=\"$KEYBOARD\"/" /etc/default/keyboard
289 sed -i "s/^XKBVARIANT=.*/XKBVARIANT=\"nodeadkeys\"/" /etc/default/keyboard
294 service_wrapper console-setup restart >>$DEBUG 2>&1 ; eend $?
295 else # not running systemd, keeing for backwards compatibility:
296 # configure keyboard layout, read in already set values first:
297 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
299 # now allow keyboard override by boot commandline for later use:
300 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
301 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
302 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
303 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
304 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
306 # modify /etc/sysconfig/keyboard only in live-cd mode:
307 if [ -z "$INSTALLED" ] ; then
309 local LANGUAGE="$BOOT_LANGUAGE"
310 . /etc/grml/language-functions
311 # allow setting xkeyboard explicitly different than console keyboard
312 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
313 if [ -n "$KXKEYBOARD" ]; then
314 XKEYBOARD="$KXKEYBOARD"
315 KDEKEYBOARD="$KXKEYBOARD"
316 elif [ -n "$KKEYBOARD" ]; then
317 XKEYBOARD="$KKEYBOARD"
318 KDEKEYBOARD="$KKEYBOARD"
321 # duplicate of previous code to make sure /etc/grml/language-functions
322 # does not overwrite our values....
323 # now allow keyboard override by boot commandline for later use:
324 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
325 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
326 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
327 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
328 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
330 # write keyboard related variables to file for later use
331 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
332 if ! [ -e /etc/sysconfig/keyboard ] ; then
333 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
334 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
335 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
336 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
340 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
345 # we have to set up all consoles, therefore loop it over all ttys:
346 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
347 if [ -n "$NUM_CONSOLES" ] ; then
348 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
349 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
351 CUR_CONSOLE=$(fgconsole 2>/dev/null)
353 if [ -x "$(which setfont)" ] ; then
355 elif [ -x "$(which consolechars)" ] ; then
356 use_consolechars=true
358 eerror "Neither setfont nor consolechars tool present, can not set font."
363 if [ -n "$CHARMAP" ] ; then
364 einfo "Setting font to ${CHARMAP}"
366 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
367 if $use_setfont ; then
368 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
369 elif $use_consolechars ; then
370 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
373 if [ -n "$CUR_CONSOLE" ] ; then
374 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
379 if checkbootparam 'noconsolefont' ; then
380 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
382 if [ -n "$CONSOLEFONT" ] ; then
383 einfo "Setting font to ${CONSOLEFONT}"
385 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
386 if $use_setfont ; then
387 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
388 elif $use_consolechars ; then
389 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
392 if [ -n "$CUR_CONSOLE" ] ; then
393 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
399 # Set default keyboard before interactive setup
400 if [ -n "$KEYTABLE" ] ; then
401 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
402 loadkeys -q $KEYTABLE &
406 # activate unicode console if running within utf8 environment
407 if [ -r /etc/default/locale ] ; then
408 if grep -q "LANG=.*UTF" /etc/default/locale ; then
409 einfo "Setting up unicode environment."
410 unicode_start ; eend $?
413 fi # not running systemd
421 if ! checkbootparam 'hostname' ; then
425 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
426 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
427 einfo "Generating random hostname as no hostname was specified."
428 HOSTNAME="$(/usr/bin/random-hostname)"
432 einfo "Setting hostname to $HOSTNAME as requested."
433 grml-hostname $HOSTNAME >>$DEBUG
438 # fstabuser (needed when running from harddisk with username != grml {{{
440 # force load of build-in and local config
441 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
442 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
444 # 1st. try configured fstab user
445 if [ -n "$CONFIG_FSTAB_USER" ] ; then
446 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
449 # 2nd. use standard user id
450 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
452 # 3rd. use standard user name
453 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
455 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
456 [ -n "$fstabuser" ] || fstabuser='root'
460 # local_user (needed when running with username != grml {{{
463 # force load of build-in and local config
464 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
465 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
467 # 1st. try id of primary user
468 localuser=$(getent passwd 1000 | cut -d: -f1)
470 # 2nd. use name standard user
471 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
475 # {{{ Set clock (Local time is more often used than GMT, so it is default)
477 # don't touch the files if running from harddisk:
478 if [ -z "$INSTALLED" ]; then
479 # The default hardware clock timezone is stated as representing local time.
482 if [ -f /etc/default/rcS ] ; then
483 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
484 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
485 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
486 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
487 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
488 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
489 elif [ -f /etc/adjtime ] ; then
490 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
491 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
492 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
493 grep -q "^UTC$" /etc/adjtime && UTC="-u"
496 # hwclock uses the TZ variable
497 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
498 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
499 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
500 ewarn "Warning: unknown timezone $KTZ" ; eend 1
502 ewarn "Falling back to timezone $KTZ" ; eend 0
505 if ! [ -r /dev/rtc ] ; then
506 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
509 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
510 if [ -n "$ERROR" ] ; then
512 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
513 if [ -n "$ERROR" ] ; then
514 eerror "Problem running hwclock: $ERROR" ; eend 1
523 # {{{ print kernel info
525 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
526 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
528 einfo "Running Linux Kernel $KERNEL" ; eend 0
531 if [ -r /proc/cpuinfo ] ; then
532 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
534 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
539 if [ -d /proc/xen ] ; then
541 einfo 'Running kernel featuring support for Xen detected' ; eend 0
549 # systemd does this for us, but if we are not running under systemd then mokutil
550 # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
551 # /sys/firmware/efi/vars would exist)
553 if modprobe efivars &>/dev/null ; then
554 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
558 if [ -x /usr/bin/mokutil ] ; then
559 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
560 if [ -n "$secstate" ] ; then
561 einfo "SecureBoot is enabled" ; eend 0
563 einfo "SecureBoot not detected" ; eend 0
566 if modprobe efivars &>/dev/null ; then
567 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
568 einfo "SecureBoot is enabled" ; eend 0
570 einfo "SecureBoot not detected" ; eend 0
579 # don't touch the files if running from harddisk:
580 if [ -z "$INSTALLED" ]; then
581 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
582 if [ -n "$KTZ" ] ; then
583 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
585 ewarn "Warning: unknown timezone $KTZ"; eend 0
587 einfo "Setting timezone."
589 area=$(echo $KTZ | cut -d '/' -f1)
590 zone=$(echo $KTZ | cut -d '/' -f2)
591 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
592 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
594 echo $KTZ > /etc/timezone
596 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
603 # activate serial console {{{
605 if checkbootparam 'console'; then
606 # this hack is no longer necessary with systemd
615 einfo "Bootoption for serial console detected:"
619 line="${line#*[$ws]}"
621 while [ -n "$line" ]; do
625 local device="${this%%,*}"
626 local device="${device##*=}"
627 if echo $serial | grep -q ttyS ; then
628 local option="${serial##*,}"
629 # default (works for kvm & CO):
630 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
631 # ... unless overriden by command line:
633 115200*) speed=115200 ;;
634 57600*) speed=57600 ;;
635 38400*) speed=38400 ;;
636 19200*) speed=19200 ;;
643 einfo "Activating console login on device ${device} with speed ${speed}."
644 local number="${device#ttyS}"
645 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
652 this="${line%%[$ws]*}"
653 line="${line#*[$ws]}"
656 if [ -n "$telinitq" ]; then
666 if checkbootparam 'testcd' ; then
667 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
671 local FOUND_FILE=false
672 local logfile='/tmp/md5sum.log'
676 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
677 einfo "Checking files against $md5, this may take a while..."
682 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
683 if [ $pipestatus[1] -eq 0 ] ; then
689 if ! $FOUND_FILE ; then
690 eerror 'Error: Could not find md5sum file' ; eend 1
695 einfo "Everything looks OK" ; eend 0
697 eerror 'Checksum failed for theses files:' ; eend 1
698 egrep -v '(^md5sum:|OK$)' "${logfile}"
699 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
700 einfon "Hit return to continue, or press the power button to shut down system."
709 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
711 if checkbootparam 'blacklist' ; then
712 if [ -z "$INSTALLED" ]; then
713 einfo "Bootoption blacklist found."
714 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
715 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
716 if [ -n "$BLACK" ] ; then
717 for module in $(echo ${BLACK//,/ }) ; do
718 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
719 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
720 echo "blacklist $module" >> "$BLACKLIST_FILE"
721 echo "alias $module off" >> "$BLACKLIST_FILE"
722 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
725 eerror "No given module for blacklist found. Blacklisting will not work therefore."
728 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
730 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
740 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
744 if checkbootparam 'noacpi'; then
745 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
746 elif checkbootparam 'nogrmlacpi' ; then
747 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
748 elif [ ! -d /proc/acpi ] ; then
749 ewarn "ACPI: Kernel support not present." ; eend 0
751 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
754 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
756 basename="${basename%%.*}"
757 case "$basename" in *_acpi)
758 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
760 modprobe $basename >>$DEBUG 2>&1 && found="yes"
761 local BASE="$BASE $basename"
763 if [ -n "$found" ] ; then
764 einfo "$BASE" ; eend 0
766 ewarn "(none)" ; eend 1
768 if ! pgrep acpid >/dev/null ; then
769 einfo "Starting acpi daemon."
770 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
771 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
773 ewarn "acpi daemon already running."
783 if checkbootparam 'brltty' ; then
784 einfo "Starting brltty service as requested on boot commandline."
785 service_wrapper brltty start ; eend $?
790 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
793 NOSWAP="yes" # we do not use swap by default!
794 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
796 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
799 # Scan for swap, config, homedir - but only in live-mode
800 if [ -z "$INSTALLED" ] ; then
801 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
804 HOMEDIR="$(getbootparam 'home')"
805 if [ -n "$partitions" ]; then
806 while read p m f relax; do
807 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
808 partoptions="users,exec"
810 # it's a swap partition?
813 if [ -n "$NOSWAP" ]; then
814 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
817 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
818 S1SUSP|S2SUSP|pmdisk|[zZ]*)
819 if [ -n "$ANYSWAP" ] ; then
820 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
821 swapon $p 2>>$DEBUG ; eend $?
823 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
827 if [[ "$p" == LABEL* ]] ; then
828 p=$(blkid -t $p | awk -F: '{print $1}')
830 if grep -q $p /proc/swaps ; then
831 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
833 if [ -b "$p" ] ; then
834 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
835 swapon $p 2>>$DEBUG ; eend $?
837 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
846 esac # it's a swap partition?
851 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
852 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
854 # *) NONEFOUND='1'; continue ;;
858 if [ -z "$NOSWAP" ] ; then
859 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
860 # Activate swapfile, if exists
861 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
863 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
864 mount -o remount,rw $m && MOUNTED=1
865 if swapon "$SWAPFILE" 2>>$DEBUG ; then
867 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
869 fnew="$SWAPFILE swap swap defaults 0 0"
870 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
871 GRML_SWP="$GRML_SWP $SWAPFILE"
874 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
877 # use a image as home
878 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
879 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
880 if [ -n "$HOMEDIR" ]; then
881 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
885 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
887 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
892 # Umount, if not in use
893 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
905 if checkbootparam 'nocpu'; then
906 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
910 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
912 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)
913 echo $CPU | sed 's/ \{1,\}/ /g'
916 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
921 # {{{ autostart of ssh
923 if checkbootparam 'ssh' ; then
925 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
928 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
929 [ -z "$localuser" ] && eend 1
932 if [ -z "$PASSWD" ] ; then
933 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
937 if [ -n "$PASSWD" ] ; then
939 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
943 echo "$localuser:$PASSWD" | chpasswd $chpass_options
944 echo "root:$PASSWD" | chpasswd $chpass_options
947 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
951 einfo "Starting secure shell server in background for root and user $localuser"
952 service_wrapper haveged start >>$DEBUG 2>>$DEBUG
953 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
954 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
962 # {{{ display hostkeys of SSH server
963 config_display_ssh_fingerprints() {
964 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
965 return 0 # no SSH host keys present
968 einfo "SSH key fingerprints:"
969 for file in /etc/ssh/ssh_host_*_key ; do
971 ssh-keygen -l -f $file
977 # {{{ autostart of x11vnc
979 if checkbootparam 'vnc' ; then
982 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
983 einfo "Bootoption vnc found, trying to set password for user $localuser."
985 if [ -z "$VNC_PASSWD" ] ; then
986 if [ -x /usr/bin/apg ] ; then
987 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
988 elif [ -x /usr/bin/gpw ] ; then
989 VNC_PASSWD="$(gpw 1)"
990 elif [ -x /usr/bin/pwgen ] ; then
991 VNC_PASSWD="$(pwgen -1 8)"
992 elif [ -x /usr/bin/hexdump ] ; then
993 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
994 elif [ -n "$RANDOM" ] ; then
995 VNC_PASSWD="${localuser}${RANDOM}"
998 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1002 if [ -n "$VNC_PASSWD" ] ; then
1003 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1008 # finally check if we have a password we can use:
1009 if [ -n "$VNC_PASSWD" ] ; then
1011 VNCDIR="/home/${localuser}/.vnc"
1012 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1014 if [ ! -x /usr/bin/x11vnc ] ; then
1015 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1018 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1019 /bin/chown -R "$localuser": "$VNCDIR"
1022 if checkbootparam 'vnc_connect' ; then
1024 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1025 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1026 #store the options in a file
1027 VNCDIR="/home/${localuser}/.vnc"
1028 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1029 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1035 # {{{ set password for root and default user
1037 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1039 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1042 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1043 [ -z "$localuser" ] && eend 1
1046 if [ -z "$PASSWD" ] ; then
1047 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1051 if [ -n "$PASSWD" ] ; then
1053 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1057 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1058 echo "root:$PASSWD" | chpasswd $chpass_options
1061 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1067 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1069 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1071 if [ -z "$PASSWD" ] ; then
1072 eerror "No hashed password found, can not set password."
1078 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1079 [ -z "$localuser" ] && eend 1
1081 if [ -n "$PASSWD" ] ; then
1084 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1085 echo "root:$PASSWD" | chpasswd $chpass_options
1088 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1098 if ! [ -x /usr/bin/amixer ] ; then
1099 logger -t grml-autoconfig "amixer binary not available"
1103 if ! [ -r /proc/asound/cards ] ; then
1104 ewarn "No soundcard present, skipping mixer settings therefore."
1109 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1110 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1113 if checkbootparam 'vol' ; then
1114 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1115 if [ -z "$VOL" ] ; then
1116 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1124 if checkbootparam 'nosound' ; then
1125 einfo "Muting sound devices on request."
1126 ERROR=$(amixer -q set Master mute)
1128 if [ -n "$ERROR" ] ; then
1130 eerror "Problem muting sound devices: $ERROR"
1134 elif [ -z "$INSTALLED" ] ; then
1135 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1137 if checkbootparam 'micvol' ; then
1138 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1139 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1144 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1147 for CONTROL in ${=CONTROLS} ; do
1148 # such devices can not be controlled with amixer ... unmute
1149 [[ "$CONTROL" == *Console* ]] && continue
1151 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1152 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1153 amixer -c $card -q set "${CONTROL}" unmute
1155 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1156 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1160 if [ ${MICVOL} -ne 0 ] ; then
1161 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1162 amixer -c $card -q set "${CONTROL}" unmute
1164 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1165 amixer -c $card -q set "${CONTROL}" $MICVOL%
1171 fi # checkbootparam 'nosound'
1177 # {{{ syslog service
1179 if checkbootparam 'nosyslog'; then
1180 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1182 einfo "Starting rsyslog in background."
1183 service_wrapper rsyslog start >>$DEBUG
1191 if checkbootparam 'nogpm'; then
1192 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1194 if ! [ -r /dev/input/mice ] ; then
1195 eerror "No mouse found - not starting GPM." ; eend 1
1197 einfo "Starting gpm in background."
1198 service_wrapper gpm start background >>$DEBUG
1207 if checkbootparam 'services' ; then
1208 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1209 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1210 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1211 for service in $(echo -e $SERVICELIST) ; do
1212 # support running (custom) init scripts in non-blocking mode
1213 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1214 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1215 einfo "Starting service ${service}."
1216 service_wrapper "${service}" start >>$DEBUG
1218 einfo "Starting service ${service} in background."
1219 service_wrapper "${service}" start background >>$DEBUG
1229 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1230 SOURCE=$(eval echo "$1")
1233 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1234 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1236 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1238 if checkbootparam 'getfile.retries' ; then
1239 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1244 while ! getconfig && [[ "$counter" != 0 ]] ; do
1245 echo -n "Sleeping for 1 second and trying to get config again... "
1246 counter=$(( counter-1 ))
1247 echo "$counter tries left" ; sleep 1
1249 if [ -s "$TARGET" ] ; then
1250 einfo "Downloading was successfull." ; eend 0
1251 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1252 md5sum ${TARGET} ; eend 0
1255 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1263 if checkbootparam 'netconfig' ; then
1264 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1265 CONFIGFILE='/tmp/netconfig.grml'
1267 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1268 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1275 # {{{ remote scripts
1276 config_netscript() {
1277 if checkbootparam 'netscript' ; then
1278 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1279 SCRIPTFILE='/tmp/netscript.grml'
1281 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1282 chmod +x ${SCRIPTFILE}
1283 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1290 # {{{ start X window system via grml-x
1294 # make sure we start X only if startx is used *before* a nostartx option
1295 # so it's possible to disable automatic X startup using nostart
1296 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1297 if [ -x "$(which X)" ] ; then
1298 if [ -z "$INSTALLED" ] ; then
1299 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1300 if [ -z "$WINDOWMANAGER" ] ; then
1301 einfo "No window manager specified. Using default one." && eend 0
1303 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1305 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1308 if [ -n "$WINDOWMANAGER" ] ; then
1309 mkdir -p /var/run/grml-x/
1310 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1315 cat>|/etc/init.d/startx<<EOF
1317 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1319 chmod 755 /etc/init.d/startx
1321 # adjust inittab for startx
1322 if grep -q '^6:' /etc/inittab ; then
1323 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
1324 else # just append tty6 to inittab if no definition is present:
1325 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
1328 /sbin/telinit q ; eend $?
1330 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1331 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1333 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1337 eerror "We are not running in live mode - startx will not work, skipping it."
1338 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1341 eerror "/usr/bin/X is not present on this grml flavour."
1342 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1348 # {{{ configuration framework
1350 if checkbootparam 'extract' ; then
1351 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1352 EXTRACTOPTIONS="-- -x $EXTRACT"
1356 config_finddcsdir() {
1357 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1358 # on the command line, nothing is changed and the dcs files are
1359 # searched within the .iso, $dcs-dir is set to the root directory
1361 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1362 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1363 # set, $dcs-dir is set to the root directory within the .iso.
1364 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1365 # foo, even if a GRMLCFG partition is present.
1368 # autoconfig, see issue673
1369 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1370 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1371 if checkbootparam 'noautoconfig' ; then
1372 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1373 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1375 if [ -z "$INSTALLED" ] ; then
1376 if checkbootparam 'myconfig' ; then
1377 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1378 if [ -z "$DCSDEVICE" ]; then
1379 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1380 fi # [ -z "$DCSDEVICE" ]
1381 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1382 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1384 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1386 modprobe 9p 2>/dev/null || true
1387 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1388 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1389 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1390 DCSDEVICE="$GRMLCFG"
1391 MOUNTOPTIONS="ro,trans=virtio"
1396 if [ -n "$DCSDEVICE" ]; then
1397 DCSMP="/mnt/grmlcfg"
1402 # if not specified/present then assume default:
1403 if [ -z "$DCSDEVICE" ]; then
1404 DCSDIR="${LIVECD_PATH}"
1407 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1408 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1409 if [ -n "$DCSDIR" ]; then
1410 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1412 [ -d $DCSMP ] || mkdir $DCSMP
1413 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1414 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1415 if [[ $RC == 0 ]]; then
1416 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1418 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1427 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1428 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1429 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1430 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1436 if checkbootparam 'partconf' ; then
1437 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1438 if [ -n "$MOUNTDEVICE" ]; then
1439 [ -d /mnt/grml ] || mkdir /mnt/grml
1440 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1441 if [[ $RC == 0 ]]; then
1442 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1443 einfo "Copying files from $MOUNTDEVICE over grml system."
1444 for file in `cat /etc/grml/partconf` ; do
1445 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1446 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1449 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1450 fi # mount $MOUNTDEVICE
1451 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1453 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1454 fi # [ -n "$MOUNTDEVICE" ]
1459 # {{{ /cdrom/.*-options
1461 if checkbootparam 'debs' ; then
1462 iszsh && setopt localoptions shwordsplit
1463 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1464 if [ -z "$DEBS" ] ; then
1467 if ! echo $DEBS | grep -q '/'; then
1468 # backwards compatibility: if no path is given get debs from debs/
1471 einfo "Trying to install Debian package(s) ${DEBS}"
1472 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1473 dpkg -i $DEBS ; eend $?
1478 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1479 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1480 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1481 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1483 if ! echo $SCRIPTS | grep -q '/'; then
1484 # backwards compatibility: if no path is given get scripts from scripts/
1485 SCRIPTS="scripts/$SCRIPTS"
1487 if [ -n "$SCRIPTS" ]; then
1488 SCRIPTS="${DCSDIR}/$SCRIPTS"
1489 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1490 einfo "Trying to execute ${SCRIPTS}"
1493 elif [ -d "$SCRIPTS" ]; then
1494 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1495 run-parts --regex '.*' $SCRIPTS
1498 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1507 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1508 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1509 if [ -z "$CONFIG" ]; then
1510 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1512 if [ -n "$CONFIG" ]; then
1513 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1514 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1516 cp -a ${DCSDIR}/${CONFIG}/* /
1517 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1518 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1521 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1523 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1530 # {{{ confing_umount_dcsdir
1531 config_umount_dcsdir(){
1532 # umount $DCSMP if it was mounted by finddcsdir
1533 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1539 if checkbootparam 'mypath' ; then
1540 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1541 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1542 touch /etc/grml/my_path
1543 chmod 644 /etc/grml/my_path
1544 # make sure the directories exist:
1546 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1547 if ! [ -d "$i" ] ; then
1548 einfo "Creating directory $i"
1549 mkdir -p "$i" ; eend $?
1552 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1560 [ -n "$INSTALLED" ] && return 0
1562 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1563 checkbootparam 'raid=noautodetect' ; then
1564 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1566 [ -e /proc/mdstat ] || modprobe md_mod
1567 if ! [ -x /sbin/mdadm ] ; then
1568 eerror "mdadm not available, can not execute it." ; eend 1
1571 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1572 # find out whether we have a valid configuration file already
1573 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1574 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1575 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1576 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1578 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1581 if ! checkbootparam 'swraid' ; then
1584 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1586 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1590 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1594 for line in $(mdadm --assemble --scan 2>&1) ; do
1596 *'No arrays found'*)
1597 ewarn "$line" ; eend 0
1600 einfo "$line" ; eend 0
1607 if [ -r /proc/mdstat ] ; then
1609 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1610 if [ -z "$MDSTAT" ] ; then
1611 ewarn "No active arrays found" ; eend 0
1615 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1616 einfo "active arrays: $line" ; eend 0
1622 fi # bootoption swraid
1624 fi # is /sbin/mdadm executable?
1625 fi # check for bootoptions
1631 [ -n "$INSTALLED" ] && return 0
1633 if checkbootparam 'nodmraid' ; then
1634 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1638 if ! [ -x /sbin/dmraid ] ; then
1639 eerror "dmraid not available, can not execute it." ; eend 1
1644 # usage: dmraid_wrapper <dmraid_option>
1645 [ -n "$1" ] || return 1
1651 for line in $(dmraid $1 ; echo errcode:$?); do
1653 *'no block devices found'*)
1654 einfo "No block devices found" ; eend 0
1658 einfo "No active dmraid devices found" ; eend 0
1677 if checkbootparam 'dmraid' ; then
1678 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1679 if [ "$ACTION" = "off" ] ; then
1680 # Deactivates all active software RAID sets:
1681 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1684 # Activate all software RAID sets discovered:
1685 einfo "Activating present dmraid sets (as requested via dmraid):"
1692 # by default (no special bootoptions) discover all software RAID devices:
1693 einfo "Searching for any present dmraid sets:"
1698 # {{{ LVM (Logical Volumes)
1700 [ -n "$INSTALLED" ] && return 0
1702 if checkbootparam 'nolvm' ; then
1703 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1705 if ! [ -x /sbin/lvm ] ; then
1706 eerror "LVM not available, can not execute it." ; eend 1
1708 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1709 einfo "You seem to have logical volumes (LVM) on your system."
1712 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1714 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1717 if checkbootparam 'lvm' ; then
1718 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1720 service_wrapper lvm2-lvmetad start
1724 service_wrapper lvm2 start ; eend $?
1729 fi # check for lvm binary
1730 fi # check for bootoption nolvm
1734 # {{{ debnet: setup network based on an existing one found on a partition
1736 if checkbootparam 'debnet' ; then
1737 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1743 # {{{ disable console blanking
1745 if checkbootparam 'noblank' ; then
1746 einfo "Bootoption noblank found. Disabling monitor blanking."
1747 setterm -blank 0 ; eend $?
1752 # {{{ debootstrap: automatic installation
1753 config_debootstrap(){
1755 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1757 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1759 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1761 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1766 if checkbootparam 'target' ; then
1768 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1769 # notice: the following checks whether the given partition is available, if not the skip
1770 # execution of grml-debootstrap as it might result in data loss...
1771 if ! [ -r "$TARGET" ] ; then
1772 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1776 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1781 if checkbootparam 'grub' ; then
1783 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1786 if checkbootparam 'groot' ; then
1788 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1791 if checkbootparam 'release' ; then
1793 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1796 if checkbootparam 'mirror' ; then
1798 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1801 if checkbootparam 'boot_append' ; then
1803 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1806 if checkbootparam 'password' ; then
1808 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1811 # now check which options are available
1812 if [ -n "TARGET" ] ; then
1813 TARGETCMD="--target $TARGET"
1817 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1821 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1822 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1823 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1824 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1825 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1826 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1828 # and finally write script and execute it
1829 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1831 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1834 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1836 screen /usr/bin/grml-debootstrap_noninteractive
1837 einfo "Invoking a shell, just exit to continue booting..."
1840 fi # checkbootparam "BOOT_IMAGE=debian2hd
1844 # {{{ virtualbox shared folders
1845 config_virtualbox_shared_folders() {
1846 if $VIRTUALBOX ; then
1847 einfo "VirtualBox detected, trying to set up Shared Folders."
1848 if ! modinfo vboxsf &>/dev/null ; then
1849 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1851 elif ! [ -x /usr/sbin/VBoxService ] ; then
1852 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1857 einfo "Loading vboxsf driver."
1858 lsmod | grep -q vboxsf || modprobe vboxsf
1861 einfo "Adjusting /dev/vboxguest."
1862 chown root:vboxsf /dev/vboxguest
1863 chmod 660 /dev/vboxguest
1868 einfo "Adding $fstabuser to group vboxsf."
1869 adduser grml vboxsf &>/dev/null
1872 einfo "Starting VBoxService."
1873 VBoxService >/dev/null
1876 local vbautomation='automation'
1877 if checkbootparam 'vbautomation'; then
1878 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1881 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1882 ewarn "No automount shared folder '$vbautomation' available"
1885 einfo "Found automount shared folder '$vbautomation'"
1888 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1889 [ -n "$distri" ] || distri='grml'
1891 local vbox_auto_sf="/media/sf_${vbautomation}"
1893 sleep 1 # ugly but necessary
1897 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1898 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1900 counter=$(( counter-1 ))
1905 if ! [ -d "${vbox_auto_sf}" ] ; then
1906 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1909 einfo "Found shared folders automation directory $vbox_auto_sf"
1913 if checkbootparam 'novbautomation' ; then
1914 einfo "Bootoption novbautomation found. Disabling automation script execution."
1917 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1918 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1921 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1922 "${vbox_auto_sf}/${distri}"
1936 # {{{ Support customization
1938 if checkbootparam 'distri'; then
1939 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1940 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1941 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1942 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1943 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1949 ## END OF FILE #################################################################
1950 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2