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 if checkbootparam 'log' || checkbootparam 'debug' ; then
207 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
209 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
211 einfo "Starting bootlogd." # known to be *very* unreliable :(
212 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
220 ### {{{ language configuration / localization
223 einfo "Activating language settings:"
226 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
227 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
229 # check for bootoption which overrides config from /etc/grml/autoconfig
230 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
231 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
233 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
234 if [ -z "$INSTALLED" ] ; then
235 [ -n "$LANGUAGE" ] || LANGUAGE='en'
238 if [ -x /usr/sbin/grml-setlang ] ; then
239 # if bootoption lang is used update /etc/default/locale accordingly
240 if [ -n "$BOOT_LANGUAGE" ] ; then
241 /usr/sbin/grml-setlang "$LANGUAGE"
242 # otherwise default to lang=en
244 /usr/sbin/grml-setlang "en"
249 if [ -z "$CONSOLEFONT" ] ; then
250 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
251 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
252 CONSOLEFONT='Uni3-Terminus16'
254 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
257 CONSOLEFONT='Lat15-Terminus16'
262 # export it now, so error messages get translated, too
263 [ -r /etc/default/locale ] && . /etc/default/locale
266 # configure keyboard layout, read in already set values first:
267 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
269 # now allow keyboard override by boot commandline for later use:
270 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
271 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
272 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
273 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
274 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
276 # modify /etc/sysconfig/keyboard only in live-cd mode:
277 if [ -z "$INSTALLED" ] ; then
279 local LANGUAGE="$BOOT_LANGUAGE"
280 . /etc/grml/language-functions
281 # allow setting xkeyboard explicitly different than console keyboard
282 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
283 if [ -n "$KXKEYBOARD" ]; then
284 XKEYBOARD="$KXKEYBOARD"
285 KDEKEYBOARD="$KXKEYBOARD"
286 elif [ -n "$KKEYBOARD" ]; then
287 XKEYBOARD="$KKEYBOARD"
288 KDEKEYBOARD="$KKEYBOARD"
291 # duplicate of previous code to make sure /etc/grml/language-functions
292 # does not overwrite our values....
293 # now allow keyboard override by boot commandline for later use:
294 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
295 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
296 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
297 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
298 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
300 # write keyboard related variables to file for later use
301 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
302 if ! [ -e /etc/sysconfig/keyboard ] ; then
303 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
304 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
305 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
306 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
310 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
312 # activate unicode console if running within utf8 environment
313 if [ -r /etc/default/locale ] ; then
314 if grep -q "LANG=.*UTF" /etc/default/locale ; then
315 einfo "Setting up unicode environment."
316 unicode_start >>$DEBUG 2>&1 ; eend $?
320 # Set default keyboard before interactive setup
321 if [ -n "$KEYTABLE" ] ; then
322 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
323 loadkeys -q $KEYTABLE &
327 # we have to set up all consoles, therefore loop it over all ttys:
328 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
329 if [ -n "$NUM_CONSOLES" ] ; then
330 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
331 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
333 CUR_CONSOLE=$(fgconsole 2>/dev/null)
335 if [ -x "$(which setfont)" ] ; then
337 elif [ -x "$(which consolechars)" ] ; then
338 use_consolechars=true
340 eerror "Neither setfont nor consolechars tool present, can not set font."
345 if [ -n "$CHARMAP" ] ; then
346 einfo "Setting font to ${CHARMAP}"
348 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
349 if $use_setfont ; then
350 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
351 elif $use_consolechars ; then
352 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
355 if [ -n "$CUR_CONSOLE" ] ; then
356 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
361 if checkbootparam 'noconsolefont' ; then
362 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
364 if [ -n "$CONSOLEFONT" ] ; then
365 einfo "Setting font to ${CONSOLEFONT}"
367 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
368 if $use_setfont ; then
369 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
370 elif $use_consolechars ; then
371 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
374 if [ -n "$CUR_CONSOLE" ] ; then
375 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
387 if ! checkbootparam 'hostname' ; then
391 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
392 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
393 einfo "Generating random hostname as no hostname was specified."
394 HOSTNAME="$(/usr/bin/random-hostname)"
398 einfo "Setting hostname to $HOSTNAME as requested."
399 grml-hostname $HOSTNAME >>$DEBUG
404 # fstabuser (needed when running from harddisk with username != grml {{{
406 # force load of build-in and local config
407 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
408 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
410 # 1st. try configured fstab user
411 if [ -n "$CONFIG_FSTAB_USER" ] ; then
412 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
415 # 2nd. use standard user id
416 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
418 # 3rd. use standard user name
419 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
421 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
422 [ -n "$fstabuser" ] || fstabuser='root'
426 # local_user (needed when running with username != grml {{{
429 # force load of build-in and local config
430 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
431 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
433 # 1st. try id of primary user
434 localuser=$(getent passwd 1000 | cut -d: -f1)
436 # 2nd. use name standard user
437 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
441 # {{{ Set clock (Local time is more often used than GMT, so it is default)
443 # don't touch the files if running from harddisk:
444 if [ -z "$INSTALLED" ]; then
445 # The default hardware clock timezone is stated as representing local time.
448 if [ -f /etc/default/rcS ] ; then
449 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
450 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
451 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
452 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
453 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
454 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
455 elif [ -f /etc/adjtime ] ; then
456 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
457 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
458 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
459 grep -q "^UTC$" /etc/adjtime && UTC="-u"
462 # hwclock uses the TZ variable
463 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
464 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
465 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
466 ewarn "Warning: unknown timezone $KTZ" ; eend 1
468 ewarn "Falling back to timezone $KTZ" ; eend 0
471 if ! [ -r /dev/rtc ] ; then
472 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
475 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
476 if [ -n "$ERROR" ] ; then
478 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
479 if [ -n "$ERROR" ] ; then
480 eerror "Problem running hwclock: $ERROR" ; eend 1
489 # {{{ print kernel info
491 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
492 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
494 einfo "Running Linux Kernel $KERNEL" ; eend 0
497 if [ -r /proc/cpuinfo ] ; then
498 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
500 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
505 if [ -d /proc/xen ] ; then
507 einfo 'Running kernel featuring support for Xen detected' ; eend 0
515 if [ -x /usr/bin/mokutil ] ; then
516 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
517 if [ -n "$secstate" ] ; then
518 einfo "SecureBoot is enabled" ; eend 0
520 einfo "SecureBoot not detected" ; eend 0
523 if modprobe efivars &>/dev/null ; then
524 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
525 einfo "SecureBoot is enabled" ; eend 0
527 einfo "SecureBoot not detected" ; eend 0
536 # don't touch the files if running from harddisk:
537 if [ -z "$INSTALLED" ]; then
538 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
539 if [ -n "$KTZ" ] ; then
540 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
542 ewarn "Warning: unknown timezone $KTZ"; eend 0
544 einfo "Setting timezone."
546 area=$(echo $KTZ | cut -d '/' -f1)
547 zone=$(echo $KTZ | cut -d '/' -f2)
548 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
549 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
551 echo $KTZ > /etc/timezone
553 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
560 # activate serial console {{{
562 if checkbootparam 'console'; then
563 # this hack is no longer necessary with systemd
572 einfo "Bootoption for serial console detected:"
576 line="${line#*[$ws]}"
578 while [ -n "$line" ]; do
582 local device="${this%%,*}"
583 local device="${device##*=}"
584 if echo $serial | grep -q ttyS ; then
585 local option="${serial##*,}"
586 # default (works for kvm & CO):
587 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
588 # ... unless overriden by command line:
590 115200*) speed=115200 ;;
591 57600*) speed=57600 ;;
592 38400*) speed=38400 ;;
593 19200*) speed=19200 ;;
600 einfo "Activating console login on device ${device} with speed ${speed}."
601 local number="${device#ttyS}"
602 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
609 this="${line%%[$ws]*}"
610 line="${line#*[$ws]}"
613 if [ -n "$telinitq" ]; then
623 if checkbootparam 'testcd' ; then
624 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
628 local FOUND_FILE=false
629 local logfile='/tmp/md5sum.log'
633 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
634 einfo "Checking files against $md5, this may take a while..."
639 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
640 if [ $pipestatus[1] -eq 0 ] ; then
646 if ! $FOUND_FILE ; then
647 eerror 'Error: Could not find md5sum file' ; eend 1
652 einfo "Everything looks OK" ; eend 0
654 eerror 'Checksum failed for theses files:' ; eend 1
655 egrep -v '(^md5sum:|OK$)' "${logfile}"
656 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
657 einfon "Hit return to continue, or press the power button to shut down system."
666 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
668 if checkbootparam 'blacklist' ; then
669 if [ -z "$INSTALLED" ]; then
670 einfo "Bootoption blacklist found."
671 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
672 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
673 if [ -n "$BLACK" ] ; then
674 for module in $(echo ${BLACK//,/ }) ; do
675 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
676 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
677 echo "blacklist $module" >> "$BLACKLIST_FILE"
678 echo "alias $module off" >> "$BLACKLIST_FILE"
679 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
682 eerror "No given module for blacklist found. Blacklisting will not work therefore."
685 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
687 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
697 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
701 if checkbootparam 'noacpi'; then
702 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
703 elif checkbootparam 'nogrmlacpi' ; then
704 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
705 elif [ ! -d /proc/acpi ] ; then
706 ewarn "ACPI: Kernel support not present." ; eend 0
708 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
711 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
713 basename="${basename%%.*}"
714 case "$basename" in *_acpi)
715 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
717 modprobe $basename >>$DEBUG 2>&1 && found="yes"
718 local BASE="$BASE $basename"
720 if [ -n "$found" ] ; then
721 einfo "$BASE" ; eend 0
723 ewarn "(none)" ; eend 1
725 if ! pgrep acpid >/dev/null ; then
726 einfo "Starting acpi daemon."
727 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
728 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
730 ewarn "acpi daemon already running."
740 if checkbootparam 'brltty' ; then
741 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
746 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
749 NOSWAP="yes" # we do not use swap by default!
750 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
752 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
755 # Scan for swap, config, homedir - but only in live-mode
756 if [ -z "$INSTALLED" ] ; then
757 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
760 HOMEDIR="$(getbootparam 'home')"
761 if [ -n "$partitions" ]; then
762 while read p m f relax; do
763 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
764 partoptions="users,exec"
766 # it's a swap partition?
769 if [ -n "$NOSWAP" ]; then
770 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
773 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
774 S1SUSP|S2SUSP|pmdisk|[zZ]*)
775 if [ -n "$ANYSWAP" ] ; then
776 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
777 swapon $p 2>>$DEBUG ; eend $?
779 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
783 if [[ "$p" == LABEL* ]] ; then
784 p=$(blkid -t $p | awk -F: '{print $1}')
786 if grep -q $p /proc/swaps ; then
787 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
789 if [ -b "$p" ] ; then
790 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
791 swapon $p 2>>$DEBUG ; eend $?
793 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
802 esac # it's a swap partition?
807 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
808 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
810 # *) NONEFOUND='1'; continue ;;
814 if [ -z "$NOSWAP" ] ; then
815 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
816 # Activate swapfile, if exists
817 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
819 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
820 mount -o remount,rw $m && MOUNTED=1
821 if swapon "$SWAPFILE" 2>>$DEBUG ; then
823 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
825 fnew="$SWAPFILE swap swap defaults 0 0"
826 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
827 GRML_SWP="$GRML_SWP $SWAPFILE"
830 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
833 # use a image as home
834 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
835 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
836 if [ -n "$HOMEDIR" ]; then
837 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
841 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
843 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
848 # Umount, if not in use
849 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
861 if checkbootparam 'nocpu'; then
862 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
866 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
868 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)
869 echo $CPU | sed 's/ \{1,\}/ /g'
872 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
875 # no cpufreq setup inside VirtualBox
876 if $VIRTUALBOX ; then
877 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
881 if ! [ -x /etc/init.d/loadcpufreq ] ; then
882 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
886 einfo "Trying to set up cpu frequency scaling:"
889 LOADCPUFREQ=$(mktemp)
890 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
891 if grep -q FATAL "$LOADCPUFREQ" ; then
896 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
897 eerror "$line" ; eend $RC
901 elif grep -q done "$LOADCPUFREQ" ; then
902 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
903 if [ -n "$MODULE" -a "$MODULE" != none ]; then
904 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
907 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
913 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
914 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
915 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
916 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
918 einfo "Setting ondemand governor"
920 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
921 echo ondemand > $file || RC=1
933 # {{{ autostart of ssh
935 if checkbootparam 'ssh' ; then
937 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
940 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
941 [ -z "$localuser" ] && eend 1
944 if [ -z "$PASSWD" ] ; then
945 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
949 if [ -n "$PASSWD" ] ; then
951 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
955 echo "$localuser:$PASSWD" | chpasswd $chpass_options
956 echo "root:$PASSWD" | chpasswd $chpass_options
959 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
963 einfo "Starting secure shell server in background for root and user $localuser"
964 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
965 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
973 # {{{ display hostkeys of SSH server
974 config_display_ssh_fingerprints() {
975 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
976 return 0 # no SSH host keys present
979 einfo "SSH key fingerprints:"
980 for file in /etc/ssh/ssh_host_*_key ; do
982 ssh-keygen -l -f $file
988 # {{{ autostart of x11vnc
990 if checkbootparam 'vnc' ; then
993 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
994 einfo "Bootoption vnc found, trying to set password for user $localuser."
996 if [ -z "$VNC_PASSWD" ] ; then
997 if [ -x /usr/bin/apg ] ; then
998 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
999 elif [ -x /usr/bin/gpw ] ; then
1000 VNC_PASSWD="$(gpw 1)"
1001 elif [ -x /usr/bin/pwgen ] ; then
1002 VNC_PASSWD="$(pwgen -1 8)"
1003 elif [ -x /usr/bin/hexdump ] ; then
1004 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1005 elif [ -n "$RANDOM" ] ; then
1006 VNC_PASSWD="${localuser}${RANDOM}"
1009 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1013 if [ -n "$VNC_PASSWD" ] ; then
1014 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1019 # finally check if we have a password we can use:
1020 if [ -n "$VNC_PASSWD" ] ; then
1022 VNCDIR="/home/${localuser}/.vnc"
1023 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1025 if [ ! -x /usr/bin/x11vnc ] ; then
1026 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1029 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1030 /bin/chown -R "$localuser": "$VNCDIR"
1033 if checkbootparam 'vnc_connect' ; then
1035 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1036 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1037 #store the options in a file
1038 VNCDIR="/home/${localuser}/.vnc"
1039 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1040 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1046 # {{{ set password for root and default user
1048 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1050 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1053 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1054 [ -z "$localuser" ] && eend 1
1057 if [ -z "$PASSWD" ] ; then
1058 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1062 if [ -n "$PASSWD" ] ; then
1064 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1068 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1069 echo "root:$PASSWD" | chpasswd $chpass_options
1072 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1078 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1080 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1082 if [ -z "$PASSWD" ] ; then
1083 eerror "No hashed password found, can not set password."
1089 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1090 [ -z "$localuser" ] && eend 1
1092 if [ -n "$PASSWD" ] ; then
1095 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1096 echo "root:$PASSWD" | chpasswd $chpass_options
1099 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1109 if ! [ -x /usr/bin/amixer ] ; then
1110 logger -t grml-autoconfig "amixer binary not available"
1114 if ! [ -r /proc/asound/cards ] ; then
1115 ewarn "No soundcard present, skipping mixer settings therefore."
1120 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1121 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1124 if checkbootparam 'vol' ; then
1125 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1126 if [ -z "$VOL" ] ; then
1127 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1135 if checkbootparam 'nosound' ; then
1136 einfo "Muting sound devices on request."
1137 ERROR=$(amixer -q set Master mute)
1139 if [ -n "$ERROR" ] ; then
1141 eerror "Problem muting sound devices: $ERROR"
1145 elif [ -z "$INSTALLED" ] ; then
1146 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1148 if checkbootparam 'micvol' ; then
1149 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1150 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1155 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1158 for CONTROL in ${=CONTROLS} ; do
1159 # such devices can not be controlled with amixer ... unmute
1160 [[ "$CONTROL" == *Console* ]] && continue
1162 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1163 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1164 amixer -c $card -q set "${CONTROL}" unmute
1166 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1167 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1171 if [ ${MICVOL} -ne 0 ] ; then
1172 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1173 amixer -c $card -q set "${CONTROL}" unmute
1175 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1176 amixer -c $card -q set "${CONTROL}" $MICVOL%
1182 fi # checkbootparam 'nosound'
1188 # {{{ syslog service
1190 if checkbootparam 'nosyslog'; then
1191 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1193 einfo "Starting rsyslog in background."
1194 service_wrapper rsyslog start >>$DEBUG &
1202 if checkbootparam 'nogpm'; then
1203 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1205 if ! [ -r /dev/input/mice ] ; then
1206 eerror "No mouse found - not starting GPM." ; eend 1
1208 einfo "Starting gpm in background."
1209 service_wrapper gpm start >>$DEBUG &
1210 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1219 if checkbootparam 'services' ; then
1220 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1221 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1222 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1223 for service in $(echo -e $SERVICELIST) ; do
1224 # support running (custom) init scripts in non-blocking mode
1225 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1226 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1227 einfo "Starting service ${service}."
1228 service_wrapper "${service}" start >>$DEBUG
1230 einfo "Starting service ${service} in background."
1231 service_wrapper "${service}" start >>$DEBUG &
1241 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1242 SOURCE=$(eval echo "$1")
1245 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1246 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1248 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1250 if checkbootparam 'getfile.retries' ; then
1251 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1256 while ! getconfig && [[ "$counter" != 0 ]] ; do
1257 echo -n "Sleeping for 1 second and trying to get config again... "
1258 counter=$(( counter-1 ))
1259 echo "$counter tries left" ; sleep 1
1261 if [ -s "$TARGET" ] ; then
1262 einfo "Downloading was successfull." ; eend 0
1263 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1264 md5sum ${TARGET} ; eend 0
1267 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1275 if checkbootparam 'netconfig' ; then
1276 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1277 CONFIGFILE='/tmp/netconfig.grml'
1279 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1280 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1287 # {{{ remote scripts
1288 config_netscript() {
1289 if checkbootparam 'netscript' ; then
1290 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1291 SCRIPTFILE='/tmp/netscript.grml'
1293 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1294 chmod +x ${SCRIPTFILE}
1295 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1302 # {{{ start X window system via grml-x
1306 # make sure we start X only if startx is used *before* a nostartx option
1307 # so it's possible to disable automatic X startup using nostart
1308 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1309 if [ -x "$(which X)" ] ; then
1310 if [ -z "$INSTALLED" ] ; then
1311 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1312 if [ -z "$WINDOWMANAGER" ] ; then
1313 einfo "No window manager specified. Using default one." && eend 0
1315 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1317 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1320 if [ -n "$WINDOWMANAGER" ] ; then
1321 mkdir -p /var/run/grml-x/
1322 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1327 cat>|/etc/init.d/startx<<EOF
1329 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1331 chmod 755 /etc/init.d/startx
1333 # adjust inittab for startx
1334 if grep -q '^6:' /etc/inittab ; then
1335 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
1336 else # just append tty6 to inittab if no definition is present:
1337 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
1340 /sbin/telinit q ; eend $?
1342 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1343 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1345 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1349 eerror "We are not running in live mode - startx will not work, skipping it."
1350 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1353 eerror "/usr/bin/X is not present on this grml flavour."
1354 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1360 # {{{ configuration framework
1362 if checkbootparam 'extract' ; then
1363 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1364 EXTRACTOPTIONS="-- -x $EXTRACT"
1368 config_finddcsdir() {
1369 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1370 # on the command line, nothing is changed and the dcs files are
1371 # searched within the .iso, $dcs-dir is set to the root directory
1373 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1374 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1375 # set, $dcs-dir is set to the root directory within the .iso.
1376 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1377 # foo, even if a GRMLCFG partition is present.
1380 # autoconfig, see issue673
1381 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1382 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1383 if checkbootparam 'noautoconfig' ; then
1384 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1385 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1387 if [ -z "$INSTALLED" ] ; then
1388 if checkbootparam 'myconfig' ; then
1389 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1390 if [ -z "$DCSDEVICE" ]; then
1391 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1392 fi # [ -z "$DCSDEVICE" ]
1393 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1394 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1396 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1398 modprobe 9p 2>/dev/null || true
1399 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1400 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1401 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1402 DCSDEVICE="$GRMLCFG"
1403 MOUNTOPTIONS="ro,trans=virtio"
1408 if [ -n "$DCSDEVICE" ]; then
1409 DCSMP="/mnt/grmlcfg"
1414 # if not specified/present then assume default:
1415 if [ -z "$DCSDEVICE" ]; then
1416 DCSDIR="${LIVECD_PATH}"
1419 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1420 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1421 if [ -n "$DCSDIR" ]; then
1422 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1424 [ -d $DCSMP ] || mkdir $DCSMP
1425 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1426 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1427 if [[ $RC == 0 ]]; then
1428 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1430 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1439 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1440 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1441 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1442 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1448 if checkbootparam 'partconf' ; then
1449 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1450 if [ -n "$MOUNTDEVICE" ]; then
1451 [ -d /mnt/grml ] || mkdir /mnt/grml
1452 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1453 if [[ $RC == 0 ]]; then
1454 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1455 einfo "Copying files from $MOUNTDEVICE over grml system."
1456 for file in `cat /etc/grml/partconf` ; do
1457 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1458 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1461 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1462 fi # mount $MOUNTDEVICE
1463 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1465 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1466 fi # [ -n "$MOUNTDEVICE" ]
1471 # {{{ /cdrom/.*-options
1473 if checkbootparam 'debs' ; then
1474 iszsh && setopt localoptions shwordsplit
1475 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1476 if [ -z "$DEBS" ] ; then
1479 if ! echo $DEBS | grep -q '/'; then
1480 # backwards compatibility: if no path is given get debs from debs/
1483 einfo "Trying to install Debian package(s) ${DEBS}"
1484 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1485 dpkg -i $DEBS ; eend $?
1490 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1491 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1492 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1493 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1495 if ! echo $SCRIPTS | grep -q '/'; then
1496 # backwards compatibility: if no path is given get scripts from scripts/
1497 SCRIPTS="scripts/$SCRIPTS"
1499 if [ -n "$SCRIPTS" ]; then
1500 SCRIPTS="${DCSDIR}/$SCRIPTS"
1501 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1502 einfo "Trying to execute ${SCRIPTS}"
1505 elif [ -d "$SCRIPTS" ]; then
1506 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1507 run-parts --regex '.*' $SCRIPTS
1510 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1519 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1520 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1521 if [ -z "$CONFIG" ]; then
1522 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1524 if [ -n "$CONFIG" ]; then
1525 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1526 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1528 cp -a ${DCSDIR}/${CONFIG}/* /
1529 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1530 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1533 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1535 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1542 # {{{ confing_umount_dcsdir
1543 config_umount_dcsdir(){
1544 # umount $DCSMP if it was mounted by finddcsdir
1545 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1551 if checkbootparam 'mypath' ; then
1552 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1553 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1554 touch /etc/grml/my_path
1555 chmod 644 /etc/grml/my_path
1556 # make sure the directories exist:
1558 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1559 if ! [ -d "$i" ] ; then
1560 einfo "Creating directory $i"
1561 mkdir -p "$i" ; eend $?
1564 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1572 [ -n "$INSTALLED" ] && return 0
1574 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1575 checkbootparam 'raid=noautodetect' ; then
1576 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1578 [ -e /proc/mdstat ] || modprobe md_mod
1579 if ! [ -x /sbin/mdadm ] ; then
1580 eerror "mdadm not available, can not execute it." ; eend 1
1583 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1584 # find out whether we have a valid configuration file already
1585 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1586 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1587 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1588 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1590 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1593 if ! checkbootparam 'swraid' ; then
1596 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1598 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1602 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1606 for line in $(mdadm --assemble --scan 2>&1) ; do
1608 *'No arrays found'*)
1609 ewarn "$line" ; eend 0
1612 einfo "$line" ; eend 0
1619 if [ -r /proc/mdstat ] ; then
1621 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1622 if [ -z "$MDSTAT" ] ; then
1623 ewarn "No active arrays found" ; eend 0
1627 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1628 einfo "active arrays: $line" ; eend 0
1634 fi # bootoption swraid
1636 fi # is /sbin/mdadm executable?
1637 fi # check for bootoptions
1643 [ -n "$INSTALLED" ] && return 0
1645 if checkbootparam 'nodmraid' ; then
1646 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1650 if ! [ -x /sbin/dmraid ] ; then
1651 eerror "dmraid not available, can not execute it." ; eend 1
1656 # usage: dmraid_wrapper <dmraid_option>
1657 [ -n "$1" ] || return 1
1663 for line in $(dmraid $1 ; echo errcode:$?); do
1665 *'no block devices found'*)
1666 einfo "No block devices found" ; eend 0
1670 einfo "No active dmraid devices found" ; eend 0
1689 if checkbootparam 'dmraid' ; then
1690 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1691 if [ "$ACTION" = "off" ] ; then
1692 # Deactivates all active software RAID sets:
1693 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1696 # Activate all software RAID sets discovered:
1697 einfo "Activating present dmraid sets (as requested via dmraid):"
1704 # by default (no special bootoptions) discover all software RAID devices:
1705 einfo "Searching for any present dmraid sets:"
1710 # {{{ LVM (Logical Volumes)
1712 [ -n "$INSTALLED" ] && return 0
1714 if checkbootparam 'nolvm' ; then
1715 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1717 if ! [ -x /sbin/lvm ] ; then
1718 eerror "LVM not available, can not execute it." ; eend 1
1720 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1721 einfo "You seem to have logical volumes (LVM) on your system."
1724 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1726 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1729 if checkbootparam 'lvm' ; then
1730 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1732 service_wrapper lvm2-lvmetad start
1736 service_wrapper lvm2 start ; eend $?
1741 fi # check for lvm binary
1742 fi # check for bootoption nolvm
1746 # {{{ debnet: setup network based on an existing one found on a partition
1748 if checkbootparam 'debnet' ; then
1749 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1755 # {{{ disable console blanking
1757 if checkbootparam 'noblank' ; then
1758 einfo "Bootoption noblank found. Disabling monitor blanking."
1759 setterm -blank 0 ; eend $?
1764 # {{{ debootstrap: automatic installation
1765 config_debootstrap(){
1767 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1769 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1771 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1773 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1778 if checkbootparam 'target' ; then
1780 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1781 # notice: the following checks whether the given partition is available, if not the skip
1782 # execution of grml-debootstrap as it might result in data loss...
1783 if ! [ -r "$TARGET" ] ; then
1784 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1788 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1793 if checkbootparam 'grub' ; then
1795 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1798 if checkbootparam 'groot' ; then
1800 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1803 if checkbootparam 'release' ; then
1805 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1808 if checkbootparam 'mirror' ; then
1810 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1813 if checkbootparam 'boot_append' ; then
1815 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1818 if checkbootparam 'password' ; then
1820 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1823 # now check which options are available
1824 if [ -n "TARGET" ] ; then
1825 TARGETCMD="--target $TARGET"
1829 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1833 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1834 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1835 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1836 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1837 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1838 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1840 # and finally write script and execute it
1841 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1843 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1846 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1848 screen /usr/bin/grml-debootstrap_noninteractive
1849 einfo "Invoking a shell, just exit to continue booting..."
1852 fi # checkbootparam "BOOT_IMAGE=debian2hd
1856 # {{{ virtualbox shared folders
1857 config_virtualbox_shared_folders() {
1858 if $VIRTUALBOX ; then
1859 einfo "VirtualBox detected, trying to set up Shared Folders."
1860 if ! modinfo vboxsf &>/dev/null ; then
1861 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1863 elif ! [ -x /usr/sbin/VBoxService ] ; then
1864 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1869 einfo "Loading vboxsf driver."
1870 lsmod | grep -q vboxsf || modprobe vboxsf
1873 einfo "Adjusting /dev/vboxguest."
1874 chown root:vboxsf /dev/vboxguest
1875 chmod 660 /dev/vboxguest
1880 einfo "Adding $fstabuser to group vboxsf."
1881 adduser grml vboxsf &>/dev/null
1884 einfo "Starting VBoxService."
1885 VBoxService >/dev/null
1888 local vbautomation='automation'
1889 if checkbootparam 'vbautomation'; then
1890 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1893 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1894 ewarn "No automount shared folder '$vbautomation' available"
1897 einfo "Found automount shared folder '$vbautomation'"
1900 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1901 [ -n "$distri" ] || distri='grml'
1903 local vbox_auto_sf="/media/sf_${vbautomation}"
1905 sleep 1 # ugly but necessary
1909 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1910 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1912 counter=$(( counter-1 ))
1917 if ! [ -d "${vbox_auto_sf}" ] ; then
1918 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1921 einfo "Found shared folders automation directory $vbox_auto_sf"
1925 if checkbootparam 'novbautomation' ; then
1926 einfo "Bootoption novbautomation found. Disabling automation script execution."
1929 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1930 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1933 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1934 "${vbox_auto_sf}/${distri}"
1948 # {{{ Support customization
1950 if checkbootparam 'distri'; then
1951 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1952 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1953 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1954 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1955 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1961 ## END OF FILE #################################################################
1962 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2