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>" >&2
42 systemctl "$action" "$service"
44 /etc/init.d/"$service" "$action"
50 if [ -n "$ZSH_VERSION" ] ; then
56 # avoid 'no matches found: ...'
57 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
60 # {{{ Read in boot parameters
61 if [ -z "$CMDLINE" ]; then
62 # if CMDLINE was set from the outside, we're debugging.
63 # otherwise, take CMDLINE from Kernel and config files.
64 CMDLINE="$(cat /proc/cmdline)"
65 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
66 modprobe 9p 2>/dev/null || true
67 if grep -q 9p /proc/filesystems ; then
69 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
70 MOUNTDIR="$(mktemp -d)"
71 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
72 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
80 ### {{{ Utility Functions
82 # Get a bootoption's parameter: read boot command line and either
83 # echo last parameter's argument or return false.
91 result="${line##*[$ws]$1=}"
92 result="${result%%[$ws]*}"
100 # Check boot commandline for specified option
102 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
108 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
115 # Check if currently using a framebuffer
117 [ -e /dev/fb0 ] && return 0 || return 1
120 # Check wheter a configuration variable (like $CONFIG_TOHD) is
124 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
125 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
126 *) return 1 ;; # default
130 # Are we using grml-small?
132 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
135 # if no password is set return a random password
137 [ -n "$PASSWD" ] && return 0
139 if [ -x /usr/bin/apg ] ; then
140 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
141 elif [ -x /usr/bin/gpw ] ; then
143 elif [ -x /usr/bin/pwgen ] ; then
144 PASSWD="$(pwgen -1 8)"
145 elif [ -x /usr/bin/hexdump ] ; then
146 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
147 elif [ -n "$RANDOM" ] ; then
148 PASSWD="grml${RANDOM}"
151 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
159 # {{{ filesystems (proc, pts, sys) and fixes
161 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
165 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
169 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
173 # {{{ Check if we are running in live mode or from HD
175 [ -e /etc/grml_cd ] || INSTALLED="yes"
178 # {{{ provide information about virtual environments
179 VIRTUAL=false # assume physical system by default
184 if vmware-detect &>/dev/null; then
185 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
186 elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
187 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
188 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
189 elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
190 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
191 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
195 # {{{ source lsb-functions , color handling
196 if checkbootparam 'nocolor'; then
197 . /etc/grml/lsb-functions
198 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
200 . /etc/grml/lsb-functions
206 checkbootparam 'debug' && BOOTDEBUG="yes"
207 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
210 if [ -n "$BOOTDEBUG" ]; then
211 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
212 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
213 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
214 einfo "Just exit the shell to continue boot process..."
218 if [ -r /etc/grml/screenrc ] ; then
219 einfo "Starting GNU screen to be able to use a full featured shell environment."
220 einfo "Just exit the shells (and therefore screen) to continue boot process..."
221 /bin/zsh -c "screen -c /etc/grml/screenrc"
223 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
224 einfo "Just exit the shell to continue boot process..."
236 if checkbootparam 'log' || checkbootparam 'debug' ; then
237 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
239 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
241 einfo "Starting bootlogd." # known to be *very* unreliable :(
242 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
250 ### {{{ language configuration / localization
253 einfo "Activating language settings:"
256 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
257 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
259 # check for bootoption which overrides config from /etc/grml/autoconfig
260 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
261 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
263 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
264 if [ -z "$INSTALLED" ] ; then
265 [ -n "$LANGUAGE" ] || LANGUAGE='en'
268 if [ -x /usr/sbin/grml-setlang ] ; then
269 # if bootoption lang is used update /etc/default/locale accordingly
270 if [ -n "$BOOT_LANGUAGE" ] ; then
271 /usr/sbin/grml-setlang "$LANGUAGE"
272 # otherwise default to lang=en
274 /usr/sbin/grml-setlang "en"
279 if [ -z "$CONSOLEFONT" ] ; then
280 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
281 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
282 CONSOLEFONT='Uni3-Terminus16'
284 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
287 CONSOLEFONT='Lat15-Terminus16'
292 # export it now, so error messages get translated, too
293 [ -r /etc/default/locale ] && . /etc/default/locale
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
342 # activate unicode console if running within utf8 environment
343 if [ -r /etc/default/locale ] ; then
344 if grep -q "LANG=.*UTF" /etc/default/locale ; then
345 einfo "Setting up unicode environment."
346 unicode_start >>$DEBUG 2>&1 ; eend $?
350 # Set default keyboard before interactive setup
351 if [ -n "$KEYTABLE" ] ; then
352 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
353 loadkeys -q $KEYTABLE &
357 # we have to set up all consoles, therefore loop it over all ttys:
358 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
359 if [ -n "$NUM_CONSOLES" ] ; then
360 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
361 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
363 CUR_CONSOLE=$(fgconsole 2>/dev/null)
365 if [ -x "$(which setfont)" ] ; then
367 elif [ -x "$(which consolechars)" ] ; then
368 use_consolechars=true
370 eerror "Neither setfont nor consolechars tool present, can not set font."
375 if [ -n "$CHARMAP" ] ; then
376 einfo "Setting font to ${CHARMAP}"
378 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
379 if $use_setfont ; then
380 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
381 elif $use_consolechars ; then
382 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
385 if [ -n "$CUR_CONSOLE" ] ; then
386 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
391 if checkbootparam 'noconsolefont' ; then
392 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
394 if [ -n "$CONSOLEFONT" ] ; then
395 einfo "Setting font to ${CONSOLEFONT}"
397 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
398 if $use_setfont ; then
399 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
400 elif $use_consolechars ; then
401 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
404 if [ -n "$CUR_CONSOLE" ] ; then
405 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
417 if ! checkbootparam 'hostname' ; then
421 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
422 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
423 einfo "Generating random hostname as no hostname was specified."
424 HOSTNAME="$(/usr/bin/random-hostname)"
428 einfo "Setting hostname to $HOSTNAME as requested."
429 grml-hostname $HOSTNAME >>$DEBUG
434 # fstabuser (needed when running from harddisk with username != grml {{{
436 # force load of build-in and local config
437 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
438 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
440 # 1st. try configured fstab user
441 if [ -n "$CONFIG_FSTAB_USER" ] ; then
442 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
445 # 2nd. use standard user id
446 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
448 # 3rd. use standard user name
449 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
451 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
452 [ -n "$fstabuser" ] || fstabuser='root'
456 # local_user (needed when running with username != grml {{{
459 # force load of build-in and local config
460 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
461 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
463 # 1st. try id of primary user
464 localuser=$(getent passwd 1000 | cut -d: -f1)
466 # 2nd. use name standard user
467 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
471 # {{{ Set clock (Local time is more often used than GMT, so it is default)
473 # don't touch the files if running from harddisk:
474 if [ -z "$INSTALLED" ]; then
475 # The default hardware clock timezone is stated as representing local time.
478 if [ -f /etc/default/rcS ] ; then
479 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
480 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
481 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
482 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
483 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
484 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
485 elif [ -f /etc/adjtime ] ; then
486 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
487 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
488 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
489 grep -q "^UTC$" /etc/adjtime && UTC="-u"
492 # hwclock uses the TZ variable
493 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
494 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
495 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
496 ewarn "Warning: unknown timezone $KTZ" ; eend 1
498 ewarn "Falling back to timezone $KTZ" ; eend 0
501 if ! [ -r /dev/rtc ] ; then
502 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
505 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
506 if [ -n "$ERROR" ] ; then
508 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
509 if [ -n "$ERROR" ] ; then
510 eerror "Problem running hwclock: $ERROR" ; eend 1
519 # {{{ print kernel info
521 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
522 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
524 einfo "Running Linux Kernel $KERNEL" ; eend 0
527 if [ -r /proc/cpuinfo ] ; then
528 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
530 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
535 if [ -d /proc/xen ] ; then
537 einfo 'Running kernel featuring support for Xen detected' ; eend 0
545 if [ -x /usr/bin/mokutil ] ; then
546 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
547 if [ -n "$secstate" ] ; then
548 einfo "SecureBoot is enabled" ; eend 0
550 einfo "SecureBoot not detected" ; eend 0
553 if modprobe efivars &>/dev/null ; then
554 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
555 einfo "SecureBoot is enabled" ; eend 0
557 einfo "SecureBoot not detected" ; eend 0
566 # don't touch the files if running from harddisk:
567 if [ -z "$INSTALLED" ]; then
568 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
569 if [ -n "$KTZ" ] ; then
570 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
572 ewarn "Warning: unknown timezone $KTZ"; eend 0
574 einfo "Setting timezone."
576 area=$(echo $KTZ | cut -d '/' -f1)
577 zone=$(echo $KTZ | cut -d '/' -f2)
578 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
579 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
581 echo $KTZ > /etc/timezone
583 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
590 # activate serial console {{{
592 if checkbootparam 'console'; then
593 # this hack is no longer necessary with systemd
602 einfo "Bootoption for serial console detected:"
606 line="${line#*[$ws]}"
608 while [ -n "$line" ]; do
612 local device="${this%%,*}"
613 local device="${device##*=}"
614 if echo $serial | grep -q ttyS ; then
615 local option="${serial##*,}"
616 # default (works for kvm & CO):
617 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
618 # ... unless overriden by command line:
620 115200*) speed=115200 ;;
621 57600*) speed=57600 ;;
622 38400*) speed=38400 ;;
623 19200*) speed=19200 ;;
630 einfo "Activating console login on device ${device} with speed ${speed}."
631 local number="${device#ttyS}"
632 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
639 this="${line%%[$ws]*}"
640 line="${line#*[$ws]}"
643 if [ -n "$telinitq" ]; then
653 if checkbootparam 'testcd' ; then
654 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
658 local FOUND_FILE=false
659 local logfile='/tmp/md5sum.log'
663 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
664 einfo "Checking files against $md5, this may take a while..."
669 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
670 if [ $pipestatus[1] -eq 0 ] ; then
676 if ! $FOUND_FILE ; then
677 eerror 'Error: Could not find md5sum file' ; eend 1
682 einfo "Everything looks OK" ; eend 0
684 eerror 'Checksum failed for theses files:' ; eend 1
685 egrep -v '(^md5sum:|OK$)' "${logfile}"
686 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
687 einfon "Hit return to continue, or press the power button to shut down system."
696 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
698 if checkbootparam 'blacklist' ; then
699 if [ -z "$INSTALLED" ]; then
700 einfo "Bootoption blacklist found."
701 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
702 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
703 if [ -n "$BLACK" ] ; then
704 for module in $(echo ${BLACK//,/ }) ; do
705 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
706 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
707 echo "blacklist $module" >> "$BLACKLIST_FILE"
708 echo "alias $module off" >> "$BLACKLIST_FILE"
709 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
712 eerror "No given module for blacklist found. Blacklisting will not work therefore."
715 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
717 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
727 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
731 if checkbootparam 'noacpi'; then
732 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
733 elif checkbootparam 'nogrmlacpi' ; then
734 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
735 elif [ ! -d /proc/acpi ] ; then
736 ewarn "ACPI: Kernel support not present." ; eend 0
738 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
741 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
743 basename="${basename%%.*}"
744 case "$basename" in *_acpi)
745 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
747 modprobe $basename >>$DEBUG 2>&1 && found="yes"
748 local BASE="$BASE $basename"
750 if [ -n "$found" ] ; then
751 einfo "$BASE" ; eend 0
753 ewarn "(none)" ; eend 1
755 if ! pgrep acpid >/dev/null ; then
756 einfo "Starting acpi daemon."
757 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
758 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
760 ewarn "acpi daemon already running."
770 if checkbootparam 'brltty' ; then
771 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
776 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
779 NOSWAP="yes" # we do not use swap by default!
780 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
782 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
785 # Scan for swap, config, homedir - but only in live-mode
786 if [ -z "$INSTALLED" ] ; then
787 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
790 HOMEDIR="$(getbootparam 'home')"
791 if [ -n "$partitions" ]; then
792 while read p m f relax; do
793 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
794 partoptions="users,exec"
796 # it's a swap partition?
799 if [ -n "$NOSWAP" ]; then
800 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
803 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
804 S1SUSP|S2SUSP|pmdisk|[zZ]*)
805 if [ -n "$ANYSWAP" ] ; then
806 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
807 swapon $p 2>>$DEBUG ; eend $?
809 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
813 if [[ "$p" == LABEL* ]] ; then
814 p=$(blkid -t $p | awk -F: '{print $1}')
816 if grep -q $p /proc/swaps ; then
817 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
819 if [ -b "$p" ] ; then
820 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
821 swapon $p 2>>$DEBUG ; eend $?
823 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
832 esac # it's a swap partition?
837 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
838 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
840 # *) NONEFOUND='1'; continue ;;
844 if [ -z "$NOSWAP" ] ; then
845 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
846 # Activate swapfile, if exists
847 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
849 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
850 mount -o remount,rw $m && MOUNTED=1
851 if swapon "$SWAPFILE" 2>>$DEBUG ; then
853 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
855 fnew="$SWAPFILE swap swap defaults 0 0"
856 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
857 GRML_SWP="$GRML_SWP $SWAPFILE"
860 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
863 # use a image as home
864 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
865 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
866 if [ -n "$HOMEDIR" ]; then
867 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
871 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
873 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
878 # Umount, if not in use
879 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
891 if checkbootparam 'nocpu'; then
892 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
896 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
898 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)
899 echo $CPU | sed 's/ \{1,\}/ /g'
902 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
905 # no cpufreq setup inside VirtualBox
906 if $VIRTUALBOX ; then
907 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
911 if ! [ -x /etc/init.d/loadcpufreq ] ; then
912 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
916 einfo "Trying to set up cpu frequency scaling:"
919 LOADCPUFREQ=$(mktemp)
920 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
921 if grep -q FATAL "$LOADCPUFREQ" ; then
927 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
928 eerror "$line" ; eend $RC
932 elif grep -q done "$LOADCPUFREQ" ; then
933 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
934 if [ -n "$MODULE" -a "$MODULE" != none ]; then
935 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
938 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
944 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
945 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
946 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
947 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
949 einfo "Setting ondemand governor"
951 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
952 echo ondemand > $file || RC=1
964 # {{{ autostart of ssh
966 if checkbootparam 'ssh' ; then
968 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
971 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
972 [ -z "$localuser" ] && eend 1
975 if [ -z "$PASSWD" ] ; then
976 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
980 if [ -n "$PASSWD" ] ; then
982 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
986 echo "$localuser:$PASSWD" | chpasswd $chpass_options
987 echo "root:$PASSWD" | chpasswd $chpass_options
990 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
994 einfo "Starting secure shell server in background for root and user $localuser"
995 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
996 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
1004 # {{{ display hostkeys of SSH server
1005 config_display_ssh_fingerprints() {
1006 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
1007 return 0 # no SSH host keys present
1010 einfo "SSH key fingerprints:"
1011 for file in /etc/ssh/ssh_host_*_key ; do
1013 ssh-keygen -l -f $file
1019 # {{{ autostart of x11vnc
1021 if checkbootparam 'vnc' ; then
1024 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1025 einfo "Bootoption vnc found, trying to set password for user $localuser."
1027 if [ -z "$VNC_PASSWD" ] ; then
1028 if [ -x /usr/bin/apg ] ; then
1029 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1030 elif [ -x /usr/bin/gpw ] ; then
1031 VNC_PASSWD="$(gpw 1)"
1032 elif [ -x /usr/bin/pwgen ] ; then
1033 VNC_PASSWD="$(pwgen -1 8)"
1034 elif [ -x /usr/bin/hexdump ] ; then
1035 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1036 elif [ -n "$RANDOM" ] ; then
1037 VNC_PASSWD="${localuser}${RANDOM}"
1040 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1044 if [ -n "$VNC_PASSWD" ] ; then
1045 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1050 # finally check if we have a password we can use:
1051 if [ -n "$VNC_PASSWD" ] ; then
1053 VNCDIR="/home/${localuser}/.vnc"
1054 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1056 if [ ! -x /usr/bin/x11vnc ] ; then
1057 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1060 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1061 /bin/chown -R "$localuser": "$VNCDIR"
1064 if checkbootparam 'vnc_connect' ; then
1066 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1067 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1068 #store the options in a file
1069 VNCDIR="/home/${localuser}/.vnc"
1070 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1071 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1077 # {{{ set password for root and default user
1079 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1081 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1084 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1085 [ -z "$localuser" ] && eend 1
1088 if [ -z "$PASSWD" ] ; then
1089 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1093 if [ -n "$PASSWD" ] ; then
1095 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1099 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1100 echo "root:$PASSWD" | chpasswd $chpass_options
1103 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1109 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1111 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1113 if [ -z "$PASSWD" ] ; then
1114 eerror "No hashed password found, can not set password."
1120 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1121 [ -z "$localuser" ] && eend 1
1123 if [ -n "$PASSWD" ] ; then
1126 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1127 echo "root:$PASSWD" | chpasswd $chpass_options
1130 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1140 if ! [ -x /usr/bin/amixer ] ; then
1141 logger -t grml-autoconfig "amixer binary not available"
1145 if ! [ -r /proc/asound/cards ] ; then
1146 ewarn "No soundcard present, skipping mixer settings therefore."
1151 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1152 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1155 if checkbootparam 'vol' ; then
1156 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1157 if [ -z "$VOL" ] ; then
1158 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1166 if checkbootparam 'nosound' ; then
1167 einfo "Muting sound devices on request."
1168 ERROR=$(amixer -q set Master mute)
1170 if [ -n "$ERROR" ] ; then
1172 eerror "Problem muting sound devices: $ERROR"
1176 elif [ -z "$INSTALLED" ] ; then
1177 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1179 if checkbootparam 'micvol' ; then
1180 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1181 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1186 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1190 for CONTROL in ${=CONTROLS} ; do
1191 # such devices can not be controlled with amixer ... unmute
1192 [[ "$CONTROL" == *Console* ]] && continue
1194 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1195 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1196 amixer -c $card -q set "${CONTROL}" unmute
1198 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1199 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1203 if [ ${MICVOL} -ne 0 ] ; then
1204 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1205 amixer -c $card -q set "${CONTROL}" unmute
1207 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1208 amixer -c $card -q set "${CONTROL}" $MICVOL%
1214 fi # checkbootparam 'nosound'
1220 # {{{ syslog service
1222 if checkbootparam 'nosyslog'; then
1223 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1225 einfo "Starting rsyslog in background."
1226 service_wrapper rsyslog start >>$DEBUG &
1234 if checkbootparam 'nogpm'; then
1235 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1237 if ! [ -r /dev/input/mice ] ; then
1238 eerror "No mouse found - not starting GPM." ; eend 1
1240 einfo "Starting gpm in background."
1241 service_wrapper gpm start >>$DEBUG &
1242 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1251 if checkbootparam 'services' ; then
1252 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1253 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1254 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1255 for service in $(echo -e $SERVICELIST) ; do
1256 # support running (custom) init scripts in non-blocking mode
1257 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1258 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1259 einfo "Starting service ${service}."
1260 service_wrapper "${service}" start >>$DEBUG
1262 einfo "Starting service ${service} in background."
1263 service_wrapper "${service}" start >>$DEBUG &
1273 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1274 SOURCE=$(eval echo "$1")
1277 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1278 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1280 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1282 if checkbootparam 'getfile.retries' ; then
1283 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1288 while ! getconfig && [[ "$counter" != 0 ]] ; do
1289 echo -n "Sleeping for 1 second and trying to get config again... "
1290 counter=$(( counter-1 ))
1291 echo "$counter tries left" ; sleep 1
1293 if [ -s "$TARGET" ] ; then
1294 einfo "Downloading was successfull." ; eend 0
1295 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1296 md5sum ${TARGET} ; eend 0
1299 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1307 if checkbootparam 'netconfig' ; then
1308 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1309 CONFIGFILE='/tmp/netconfig.grml'
1311 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1312 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1319 # {{{ remote scripts
1320 config_netscript() {
1321 if checkbootparam 'netscript' ; then
1322 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1323 SCRIPTFILE='/tmp/netscript.grml'
1325 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1326 chmod +x ${SCRIPTFILE}
1327 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1336 if ! checkbootparam 'nostats' ; then
1337 BASE_URL="http://stats.grml.org/report/"
1340 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1342 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1343 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1344 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1345 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1347 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1349 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1350 [ -z "$BOOT" ] && BOOT="local"
1352 ADDITIONAL_PARAMS=""
1353 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1354 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1356 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1358 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1363 # {{{ start X window system via grml-x
1367 # make sure we start X only if startx is used *before* a nostartx option
1368 # so it's possible to disable automatic X startup using nostart
1369 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1370 if [ -x "$(which X)" ] ; then
1371 if [ -z "$INSTALLED" ] ; then
1372 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1373 if [ -z "$WINDOWMANAGER" ] ; then
1374 einfo "No window manager specified. Using default one." && eend 0
1376 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1378 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1381 cat>|/etc/init.d/startx<<EOF
1385 sudo -u "${localuser}" /usr/bin/grml-x ${WINDOWMANAGER}
1387 chmod 755 /etc/init.d/startx
1391 cat>|/etc/init.d/startx<<EOF
1393 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1395 chmod 755 /etc/init.d/startx
1397 # adjust inittab for startx
1398 if grep -q '^6:' /etc/inittab ; then
1399 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
1400 else # just append tty6 to inittab if no definition is present:
1401 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
1404 /sbin/telinit q ; eend $?
1406 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1407 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1409 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1413 eerror "We are not running in live mode - startx will not work, skipping it."
1414 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1417 eerror "/usr/bin/X is not present on this grml flavour."
1418 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1424 # {{{ configuration framework
1426 if checkbootparam 'extract' ; then
1427 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1428 EXTRACTOPTIONS="-- -x $EXTRACT"
1432 config_finddcsdir() {
1433 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1434 # on the command line, nothing is changed and the dcs files are
1435 # searched within the .iso, $dcs-dir is set to the root directory
1437 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1438 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1439 # set, $dcs-dir is set to the root directory within the .iso.
1440 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1441 # foo, even if a GRMLCFG partition is present.
1444 # autoconfig, see issue673
1445 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1446 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1447 if checkbootparam 'noautoconfig' ; then
1448 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1449 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1451 if [ -z "$INSTALLED" ] ; then
1452 if checkbootparam 'myconfig' ; then
1453 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1454 if [ -z "$DCSDEVICE" ]; then
1455 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1456 fi # [ -z "$DCSDEVICE" ]
1457 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1458 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1460 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1462 modprobe 9p 2>/dev/null || true
1463 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1464 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1465 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1466 DCSDEVICE="$GRMLCFG"
1467 MOUNTOPTIONS="ro,trans=virtio"
1472 if [ -n "$DCSDEVICE" ]; then
1473 DCSMP="/mnt/grmlcfg"
1478 # if not specified/present then assume default:
1479 if [ -z "$DCSDEVICE" ]; then
1480 DCSDIR="${LIVECD_PATH}"
1483 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1484 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1485 if [ -n "$DCSDIR" ]; then
1486 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1488 [ -d $DCSMP ] || mkdir $DCSMP
1489 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1490 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1491 if [[ $RC == 0 ]]; then
1492 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1494 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1503 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1504 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1505 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1506 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1512 if checkbootparam 'partconf' ; then
1513 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1514 if [ -n "$MOUNTDEVICE" ]; then
1515 [ -d /mnt/grml ] || mkdir /mnt/grml
1516 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1517 if [[ $RC == 0 ]]; then
1518 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1519 einfo "Copying files from $MOUNTDEVICE over grml system."
1520 for file in `cat /etc/grml/partconf` ; do
1521 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1522 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1525 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1526 fi # mount $MOUNTDEVICE
1527 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1529 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1530 fi # [ -n "$MOUNTDEVICE" ]
1535 # {{{ /cdrom/.*-options
1537 if checkbootparam 'debs' ; then
1538 iszsh && setopt localoptions shwordsplit
1539 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1540 if [ -z "$DEBS" ] ; then
1543 if ! echo $DEBS | grep -q '/'; then
1544 # backwards compatibility: if no path is given get debs from debs/
1547 einfo "Trying to install Debian package(s) ${DEBS}"
1548 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1549 dpkg -i $DEBS ; eend $?
1554 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1555 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1556 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1557 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1559 if ! echo $SCRIPTS | grep -q '/'; then
1560 # backwards compatibility: if no path is given get scripts from scripts/
1561 SCRIPTS="scripts/$SCRIPTS"
1563 if [ -n "$SCRIPTS" ]; then
1564 SCRIPTS="${DCSDIR}/$SCRIPTS"
1565 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1566 einfo "Trying to execute ${SCRIPTS}"
1569 elif [ -d "$SCRIPTS" ]; then
1570 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1571 run-parts --regex '.*' $SCRIPTS
1574 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1583 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1584 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1585 if [ -z "$CONFIG" ]; then
1586 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1588 if [ -n "$CONFIG" ]; then
1589 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1590 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1592 cp -a ${DCSDIR}/${CONFIG}/* /
1593 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1594 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1597 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1599 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1606 # {{{ confing_umount_dcsdir
1607 config_umount_dcsdir(){
1608 # umount $DCSMP if it was mounted by finddcsdir
1609 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1615 if checkbootparam 'mypath' ; then
1616 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1617 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1618 touch /etc/grml/my_path
1619 chmod 644 /etc/grml/my_path
1620 # make sure the directories exist:
1622 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1623 if ! [ -d "$i" ] ; then
1624 einfo "Creating directory $i"
1625 mkdir -p "$i" ; eend $?
1628 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1636 [ -n "$INSTALLED" ] && return 0
1638 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1639 checkbootparam 'raid=noautodetect' ; then
1640 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1642 [ -e /proc/mdstat ] || modprobe md_mod
1643 if ! [ -x /sbin/mdadm ] ; then
1644 eerror "mdadm not available, can not execute it." ; eend 1
1647 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1648 # find out whether we have a valid configuration file already
1649 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1650 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1651 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1652 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1654 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1657 if ! checkbootparam 'swraid' ; then
1660 einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1662 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1666 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1671 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1673 *'No arrays found'*)
1674 ewarn "$line" ; eend 0
1677 einfo "$line" ; eend 0
1684 if [ -r /proc/mdstat ] ; then
1686 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1687 if [ -z "$MDSTAT" ] ; then
1688 ewarn "No active arrays found" ; eend 0
1693 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1694 einfo "active arrays: $line" ; eend 0
1700 fi # bootoption swraid
1702 fi # is /sbin/mdadm executable?
1703 fi # check for bootoptions
1709 [ -n "$INSTALLED" ] && return 0
1711 if checkbootparam 'nodmraid' ; then
1712 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1716 if ! [ -x /sbin/dmraid ] ; then
1717 eerror "dmraid not available, can not execute it." ; eend 1
1722 # usage: dmraid_wrapper <dmraid_option>
1723 [ -n "$1" ] || return 1
1730 for line in $(dmraid $1 ; echo errcode:$?); do
1732 *'no block devices found'*)
1733 einfo "No block devices found" ; eend 0
1737 einfo "No active dmraid devices found" ; eend 0
1756 if checkbootparam 'dmraid' ; then
1757 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1758 if [ "$ACTION" = "off" ] ; then
1759 # Deactivates all active software RAID sets:
1760 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1763 # Activate all software RAID sets discovered:
1764 einfo "Activating present dmraid sets (as requested via dmraid):"
1771 # by default (no special bootoptions) discover all software RAID devices:
1772 einfo "Searching for any present dmraid sets:"
1777 # {{{ LVM (Logical Volumes)
1779 [ -n "$INSTALLED" ] && return 0
1781 if checkbootparam 'nolvm' ; then
1782 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1784 if ! [ -x /sbin/lvm ] ; then
1785 eerror "LVM not available, can not execute it." ; eend 1
1787 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1788 einfo "You seem to have logical volumes (LVM) on your system."
1791 einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart."
1793 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1796 if checkbootparam 'lvm' ; then
1797 einfo "Bootoption LVM found. Searching for logical volumes:"
1799 service_wrapper lvm2-lvmetad start ; eend $?
1801 service_wrapper lvm2 start ; eend $?
1806 fi # check for lvm binary
1807 fi # check for bootoption nolvm
1811 # {{{ debnet: setup network based on an existing one found on a partition
1813 if checkbootparam 'debnet' ; then
1814 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1820 # {{{ disable console blanking
1822 if checkbootparam 'noblank' ; then
1823 einfo "Bootoption noblank found. Disabling monitor blanking."
1824 setterm -blank 0 ; eend $?
1829 # {{{ debootstrap: automatic installation
1830 config_debootstrap(){
1832 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1834 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1836 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1838 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1843 if checkbootparam 'target' ; then
1845 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1846 # notice: the following checks whether the given partition is available, if not the skip
1847 # execution of grml-debootstrap as it might result in data loss...
1848 if ! [ -r "$TARGET" ] ; then
1849 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1853 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1858 if checkbootparam 'grub' ; then
1860 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1863 if checkbootparam 'groot' ; then
1865 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1868 if checkbootparam 'release' ; then
1870 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1873 if checkbootparam 'mirror' ; then
1875 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1878 if checkbootparam 'boot_append' ; then
1880 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1883 if checkbootparam 'password' ; then
1885 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1888 # now check which options are available
1889 if [ -n "TARGET" ] ; then
1890 TARGETCMD="--target $TARGET"
1894 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1898 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1899 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1900 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1901 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1902 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1903 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1905 # and finally write script and execute it
1906 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1908 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1911 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1913 screen /usr/bin/grml-debootstrap_noninteractive
1914 einfo "Invoking a shell, just exit to continue booting..."
1917 fi # checkbootparam "BOOT_IMAGE=debian2hd
1921 # {{{ virtualbox shared folders
1922 config_virtualbox_shared_folders() {
1923 if $VIRTUALBOX ; then
1924 einfo "VirtualBox detected, trying to set up Shared Folders."
1925 if ! modinfo vboxsf &>/dev/null ; then
1926 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1928 elif ! [ -x /usr/sbin/VBoxService ] ; then
1929 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1934 einfo "Loading vboxsf driver."
1935 lsmod | grep -q vboxsf || modprobe vboxsf
1938 einfo "Adjusting /dev/vboxguest."
1939 chown root:vboxsf /dev/vboxguest
1940 chmod 660 /dev/vboxguest
1945 einfo "Adding $fstabuser to group vboxsf."
1946 adduser grml vboxsf &>/dev/null
1949 einfo "Starting VBoxService."
1950 VBoxService >/dev/null
1953 local vbautomation='automation'
1954 if checkbootparam 'vbautomation'; then
1955 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1958 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1959 ewarn "No automount shared folder '$vbautomation' available"
1962 einfo "Found automount shared folder '$vbautomation'"
1965 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1966 [ -n "$distri" ] || distri='grml'
1968 local vbox_auto_sf="/media/sf_${vbautomation}"
1970 sleep 1 # ugly but necessary
1974 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1975 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1977 counter=$(( counter-1 ))
1982 if ! [ -d "${vbox_auto_sf}" ] ; then
1983 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1986 einfo "Found shared folders automation directory $vbox_auto_sf"
1990 if checkbootparam 'novbautomation' ; then
1991 einfo "Bootoption novbautomation found. Disabling automation script execution."
1994 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1995 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1998 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1999 "${vbox_auto_sf}/${distri}"
2013 # {{{ Support customization
2015 if checkbootparam 'distri'; then
2016 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2017 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2018 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2019 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2020 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2021 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2027 ## END OF FILE #################################################################
2028 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2