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 # new initramfs layout:
19 [ -d /live/image ] && export LIVECD_PATH=/live/image
21 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
22 [ -z "$PS1" ] && trap "" 2 3 11
26 if [ -n "$ZSH_VERSION" ] ; then
32 # avoid 'no matches found: ...'
33 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
36 # {{{ Read in boot parameters
37 if [ -z "$CMDLINE" ]; then
38 # if CMDLINE was set from the outside, we're debugging.
39 # otherwise, take CMDLINE from Kernel and config files.
40 CMDLINE="$(cat /proc/cmdline)"
41 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
42 [ -d /live/image/bootparams/ ] && CMDLINE="$CMDLINE $(cat /live/image/bootparams/* | tr '\n' ' ')"
43 modprobe 9p 2>/dev/null || true
44 if grep -q 9p /proc/filesystems ; then
45 local TAG="grml-parameters"
46 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
47 local MOUNTDIR="$(mktemp -d)"
48 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
49 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
57 ### {{{ Utility Functions
59 # Get a bootoption's parameter: read boot command line and either
60 # echo last parameter's argument or return false.
68 result="${line##*[$ws]$1=}"
69 result="${result%%[$ws]*}"
77 # Check boot commandline for specified option
79 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
85 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
92 # Check if currently using a framebuffer
94 [ -e /dev/fb0 ] && return 0 || return 1
97 # Check wheter a configuration variable (like $CONFIG_TOHD) is
101 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
102 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
103 *) return 1 ;; # default
107 # Are we using grml-small?
109 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
114 # {{{ filesystems (proc, pts, sys) and fixes
116 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
120 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
124 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
128 # {{{ Check if we are running in live mode or from HD
130 [ -e /etc/grml_cd ] || INSTALLED="yes"
133 # {{{ source lsb-functions , color handling
134 if checkbootparam 'nocolor'; then
136 . /etc/grml/lsb-functions
137 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
139 . /etc/grml/lsb-functions
146 checkbootparam 'debug' && BOOTDEBUG="yes"
147 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
150 if [ -n "$BOOTDEBUG" ]; then
151 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
152 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
153 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
154 einfo "Just exit the shell to continue boot process..."
158 if [ -r /etc/grml/screenrc ] ; then
159 einfo "Starting GNU screen to be able to use a full featured shell environment."
160 einfo "Just exit the shells (and therefore screen) to continue boot process..."
161 /bin/zsh -c "screen -c /etc/grml/screenrc"
163 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
164 einfo "Just exit the shell to continue boot process..."
176 if checkbootparam 'log' || checkbootparam 'debug' ; then
177 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
179 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
181 einfo "Starting bootlogd." # known to be *very* unreliable :(
182 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
190 # {{{ set firmware timeout via bootparam
192 if checkbootparam 'fwtimeout' ; then
193 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
194 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
195 rmmod firmware_class >>$DEBUG 2>&1
196 modprobe firmware_class ; eend $?
198 if [ -z "$TIMEOUT" ] ; then
199 TIMEOUT="100" # linux kernel default: 10
201 if [ -f /sys/class/firmware/timeout ] ; then
202 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
203 echo $TIMEOUT > /sys/class/firmware/timeout ; eend $?
208 ### {{{ language configuration / localization
211 einfo "Activating language settings:"
214 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
215 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
217 # check for bootoption which overrides config from /etc/grml/autoconfig
218 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
219 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
221 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
222 if [ -z "$INSTALLED" ] ; then
223 [ -n "$LANGUAGE" ] || LANGUAGE='en'
226 if [ -x /usr/sbin/grml-setlang ] ; then
227 # if bootoption lang is used update /etc/default/locale accordingly
228 if [ -n "$BOOT_LANGUAGE" ] ; then
229 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "$LANGUAGE"
230 # otherwise default to lang=en
232 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en"
237 if [ -z "$CONSOLEFONT" ] ; then
238 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
239 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
240 CONSOLEFONT='Uni3-Terminus16'
242 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
245 CONSOLEFONT='Lat15-Terminus16'
250 # export it now, so error messages get translated, too
251 if checkgrmlsmall ; then
252 export LANG='C' # grml-small does not provide any further locales
254 [ -r /etc/default/locale ] && . /etc/default/locale
258 # configure keyboard layout, read in already set values first:
259 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
261 # now allow keyboard override by boot commandline for later use:
262 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
263 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
264 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
265 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
266 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
268 # modify /etc/sysconfig/keyboard only in live-cd mode:
269 if [ -z "$INSTALLED" ] ; then
271 local LANGUAGE="$BOOT_LANGUAGE"
272 . /etc/grml/language-functions
273 # allow setting xkeyboard explicitly different than console keyboard
274 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
275 if [ -n "$KXKEYBOARD" ]; then
276 XKEYBOARD="$KXKEYBOARD"
277 KDEKEYBOARD="$KXKEYBOARD"
278 elif [ -n "$KKEYBOARD" ]; then
279 XKEYBOARD="$KKEYBOARD"
280 KDEKEYBOARD="$KKEYBOARD"
283 # duplicate of previous code to make sure /etc/grml/language-functions
284 # does not overwrite our values....
285 # now allow keyboard override by boot commandline for later use:
286 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
287 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
288 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
289 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
290 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
292 # write keyboard related variables to file for later use
293 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
294 if ! [ -e /etc/sysconfig/keyboard ] ; then
295 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
296 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
297 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
298 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
302 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
304 # activate unicode console if running within utf8 environment
305 if [ -r /etc/default/locale ] ; then
306 if grep -q "LANG=.*UTF" /etc/default/locale ; then
307 einfo "Setting up unicode environment."
308 unicode_start >>$DEBUG 2>&1 ; eend $?
312 # Set default keyboard before interactive setup
313 if [ -n "$KEYTABLE" ] ; then
314 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
315 loadkeys -q $KEYTABLE &
319 # we have to set up all consoles, therefore loop it over all ttys:
320 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
321 if [ -n "$NUM_CONSOLES" ] ; then
322 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
323 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
325 CUR_CONSOLE=$(fgconsole 2>/dev/null)
327 if [ -x "$(which setfont)" ] ; then
329 elif [ -x "$(which consolechars)" ] ; then
330 use_consolechars=true
332 eerror "Neither setfont nor consolechars tool present, can not set font."
337 if [ -n "$CHARMAP" ] ; then
338 einfo "Setting font to ${CHARMAP}"
340 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
341 if $use_setfont ; then
342 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
343 elif $use_consolechars ; then
344 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
347 if [ -n "$CUR_CONSOLE" ] ; then
348 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
353 if checkbootparam 'noconsolefont' ; then
354 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
356 if [ -n "$CONSOLEFONT" ] ; then
357 einfo "Setting font to ${CONSOLEFONT}"
359 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
360 if $use_setfont ; then
361 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
362 elif $use_consolechars ; then
363 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
366 if [ -n "$CUR_CONSOLE" ] ; then
367 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
379 if checkbootparam 'hostname' ; then
380 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
381 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
382 einfo "Generating random hostname as no hostname was specified."
383 HOSTNAME="$(/usr/bin/random-hostname)"
386 einfo "Setting hostname to $HOSTNAME as requested."
387 grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
388 [ "$RC" = "0" ] && hostname $HOSTNAME
391 hostname --file /etc/hostname
396 # fstabuser (needed when running from harddisk with username != grml {{{
398 # force load of build-in and local config
399 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
400 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
402 # 1st. try configured fstab user
403 if [ -n "$CONFIG_FSTAB_USER" ] ; then
404 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
407 # 2nd. use standard user id
408 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
410 # 3rd. use standard user name
411 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
413 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
414 [ -n "$fstabuser" ] || fstabuser='root'
418 # local_user (needed when running with username != grml {{{
421 # force load of build-in and local config
422 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
423 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
425 # 1st. try id of primary user
426 localuser=$(getent passwd 1000 | cut -d: -f1)
428 # 2nd. use name standard user
429 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
435 einfo "Mounting configfs"
436 CONFIGFS_DIR=/sys/kernel/config/
437 modprobe configfs 2>/dev/null 1>&2
438 if ! [ -d "$CONFIGFS_DIR" ] ; then
440 einfo "$CONFIGFS_DIR does not exist, can't mount directory"
444 mount -t configfs configfs "$CONFIGFS_DIR" 2>/dev/null 1>&2
450 # {{{ Set clock (Local time is more often used than GMT, so it is default)
452 # don't touch the files if running from harddisk:
453 if [ -z "$INSTALLED" ]; then
454 # The default hardware clock timezone is stated as representing local time.
456 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
457 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
458 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
459 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
460 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
461 # hwclock uses the TZ variable
462 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
463 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
464 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
465 ewarn "Warning: unknown timezone $KTZ" ; eend 1
467 ewarn "Falling back to timezone $KTZ" ; eend 0
470 if ! [ -r /dev/rtc ] ; then
471 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
474 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
475 if [ -n "$ERROR" ] ; then
477 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
478 if [ -n "$ERROR" ] ; then
479 eerror "Problem running hwclock: $ERROR" ; eend 1
488 # {{{ print kernel info
490 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
491 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
492 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
493 if [ -r /proc/cpuinfo ] ; then
494 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
496 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
500 if [ -d /proc/xen ] ; then
502 einfo 'Running kernel featuring support for Xen detected' ; eend 0
508 # {{{ ld.so.cache + depmod
510 if [ -n "$INSTALLED" ]; then
511 if ! [ -r /etc/grml.first.boot ] ; then
512 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
514 # Regenerate ld.so.cache and module dependencies on HD
515 einfo "Running ldconfig" ; ldconfig ; eend $?
516 einfo "Running depmod" ; depmod -a ; eend $?
517 touch /etc/grml.first.boot
527 # don't touch the files if running from harddisk:
528 if [ -z "$INSTALLED" ]; then
529 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
530 if [ -n "$KTZ" ] ; then
531 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
533 ewarn "Warning: unknown timezone $KTZ"; eend 0
535 einfo "Setting timezone."
537 area=$(echo $KTZ | cut -d '/' -f1)
538 zone=$(echo $KTZ | cut -d '/' -f2)
539 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
540 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
542 echo $KTZ > /etc/timezone
544 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
551 # small computer / nearly no ram {{{
554 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
555 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
558 if checkbootparam 'small'; then
559 einfo "Information: ${RAM} kB of RAM available." ; eend 0
560 einfo "Bootoption small detected. Activating small system."
561 if [ -r /etc/inittab.small ] ; then
562 mv /etc/inittab /etc/inittab.normal
563 mv /etc/inittab.small /etc/inittab
565 sed -i 's/^9/#&/' /etc/inittab
566 sed -i 's/^10/#&/' /etc/inittab
567 sed -i 's/^11/#&/' /etc/inittab
568 sed -i 's/^12/#&/' /etc/inittab
570 /sbin/telinit q ; eend $?
572 if checkgrmlsmall ; then
573 if [[ $RAM -lt 25000 ]] ; then
574 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
575 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
576 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
577 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
580 einfo "Information: ${RAM} kB of RAM available." ; eend 0
583 if [[ $RAM -lt 58000 ]] ; then
584 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
585 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
586 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
587 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
590 einfo "Information: ${RAM} kB of RAM available." ; eend 0
598 # skip startup of w3m {{{
600 if checkbootparam 'fast'; then
601 ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
602 sed -i '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab
603 /sbin/telinit q ; eend $?
608 # activate serial console {{{
610 if checkbootparam 'console'; then
615 einfo "Bootoption for serial console detected:"
619 line="${line#*[$ws]}"
621 while [ -n "$line" ]; do
625 local device="${this%%,*}"
626 local device="${device##*=}"
627 if echo $serial | grep -q ttyS ; then
628 local option="${serial##*,}"
629 # default (works for kvm & CO):
630 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
631 # ... unless overriden by command line:
633 115200*) speed=115200 ;;
634 57600*) speed=57600 ;;
635 38400*) speed=38400 ;;
636 19200*) speed=19200 ;;
643 einfo "Activating console login on device ${device} with speed ${speed}."
644 local number="${device#ttyS}"
645 sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab
652 this="${line%%[$ws]*}"
653 line="${line#*[$ws]}"
656 if [ -n "$telinitq" ]; then
664 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
665 # otherwise we will get: passwd: Authentication token lock busy
667 if [ -z "$INSTALLED" ] ; then
675 if checkbootparam 'testcd' ; then
676 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
681 rm -f /tmp/md5sum.log
682 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
683 einfo "Checking files against $md5, this may take a while..."
686 ( cd $(dirname "$md5") && md5sum -c $(basename "$md5") ; RC=$?) |& tee -a /tmp/md5sum.log
688 if [ $RC -ne 0 ] ; then
693 if [ $FOUND_FILE -eq 0 ] ; then
694 echo "${RED} *** Error: Could not find md5sum file. ***"
698 if [ "$ERROR" -eq 0 ]; then
699 einfo "Everything looks OK" ; eend 0
701 eerror 'Checksum failed for theses files:' ; eend 1
702 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
703 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
704 eerror '... RAM of your computer is broken.' ; eend 1
705 einfon "Hit return to continue, or press the reset button to quit."
714 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
716 if checkbootparam 'blacklist' ; then
717 if [ -z "$INSTALLED" ]; then
718 einfo "Bootoption blacklist found."
719 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
720 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
721 if [ -n "$BLACK" ] ; then
722 for module in $(echo ${BLACK//,/ }) ; do
723 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
724 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
725 echo "blacklist $module" >> "$BLACKLIST_FILE"
726 echo "alias $module off" >> "$BLACKLIST_FILE"
727 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
730 eerror "No given module for blacklist found. Blacklisting will not work therefore."
733 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
735 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
744 if checkbootparam 'noacpi'; then
745 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
746 elif checkbootparam 'nogrmlacpi' ; then
747 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
748 elif [ ! -d /proc/acpi ] ; then
749 ewarn "ACPI: Kernel support not present." ; eend 0
751 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
754 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
756 basename="${basename%%.*}"
757 case "$basename" in *_acpi)
758 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
760 modprobe $basename >>$DEBUG 2>&1 && found="yes"
761 local BASE="$BASE $basename"
763 if [ -n "$found" ] ; then
764 einfo "$BASE" ; eend 0
766 ewarn "(none)" ; eend 1
768 if ! pgrep acpid >/dev/null ; then
769 einfo "Starting acpi daemon."
770 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
772 ewarn "acpi daemon already running."
780 # {{{ Collect partitions from /proc/partitions first for enabling DMA
784 while read major minor blocks partition relax; do
785 partition="${partition##*/}"
786 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
788 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
789 sd?) ;; # SCSI Harddisk, entire disk
790 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
791 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
794 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
797 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
802 if checkbootparam 'brltty' ; then
803 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
808 # {{{ Enable DMA for all IDE drives now if not disabled
809 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
811 if checkbootparam 'nodma'; then
812 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
814 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
815 if test -d /proc/ide/$d; then
816 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
817 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
818 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
819 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
820 echo "using_dma:1" >/proc/ide/$d/settings
829 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
832 NOSWAP="yes" # we do not use swap by default!
833 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
835 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
838 # Scan for swap, config, homedir - but only in live-mode
839 if [ -z "$INSTALLED" ] ; then
840 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
843 HOMEDIR="$(getbootparam 'home')"
844 if [ -n "$partitions" ]; then
845 while read p m f relax; do
846 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
847 partoptions="users,exec"
849 # it's a swap partition?
852 if [ -n "$NOSWAP" ]; then
853 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
856 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
857 S1SUSP|S2SUSP|pmdisk|[zZ]*)
858 if [ -n "$ANYSWAP" ] ; then
859 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
860 swapon $p 2>>$DEBUG ; eend $?
862 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
866 if [[ "$p" == LABEL* ]] ; then
867 p=$(blkid -t $p | awk -F: '{print $1}')
869 if grep -q $p /proc/swaps ; then
870 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
872 if [ -b "$p" ] ; then
873 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
874 swapon $p 2>>$DEBUG ; eend $?
876 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
885 esac # it's a swap partition?
890 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
891 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
893 # *) NONEFOUND='1'; continue ;;
897 if [ -z "$NOSWAP" ] ; then
898 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
899 # Activate swapfile, if exists
900 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
902 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
903 mount -o remount,rw $m && MOUNTED=1
904 if swapon "$SWAPFILE" 2>>$DEBUG ; then
906 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
908 fnew="$SWAPFILE swap swap defaults 0 0"
909 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
910 GRML_SWP="$GRML_SWP $SWAPFILE"
913 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
916 # use a image as home
917 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
918 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
919 if [ -n "$HOMEDIR" ]; then
920 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
924 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
926 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
931 # Umount, if not in use
932 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
944 if [ -n "$MOUSE_DEVICE" ] ; then
945 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
950 # {{{ IPv6 configuration
951 # Load IPv6 kernel module and print IP adresses
953 if checkbootparam 'ipv6'; then
954 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
956 # we probably need some time until stateless autoconfiguration has happened
958 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
959 for DEVICE in `echo "$NETDEVICES"`; do
962 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
963 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
965 for ADDR in `echo "$ADDRESSES"` ; do
968 if [ "$COUNT" -eq "0" ] ; then
969 einfo "(none)" ; eend 1
981 if checkbootparam 'nocpu'; then
982 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
986 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
988 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)
989 echo $CPU | sed 's/ \{1,\}/ /g'
992 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
995 # no cpufreq setup inside VirtualBox
996 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
997 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1001 if [ -x /etc/init.d/loadcpufreq ] ; then
1002 einfo "Trying to set up cpu frequency scaling:"
1004 SKIP_CPU_GOVERNOR=''
1005 LOADCPUFREQ=$(mktemp)
1006 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1007 if grep -q FATAL "$LOADCPUFREQ" ; then
1013 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1014 eerror "$line" ; eend $RC
1018 elif grep -q done "$LOADCPUFREQ" ; then
1019 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1020 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1021 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1024 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1030 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1031 if grep -vq ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
1032 einfo "Loading cpufreq_ondemand"
1033 modprobe cpufreq_ondemand
1037 einfo "Setting ondemand governor"
1039 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1040 echo ondemand > $file || RC=1
1050 # {{{ autostart of ssh
1052 if checkbootparam 'ssh' ; then
1054 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1056 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
1057 [ -z "$localuser" ] && eend 1
1059 if [ -z "$SSH_PASSWD" ] ; then
1060 if [ -x /usr/bin/apg ] ; then
1061 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1062 elif [ -x /usr/bin/gpw ] ; then
1063 SSH_PASSWD="$(gpw 1)"
1064 elif [ -x /usr/bin/pwgen ] ; then
1065 SSH_PASSWD="$(pwgen -1 8)"
1066 elif [ -x /usr/bin/hexdump ] ; then
1067 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1068 elif [ -n "$RANDOM" ] ; then
1069 SSH_PASSWD="grml${RANDOM}"
1072 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1076 if [ -n "$SSH_PASSWD" ] ; then
1077 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1082 # finally check if we have a password we can use:
1083 if [ -n "$SSH_PASSWD" ] ; then
1084 # chpasswd sucks, seriously.
1086 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1089 echo "$localuser:$SSH_PASSWD" | chpasswd $chpass_options
1090 echo "root:$SSH_PASSWD" | chpasswd $chpass_options
1093 einfo "Starting secure shell server in background for root and user $localuser"
1094 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1095 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1099 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1105 # {{{ autostart of x11vnc
1107 if checkbootparam 'vnc' ; then
1109 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1110 einfo "Bootoption vnc found, trying to set password for user $localuser."
1112 if [ -z "$VNC_PASSWD" ] ; then
1113 if [ -x /usr/bin/apg ] ; then
1114 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1115 elif [ -x /usr/bin/gpw ] ; then
1116 VNC_PASSWD="$(gpw 1)"
1117 elif [ -x /usr/bin/pwgen ] ; then
1118 VNC_PASSWD="$(pwgen -1 8)"
1119 elif [ -x /usr/bin/hexdump ] ; then
1120 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1121 elif [ -n "$RANDOM" ] ; then
1122 VNC_PASSWD="${USER}${RANDOM}"
1125 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1129 if [ -n "$VNC_PASSWD" ] ; then
1130 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1135 # finally check if we have a password we can use:
1136 if [ -n "$VNC_PASSWD" ] ; then
1138 VNCDIR="/home/${USER}/.vnc"
1139 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1141 if [ ! -x /usr/bin/x11vnc ] ; then
1142 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1145 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1146 /bin/chown -R "$localuser": "$VNCDIR"
1149 if checkbootparam 'vnc_connect' ; then
1151 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1152 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1153 #store the options in a file
1154 VNCDIR="/home/${USER}/.vnc"
1155 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1156 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1162 # {{{ set password for default user
1164 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1165 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1167 einfo "Bootoption passwd found, change password for user '$localuser'."
1168 [ -z "$localuser" ] && eend 1
1169 if [ -n "$PASSWD" ] ; then
1170 echo "$localuser:$PASSWD" | chpasswd -m ; eend $?
1172 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1175 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1183 if ! [ -x /usr/bin/amixer ] ; then
1184 eerror "amixer binary not available. Can not set sound volumes therefore."
1187 if ! [ -r /proc/asound/cards ] ; then
1188 ewarn "No soundcard present, skipping mixer settings therefore."
1193 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1194 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1197 if checkbootparam 'vol' ; then
1198 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1199 if [ -z "$VOL" ] ; then
1200 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1208 if checkbootparam 'nosound' ; then
1209 einfo "Muting sound devices on request."
1210 ERROR=$(amixer -q set Master mute)
1212 if [ -n "$ERROR" ] ; then
1214 eerror "Problem muting sound devices: $ERROR"
1218 elif [ -z "$INSTALLED" ] ; then
1219 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1221 if checkbootparam 'micvol' ; then
1222 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1223 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1228 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1232 for CONTROL in ${=CONTROLS} ; do
1233 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1234 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1235 amixer -c $card -q set "${CONTROL}" unmute
1237 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1238 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1242 if [ ${MICVOL} -ne 0 ] ; then
1243 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1244 amixer -c $card -q set "${CONTROL}" unmute
1246 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1247 amixer -c $card -q set "${CONTROL}" $MICVOL%
1253 fi # checkbootparam 'nosound'
1260 # {{{ modem detection
1262 if checkbootparam 'nomodem'; then
1263 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1265 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1266 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1267 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1276 config_wondershaper(){
1277 if checkbootparam 'wondershaper' ; then
1278 WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1283 if [ -n "$WONDER" ]; then
1285 DEVICE="${WONDER%%,*}"
1287 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1289 DOWNSTREAM="${WONDER%%,*}"
1291 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1293 UPSTREAM="${WONDER%%,*}"
1298 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1299 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1300 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1301 einfo "Starting wondershaper (${CMD}) in background."
1302 ( sh -c $CMD & ) && eend 0
1309 if checkbootparam 'nosyslog'; then
1310 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1313 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1314 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1315 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1316 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1317 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1319 if [ -z "$SYSLOGD" ] ; then
1320 eerror "No syslog daemon found." ; eend 1
1322 einfo "Starting $SYSLOGD in background."
1323 /etc/init.d/$SYSLOGD start >>$DEBUG &
1332 if checkbootparam 'nogpm'; then
1333 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1335 if ! [ -r /dev/input/mice ] ; then
1336 eerror "No mouse found - not starting GPM." ; eend 1
1338 einfo "Starting gpm in background."
1339 /etc/init.d/gpm start >>$DEBUG &
1340 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1349 if checkbootparam 'services' ; then
1350 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1351 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1352 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1353 for service in $(echo -e $SERVICELIST) ; do
1354 # support running (custom) init scripts in non-blocking mode
1355 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1356 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1357 einfo "Starting service ${service}."
1358 /etc/init.d/${service} start >>$DEBUG
1360 einfo "Starting service ${service} in background."
1361 /etc/init.d/${service} start >>$DEBUG &
1371 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1372 SOURCE=$(eval echo "$1")
1375 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1376 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1378 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1380 while ! getconfig && [[ "$counter" != 0 ]] ; do
1381 echo -n "Sleeping for 1 second and trying to get config again... "
1382 counter=$(( counter-1 ))
1383 echo "$counter tries left" ; sleep 1
1385 if [ -s "$TARGET" ] ; then
1386 einfo "Downloading was successfull." ; eend 0
1387 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1388 md5sum ${TARGET} ; eend 0
1391 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1399 if checkbootparam 'netconfig' ; then
1400 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1401 CONFIGFILE='/tmp/netconfig.grml'
1403 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1404 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1411 # {{{ remote scripts
1412 config_netscript() {
1413 if checkbootparam 'netscript' ; then
1414 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1415 SCRIPTFILE='/tmp/netscript.grml'
1417 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1418 chmod +x ${SCRIPTFILE}
1419 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1428 if ! checkbootparam 'nostats' ; then
1429 BASE_URL="http://stats.grml.org/report/"
1432 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1434 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1435 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1436 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1437 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1439 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1441 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1442 [ -z "$BOOT" ] && BOOT="local"
1444 ADDITIONAL_PARAMS=""
1445 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1446 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1448 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1450 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1454 # {{{ fix/workaround for unionfs
1456 if [ -z "$INSTALLED" ]; then
1457 touch /var/cache/apt/*cache.bin
1462 # {{{ start X window system via grml-x
1464 # make sure we start X only if startx is used *before* a nostartx option
1465 # so it's possible to disable automatic X startup using nostart
1466 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1467 if [ -x "$(which X)" ] ; then
1468 if [ -z "$INSTALLED" ] ; then
1469 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1470 if [ -z "$WINDOWMANAGER" ] ; then
1471 einfo "No window manager specified. Using default one." && eend 0
1473 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1475 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1477 cat>|/etc/init.d/xstartup<<EOF
1479 su $localuser -c "/usr/bin/grml-x"
1481 chmod 755 /etc/init.d/xstartup
1483 # adjust inittab for xstartup
1484 if grep -q '^6:' /etc/inittab ; then
1485 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
1486 else # just append tty6 to inittab if no definition is present:
1487 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
1490 /sbin/telinit q ; eend $?
1492 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1493 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1495 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1499 eerror "We are not running in live mode - startx will not work, skipping it."
1500 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1503 eerror "/usr/bin/X is not present on this grml flavour."
1504 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1510 # {{{ configuration framework
1512 if checkbootparam 'extract' ; then
1513 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1514 EXTRACTOPTIONS="-- -x $EXTRACT"
1518 config_finddcsdir() {
1519 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1520 # on the command line, nothing is changed and the dcs files are
1521 # searched within the .iso, $dcs-dir is set to the root directory
1523 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1524 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1525 # set, $dcs-dir is set to the root directory within the .iso.
1526 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1527 # foo, even if a GRMLCFG partition is present.
1530 # autoconfig, see issue673
1531 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1532 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1533 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1534 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1536 if [ -z "$INSTALLED" ] ; then
1537 if checkbootparam 'myconfig' ; then
1538 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1539 if [ -z "$DCSDEVICE" ]; then
1540 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1541 fi # [ -z "$DCSDEVICE" ]
1542 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1543 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1545 # We do need the following fix so floppy disk is available to blkid in any case :-/
1546 if [ -r /dev/fd0 ] ; then
1547 einfo "Floppy device detected. Trying to access floppy disk."
1548 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
1549 blkid /dev/fd0 >>$DEBUG 2>&1
1552 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1554 modprobe 9p 2>/dev/null || true
1555 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1556 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1557 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1558 DCSDEVICE="$GRMLCFG"
1559 MOUNTOPTIONS="ro,trans=virtio"
1564 if [ -n "$DCSDEVICE" ]; then
1565 DCSMP="/mnt/grmlcfg"
1570 # if not specified/present then assume default:
1571 if [ -z "$DCSDEVICE" ]; then
1572 DCSDIR="/live/image"
1575 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1576 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1577 if [ -n "$DCSDIR" ]; then
1578 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1580 [ -d $DCSMP ] || mkdir $DCSMP
1581 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1582 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1583 if [[ $RC == 0 ]]; then
1584 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1586 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1595 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
1596 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1597 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1598 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1604 if checkbootparam 'partconf' ; then
1605 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1606 if [ -n "$MOUNTDEVICE" ]; then
1607 [ -d /mnt/grml ] || mkdir /mnt/grml
1608 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1609 if [[ $RC == 0 ]]; then
1610 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1611 einfo "Copying files from $MOUNTDEVICE over grml system."
1612 for file in `cat /etc/grml/partconf` ; do
1613 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1614 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1617 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1618 fi # mount $MOUNTDEVICE
1619 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1621 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1622 fi # [ -n "$MOUNTDEVICE" ]
1627 # {{{ /cdrom/.*-options
1629 if checkbootparam 'debs' ; then
1630 iszsh && setopt localoptions shwordsplit
1631 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1632 if [ -z "$DEBS" ] ; then
1635 if ! echo $DEBS | grep -q '/'; then
1636 # backwards compatibility: if no path is given get debs from debs/
1639 einfo "Tring to install debian package(s) ${DEBS}"
1640 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1641 dpkg -i $DEBS ; eend $?
1646 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1647 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1648 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1649 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1651 if ! echo $SCRIPTS | grep -q '/'; then
1652 # backwards compatibility: if no path is given get scripts from scripts/
1653 SCRIPTS="scripts/$SCRIPTS"
1655 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1656 # we are executing from a GRMLCFG labeled fs
1657 # kick everything we have done before and start over
1658 SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1660 if [ -n "$SCRIPTS" ]; then
1661 SCRIPTS="${DCSDIR}/$SCRIPTS"
1662 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1663 einfo "Trying to execute ${SCRIPTS}"
1665 elif [ -d "$SCRIPTS" ]; then
1666 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1669 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1677 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1678 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1679 if [ -z "$CONFIG" ]; then
1680 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1682 if [ -n "$CONFIG" ]; then
1683 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1684 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1686 cp -a ${DCSDIR}/${CONFIG}/* /
1687 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1688 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1691 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1693 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1700 # {{{ confing_umount_dcsdir
1701 config_umount_dcsdir(){
1702 # umount $DCSMP if it was mounted by finddcsdir
1703 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1709 if checkbootparam 'mypath' ; then
1710 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1711 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1712 touch /etc/grml/my_path
1713 chmod 644 /etc/grml/my_path
1714 # make sure the directories exist:
1716 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1717 if ! [ -d "$i" ] ; then
1718 einfo "Creating directory $i"
1719 mkdir -p "$i" ; eend $?
1722 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1730 if checkbootparam 'distcc' ; then
1731 OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1732 if [ -n "$OPTIONS" ]; then
1735 if [ -n "$OPTIONS" ]; then
1736 NET="${OPTIONS%%,*}"
1738 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1740 INTERFACE="${OPTIONS%%,*}"
1745 CONFIG=/etc/default/distcc
1746 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1747 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1749 if [ -n "$INTERFACE" ] ; then
1750 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1753 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1754 counter=$(( counter-1 ))
1755 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1757 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1761 if [ -n "$IP" ] ; then
1762 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1764 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1766 id distccd >/dev/null 2>&1 || \
1768 einfo "Creating distcc user" ; \
1769 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1772 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1773 /etc/init.d/distcc start >/dev/null ; eend $?
1776 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1780 if checkbootparam 'gcc'; then
1781 GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
1783 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1786 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1789 if checkbootparam 'gpp'; then
1790 GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
1792 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1793 if [ -x /usr/bin/g++-${GPP} ] ; then
1795 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1797 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1798 if [ -x /usr/bin/cpp-${GPP} ] ; then
1800 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1809 # Notice: use it only on live-cd system, if running from harddisk please
1810 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1811 # in /etc/runlevel.conf
1813 MODULES_FILE=/etc/grml/modules
1814 if checkbootparam 'nomodules' ; then
1815 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1816 elif [ -z "$INSTALLED" ]; then
1817 if [ -r $MODULES_FILE ] ; then
1818 einfo "Loading modules specified in ${MODULES_FILE}:"
1820 grep '^[^#]' $MODULES_FILE | \
1821 while read module args; do
1822 [ "$module" ] || continue
1824 modprobe $module $args ; eend $?
1828 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1836 [ -n "$INSTALLED" ] && return 0
1838 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
1839 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1840 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
1841 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1843 [ -e /proc/mdstat ] || modprobe md_mod
1844 if ! [ -x /sbin/mdadm ] ; then
1845 eerror "mdadm not available, can not execute it." ; eend 1
1848 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1849 # find out whether we have a valid configuration file already
1850 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1851 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1852 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1853 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1855 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1858 if ! checkbootparam 'swraid' ; then
1860 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1863 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1868 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1870 *'No arrays found'*)
1871 ewarn "$line" ; eend 0
1874 einfo "$line" ; eend 0
1881 if [ -r /proc/mdstat ] ; then
1883 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1884 if [ -z "$MDSTAT" ] ; then
1885 ewarn "No active arrays found" ; eend 0
1890 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1891 einfo "active arrays: $line" ; eend 0
1897 fi # bootoption swraid
1899 fi # is /sbin/mdadm executable?
1900 fi # check for bootoptions
1906 [ -n "$INSTALLED" ] && return 0
1908 if checkbootparam 'nodmraid' ; then
1909 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1913 if ! [ -x /sbin/dmraid ] ; then
1914 eerror "dmraid not available, can not execute it." ; eend 1
1919 # usage: dmraid_wrapper <dmraid_option>
1920 [ -n "$1" ] || return 1
1927 for line in $(dmraid $1 ; echo errcode:$?); do
1929 *'no block devices found'*)
1930 einfo "No block devices found" ; eend 0
1934 einfo "No active dmraid devices found" ; eend 0
1953 if checkbootparam 'dmraid' ; then
1954 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1955 if [ "$ACTION" = "off" ] ; then
1956 # Deactivates all active software RAID sets:
1957 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1960 # Activate all software RAID sets discovered:
1961 einfo "Activating present dmraid sets (as requested via dmraid):"
1968 # by default (no special bootoptions) discover all software RAID devices:
1969 einfo "Searching for any present dmraid sets:"
1974 # {{{ LVM (Logical Volumes)
1976 [ -n "$INSTALLED" ] && return 0
1978 if checkbootparam 'nolvm' ; then
1979 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1981 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
1982 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
1983 eerror "LVM not available, can not execute it." ; eend 1
1985 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1986 einfo "You seem to have logical volumes (LVM) on your system."
1988 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1990 if checkbootparam 'lvm' ; then
1991 einfo "Bootoption LVM found. Searching for logical volumes:"
1992 /etc/init.d/lvm2 start ; eend $?
1996 fi # check for lvm binary
1997 fi # check for bootoption nolvm
2001 # {{{ debnet: setup network based on an existing one found on a partition
2003 if checkbootparam 'debnet' ; then
2004 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2010 # {{{ disable console blanking
2012 if checkbootparam 'noblank' ; then
2013 einfo "Bootoption noblank found. Disabling monitor blanking."
2014 setterm -blank 0 ; eend $?
2019 # {{{ tohd= bootoption
2022 if checkbootparam 'tohd' ; then
2023 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2024 if [ -z "$TARGET" ] ; then
2025 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2026 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2030 if ! [ -b "$TARGET" ] ; then
2031 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2035 if grep -q $TARGET /proc/mounts ; then
2036 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2041 local MOUNTDIR=$(mktemp -d)
2043 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2044 einfo "Copyring live system to $TARGET - this might take a while"
2045 rsync -a --progress /live/image/live $MOUNTDIR
2049 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2051 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2060 # {{{ debootstrap: automatic installation
2061 config_debootstrap(){
2063 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2065 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2067 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2069 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2074 if checkbootparam 'target' ; then
2076 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2077 # notice: the following checks whether the given partition is available, if not the skip
2078 # execution of grml-debootstrap as it might result in data loss...
2079 if ! [ -r "$TARGET" ] ; then
2080 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2084 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2089 if checkbootparam 'grub' ; then
2091 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2094 if checkbootparam 'groot' ; then
2096 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2099 if checkbootparam 'release' ; then
2101 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2104 if checkbootparam 'mirror' ; then
2106 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2109 if checkbootparam 'boot_append' ; then
2111 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2114 if checkbootparam 'password' ; then
2116 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2119 # now check which options are available
2120 if [ -n "TARGET" ] ; then
2121 TARGETCMD="--target $TARGET"
2125 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2129 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2130 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2131 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2132 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2133 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2134 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2136 # and finally write script and execute it
2137 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2139 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2142 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2144 screen /usr/bin/grml-debootstrap_noninteractive
2145 einfo "Invoking a shell, just exit to continue booting..."
2148 fi # checkbootparam "BOOT_IMAGE=debian2hd
2152 config_virtualbox_shared_folders() {
2153 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
2154 einfo "VirtualBox detected, trying to set up Shared Folders."
2155 if ! modprobe -l | grep -q vboxsf.ko ; then
2156 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
2158 elif ! [ -x /usr/sbin/VBoxService ] ; then
2159 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
2164 einfo "Loading vboxsf driver."
2165 lsmod | grep -q vboxsf || modprobe vboxsf
2168 einfo "Adjusting /dev/vboxguest."
2169 chown root:vboxsf /dev/vboxguest
2170 chmod 660 /dev/vboxguest
2175 einfo "Adding $fstabuser to group vboxsf."
2176 adduser grml vboxsf &>/dev/null
2179 einfo "Starting VBoxService."
2180 VBoxService >/dev/null &
2188 # {{{ Support customization
2190 if checkbootparam 'distri'; then
2191 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2192 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2193 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2194 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2195 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2196 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2202 ## END OF FILE #################################################################
2203 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3