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"
258 if [ -z "$CONSOLEFONT" ] ; then
259 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
260 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
261 CONSOLEFONT='Uni3-Terminus16'
263 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
266 CONSOLEFONT='Lat15-Terminus16'
271 # export it now, so error messages get translated, too
272 [ -r /etc/default/locale ] && . /etc/default/locale
275 # configure keyboard layout, read in already set values first:
276 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
278 # now allow keyboard override by boot commandline for later use:
279 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
280 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
281 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
282 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
283 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
285 # modify /etc/sysconfig/keyboard only in live-cd mode:
286 if [ -z "$INSTALLED" ] ; then
288 local LANGUAGE="$BOOT_LANGUAGE"
289 . /etc/grml/language-functions
290 # allow setting xkeyboard explicitly different than console keyboard
291 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
292 if [ -n "$KXKEYBOARD" ]; then
293 XKEYBOARD="$KXKEYBOARD"
294 KDEKEYBOARD="$KXKEYBOARD"
295 elif [ -n "$KKEYBOARD" ]; then
296 XKEYBOARD="$KKEYBOARD"
297 KDEKEYBOARD="$KKEYBOARD"
300 # duplicate of previous code to make sure /etc/grml/language-functions
301 # does not overwrite our values....
302 # now allow keyboard override by boot commandline for later use:
303 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
304 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
305 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
306 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
307 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
309 # write keyboard related variables to file for later use
310 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
311 if ! [ -e /etc/sysconfig/keyboard ] ; then
312 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
313 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
314 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
315 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
319 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
322 # we have to set up all consoles, therefore loop it over all ttys:
323 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
324 if [ -n "$NUM_CONSOLES" ] ; then
325 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
326 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
328 CUR_CONSOLE=$(fgconsole 2>/dev/null)
330 if [ -x "$(which setfont)" ] ; then
332 elif [ -x "$(which consolechars)" ] ; then
333 use_consolechars=true
335 eerror "Neither setfont nor consolechars tool present, can not set font."
340 if [ -n "$CHARMAP" ] ; then
341 einfo "Setting font to ${CHARMAP}"
343 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
344 if $use_setfont ; then
345 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
346 elif $use_consolechars ; then
347 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
350 if [ -n "$CUR_CONSOLE" ] ; then
351 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
356 if checkbootparam 'noconsolefont' ; then
357 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
359 if [ -n "$CONSOLEFONT" ] ; then
360 einfo "Setting font to ${CONSOLEFONT}"
362 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
363 if $use_setfont ; then
364 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
365 elif $use_consolechars ; then
366 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
369 if [ -n "$CUR_CONSOLE" ] ; then
370 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
376 # Set default keyboard before interactive setup
377 if [ -n "$KEYTABLE" ] ; then
378 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
379 loadkeys -q $KEYTABLE &
383 # activate unicode console if running within utf8 environment
384 if [ -r /etc/default/locale ] ; then
385 if grep -q "LANG=.*UTF" /etc/default/locale ; then
386 einfo "Setting up unicode environment."
387 unicode_start ; eend $?
397 if ! checkbootparam 'hostname' ; then
401 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
402 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
403 einfo "Generating random hostname as no hostname was specified."
404 HOSTNAME="$(/usr/bin/random-hostname)"
408 einfo "Setting hostname to $HOSTNAME as requested."
409 grml-hostname $HOSTNAME >>$DEBUG
414 # fstabuser (needed when running from harddisk with username != grml {{{
416 # force load of build-in and local config
417 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
418 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
420 # 1st. try configured fstab user
421 if [ -n "$CONFIG_FSTAB_USER" ] ; then
422 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
425 # 2nd. use standard user id
426 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
428 # 3rd. use standard user name
429 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
431 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
432 [ -n "$fstabuser" ] || fstabuser='root'
436 # local_user (needed when running with username != grml {{{
439 # force load of build-in and local config
440 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
441 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
443 # 1st. try id of primary user
444 localuser=$(getent passwd 1000 | cut -d: -f1)
446 # 2nd. use name standard user
447 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
451 # {{{ Set clock (Local time is more often used than GMT, so it is default)
453 # don't touch the files if running from harddisk:
454 if [ -z "$INSTALLED" ]; then
455 # The default hardware clock timezone is stated as representing local time.
458 if [ -f /etc/default/rcS ] ; then
459 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
460 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
461 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
462 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
463 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
464 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
465 elif [ -f /etc/adjtime ] ; then
466 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
467 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
468 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
469 grep -q "^UTC$" /etc/adjtime && UTC="-u"
472 # hwclock uses the TZ variable
473 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
474 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
475 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
476 ewarn "Warning: unknown timezone $KTZ" ; eend 1
478 ewarn "Falling back to timezone $KTZ" ; eend 0
481 if ! [ -r /dev/rtc ] ; then
482 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
485 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
486 if [ -n "$ERROR" ] ; then
488 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
489 if [ -n "$ERROR" ] ; then
490 eerror "Problem running hwclock: $ERROR" ; eend 1
499 # {{{ print kernel info
501 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
502 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
504 einfo "Running Linux Kernel $KERNEL" ; eend 0
507 if [ -r /proc/cpuinfo ] ; then
508 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
510 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
515 if [ -d /proc/xen ] ; then
517 einfo 'Running kernel featuring support for Xen detected' ; eend 0
525 # systemd does this for us, but if we are not running under systemd then mokutil
526 # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
527 # /sys/firmware/efi/vars would exist)
529 if modprobe efivars &>/dev/null ; then
530 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
534 if [ -x /usr/bin/mokutil ] ; then
535 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
536 if [ -n "$secstate" ] ; then
537 einfo "SecureBoot is enabled" ; eend 0
539 einfo "SecureBoot not detected" ; eend 0
542 if modprobe efivars &>/dev/null ; then
543 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
544 einfo "SecureBoot is enabled" ; eend 0
546 einfo "SecureBoot not detected" ; eend 0
555 # don't touch the files if running from harddisk:
556 if [ -z "$INSTALLED" ]; then
557 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
558 if [ -n "$KTZ" ] ; then
559 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
561 ewarn "Warning: unknown timezone $KTZ"; eend 0
563 einfo "Setting timezone."
565 area=$(echo $KTZ | cut -d '/' -f1)
566 zone=$(echo $KTZ | cut -d '/' -f2)
567 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
568 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
570 echo $KTZ > /etc/timezone
572 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
579 # activate serial console {{{
581 if checkbootparam 'console'; then
582 # this hack is no longer necessary with systemd
591 einfo "Bootoption for serial console detected:"
595 line="${line#*[$ws]}"
597 while [ -n "$line" ]; do
601 local device="${this%%,*}"
602 local device="${device##*=}"
603 if echo $serial | grep -q ttyS ; then
604 local option="${serial##*,}"
605 # default (works for kvm & CO):
606 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
607 # ... unless overriden by command line:
609 115200*) speed=115200 ;;
610 57600*) speed=57600 ;;
611 38400*) speed=38400 ;;
612 19200*) speed=19200 ;;
619 einfo "Activating console login on device ${device} with speed ${speed}."
620 local number="${device#ttyS}"
621 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
628 this="${line%%[$ws]*}"
629 line="${line#*[$ws]}"
632 if [ -n "$telinitq" ]; then
642 if checkbootparam 'testcd' ; then
643 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
647 local FOUND_FILE=false
648 local logfile='/tmp/md5sum.log'
652 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
653 einfo "Checking files against $md5, this may take a while..."
658 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
659 if [ $pipestatus[1] -eq 0 ] ; then
665 if ! $FOUND_FILE ; then
666 eerror 'Error: Could not find md5sum file' ; eend 1
671 einfo "Everything looks OK" ; eend 0
673 eerror 'Checksum failed for theses files:' ; eend 1
674 egrep -v '(^md5sum:|OK$)' "${logfile}"
675 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
676 einfon "Hit return to continue, or press the power button to shut down system."
685 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
687 if checkbootparam 'blacklist' ; then
688 if [ -z "$INSTALLED" ]; then
689 einfo "Bootoption blacklist found."
690 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
691 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
692 if [ -n "$BLACK" ] ; then
693 for module in $(echo ${BLACK//,/ }) ; do
694 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
695 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
696 echo "blacklist $module" >> "$BLACKLIST_FILE"
697 echo "alias $module off" >> "$BLACKLIST_FILE"
698 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
701 eerror "No given module for blacklist found. Blacklisting will not work therefore."
704 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
706 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
716 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
720 if checkbootparam 'noacpi'; then
721 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
722 elif checkbootparam 'nogrmlacpi' ; then
723 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
724 elif [ ! -d /proc/acpi ] ; then
725 ewarn "ACPI: Kernel support not present." ; eend 0
727 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
730 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
732 basename="${basename%%.*}"
733 case "$basename" in *_acpi)
734 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
736 modprobe $basename >>$DEBUG 2>&1 && found="yes"
737 local BASE="$BASE $basename"
739 if [ -n "$found" ] ; then
740 einfo "$BASE" ; eend 0
742 ewarn "(none)" ; eend 1
744 if ! pgrep acpid >/dev/null ; then
745 einfo "Starting acpi daemon."
746 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
747 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
749 ewarn "acpi daemon already running."
759 if checkbootparam 'brltty' ; then
760 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
765 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
768 NOSWAP="yes" # we do not use swap by default!
769 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
771 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
774 # Scan for swap, config, homedir - but only in live-mode
775 if [ -z "$INSTALLED" ] ; then
776 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
779 HOMEDIR="$(getbootparam 'home')"
780 if [ -n "$partitions" ]; then
781 while read p m f relax; do
782 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
783 partoptions="users,exec"
785 # it's a swap partition?
788 if [ -n "$NOSWAP" ]; then
789 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
792 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
793 S1SUSP|S2SUSP|pmdisk|[zZ]*)
794 if [ -n "$ANYSWAP" ] ; then
795 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
796 swapon $p 2>>$DEBUG ; eend $?
798 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
802 if [[ "$p" == LABEL* ]] ; then
803 p=$(blkid -t $p | awk -F: '{print $1}')
805 if grep -q $p /proc/swaps ; then
806 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
808 if [ -b "$p" ] ; then
809 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
810 swapon $p 2>>$DEBUG ; eend $?
812 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
821 esac # it's a swap partition?
826 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
827 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
829 # *) NONEFOUND='1'; continue ;;
833 if [ -z "$NOSWAP" ] ; then
834 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
835 # Activate swapfile, if exists
836 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
838 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
839 mount -o remount,rw $m && MOUNTED=1
840 if swapon "$SWAPFILE" 2>>$DEBUG ; then
842 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
844 fnew="$SWAPFILE swap swap defaults 0 0"
845 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
846 GRML_SWP="$GRML_SWP $SWAPFILE"
849 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
852 # use a image as home
853 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
854 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
855 if [ -n "$HOMEDIR" ]; then
856 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
860 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
862 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
867 # Umount, if not in use
868 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
880 if checkbootparam 'nocpu'; then
881 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
885 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
887 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)
888 echo $CPU | sed 's/ \{1,\}/ /g'
891 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
894 # no cpufreq setup inside VirtualBox
895 if $VIRTUALBOX ; then
896 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
900 if ! [ -x /etc/init.d/loadcpufreq ] ; then
901 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
905 einfo "Trying to set up cpu frequency scaling:"
908 LOADCPUFREQ=$(mktemp)
909 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
910 if grep -q FATAL "$LOADCPUFREQ" ; then
915 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
916 eerror "$line" ; eend $RC
920 elif grep -q done "$LOADCPUFREQ" ; then
921 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
922 if [ -n "$MODULE" -a "$MODULE" != none ]; then
923 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
926 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
932 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
933 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
934 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
935 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
937 einfo "Setting ondemand governor"
939 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
940 echo ondemand > $file || RC=1
952 # {{{ autostart of ssh
954 if checkbootparam 'ssh' ; then
956 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
959 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
960 [ -z "$localuser" ] && eend 1
963 if [ -z "$PASSWD" ] ; then
964 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
968 if [ -n "$PASSWD" ] ; then
970 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
974 echo "$localuser:$PASSWD" | chpasswd $chpass_options
975 echo "root:$PASSWD" | chpasswd $chpass_options
978 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
982 einfo "Starting secure shell server in background for root and user $localuser"
983 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
984 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
992 # {{{ display hostkeys of SSH server
993 config_display_ssh_fingerprints() {
994 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
995 return 0 # no SSH host keys present
998 einfo "SSH key fingerprints:"
999 for file in /etc/ssh/ssh_host_*_key ; do
1001 ssh-keygen -l -f $file
1007 # {{{ autostart of x11vnc
1009 if checkbootparam 'vnc' ; then
1012 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1013 einfo "Bootoption vnc found, trying to set password for user $localuser."
1015 if [ -z "$VNC_PASSWD" ] ; then
1016 if [ -x /usr/bin/apg ] ; then
1017 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1018 elif [ -x /usr/bin/gpw ] ; then
1019 VNC_PASSWD="$(gpw 1)"
1020 elif [ -x /usr/bin/pwgen ] ; then
1021 VNC_PASSWD="$(pwgen -1 8)"
1022 elif [ -x /usr/bin/hexdump ] ; then
1023 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1024 elif [ -n "$RANDOM" ] ; then
1025 VNC_PASSWD="${localuser}${RANDOM}"
1028 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1032 if [ -n "$VNC_PASSWD" ] ; then
1033 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1038 # finally check if we have a password we can use:
1039 if [ -n "$VNC_PASSWD" ] ; then
1041 VNCDIR="/home/${localuser}/.vnc"
1042 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1044 if [ ! -x /usr/bin/x11vnc ] ; then
1045 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1048 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1049 /bin/chown -R "$localuser": "$VNCDIR"
1052 if checkbootparam 'vnc_connect' ; then
1054 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1055 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1056 #store the options in a file
1057 VNCDIR="/home/${localuser}/.vnc"
1058 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1059 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1065 # {{{ set password for root and default user
1067 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1069 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1072 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1073 [ -z "$localuser" ] && eend 1
1076 if [ -z "$PASSWD" ] ; then
1077 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1081 if [ -n "$PASSWD" ] ; then
1083 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1087 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1088 echo "root:$PASSWD" | chpasswd $chpass_options
1091 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1097 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1099 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1101 if [ -z "$PASSWD" ] ; then
1102 eerror "No hashed password found, can not set password."
1108 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1109 [ -z "$localuser" ] && eend 1
1111 if [ -n "$PASSWD" ] ; then
1114 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1115 echo "root:$PASSWD" | chpasswd $chpass_options
1118 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1128 if ! [ -x /usr/bin/amixer ] ; then
1129 logger -t grml-autoconfig "amixer binary not available"
1133 if ! [ -r /proc/asound/cards ] ; then
1134 ewarn "No soundcard present, skipping mixer settings therefore."
1139 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1140 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1143 if checkbootparam 'vol' ; then
1144 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1145 if [ -z "$VOL" ] ; then
1146 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1154 if checkbootparam 'nosound' ; then
1155 einfo "Muting sound devices on request."
1156 ERROR=$(amixer -q set Master mute)
1158 if [ -n "$ERROR" ] ; then
1160 eerror "Problem muting sound devices: $ERROR"
1164 elif [ -z "$INSTALLED" ] ; then
1165 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1167 if checkbootparam 'micvol' ; then
1168 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1169 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1174 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1177 for CONTROL in ${=CONTROLS} ; do
1178 # such devices can not be controlled with amixer ... unmute
1179 [[ "$CONTROL" == *Console* ]] && continue
1181 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1182 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1183 amixer -c $card -q set "${CONTROL}" unmute
1185 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1186 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1190 if [ ${MICVOL} -ne 0 ] ; then
1191 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1192 amixer -c $card -q set "${CONTROL}" unmute
1194 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1195 amixer -c $card -q set "${CONTROL}" $MICVOL%
1201 fi # checkbootparam 'nosound'
1207 # {{{ syslog service
1209 if checkbootparam 'nosyslog'; then
1210 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1212 einfo "Starting rsyslog in background."
1213 service_wrapper rsyslog start >>$DEBUG
1221 if checkbootparam 'nogpm'; then
1222 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1224 if ! [ -r /dev/input/mice ] ; then
1225 eerror "No mouse found - not starting GPM." ; eend 1
1227 einfo "Starting gpm in background."
1228 service_wrapper gpm start background >>$DEBUG
1237 if checkbootparam 'services' ; then
1238 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1239 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1240 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1241 for service in $(echo -e $SERVICELIST) ; do
1242 # support running (custom) init scripts in non-blocking mode
1243 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1244 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1245 einfo "Starting service ${service}."
1246 service_wrapper "${service}" start >>$DEBUG
1248 einfo "Starting service ${service} in background."
1249 service_wrapper "${service}" start background >>$DEBUG
1259 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1260 SOURCE=$(eval echo "$1")
1263 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1264 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1266 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1268 if checkbootparam 'getfile.retries' ; then
1269 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1274 while ! getconfig && [[ "$counter" != 0 ]] ; do
1275 echo -n "Sleeping for 1 second and trying to get config again... "
1276 counter=$(( counter-1 ))
1277 echo "$counter tries left" ; sleep 1
1279 if [ -s "$TARGET" ] ; then
1280 einfo "Downloading was successfull." ; eend 0
1281 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1282 md5sum ${TARGET} ; eend 0
1285 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1293 if checkbootparam 'netconfig' ; then
1294 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1295 CONFIGFILE='/tmp/netconfig.grml'
1297 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1298 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1305 # {{{ remote scripts
1306 config_netscript() {
1307 if checkbootparam 'netscript' ; then
1308 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1309 SCRIPTFILE='/tmp/netscript.grml'
1311 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1312 chmod +x ${SCRIPTFILE}
1313 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1320 # {{{ start X window system via grml-x
1324 # make sure we start X only if startx is used *before* a nostartx option
1325 # so it's possible to disable automatic X startup using nostart
1326 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1327 if [ -x "$(which X)" ] ; then
1328 if [ -z "$INSTALLED" ] ; then
1329 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1330 if [ -z "$WINDOWMANAGER" ] ; then
1331 einfo "No window manager specified. Using default one." && eend 0
1333 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1335 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1338 if [ -n "$WINDOWMANAGER" ] ; then
1339 mkdir -p /var/run/grml-x/
1340 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1345 cat>|/etc/init.d/startx<<EOF
1347 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1349 chmod 755 /etc/init.d/startx
1351 # adjust inittab for startx
1352 if grep -q '^6:' /etc/inittab ; then
1353 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
1354 else # just append tty6 to inittab if no definition is present:
1355 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
1358 /sbin/telinit q ; eend $?
1360 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1361 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1363 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1367 eerror "We are not running in live mode - startx will not work, skipping it."
1368 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1371 eerror "/usr/bin/X is not present on this grml flavour."
1372 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1378 # {{{ configuration framework
1380 if checkbootparam 'extract' ; then
1381 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1382 EXTRACTOPTIONS="-- -x $EXTRACT"
1386 config_finddcsdir() {
1387 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1388 # on the command line, nothing is changed and the dcs files are
1389 # searched within the .iso, $dcs-dir is set to the root directory
1391 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1392 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1393 # set, $dcs-dir is set to the root directory within the .iso.
1394 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1395 # foo, even if a GRMLCFG partition is present.
1398 # autoconfig, see issue673
1399 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1400 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1401 if checkbootparam 'noautoconfig' ; then
1402 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1403 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1405 if [ -z "$INSTALLED" ] ; then
1406 if checkbootparam 'myconfig' ; then
1407 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1408 if [ -z "$DCSDEVICE" ]; then
1409 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1410 fi # [ -z "$DCSDEVICE" ]
1411 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1412 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1414 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1416 modprobe 9p 2>/dev/null || true
1417 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1418 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1419 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1420 DCSDEVICE="$GRMLCFG"
1421 MOUNTOPTIONS="ro,trans=virtio"
1426 if [ -n "$DCSDEVICE" ]; then
1427 DCSMP="/mnt/grmlcfg"
1432 # if not specified/present then assume default:
1433 if [ -z "$DCSDEVICE" ]; then
1434 DCSDIR="${LIVECD_PATH}"
1437 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1438 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1439 if [ -n "$DCSDIR" ]; then
1440 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1442 [ -d $DCSMP ] || mkdir $DCSMP
1443 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1444 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1445 if [[ $RC == 0 ]]; then
1446 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1448 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1457 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1458 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1459 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1460 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1466 if checkbootparam 'partconf' ; then
1467 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1468 if [ -n "$MOUNTDEVICE" ]; then
1469 [ -d /mnt/grml ] || mkdir /mnt/grml
1470 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1471 if [[ $RC == 0 ]]; then
1472 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1473 einfo "Copying files from $MOUNTDEVICE over grml system."
1474 for file in `cat /etc/grml/partconf` ; do
1475 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1476 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1479 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1480 fi # mount $MOUNTDEVICE
1481 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1483 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1484 fi # [ -n "$MOUNTDEVICE" ]
1489 # {{{ /cdrom/.*-options
1491 if checkbootparam 'debs' ; then
1492 iszsh && setopt localoptions shwordsplit
1493 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1494 if [ -z "$DEBS" ] ; then
1497 if ! echo $DEBS | grep -q '/'; then
1498 # backwards compatibility: if no path is given get debs from debs/
1501 einfo "Trying to install Debian package(s) ${DEBS}"
1502 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1503 dpkg -i $DEBS ; eend $?
1508 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1509 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1510 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1511 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1513 if ! echo $SCRIPTS | grep -q '/'; then
1514 # backwards compatibility: if no path is given get scripts from scripts/
1515 SCRIPTS="scripts/$SCRIPTS"
1517 if [ -n "$SCRIPTS" ]; then
1518 SCRIPTS="${DCSDIR}/$SCRIPTS"
1519 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1520 einfo "Trying to execute ${SCRIPTS}"
1523 elif [ -d "$SCRIPTS" ]; then
1524 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1525 run-parts --regex '.*' $SCRIPTS
1528 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1537 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1538 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1539 if [ -z "$CONFIG" ]; then
1540 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1542 if [ -n "$CONFIG" ]; then
1543 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1544 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1546 cp -a ${DCSDIR}/${CONFIG}/* /
1547 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1548 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1551 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1553 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1560 # {{{ confing_umount_dcsdir
1561 config_umount_dcsdir(){
1562 # umount $DCSMP if it was mounted by finddcsdir
1563 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1569 if checkbootparam 'mypath' ; then
1570 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1571 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1572 touch /etc/grml/my_path
1573 chmod 644 /etc/grml/my_path
1574 # make sure the directories exist:
1576 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1577 if ! [ -d "$i" ] ; then
1578 einfo "Creating directory $i"
1579 mkdir -p "$i" ; eend $?
1582 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1590 [ -n "$INSTALLED" ] && return 0
1592 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1593 checkbootparam 'raid=noautodetect' ; then
1594 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1596 [ -e /proc/mdstat ] || modprobe md_mod
1597 if ! [ -x /sbin/mdadm ] ; then
1598 eerror "mdadm not available, can not execute it." ; eend 1
1601 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1602 # find out whether we have a valid configuration file already
1603 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1604 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1605 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1606 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1608 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1611 if ! checkbootparam 'swraid' ; then
1614 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1616 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1620 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1624 for line in $(mdadm --assemble --scan 2>&1) ; do
1626 *'No arrays found'*)
1627 ewarn "$line" ; eend 0
1630 einfo "$line" ; eend 0
1637 if [ -r /proc/mdstat ] ; then
1639 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1640 if [ -z "$MDSTAT" ] ; then
1641 ewarn "No active arrays found" ; eend 0
1645 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1646 einfo "active arrays: $line" ; eend 0
1652 fi # bootoption swraid
1654 fi # is /sbin/mdadm executable?
1655 fi # check for bootoptions
1661 [ -n "$INSTALLED" ] && return 0
1663 if checkbootparam 'nodmraid' ; then
1664 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1668 if ! [ -x /sbin/dmraid ] ; then
1669 eerror "dmraid not available, can not execute it." ; eend 1
1674 # usage: dmraid_wrapper <dmraid_option>
1675 [ -n "$1" ] || return 1
1681 for line in $(dmraid $1 ; echo errcode:$?); do
1683 *'no block devices found'*)
1684 einfo "No block devices found" ; eend 0
1688 einfo "No active dmraid devices found" ; eend 0
1707 if checkbootparam 'dmraid' ; then
1708 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1709 if [ "$ACTION" = "off" ] ; then
1710 # Deactivates all active software RAID sets:
1711 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1714 # Activate all software RAID sets discovered:
1715 einfo "Activating present dmraid sets (as requested via dmraid):"
1722 # by default (no special bootoptions) discover all software RAID devices:
1723 einfo "Searching for any present dmraid sets:"
1728 # {{{ LVM (Logical Volumes)
1730 [ -n "$INSTALLED" ] && return 0
1732 if checkbootparam 'nolvm' ; then
1733 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1735 if ! [ -x /sbin/lvm ] ; then
1736 eerror "LVM not available, can not execute it." ; eend 1
1738 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1739 einfo "You seem to have logical volumes (LVM) on your system."
1742 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1744 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1747 if checkbootparam 'lvm' ; then
1748 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1750 service_wrapper lvm2-lvmetad start
1754 service_wrapper lvm2 start ; eend $?
1759 fi # check for lvm binary
1760 fi # check for bootoption nolvm
1764 # {{{ debnet: setup network based on an existing one found on a partition
1766 if checkbootparam 'debnet' ; then
1767 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1773 # {{{ disable console blanking
1775 if checkbootparam 'noblank' ; then
1776 einfo "Bootoption noblank found. Disabling monitor blanking."
1777 setterm -blank 0 ; eend $?
1782 # {{{ debootstrap: automatic installation
1783 config_debootstrap(){
1785 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1787 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1789 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1791 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1796 if checkbootparam 'target' ; then
1798 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1799 # notice: the following checks whether the given partition is available, if not the skip
1800 # execution of grml-debootstrap as it might result in data loss...
1801 if ! [ -r "$TARGET" ] ; then
1802 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1806 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1811 if checkbootparam 'grub' ; then
1813 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1816 if checkbootparam 'groot' ; then
1818 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1821 if checkbootparam 'release' ; then
1823 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1826 if checkbootparam 'mirror' ; then
1828 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1831 if checkbootparam 'boot_append' ; then
1833 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1836 if checkbootparam 'password' ; then
1838 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1841 # now check which options are available
1842 if [ -n "TARGET" ] ; then
1843 TARGETCMD="--target $TARGET"
1847 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1851 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1852 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1853 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1854 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1855 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1856 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1858 # and finally write script and execute it
1859 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1861 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1864 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1866 screen /usr/bin/grml-debootstrap_noninteractive
1867 einfo "Invoking a shell, just exit to continue booting..."
1870 fi # checkbootparam "BOOT_IMAGE=debian2hd
1874 # {{{ virtualbox shared folders
1875 config_virtualbox_shared_folders() {
1876 if $VIRTUALBOX ; then
1877 einfo "VirtualBox detected, trying to set up Shared Folders."
1878 if ! modinfo vboxsf &>/dev/null ; then
1879 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1881 elif ! [ -x /usr/sbin/VBoxService ] ; then
1882 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1887 einfo "Loading vboxsf driver."
1888 lsmod | grep -q vboxsf || modprobe vboxsf
1891 einfo "Adjusting /dev/vboxguest."
1892 chown root:vboxsf /dev/vboxguest
1893 chmod 660 /dev/vboxguest
1898 einfo "Adding $fstabuser to group vboxsf."
1899 adduser grml vboxsf &>/dev/null
1902 einfo "Starting VBoxService."
1903 VBoxService >/dev/null
1906 local vbautomation='automation'
1907 if checkbootparam 'vbautomation'; then
1908 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1911 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1912 ewarn "No automount shared folder '$vbautomation' available"
1915 einfo "Found automount shared folder '$vbautomation'"
1918 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1919 [ -n "$distri" ] || distri='grml'
1921 local vbox_auto_sf="/media/sf_${vbautomation}"
1923 sleep 1 # ugly but necessary
1927 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1928 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1930 counter=$(( counter-1 ))
1935 if ! [ -d "${vbox_auto_sf}" ] ; then
1936 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1939 einfo "Found shared folders automation directory $vbox_auto_sf"
1943 if checkbootparam 'novbautomation' ; then
1944 einfo "Bootoption novbautomation found. Disabling automation script execution."
1947 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1948 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1951 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1952 "${vbox_auto_sf}/${distri}"
1966 # {{{ Support customization
1968 if checkbootparam 'distri'; then
1969 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1970 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1971 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1972 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1973 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1979 ## END OF FILE #################################################################
1980 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2