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
28 if [ -n "$ZSH_VERSION" ] ; then
34 # avoid 'no matches found: ...'
35 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
38 # {{{ Read in boot parameters
39 if [ -z "$CMDLINE" ]; then
40 # if CMDLINE was set from the outside, we're debugging.
41 # otherwise, take CMDLINE from Kernel and config files.
42 CMDLINE="$(cat /proc/cmdline)"
43 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
44 modprobe 9p 2>/dev/null || true
45 if grep -q 9p /proc/filesystems ; then
47 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
48 MOUNTDIR="$(mktemp -d)"
49 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
50 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
58 ### {{{ Utility Functions
60 # Get a bootoption's parameter: read boot command line and either
61 # echo last parameter's argument or return false.
69 result="${line##*[$ws]$1=}"
70 result="${result%%[$ws]*}"
78 # Check boot commandline for specified option
80 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
86 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
93 # Check if currently using a framebuffer
95 [ -e /dev/fb0 ] && return 0 || return 1
98 # Check wheter a configuration variable (like $CONFIG_TOHD) is
102 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
103 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
104 *) return 1 ;; # default
108 # Are we using grml-small?
110 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
113 # if no password is set return a random password
115 [ -n "$PASSWD" ] && return 0
117 if [ -x /usr/bin/apg ] ; then
118 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
119 elif [ -x /usr/bin/gpw ] ; then
121 elif [ -x /usr/bin/pwgen ] ; then
122 PASSWD="$(pwgen -1 8)"
123 elif [ -x /usr/bin/hexdump ] ; then
124 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
125 elif [ -n "$RANDOM" ] ; then
126 PASSWD="grml${RANDOM}"
129 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
137 # {{{ filesystems (proc, pts, sys) and fixes
139 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
143 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
147 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
151 # {{{ Check if we are running in live mode or from HD
153 [ -e /etc/grml_cd ] || INSTALLED="yes"
156 # {{{ provide information about virtual environments
157 VIRTUAL=false # assume physical system by default
162 if vmware-detect &>/dev/null; then
163 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
164 elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
165 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
166 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
167 elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
168 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
169 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
173 # {{{ source lsb-functions , color handling
174 if checkbootparam 'nocolor'; then
176 . /etc/grml/lsb-functions
177 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
179 . /etc/grml/lsb-functions
186 checkbootparam 'debug' && BOOTDEBUG="yes"
187 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
190 if [ -n "$BOOTDEBUG" ]; then
191 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
192 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
193 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
194 einfo "Just exit the shell to continue boot process..."
198 if [ -r /etc/grml/screenrc ] ; then
199 einfo "Starting GNU screen to be able to use a full featured shell environment."
200 einfo "Just exit the shells (and therefore screen) to continue boot process..."
201 /bin/zsh -c "screen -c /etc/grml/screenrc"
203 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
204 einfo "Just exit the shell to continue boot process..."
216 if checkbootparam 'log' || checkbootparam 'debug' ; then
217 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
219 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
221 einfo "Starting bootlogd." # known to be *very* unreliable :(
222 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
230 # {{{ set firmware timeout via bootparam
232 if checkbootparam 'fwtimeout' ; then
233 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
234 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
235 rmmod firmware_class >>$DEBUG 2>&1
236 modprobe firmware_class ; eend $?
238 if [ -z "$TIMEOUT" ] ; then
239 TIMEOUT="100" # linux kernel default: 10
241 if [ -f /sys/class/firmware/timeout ] ; then
242 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
243 echo $TIMEOUT > /sys/class/firmware/timeout ; eend $?
248 ### {{{ language configuration / localization
251 einfo "Activating language settings:"
254 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
255 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
257 # check for bootoption which overrides config from /etc/grml/autoconfig
258 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
259 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
261 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
262 if [ -z "$INSTALLED" ] ; then
263 [ -n "$LANGUAGE" ] || LANGUAGE='en'
266 if [ -x /usr/sbin/grml-setlang ] ; then
267 # if bootoption lang is used update /etc/default/locale accordingly
268 if [ -n "$BOOT_LANGUAGE" ] ; then
269 /usr/sbin/grml-setlang "$LANGUAGE"
270 # otherwise default to lang=en
272 /usr/sbin/grml-setlang "en"
277 if [ -z "$CONSOLEFONT" ] ; then
278 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
279 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
280 CONSOLEFONT='Uni3-Terminus16'
282 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
285 CONSOLEFONT='Lat15-Terminus16'
290 # export it now, so error messages get translated, too
291 [ -r /etc/default/locale ] && . /etc/default/locale
294 # configure keyboard layout, read in already set values first:
295 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
297 # now allow keyboard override by boot commandline for later use:
298 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
299 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
300 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
301 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
302 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
304 # modify /etc/sysconfig/keyboard only in live-cd mode:
305 if [ -z "$INSTALLED" ] ; then
307 local LANGUAGE="$BOOT_LANGUAGE"
308 . /etc/grml/language-functions
309 # allow setting xkeyboard explicitly different than console keyboard
310 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
311 if [ -n "$KXKEYBOARD" ]; then
312 XKEYBOARD="$KXKEYBOARD"
313 KDEKEYBOARD="$KXKEYBOARD"
314 elif [ -n "$KKEYBOARD" ]; then
315 XKEYBOARD="$KKEYBOARD"
316 KDEKEYBOARD="$KKEYBOARD"
319 # duplicate of previous code to make sure /etc/grml/language-functions
320 # does not overwrite our values....
321 # now allow keyboard override by boot commandline for later use:
322 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
323 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
324 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
325 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
326 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
328 # write keyboard related variables to file for later use
329 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
330 if ! [ -e /etc/sysconfig/keyboard ] ; then
331 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
332 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
333 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
334 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
338 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
340 # activate unicode console if running within utf8 environment
341 if [ -r /etc/default/locale ] ; then
342 if grep -q "LANG=.*UTF" /etc/default/locale ; then
343 einfo "Setting up unicode environment."
344 unicode_start >>$DEBUG 2>&1 ; eend $?
348 # Set default keyboard before interactive setup
349 if [ -n "$KEYTABLE" ] ; then
350 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
351 loadkeys -q $KEYTABLE &
355 # we have to set up all consoles, therefore loop it over all ttys:
356 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
357 if [ -n "$NUM_CONSOLES" ] ; then
358 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
359 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
361 CUR_CONSOLE=$(fgconsole 2>/dev/null)
363 if [ -x "$(which setfont)" ] ; then
365 elif [ -x "$(which consolechars)" ] ; then
366 use_consolechars=true
368 eerror "Neither setfont nor consolechars tool present, can not set font."
373 if [ -n "$CHARMAP" ] ; then
374 einfo "Setting font to ${CHARMAP}"
376 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
377 if $use_setfont ; then
378 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
379 elif $use_consolechars ; then
380 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
383 if [ -n "$CUR_CONSOLE" ] ; then
384 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
389 if checkbootparam 'noconsolefont' ; then
390 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
392 if [ -n "$CONSOLEFONT" ] ; then
393 einfo "Setting font to ${CONSOLEFONT}"
395 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
396 if $use_setfont ; then
397 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
398 elif $use_consolechars ; then
399 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
402 if [ -n "$CUR_CONSOLE" ] ; then
403 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
415 if ! checkbootparam 'hostname' ; then
419 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
420 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
421 einfo "Generating random hostname as no hostname was specified."
422 HOSTNAME="$(/usr/bin/random-hostname)"
426 einfo "Setting hostname to $HOSTNAME as requested."
427 grml-hostname $HOSTNAME >>$DEBUG
432 # fstabuser (needed when running from harddisk with username != grml {{{
434 # force load of build-in and local config
435 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
436 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
438 # 1st. try configured fstab user
439 if [ -n "$CONFIG_FSTAB_USER" ] ; then
440 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
443 # 2nd. use standard user id
444 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
446 # 3rd. use standard user name
447 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
449 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
450 [ -n "$fstabuser" ] || fstabuser='root'
454 # local_user (needed when running with username != grml {{{
457 # force load of build-in and local config
458 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
459 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
461 # 1st. try id of primary user
462 localuser=$(getent passwd 1000 | cut -d: -f1)
464 # 2nd. use name standard user
465 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
471 einfo "Mounting configfs"
472 CONFIGFS_DIR=/sys/kernel/config/
473 modprobe configfs 2>/dev/null 1>&2
474 if ! [ -d "$CONFIGFS_DIR" ] ; then
476 einfo "$CONFIGFS_DIR does not exist, can't mount directory"
480 mount -t configfs configfs "$CONFIGFS_DIR" 2>/dev/null 1>&2
486 # {{{ Set clock (Local time is more often used than GMT, so it is default)
488 # don't touch the files if running from harddisk:
489 if [ -z "$INSTALLED" ]; then
490 # The default hardware clock timezone is stated as representing local time.
492 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
493 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
494 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
495 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
496 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
497 # hwclock uses the TZ variable
498 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
499 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
500 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
501 ewarn "Warning: unknown timezone $KTZ" ; eend 1
503 ewarn "Falling back to timezone $KTZ" ; eend 0
506 if ! [ -r /dev/rtc ] ; then
507 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
510 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
511 if [ -n "$ERROR" ] ; then
513 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
514 if [ -n "$ERROR" ] ; then
515 eerror "Problem running hwclock: $ERROR" ; eend 1
524 # {{{ print kernel info
526 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
527 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
529 einfo "Running Linux Kernel $KERNEL" ; eend 0
532 if [ -r /proc/cpuinfo ] ; then
533 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
535 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
540 if [ -d /proc/xen ] ; then
542 einfo 'Running kernel featuring support for Xen detected' ; eend 0
548 # {{{ ld.so.cache + depmod
550 if [ -n "$INSTALLED" ]; then
551 if ! [ -r /etc/grml.first.boot ] ; then
552 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
554 # Regenerate ld.so.cache and module dependencies on HD
555 einfo "Running ldconfig" ; ldconfig ; eend $?
556 einfo "Running depmod" ; depmod -a ; eend $?
557 touch /etc/grml.first.boot
567 # don't touch the files if running from harddisk:
568 if [ -z "$INSTALLED" ]; then
569 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
570 if [ -n "$KTZ" ] ; then
571 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
573 ewarn "Warning: unknown timezone $KTZ"; eend 0
575 einfo "Setting timezone."
577 area=$(echo $KTZ | cut -d '/' -f1)
578 zone=$(echo $KTZ | cut -d '/' -f2)
579 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
580 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
582 echo $KTZ > /etc/timezone
584 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
591 # small computer / nearly no ram {{{
594 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
595 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
598 if checkbootparam 'small'; then
599 einfo "Information: ${RAM} kB of RAM available." ; eend 0
600 einfo "Bootoption small detected. Activating small system."
601 if [ -r /etc/inittab.small ] ; then
602 mv /etc/inittab /etc/inittab.normal
603 mv /etc/inittab.small /etc/inittab
605 sed -i 's/^9/#&/' /etc/inittab
606 sed -i 's/^10/#&/' /etc/inittab
607 sed -i 's/^11/#&/' /etc/inittab
608 sed -i 's/^12/#&/' /etc/inittab
610 /sbin/telinit q ; eend $?
612 if checkgrmlsmall ; then
613 if [[ $RAM -lt 25000 ]] ; then
614 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
615 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
616 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
617 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
620 einfo "Information: ${RAM} kB of RAM available." ; eend 0
623 if [[ $RAM -lt 58000 ]] ; then
624 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
625 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
626 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
627 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
630 einfo "Information: ${RAM} kB of RAM available." ; eend 0
638 # skip startup of w3m {{{
640 if checkbootparam 'fast'; then
641 ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
642 sed -i '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab
643 /sbin/telinit q ; eend $?
648 # activate serial console {{{
650 if checkbootparam 'console'; then
655 einfo "Bootoption for serial console detected:"
659 line="${line#*[$ws]}"
661 while [ -n "$line" ]; do
665 local device="${this%%,*}"
666 local device="${device##*=}"
667 if echo $serial | grep -q ttyS ; then
668 local option="${serial##*,}"
669 # default (works for kvm & CO):
670 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
671 # ... unless overriden by command line:
673 115200*) speed=115200 ;;
674 57600*) speed=57600 ;;
675 38400*) speed=38400 ;;
676 19200*) speed=19200 ;;
683 einfo "Activating console login on device ${device} with speed ${speed}."
684 local number="${device#ttyS}"
685 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
692 this="${line%%[$ws]*}"
693 line="${line#*[$ws]}"
696 if [ -n "$telinitq" ]; then
704 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
705 # otherwise we will get: passwd: Authentication token lock busy
707 if [ -z "$INSTALLED" ] ; then
715 if checkbootparam 'testcd' ; then
716 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
720 local FOUND_FILE=false
721 local logfile='/tmp/md5sum.log'
725 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
726 einfo "Checking files against $md5, this may take a while..."
731 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
732 if [ $pipestatus[1] -eq 0 ] ; then
738 if ! $FOUND_FILE ; then
739 eerror 'Error: Could not find md5sum file' ; eend 1
744 einfo "Everything looks OK" ; eend 0
746 eerror 'Checksum failed for theses files:' ; eend 1
747 egrep -v '(^md5sum:|OK$)' "${logfile}"
748 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
749 einfon "Hit return to continue, or press the power button to shut down system."
758 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
760 if checkbootparam 'blacklist' ; then
761 if [ -z "$INSTALLED" ]; then
762 einfo "Bootoption blacklist found."
763 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
764 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
765 if [ -n "$BLACK" ] ; then
766 for module in $(echo ${BLACK//,/ }) ; do
767 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
768 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
769 echo "blacklist $module" >> "$BLACKLIST_FILE"
770 echo "alias $module off" >> "$BLACKLIST_FILE"
771 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
774 eerror "No given module for blacklist found. Blacklisting will not work therefore."
777 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
779 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
788 if checkbootparam 'noacpi'; then
789 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
790 elif checkbootparam 'nogrmlacpi' ; then
791 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
792 elif [ ! -d /proc/acpi ] ; then
793 ewarn "ACPI: Kernel support not present." ; eend 0
795 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
798 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
800 basename="${basename%%.*}"
801 case "$basename" in *_acpi)
802 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
804 modprobe $basename >>$DEBUG 2>&1 && found="yes"
805 local BASE="$BASE $basename"
807 if [ -n "$found" ] ; then
808 einfo "$BASE" ; eend 0
810 ewarn "(none)" ; eend 1
812 if ! pgrep acpid >/dev/null ; then
813 einfo "Starting acpi daemon."
814 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
816 ewarn "acpi daemon already running."
824 # {{{ Collect partitions from /proc/partitions first for enabling DMA
828 while read major minor blocks partition relax; do
829 partition="${partition##*/}"
830 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
832 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
833 sd?) ;; # SCSI Harddisk, entire disk
834 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
835 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
838 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
841 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
846 if checkbootparam 'brltty' ; then
847 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
852 # {{{ Enable DMA for all IDE drives now if not disabled
853 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
855 if checkbootparam 'nodma'; then
856 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
858 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
859 if test -d /proc/ide/$d; then
860 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
861 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
862 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
863 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
864 echo "using_dma:1" >/proc/ide/$d/settings
873 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
876 NOSWAP="yes" # we do not use swap by default!
877 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
879 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
882 # Scan for swap, config, homedir - but only in live-mode
883 if [ -z "$INSTALLED" ] ; then
884 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
887 HOMEDIR="$(getbootparam 'home')"
888 if [ -n "$partitions" ]; then
889 while read p m f relax; do
890 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
891 partoptions="users,exec"
893 # it's a swap partition?
896 if [ -n "$NOSWAP" ]; then
897 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
900 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
901 S1SUSP|S2SUSP|pmdisk|[zZ]*)
902 if [ -n "$ANYSWAP" ] ; then
903 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
904 swapon $p 2>>$DEBUG ; eend $?
906 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
910 if [[ "$p" == LABEL* ]] ; then
911 p=$(blkid -t $p | awk -F: '{print $1}')
913 if grep -q $p /proc/swaps ; then
914 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
916 if [ -b "$p" ] ; then
917 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
918 swapon $p 2>>$DEBUG ; eend $?
920 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
929 esac # it's a swap partition?
934 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
935 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
937 # *) NONEFOUND='1'; continue ;;
941 if [ -z "$NOSWAP" ] ; then
942 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
943 # Activate swapfile, if exists
944 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
946 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
947 mount -o remount,rw $m && MOUNTED=1
948 if swapon "$SWAPFILE" 2>>$DEBUG ; then
950 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
952 fnew="$SWAPFILE swap swap defaults 0 0"
953 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
954 GRML_SWP="$GRML_SWP $SWAPFILE"
957 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
960 # use a image as home
961 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
962 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
963 if [ -n "$HOMEDIR" ]; then
964 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
968 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
970 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
975 # Umount, if not in use
976 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
988 if [ -n "$MOUSE_DEVICE" ] ; then
989 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
994 # {{{ IPv6 configuration
995 # Load IPv6 kernel module and print IP adresses
997 if checkbootparam 'ipv6'; then
998 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1000 # we probably need some time until stateless autoconfiguration has happened
1002 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1003 for DEVICE in `echo "$NETDEVICES"`; do
1006 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1007 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1009 for ADDR in `echo "$ADDRESSES"` ; do
1012 if [ "$COUNT" -eq "0" ] ; then
1013 einfo "(none)" ; eend 1
1025 if checkbootparam 'nocpu'; then
1026 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1030 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
1032 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)
1033 echo $CPU | sed 's/ \{1,\}/ /g'
1036 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
1039 # no cpufreq setup inside VirtualBox
1040 if $VIRTUALBOX ; then
1041 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1045 if [ -x /etc/init.d/loadcpufreq ] ; then
1046 einfo "Trying to set up cpu frequency scaling:"
1048 SKIP_CPU_GOVERNOR=''
1049 LOADCPUFREQ=$(mktemp)
1050 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1051 if grep -q FATAL "$LOADCPUFREQ" ; then
1057 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1058 eerror "$line" ; eend $RC
1062 elif grep -q done "$LOADCPUFREQ" ; then
1063 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1064 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1065 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1068 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1074 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1075 if grep -vq ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
1076 einfo "Loading cpufreq_ondemand"
1077 modprobe cpufreq_ondemand
1081 einfo "Setting ondemand governor"
1083 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1084 echo ondemand > $file || RC=1
1094 # {{{ autostart of ssh
1096 if checkbootparam 'ssh' ; then
1098 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1101 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
1102 [ -z "$localuser" ] && eend 1
1105 if [ -z "$PASSWD" ] ; then
1106 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1110 if [ -n "$PASSWD" ] ; then
1112 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1116 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1117 echo "root:$PASSWD" | chpasswd $chpass_options
1120 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1124 einfo "Starting secure shell server in background for root and user $localuser"
1125 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1126 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1134 # {{{ display hostkeys of SSH server
1135 config_display_ssh_fingerprints() {
1136 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
1137 return 0 # no SSH host keys present
1140 einfo "SSH key fingerprints:"
1141 for file in /etc/ssh/ssh_host_*_key ; do
1143 ssh-keygen -l -f $file
1149 # {{{ autostart of x11vnc
1151 if checkbootparam 'vnc' ; then
1154 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1155 einfo "Bootoption vnc found, trying to set password for user $localuser."
1157 if [ -z "$VNC_PASSWD" ] ; then
1158 if [ -x /usr/bin/apg ] ; then
1159 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1160 elif [ -x /usr/bin/gpw ] ; then
1161 VNC_PASSWD="$(gpw 1)"
1162 elif [ -x /usr/bin/pwgen ] ; then
1163 VNC_PASSWD="$(pwgen -1 8)"
1164 elif [ -x /usr/bin/hexdump ] ; then
1165 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1166 elif [ -n "$RANDOM" ] ; then
1167 VNC_PASSWD="${localuser}${RANDOM}"
1170 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1174 if [ -n "$VNC_PASSWD" ] ; then
1175 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1180 # finally check if we have a password we can use:
1181 if [ -n "$VNC_PASSWD" ] ; then
1183 VNCDIR="/home/${localuser}/.vnc"
1184 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1186 if [ ! -x /usr/bin/x11vnc ] ; then
1187 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1190 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1191 /bin/chown -R "$localuser": "$VNCDIR"
1194 if checkbootparam 'vnc_connect' ; then
1196 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1197 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1198 #store the options in a file
1199 VNCDIR="/home/${localuser}/.vnc"
1200 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1201 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1207 # {{{ set password for root and default user
1209 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1211 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1214 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1215 [ -z "$localuser" ] && eend 1
1218 if [ -z "$PASSWD" ] ; then
1219 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1223 if [ -n "$PASSWD" ] ; then
1225 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1229 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1230 echo "root:$PASSWD" | chpasswd $chpass_options
1233 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1239 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1241 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1243 if [ -z "$PASSWD" ] ; then
1244 eerror "No hashed password found, can not set password."
1250 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1251 [ -z "$localuser" ] && eend 1
1253 if [ -n "$PASSWD" ] ; then
1256 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1257 echo "root:$PASSWD" | chpasswd $chpass_options
1260 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1270 if ! [ -x /usr/bin/amixer ] ; then
1271 eerror "amixer binary not available. Can not set sound volumes therefore."
1274 if ! [ -r /proc/asound/cards ] ; then
1275 ewarn "No soundcard present, skipping mixer settings therefore."
1280 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1281 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1284 if checkbootparam 'vol' ; then
1285 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1286 if [ -z "$VOL" ] ; then
1287 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1295 if checkbootparam 'nosound' ; then
1296 einfo "Muting sound devices on request."
1297 ERROR=$(amixer -q set Master mute)
1299 if [ -n "$ERROR" ] ; then
1301 eerror "Problem muting sound devices: $ERROR"
1305 elif [ -z "$INSTALLED" ] ; then
1306 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1308 if checkbootparam 'micvol' ; then
1309 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1310 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1315 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1319 for CONTROL in ${=CONTROLS} ; do
1320 # such devices can not be controlled with amixer ... unmute
1321 [[ "$CONTROL" == *Console* ]] && continue
1323 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1324 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1325 amixer -c $card -q set "${CONTROL}" unmute
1327 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1328 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1332 if [ ${MICVOL} -ne 0 ] ; then
1333 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1334 amixer -c $card -q set "${CONTROL}" unmute
1336 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1337 amixer -c $card -q set "${CONTROL}" $MICVOL%
1343 fi # checkbootparam 'nosound'
1350 # {{{ modem detection
1352 if checkbootparam 'nomodem'; then
1353 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1355 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1356 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1357 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1366 config_wondershaper(){
1367 if checkbootparam 'wondershaper' ; then
1368 WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1373 if [ -n "$WONDER" ]; then
1375 DEVICE="${WONDER%%,*}"
1377 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1379 DOWNSTREAM="${WONDER%%,*}"
1381 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1383 UPSTREAM="${WONDER%%,*}"
1388 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1389 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1390 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1391 einfo "Starting wondershaper (${CMD}) in background."
1392 ( sh -c $CMD & ) && eend 0
1399 if checkbootparam 'nosyslog'; then
1400 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1403 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1404 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1405 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1406 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1407 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1409 if [ -z "$SYSLOGD" ] ; then
1410 eerror "No syslog daemon found." ; eend 1
1412 einfo "Starting $SYSLOGD in background."
1413 /etc/init.d/$SYSLOGD start >>$DEBUG &
1422 if checkbootparam 'nogpm'; then
1423 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1425 if ! [ -r /dev/input/mice ] ; then
1426 eerror "No mouse found - not starting GPM." ; eend 1
1428 einfo "Starting gpm in background."
1429 /etc/init.d/gpm start >>$DEBUG &
1430 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1439 if checkbootparam 'services' ; then
1440 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1441 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1442 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1443 for service in $(echo -e $SERVICELIST) ; do
1444 # support running (custom) init scripts in non-blocking mode
1445 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1446 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1447 einfo "Starting service ${service}."
1448 /etc/init.d/${service} start >>$DEBUG
1450 einfo "Starting service ${service} in background."
1451 /etc/init.d/${service} start >>$DEBUG &
1461 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1462 SOURCE=$(eval echo "$1")
1465 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1466 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1468 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1470 while ! getconfig && [[ "$counter" != 0 ]] ; do
1471 echo -n "Sleeping for 1 second and trying to get config again... "
1472 counter=$(( counter-1 ))
1473 echo "$counter tries left" ; sleep 1
1475 if [ -s "$TARGET" ] ; then
1476 einfo "Downloading was successfull." ; eend 0
1477 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1478 md5sum ${TARGET} ; eend 0
1481 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1489 if checkbootparam 'netconfig' ; then
1490 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1491 CONFIGFILE='/tmp/netconfig.grml'
1493 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1494 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1501 # {{{ remote scripts
1502 config_netscript() {
1503 if checkbootparam 'netscript' ; then
1504 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1505 SCRIPTFILE='/tmp/netscript.grml'
1507 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1508 chmod +x ${SCRIPTFILE}
1509 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1518 if ! checkbootparam 'nostats' ; then
1519 BASE_URL="http://stats.grml.org/report/"
1522 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1524 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1525 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1526 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1527 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1529 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1531 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1532 [ -z "$BOOT" ] && BOOT="local"
1534 ADDITIONAL_PARAMS=""
1535 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1536 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1538 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1540 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1545 # {{{ fix/workaround for unionfs
1547 if [ -z "$INSTALLED" ]; then
1548 touch /var/cache/apt/*cache.bin
1553 # {{{ start X window system via grml-x
1555 # make sure we start X only if startx is used *before* a nostartx option
1556 # so it's possible to disable automatic X startup using nostart
1557 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1558 if [ -x "$(which X)" ] ; then
1559 if [ -z "$INSTALLED" ] ; then
1560 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1561 if [ -z "$WINDOWMANAGER" ] ; then
1562 einfo "No window manager specified. Using default one." && eend 0
1564 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1566 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1568 cat>|/etc/init.d/xstartup<<EOF
1570 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1572 chmod 755 /etc/init.d/xstartup
1574 # adjust inittab for xstartup
1575 if grep -q '^6:' /etc/inittab ; then
1576 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
1577 else # just append tty6 to inittab if no definition is present:
1578 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1581 /sbin/telinit q ; eend $?
1583 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1584 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1586 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1590 eerror "We are not running in live mode - startx will not work, skipping it."
1591 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1594 eerror "/usr/bin/X is not present on this grml flavour."
1595 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1601 # {{{ configuration framework
1603 if checkbootparam 'extract' ; then
1604 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1605 EXTRACTOPTIONS="-- -x $EXTRACT"
1609 config_finddcsdir() {
1610 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1611 # on the command line, nothing is changed and the dcs files are
1612 # searched within the .iso, $dcs-dir is set to the root directory
1614 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1615 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1616 # set, $dcs-dir is set to the root directory within the .iso.
1617 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1618 # foo, even if a GRMLCFG partition is present.
1621 # autoconfig, see issue673
1622 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1623 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1624 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1625 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1626 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1628 if [ -z "$INSTALLED" ] ; then
1629 if checkbootparam 'myconfig' ; then
1630 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1631 if [ -z "$DCSDEVICE" ]; then
1632 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1633 fi # [ -z "$DCSDEVICE" ]
1634 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1635 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1637 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1639 modprobe 9p 2>/dev/null || true
1640 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1641 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1642 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1643 DCSDEVICE="$GRMLCFG"
1644 MOUNTOPTIONS="ro,trans=virtio"
1649 if [ -n "$DCSDEVICE" ]; then
1650 DCSMP="/mnt/grmlcfg"
1655 # if not specified/present then assume default:
1656 if [ -z "$DCSDEVICE" ]; then
1657 DCSDIR="${LIVECD_PATH}"
1660 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1661 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1662 if [ -n "$DCSDIR" ]; then
1663 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1665 [ -d $DCSMP ] || mkdir $DCSMP
1666 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1667 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1668 if [[ $RC == 0 ]]; then
1669 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1671 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1680 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1681 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1682 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1683 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1689 if checkbootparam 'partconf' ; then
1690 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1691 if [ -n "$MOUNTDEVICE" ]; then
1692 [ -d /mnt/grml ] || mkdir /mnt/grml
1693 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1694 if [[ $RC == 0 ]]; then
1695 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1696 einfo "Copying files from $MOUNTDEVICE over grml system."
1697 for file in `cat /etc/grml/partconf` ; do
1698 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1699 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1702 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1703 fi # mount $MOUNTDEVICE
1704 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1706 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1707 fi # [ -n "$MOUNTDEVICE" ]
1712 # {{{ /cdrom/.*-options
1714 if checkbootparam 'debs' ; then
1715 iszsh && setopt localoptions shwordsplit
1716 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1717 if [ -z "$DEBS" ] ; then
1720 if ! echo $DEBS | grep -q '/'; then
1721 # backwards compatibility: if no path is given get debs from debs/
1724 einfo "Trying to install Debian package(s) ${DEBS}"
1725 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1726 dpkg -i $DEBS ; eend $?
1731 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1732 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1733 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1734 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1736 if ! echo $SCRIPTS | grep -q '/'; then
1737 # backwards compatibility: if no path is given get scripts from scripts/
1738 SCRIPTS="scripts/$SCRIPTS"
1740 if [ -n "$SCRIPTS" ]; then
1741 SCRIPTS="${DCSDIR}/$SCRIPTS"
1742 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1743 einfo "Trying to execute ${SCRIPTS}"
1746 elif [ -d "$SCRIPTS" ]; then
1747 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1748 run-parts --regex '.*' $SCRIPTS
1751 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1760 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1761 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1762 if [ -z "$CONFIG" ]; then
1763 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1765 if [ -n "$CONFIG" ]; then
1766 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1767 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1769 cp -a ${DCSDIR}/${CONFIG}/* /
1770 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1771 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1774 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1776 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1783 # {{{ confing_umount_dcsdir
1784 config_umount_dcsdir(){
1785 # umount $DCSMP if it was mounted by finddcsdir
1786 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1792 if checkbootparam 'mypath' ; then
1793 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1794 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1795 touch /etc/grml/my_path
1796 chmod 644 /etc/grml/my_path
1797 # make sure the directories exist:
1799 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1800 if ! [ -d "$i" ] ; then
1801 einfo "Creating directory $i"
1802 mkdir -p "$i" ; eend $?
1805 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1813 if checkbootparam 'distcc' ; then
1814 OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1815 if [ -n "$OPTIONS" ]; then
1818 if [ -n "$OPTIONS" ]; then
1819 NET="${OPTIONS%%,*}"
1821 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1823 INTERFACE="${OPTIONS%%,*}"
1828 CONFIG=/etc/default/distcc
1829 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1830 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1832 if [ -n "$INTERFACE" ] ; then
1833 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1836 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1837 counter=$(( counter-1 ))
1838 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1840 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1844 if [ -n "$IP" ] ; then
1845 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1847 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1849 id distccd >/dev/null 2>&1 || \
1851 einfo "Creating distcc user" ; \
1852 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1855 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1856 /etc/init.d/distcc start >/dev/null ; eend $?
1859 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1863 if checkbootparam 'gcc'; then
1864 GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
1866 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1869 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1872 if checkbootparam 'gpp'; then
1873 GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
1875 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1876 if [ -x /usr/bin/g++-${GPP} ] ; then
1878 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1880 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1881 if [ -x /usr/bin/cpp-${GPP} ] ; then
1883 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1892 # Notice: use it only on live-cd system, if running from harddisk please
1893 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1894 # in /etc/runlevel.conf
1896 MODULES_FILE=/etc/grml/modules
1897 if checkbootparam 'nomodules' ; then
1898 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1899 elif [ -z "$INSTALLED" ]; then
1900 if [ -r $MODULES_FILE ] ; then
1901 einfo "Loading modules specified in ${MODULES_FILE}:"
1903 grep '^[^#]' $MODULES_FILE | \
1904 while read module args; do
1905 [ "$module" ] || continue
1907 modprobe $module $args ; eend $?
1911 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1919 [ -n "$INSTALLED" ] && return 0
1921 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
1922 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1923 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
1924 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1926 [ -e /proc/mdstat ] || modprobe md_mod
1927 if ! [ -x /sbin/mdadm ] ; then
1928 eerror "mdadm not available, can not execute it." ; eend 1
1931 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1932 # find out whether we have a valid configuration file already
1933 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1934 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1935 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1936 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1938 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1941 if ! checkbootparam 'swraid' ; then
1943 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1946 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1951 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1953 *'No arrays found'*)
1954 ewarn "$line" ; eend 0
1957 einfo "$line" ; eend 0
1964 if [ -r /proc/mdstat ] ; then
1966 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1967 if [ -z "$MDSTAT" ] ; then
1968 ewarn "No active arrays found" ; eend 0
1973 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1974 einfo "active arrays: $line" ; eend 0
1980 fi # bootoption swraid
1982 fi # is /sbin/mdadm executable?
1983 fi # check for bootoptions
1989 [ -n "$INSTALLED" ] && return 0
1991 if checkbootparam 'nodmraid' ; then
1992 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1996 if ! [ -x /sbin/dmraid ] ; then
1997 eerror "dmraid not available, can not execute it." ; eend 1
2002 # usage: dmraid_wrapper <dmraid_option>
2003 [ -n "$1" ] || return 1
2010 for line in $(dmraid $1 ; echo errcode:$?); do
2012 *'no block devices found'*)
2013 einfo "No block devices found" ; eend 0
2017 einfo "No active dmraid devices found" ; eend 0
2036 if checkbootparam 'dmraid' ; then
2037 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
2038 if [ "$ACTION" = "off" ] ; then
2039 # Deactivates all active software RAID sets:
2040 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
2043 # Activate all software RAID sets discovered:
2044 einfo "Activating present dmraid sets (as requested via dmraid):"
2051 # by default (no special bootoptions) discover all software RAID devices:
2052 einfo "Searching for any present dmraid sets:"
2057 # {{{ LVM (Logical Volumes)
2059 [ -n "$INSTALLED" ] && return 0
2061 if checkbootparam 'nolvm' ; then
2062 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2064 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2065 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2066 eerror "LVM not available, can not execute it." ; eend 1
2068 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
2069 einfo "You seem to have logical volumes (LVM) on your system."
2071 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2073 if checkbootparam 'lvm' ; then
2074 einfo "Bootoption LVM found. Searching for logical volumes:"
2075 /etc/init.d/lvm2 start ; eend $?
2079 fi # check for lvm binary
2080 fi # check for bootoption nolvm
2084 # {{{ debnet: setup network based on an existing one found on a partition
2086 if checkbootparam 'debnet' ; then
2087 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2093 # {{{ disable console blanking
2095 if checkbootparam 'noblank' ; then
2096 einfo "Bootoption noblank found. Disabling monitor blanking."
2097 setterm -blank 0 ; eend $?
2102 # {{{ tohd= bootoption
2105 if checkbootparam 'tohd' ; then
2106 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2107 if [ -z "$TARGET" ] ; then
2108 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2109 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2113 if ! [ -b "$TARGET" ] ; then
2114 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2118 if grep -q $TARGET /proc/mounts ; then
2119 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2124 local MOUNTDIR=$(mktemp -d)
2126 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2127 einfo "Copyring live system to $TARGET - this might take a while"
2128 rsync -a --progress ${LIVECD_PATH}/live $MOUNTDIR
2132 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2134 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2143 # {{{ debootstrap: automatic installation
2144 config_debootstrap(){
2146 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2148 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2150 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2152 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2157 if checkbootparam 'target' ; then
2159 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2160 # notice: the following checks whether the given partition is available, if not the skip
2161 # execution of grml-debootstrap as it might result in data loss...
2162 if ! [ -r "$TARGET" ] ; then
2163 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2167 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2172 if checkbootparam 'grub' ; then
2174 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2177 if checkbootparam 'groot' ; then
2179 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2182 if checkbootparam 'release' ; then
2184 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2187 if checkbootparam 'mirror' ; then
2189 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2192 if checkbootparam 'boot_append' ; then
2194 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2197 if checkbootparam 'password' ; then
2199 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2202 # now check which options are available
2203 if [ -n "TARGET" ] ; then
2204 TARGETCMD="--target $TARGET"
2208 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2212 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2213 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2214 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2215 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2216 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2217 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2219 # and finally write script and execute it
2220 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2222 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2225 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2227 screen /usr/bin/grml-debootstrap_noninteractive
2228 einfo "Invoking a shell, just exit to continue booting..."
2231 fi # checkbootparam "BOOT_IMAGE=debian2hd
2235 config_virtualbox_shared_folders() {
2236 if $VIRTUALBOX ; then
2237 einfo "VirtualBox detected, trying to set up Shared Folders."
2238 if ! modinfo vboxsf &>/dev/null ; then
2239 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
2241 elif ! [ -x /usr/sbin/VBoxService ] ; then
2242 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
2247 einfo "Loading vboxsf driver."
2248 lsmod | grep -q vboxsf || modprobe vboxsf
2251 einfo "Adjusting /dev/vboxguest."
2252 chown root:vboxsf /dev/vboxguest
2253 chmod 660 /dev/vboxguest
2258 einfo "Adding $fstabuser to group vboxsf."
2259 adduser grml vboxsf &>/dev/null
2262 einfo "Starting VBoxService."
2263 VBoxService >/dev/null
2266 local vbautomation='automation'
2267 if checkbootparam 'vbautomation'; then
2268 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
2271 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
2272 ewarn "No automount shared folder '$vbautomation' available"
2275 einfo "Found automount shared folder '$vbautomation'"
2278 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
2279 [ -n "$distri" ] || distri='grml'
2281 local vbox_auto_sf="/media/sf_${vbautomation}"
2283 sleep 1 # ugly but necessary
2287 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
2288 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
2290 counter=$(( counter-1 ))
2295 if ! [ -d "${vbox_auto_sf}" ] ; then
2296 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
2299 einfo "Found shared folders automation directory $vbox_auto_sf"
2303 if checkbootparam 'novbautomation' ; then
2304 einfo "Bootoption novbautomation found. Disabling automation script execution."
2307 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
2308 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
2311 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
2312 "${vbox_auto_sf}/${distri}"
2325 # {{{ Support customization
2327 if checkbootparam 'distri'; then
2328 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2329 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2330 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2331 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2332 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2333 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2339 ## END OF FILE #################################################################
2340 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2