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' ' ')"
46 ### {{{ Utility Functions
48 # Get a bootoption's parameter: read boot command line and either
49 # echo last parameter's argument or return false.
57 result="${line##*[$ws]$1=}"
58 result="${result%%[$ws]*}"
66 # Check boot commandline for specified option
68 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
74 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
81 # Check if currently using a framebuffer
83 [ -e /dev/fb0 ] && return 0 || return 1
86 # Check wheter a configuration variable (like $CONFIG_TOHD) is
90 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
91 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
92 *) return 1 ;; # default
96 # Are we using grml-small?
98 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
103 # {{{ filesystems (proc, pts, sys) and fixes
105 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
109 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
113 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
117 # {{{ Check if we are running in live mode or from HD
119 [ -e /etc/grml_cd ] || INSTALLED="yes"
122 # {{{ source lsb-functions , color handling
123 if checkbootparam 'nocolor'; then
125 . /etc/grml/lsb-functions
126 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
128 . /etc/grml/lsb-functions
135 checkbootparam 'debug' && BOOTDEBUG="yes"
136 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
139 if [ -n "$BOOTDEBUG" ]; then
140 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
141 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
142 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
143 einfo "Just exit the shell to continue boot process..."
147 if [ -r /etc/grml/screenrc ] ; then
148 einfo "Starting GNU screen to be able to use a full featured shell environment."
149 einfo "Just exit the shells (and therefore screen) to continue boot process..."
150 /bin/zsh -c "screen -c /etc/grml/screenrc"
152 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
153 einfo "Just exit the shell to continue boot process..."
165 if checkbootparam 'log' || checkbootparam 'debug' ; then
166 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
168 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
170 einfo "Starting bootlogd." # known to be *very* unreliable :(
171 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
179 # {{{ set firmware timeout via bootparam
181 if checkbootparam 'fwtimeout' ; then
182 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
183 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
184 rmmod firmware_class >>$DEBUG 2>&1
185 modprobe firmware_class ; eend $?
187 if [ -z "$TIMEOUT" ] ; then
188 TIMEOUT="100" # linux kernel default: 10
190 if [ -f /sys/class/firmware/timeout ] ; then
191 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
192 echo $TIMEOUT > /sys/class/firmware/timeout ; eend $?
197 ### {{{ language configuration / localization
200 einfo "Activating language settings:"
203 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
204 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
206 # check for bootoption which overrides config from /etc/grml/autoconfig
207 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
208 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
210 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
211 if [ -z "$INSTALLED" ] ; then
212 [ -n "$LANGUAGE" ] || LANGUAGE='en'
215 if [ -x /usr/sbin/grml-setlang ] ; then
216 # if bootoption lang is used update /etc/default/locale accordingly
217 if [ -n "$BOOT_LANGUAGE" ] ; then
218 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "$LANGUAGE"
219 # otherwise default to lang=en
221 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en"
226 if [ -z "$CONSOLEFONT" ] ; then
227 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
228 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
229 CONSOLEFONT='Uni3-Terminus16'
231 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
234 CONSOLEFONT='Lat15-Terminus16'
239 # export it now, so error messages get translated, too
240 if checkgrmlsmall ; then
241 export LANG='C' # grml-small does not provide any further locales
243 [ -r /etc/default/locale ] && . /etc/default/locale
247 # configure keyboard layout, read in already set values first:
248 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
250 # now allow keyboard override by boot commandline for later use:
251 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
252 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
253 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
254 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
255 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
257 # modify /etc/sysconfig/keyboard only in live-cd mode:
258 if [ -z "$INSTALLED" ] ; then
260 local LANGUAGE="$BOOT_LANGUAGE"
261 . /etc/grml/language-functions
262 # allow setting xkeyboard explicitly different than console keyboard
263 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
264 if [ -n "$KXKEYBOARD" ]; then
265 XKEYBOARD="$KXKEYBOARD"
266 KDEKEYBOARD="$KXKEYBOARD"
267 elif [ -n "$KKEYBOARD" ]; then
268 XKEYBOARD="$KKEYBOARD"
269 KDEKEYBOARD="$KKEYBOARD"
272 # duplicate of previous code to make sure /etc/grml/language-functions
273 # does not overwrite our values....
274 # now allow keyboard override by boot commandline for later use:
275 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
276 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
277 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
278 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
279 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
281 # write keyboard related variables to file for later use
282 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
283 if ! [ -e /etc/sysconfig/keyboard ] ; then
284 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
285 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
286 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
287 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
291 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
293 # activate unicode console if running within utf8 environment
294 if [ -r /etc/default/locale ] ; then
295 if grep -q "LANG=.*UTF" /etc/default/locale ; then
296 einfo "Setting up unicode environment."
297 unicode_start >>$DEBUG 2>&1 ; eend $?
301 # Set default keyboard before interactive setup
302 if [ -n "$KEYTABLE" ] ; then
303 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
304 loadkeys -q $KEYTABLE &
308 # we have to set up all consoles, therefore loop it over all ttys:
309 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
310 if [ -n "$NUM_CONSOLES" ] ; then
311 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
312 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
314 CUR_CONSOLE=$(fgconsole 2>/dev/null)
316 if [ -x "$(which setfont)" ] ; then
318 elif [ -x "$(which consolechars)" ] ; then
319 use_consolechars=true
321 eerror "Neither setfont nor consolechars tool present, can not set font."
326 if [ -n "$CHARMAP" ] ; then
327 einfo "Setting font to ${CHARMAP}"
329 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
330 if $use_setfont ; then
331 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
332 elif $use_consolechars ; then
333 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
336 if [ -n "$CUR_CONSOLE" ] ; then
337 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
342 if checkbootparam 'noconsolefont' ; then
343 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
345 if [ -n "$CONSOLEFONT" ] ; then
346 einfo "Setting font to ${CONSOLEFONT}"
348 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
349 if $use_setfont ; then
350 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
351 elif $use_consolechars ; then
352 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
355 if [ -n "$CUR_CONSOLE" ] ; then
356 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
368 if checkbootparam 'hostname' ; then
369 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
370 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
371 einfo "Generating random hostname as no hostname was specified."
372 HOSTNAME="$(/usr/bin/random-hostname)"
375 einfo "Setting hostname to $HOSTNAME as requested."
376 grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
377 [ "$RC" = "0" ] && hostname $HOSTNAME
380 hostname --file /etc/hostname
385 # fstabuser (needed when running from harddisk with username != grml {{{
387 # force load of build-in and local config
388 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
389 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
391 # 1st. try configured fstab user
392 if [ -n "$CONFIG_FSTAB_USER" ] ; then
393 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
396 # 2nd. use standard user id
397 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
399 # 3rd. use standard user name
400 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
402 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
403 [ -n "$fstabuser" ] || fstabuser='root'
407 # local_user (needed when running with username != grml {{{
410 # force load of build-in and local config
411 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
412 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
414 # 1st. try id of primary user
415 localuser=$(getent passwd 1000 | cut -d: -f1)
417 # 2nd. use name standard user
418 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
424 einfo "Mounting configfs"
425 CONFIGFS_DIR=/sys/kernel/config/
426 modprobe configfs 2>/dev/null 1>&2
427 if ! [ -d "$CONFIGFS_DIR" ] ; then
429 einfo "$CONFIGFS_DIR does not exist, can't mount directory"
433 mount -t configfs configfs "$CONFIGFS_DIR" 2>/dev/null 1>&2
439 # {{{ Set clock (Local time is more often used than GMT, so it is default)
441 # don't touch the files if running from harddisk:
442 if [ -z "$INSTALLED" ]; then
443 # The default hardware clock timezone is stated as representing local time.
445 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
446 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
447 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
448 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
449 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
450 # hwclock uses the TZ variable
451 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
452 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
453 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
454 ewarn "Warning: unknown timezone $KTZ" ; eend 1
456 ewarn "Falling back to timezone $KTZ" ; eend 0
459 if ! [ -r /dev/rtc ] ; then
460 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
463 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
464 if [ -n "$ERROR" ] ; then
466 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
467 if [ -n "$ERROR" ] ; then
468 eerror "Problem running hwclock: $ERROR" ; eend 1
477 # {{{ print kernel info
479 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
480 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
481 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
482 if [ -r /proc/cpuinfo ] ; then
483 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
485 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
489 if [ -d /proc/xen ] ; then
491 einfo 'Running kernel featuring support for Xen detected' ; eend 0
497 # {{{ ld.so.cache + depmod
499 if [ -n "$INSTALLED" ]; then
500 if ! [ -r /etc/grml.first.boot ] ; then
501 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
503 # Regenerate ld.so.cache and module dependencies on HD
504 einfo "Running ldconfig" ; ldconfig ; eend $?
505 einfo "Running depmod" ; depmod -a ; eend $?
506 touch /etc/grml.first.boot
516 # don't touch the files if running from harddisk:
517 if [ -z "$INSTALLED" ]; then
518 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
519 if [ -n "$KTZ" ] ; then
520 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
522 ewarn "Warning: unknown timezone $KTZ"; eend 0
524 einfo "Setting timezone."
526 area=$(echo $KTZ | cut -d '/' -f1)
527 zone=$(echo $KTZ | cut -d '/' -f2)
528 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
529 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
531 echo $KTZ > /etc/timezone
533 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
540 # small computer / nearly no ram {{{
543 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
544 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
547 if checkbootparam 'small'; then
548 einfo "Information: ${RAM} kB of RAM available." ; eend 0
549 einfo "Bootoption small detected. Activating small system."
550 if [ -r /etc/inittab.small ] ; then
551 mv /etc/inittab /etc/inittab.normal
552 mv /etc/inittab.small /etc/inittab
554 sed -i 's/^9/#&/' /etc/inittab
555 sed -i 's/^10/#&/' /etc/inittab
556 sed -i 's/^11/#&/' /etc/inittab
557 sed -i 's/^12/#&/' /etc/inittab
559 /sbin/telinit q ; eend $?
561 if checkgrmlsmall ; then
562 if [[ $RAM -lt 25000 ]] ; then
563 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
564 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
565 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
566 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
569 einfo "Information: ${RAM} kB of RAM available." ; eend 0
572 if [[ $RAM -lt 58000 ]] ; then
573 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
574 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
575 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
576 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
579 einfo "Information: ${RAM} kB of RAM available." ; eend 0
587 # skip startup of w3m {{{
589 if checkbootparam 'fast'; then
590 ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
591 sed -i '/1:/s#/usr/share/grml-scripts/run-welcome#/bin/zsh#' /etc/inittab
592 /sbin/telinit q ; eend $?
597 # activate serial console {{{
599 if checkbootparam 'console'; then
604 einfo "Bootoption for serial console detected:"
608 line="${line#*[$ws]}"
610 while [ -n "$line" ]; do
614 local device="${this%%,*}"
615 local device="${device##*=}"
616 if echo $serial | grep -q ttyS ; then
617 local option="${serial##*,}"
618 # default (works for kvm & CO):
619 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
620 # ... unless overriden by command line:
622 115200*) speed=115200 ;;
623 57600*) speed=57600 ;;
624 38400*) speed=38400 ;;
625 19200*) speed=19200 ;;
632 einfo "Activating console login on device ${device} with speed ${speed}."
633 local number="${device#ttyS}"
634 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
641 this="${line%%[$ws]*}"
642 line="${line#*[$ws]}"
645 if [ -n "$telinitq" ]; then
653 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
654 # otherwise we will get: passwd: Authentication token lock busy
656 if [ -z "$INSTALLED" ] ; then
664 if checkbootparam 'testcd' ; then
665 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
670 rm -f /tmp/md5sum.log
671 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
672 einfo "Checking files against $md5, this may take a while..."
675 ( cd $(dirname "$md5") && md5sum -c $(basename "$md5") ; RC=$?) |& tee -a /tmp/md5sum.log
677 if [ $RC -ne 0 ] ; then
682 if [ $FOUND_FILE -eq 0 ] ; then
683 echo "${RED} *** Error: Could not find md5sum file. ***"
687 if [ "$ERROR" -eq 0 ]; then
688 einfo "Everything looks OK" ; eend 0
690 eerror 'Checksum failed for theses files:' ; eend 1
691 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
692 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
693 eerror '... RAM of your computer is broken.' ; eend 1
694 einfon "Hit return to continue, or press the reset button to quit."
703 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
705 if checkbootparam 'blacklist' ; then
706 if [ -z "$INSTALLED" ]; then
707 einfo "Bootoption blacklist found."
708 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
709 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
710 if [ -n "$BLACK" ] ; then
711 for module in $(echo ${BLACK//,/ }) ; do
712 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
713 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
714 echo "blacklist $module" >> "$BLACKLIST_FILE"
715 echo "alias $module off" >> "$BLACKLIST_FILE"
716 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
719 eerror "No given module for blacklist found. Blacklisting will not work therefore."
722 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
724 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
733 if checkbootparam 'noacpi'; then
734 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
735 elif checkbootparam 'nogrmlacpi' ; then
736 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
737 elif [ ! -d /proc/acpi ] ; then
738 ewarn "ACPI: Kernel support not present." ; eend 0
740 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
743 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
745 basename="${basename%%.*}"
746 case "$basename" in *_acpi)
747 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
749 modprobe $basename >>$DEBUG 2>&1 && found="yes"
750 local BASE="$BASE $basename"
752 if [ -n "$found" ] ; then
753 einfo "$BASE" ; eend 0
755 ewarn "(none)" ; eend 1
757 if ! pgrep acpid >/dev/null ; then
758 einfo "Starting acpi daemon."
759 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
761 ewarn "acpi daemon already running."
769 # {{{ Collect partitions from /proc/partitions first for enabling DMA
773 while read major minor blocks partition relax; do
774 partition="${partition##*/}"
775 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
777 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
778 sd?) ;; # SCSI Harddisk, entire disk
779 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
780 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
783 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
786 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
791 if checkbootparam 'brltty' ; then
792 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
797 # {{{ Enable DMA for all IDE drives now if not disabled
798 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
800 if checkbootparam 'nodma'; then
801 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
803 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
804 if test -d /proc/ide/$d; then
805 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
806 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
807 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
808 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
809 echo "using_dma:1" >/proc/ide/$d/settings
818 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
821 NOSWAP="yes" # we do not use swap by default!
822 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
824 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
827 # Scan for swap, config, homedir - but only in live-mode
828 if [ -z "$INSTALLED" ] ; then
829 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
832 HOMEDIR="$(getbootparam 'home')"
833 if [ -n "$partitions" ]; then
834 while read p m f relax; do
835 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
836 partoptions="users,exec"
838 # it's a swap partition?
841 if [ -n "$NOSWAP" ]; then
842 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
845 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
846 S1SUSP|S2SUSP|pmdisk|[zZ]*)
847 if [ -n "$ANYSWAP" ] ; then
848 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
849 swapon $p 2>>$DEBUG ; eend $?
851 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
855 if [[ "$p" == LABEL* ]] ; then
856 p=$(blkid -t $p | awk -F: '{print $1}')
858 if grep -q $p /proc/swaps ; then
859 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
861 if [ -b "$p" ] ; then
862 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
863 swapon $p 2>>$DEBUG ; eend $?
865 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
874 esac # it's a swap partition?
879 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
880 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
882 # *) NONEFOUND='1'; continue ;;
886 if [ -z "$NOSWAP" ] ; then
887 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
888 # Activate swapfile, if exists
889 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
891 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
892 mount -o remount,rw $m && MOUNTED=1
893 if swapon "$SWAPFILE" 2>>$DEBUG ; then
895 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
897 fnew="$SWAPFILE swap swap defaults 0 0"
898 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
899 GRML_SWP="$GRML_SWP $SWAPFILE"
902 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
905 # use a image as home
906 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
907 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
908 if [ -n "$HOMEDIR" ]; then
909 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
913 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
915 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
920 # Umount, if not in use
921 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
933 if [ -n "$MOUSE_DEVICE" ] ; then
934 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
939 # {{{ IPv6 configuration
940 # Load IPv6 kernel module and print IP adresses
942 if checkbootparam 'ipv6'; then
943 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
945 # we probably need some time until stateless autoconfiguration has happened
947 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
948 for DEVICE in `echo "$NETDEVICES"`; do
951 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
952 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
954 for ADDR in `echo "$ADDRESSES"` ; do
957 if [ "$COUNT" -eq "0" ] ; then
958 einfo "(none)" ; eend 1
970 if checkbootparam 'nocpu'; then
971 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
975 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
977 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)
978 echo $CPU | sed 's/ \{1,\}/ /g'
981 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
984 # no cpufreq setup inside VirtualBox
985 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
986 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
990 if [ -x /etc/init.d/loadcpufreq ] ; then
991 einfo "Trying to set up cpu frequency scaling:"
994 LOADCPUFREQ=$(mktemp)
995 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
996 if grep -q FATAL "$LOADCPUFREQ" ; then
1002 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1003 eerror "$line" ; eend $RC
1007 elif grep -q done "$LOADCPUFREQ" ; then
1008 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1009 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1010 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1013 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1019 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1020 if grep -vq ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
1021 einfo "Loading cpufreq_ondemand"
1022 modprobe cpufreq_ondemand
1026 einfo "Setting ondemand governor"
1028 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1029 echo ondemand > $file || RC=1
1039 # {{{ autostart of ssh
1041 if checkbootparam 'ssh' ; then
1043 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1045 einfo "Bootoption ssh found, trying to set password for user $localuser"
1046 [ -z "$localuser" ] && eend 1
1048 if [ -z "$SSH_PASSWD" ] ; then
1049 if [ -x /usr/bin/apg ] ; then
1050 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1051 elif [ -x /usr/bin/gpw ] ; then
1052 SSH_PASSWD="$(gpw 1)"
1053 elif [ -x /usr/bin/pwgen ] ; then
1054 SSH_PASSWD="$(pwgen -1 8)"
1055 elif [ -x /usr/bin/hexdump ] ; then
1056 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1057 elif [ -n "$RANDOM" ] ; then
1058 SSH_PASSWD="grml${RANDOM}"
1061 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1065 if [ -n "$SSH_PASSWD" ] ; then
1066 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1071 # finally check if we have a password we can use:
1072 if [ -n "$SSH_PASSWD" ] ; then
1073 # chpasswd sucks, seriously.
1074 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1075 echo "$localuser:$SSH_PASSWD" | chpasswd -m
1077 echo "$localuser:$SSH_PASSWD" | chpasswd
1081 einfo "Starting secure shell server in background for user $localuser"
1082 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1083 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1087 ewarn "Warning: please change the password for user $localuser as soon as possible!"
1093 # {{{ autostart of x11vnc
1095 if checkbootparam 'vnc' ; then
1097 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1098 einfo "Bootoption vnc found, trying to set password for user $localuser."
1100 if [ -z "$VNC_PASSWD" ] ; then
1101 if [ -x /usr/bin/apg ] ; then
1102 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1103 elif [ -x /usr/bin/gpw ] ; then
1104 VNC_PASSWD="$(gpw 1)"
1105 elif [ -x /usr/bin/pwgen ] ; then
1106 VNC_PASSWD="$(pwgen -1 8)"
1107 elif [ -x /usr/bin/hexdump ] ; then
1108 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1109 elif [ -n "$RANDOM" ] ; then
1110 VNC_PASSWD="${USER}${RANDOM}"
1113 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1117 if [ -n "$VNC_PASSWD" ] ; then
1118 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1123 # finally check if we have a password we can use:
1124 if [ -n "$VNC_PASSWD" ] ; then
1126 VNCDIR="/home/${USER}/.vnc"
1127 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1129 if [ ! -x /usr/bin/x11vnc ] ; then
1130 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1133 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1134 /bin/chown -R "$localuser": "$VNCDIR"
1137 if checkbootparam 'vnc_connect' ; then
1139 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1140 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1141 #store the options in a file
1142 VNCDIR="/home/${USER}/.vnc"
1143 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1144 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1150 # {{{ set password for default user
1152 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1153 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1155 einfo "Bootoption passwd found, change password for user '$localuser'."
1156 [ -z "$localuser" ] && eend 1
1157 if [ -n "$PASSWD" ] ; then
1158 echo "$localuser:$PASSWD" | chpasswd -m ; eend $?
1160 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1163 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1171 if ! [ -x /usr/bin/amixer ] ; then
1172 eerror "amixer binary not available. Can not set sound volumes therefore."
1175 if ! [ -r /proc/asound/cards ] ; then
1176 ewarn "No soundcard present, skipping mixer settings therefore."
1181 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1182 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1185 if checkbootparam 'vol' ; then
1186 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1187 if [ -z "$VOL" ] ; then
1188 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1196 if checkbootparam 'nosound' ; then
1197 einfo "Muting sound devices on request."
1198 ERROR=$(amixer -q set Master mute)
1200 if [ -n "$ERROR" ] ; then
1202 eerror "Problem muting sound devices: $ERROR"
1206 elif [ -z "$INSTALLED" ] ; then
1207 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1209 if checkbootparam 'micvol' ; then
1210 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1211 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1216 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1220 for CONTROL in ${=CONTROLS} ; do
1221 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1222 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1223 amixer -c $card -q set "${CONTROL}" unmute
1225 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1226 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1230 if [ ${MICVOL} -ne 0 ] ; then
1231 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1232 amixer -c $card -q set "${CONTROL}" unmute
1234 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1235 amixer -c $card -q set "${CONTROL}" $MICVOL%
1241 fi # checkbootparam 'nosound'
1248 # {{{ modem detection
1250 if checkbootparam 'nomodem'; then
1251 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1253 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1254 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1255 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1264 config_wondershaper(){
1265 if checkbootparam 'wondershaper' ; then
1266 WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1271 if [ -n "$WONDER" ]; then
1273 DEVICE="${WONDER%%,*}"
1275 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1277 DOWNSTREAM="${WONDER%%,*}"
1279 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1281 UPSTREAM="${WONDER%%,*}"
1286 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1287 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1288 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1289 einfo "Starting wondershaper (${CMD}) in background."
1290 ( sh -c $CMD & ) && eend 0
1297 if checkbootparam 'nosyslog'; then
1298 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1301 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1302 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1303 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1304 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1305 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1307 if [ -z "$SYSLOGD" ] ; then
1308 eerror "No syslog daemon found." ; eend 1
1310 einfo "Starting $SYSLOGD in background."
1311 /etc/init.d/$SYSLOGD start >>$DEBUG &
1320 if checkbootparam 'nogpm'; then
1321 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1323 if ! [ -r /dev/input/mice ] ; then
1324 eerror "No mouse found - not starting GPM." ; eend 1
1326 einfo "Starting gpm in background."
1327 /etc/init.d/gpm start >>$DEBUG &
1328 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1337 if checkbootparam 'services' ; then
1338 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1339 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1340 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1341 for service in $(echo -e $SERVICELIST) ; do
1342 # support running (custom) init scripts in non-blocking mode
1343 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1344 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1345 einfo "Starting service ${service}."
1346 /etc/init.d/${service} start >>$DEBUG
1348 einfo "Starting service ${service} in background."
1349 /etc/init.d/${service} start >>$DEBUG &
1359 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1360 SOURCE=$(eval echo "$1")
1363 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1364 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1366 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1368 while ! getconfig && [[ "$counter" != 0 ]] ; do
1369 echo -n "Sleeping for 1 second and trying to get config again... "
1370 counter=$(( counter-1 ))
1371 echo "$counter tries left" ; sleep 1
1373 if [ -s "$TARGET" ] ; then
1374 einfo "Downloading was successfull." ; eend 0
1375 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1376 md5sum ${TARGET} ; eend 0
1379 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1387 if checkbootparam 'netconfig' ; then
1388 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1389 CONFIGFILE='/tmp/netconfig.grml'
1391 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1392 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1399 # {{{ remote scripts
1400 config_netscript() {
1401 if checkbootparam 'netscript' ; then
1402 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1403 SCRIPTFILE='/tmp/netscript.grml'
1405 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1406 chmod +x ${SCRIPTFILE}
1407 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1416 if ! checkbootparam 'nostats' ; then
1417 BASE_URL="http://stats.grml.org/report/"
1420 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1422 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1423 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1424 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1425 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1427 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1429 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1430 [ -z "$BOOT" ] && BOOT="local"
1432 ADDITIONAL_PARAMS=""
1433 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1434 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1436 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1438 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1442 # {{{ fix/workaround for unionfs
1444 if [ -z "$INSTALLED" ]; then
1445 touch /var/cache/apt/*cache.bin
1450 # {{{ start X window system via grml-x
1452 # make sure we start X only if startx is used *before* a nostartx option
1453 # so it's possible to disable automatic X startup using nostart
1454 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1455 if [ -x "$(which X)" ] ; then
1456 if [ -z "$INSTALLED" ] ; then
1457 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1458 if [ -z "$WINDOWMANAGER" ] ; then
1459 einfo "No window manager specified. Using default one." && eend 0
1461 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1463 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1465 cat>|/etc/init.d/xstartup<<EOF
1467 su $localuser -c "/usr/bin/grml-x"
1469 chmod 755 /etc/init.d/xstartup
1471 # adjust inittab for xstartup
1472 if grep -q '^6:' /etc/inittab ; then
1473 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
1474 else # just append tty6 to inittab if no definition is present:
1475 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
1478 /sbin/telinit q ; eend $?
1480 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1481 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1483 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1487 eerror "We are not running in live mode - startx will not work, skipping it."
1488 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1491 eerror "/usr/bin/X is not present on this grml flavour."
1492 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1498 # {{{ configuration framework
1500 if checkbootparam 'extract' ; then
1501 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1502 EXTRACTOPTIONS="-- -x $EXTRACT"
1506 config_finddcsdir() {
1507 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1508 # on the command line, nothing is changed and the dcs files are
1509 # searched within the .iso, $dcs-dir is set to the root directory
1511 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1512 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1513 # set, $dcs-dir is set to the root directory within the .iso.
1514 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1515 # foo, even if a GRMLCFG partition is present.
1518 # autoconfig, see issue673
1519 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1520 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1521 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1522 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1524 if [ -z "$INSTALLED" ] ; then
1525 if checkbootparam 'myconfig' ; then
1526 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1527 if [ -z "$DCSDEVICE" ]; then
1528 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1529 fi # [ -z "$DCSDEVICE" ]
1530 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1531 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1533 # We do need the following fix so floppy disk is available to blkid in any case :-/
1534 if [ -r /dev/fd0 ] ; then
1535 einfo "Floppy device detected. Trying to access floppy disk."
1536 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
1537 blkid /dev/fd0 >>$DEBUG 2>&1
1540 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1542 modprobe 9p 2>/dev/null || true
1543 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1544 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1545 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1546 DCSDEVICE="$GRMLCFG"
1547 MOUNTOPTIONS="ro,trans=virtio"
1552 if [ -n "$DCSDEVICE" ]; then
1553 DCSMP="/mnt/grmlcfg"
1558 # if not specified/present then assume default:
1559 if [ -z "$DCSDEVICE" ]; then
1560 DCSDIR="/live/image"
1563 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1564 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1565 if [ -n "$DCSDIR" ]; then
1566 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1568 [ -d $DCSMP ] || mkdir $DCSMP
1569 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1570 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1571 if [[ $RC == 0 ]]; then
1572 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1574 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1583 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
1584 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1585 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1586 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1592 if checkbootparam 'partconf' ; then
1593 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1594 if [ -n "$MOUNTDEVICE" ]; then
1595 [ -d /mnt/grml ] || mkdir /mnt/grml
1596 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1597 if [[ $RC == 0 ]]; then
1598 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1599 einfo "Copying files from $MOUNTDEVICE over grml system."
1600 for file in `cat /etc/grml/partconf` ; do
1601 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1602 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1605 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1606 fi # mount $MOUNTDEVICE
1607 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1609 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1610 fi # [ -n "$MOUNTDEVICE" ]
1615 # {{{ /cdrom/.*-options
1617 if checkbootparam 'debs' ; then
1618 iszsh && setopt localoptions shwordsplit
1619 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1620 if [ -z "$DEBS" ] ; then
1623 if ! echo $DEBS | grep -q '/'; then
1624 # backwards compatibility: if no path is given get debs from debs/
1627 einfo "Tring to install debian package(s) ${DEBS}"
1628 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1629 dpkg -i $DEBS ; eend $?
1634 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1635 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1636 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1637 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1639 if ! echo $SCRIPTS | grep -q '/'; then
1640 # backwards compatibility: if no path is given get scripts from scripts/
1641 SCRIPTS="scripts/$SCRIPTS"
1643 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1644 # we are executing from a GRMLCFG labeled fs
1645 # kick everything we have done before and start over
1646 SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1648 if [ -n "$SCRIPTS" ]; then
1649 SCRIPTS="${DCSDIR}/$SCRIPTS"
1650 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1651 einfo "Trying to execute ${SCRIPTS}"
1653 elif [ -d "$SCRIPTS" ]; then
1654 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1657 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1665 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1666 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1667 if [ -z "$CONFIG" ]; then
1668 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1670 if [ -n "$CONFIG" ]; then
1671 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1672 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1674 cp -a ${DCSDIR}/${CONFIG}/* /
1675 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1676 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1679 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1681 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1688 # {{{ confing_umount_dcsdir
1689 config_umount_dcsdir(){
1690 # umount $DCSMP if it was mounted by finddcsdir
1691 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1697 if checkbootparam 'mypath' ; then
1698 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1699 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1700 touch /etc/grml/my_path
1701 chmod 644 /etc/grml/my_path
1702 # make sure the directories exist:
1704 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1705 if ! [ -d "$i" ] ; then
1706 einfo "Creating directory $i"
1707 mkdir -p "$i" ; eend $?
1710 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1718 if checkbootparam 'distcc' ; then
1719 OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1720 if [ -n "$OPTIONS" ]; then
1723 if [ -n "$OPTIONS" ]; then
1724 NET="${OPTIONS%%,*}"
1726 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1728 INTERFACE="${OPTIONS%%,*}"
1733 CONFIG=/etc/default/distcc
1734 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1735 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1737 if [ -n "$INTERFACE" ] ; then
1738 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1741 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1742 counter=$(( counter-1 ))
1743 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1745 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1749 if [ -n "$IP" ] ; then
1750 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1752 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1754 id distccd >/dev/null 2>&1 || \
1756 einfo "Creating distcc user" ; \
1757 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1760 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1761 /etc/init.d/distcc start >/dev/null ; eend $?
1764 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1768 if checkbootparam 'gcc'; then
1769 GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
1771 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1774 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1777 if checkbootparam 'gpp'; then
1778 GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
1780 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1781 if [ -x /usr/bin/g++-${GPP} ] ; then
1783 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1785 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1786 if [ -x /usr/bin/cpp-${GPP} ] ; then
1788 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1797 # Notice: use it only on live-cd system, if running from harddisk please
1798 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1799 # in /etc/runlevel.conf
1801 MODULES_FILE=/etc/grml/modules
1802 if checkbootparam 'nomodules' ; then
1803 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1804 elif [ -z "$INSTALLED" ]; then
1805 if [ -r $MODULES_FILE ] ; then
1806 einfo "Loading modules specified in ${MODULES_FILE}:"
1808 grep '^[^#]' $MODULES_FILE | \
1809 while read module args; do
1810 [ "$module" ] || continue
1812 modprobe $module $args ; eend $?
1816 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1824 [ -n "$INSTALLED" ] && return 0
1826 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
1827 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1828 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
1829 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1831 [ -e /proc/mdstat ] || modprobe md_mod
1832 if ! [ -x /sbin/mdadm ] ; then
1833 eerror "mdadm not available, can not execute it." ; eend 1
1836 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1837 # find out whether we have a valid configuration file already
1838 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1839 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1840 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1841 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1843 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1846 if ! checkbootparam 'swraid' ; then
1848 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1851 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1856 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1858 *'No arrays found'*)
1859 ewarn "$line" ; eend 0
1862 einfo "$line" ; eend 0
1869 if [ -r /proc/mdstat ] ; then
1871 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1872 if [ -z "$MDSTAT" ] ; then
1873 ewarn "No active arrays found" ; eend 0
1878 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1879 einfo "active arrays: $line" ; eend 0
1885 fi # bootoption swraid
1887 fi # is /sbin/mdadm executable?
1888 fi # check for bootoptions
1894 [ -n "$INSTALLED" ] && return 0
1896 if checkbootparam 'nodmraid' ; then
1897 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1901 if ! [ -x /sbin/dmraid ] ; then
1902 eerror "dmraid not available, can not execute it." ; eend 1
1907 # usage: dmraid_wrapper <dmraid_option>
1908 [ -n "$1" ] || return 1
1915 for line in $(dmraid $1 ; echo errcode:$?); do
1917 *'no block devices found'*)
1918 einfo "No block devices found" ; eend 0
1922 einfo "No active dmraid devices found" ; eend 0
1941 if checkbootparam 'dmraid' ; then
1942 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1943 if [ "$ACTION" = "off" ] ; then
1944 # Deactivates all active software RAID sets:
1945 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1948 # Activate all software RAID sets discovered:
1949 einfo "Activating present dmraid sets (as requested via dmraid):"
1956 # by default (no special bootoptions) discover all software RAID devices:
1957 einfo "Searching for any present dmraid sets:"
1962 # {{{ LVM (Logical Volumes)
1964 [ -n "$INSTALLED" ] && return 0
1966 if checkbootparam 'nolvm' ; then
1967 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1969 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
1970 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
1971 eerror "LVM not available, can not execute it." ; eend 1
1973 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1974 einfo "You seem to have logical volumes (LVM) on your system."
1976 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1978 if checkbootparam 'lvm' ; then
1979 einfo "Bootoption LVM found. Searching for logical volumes:"
1980 /etc/init.d/lvm2 start ; eend $?
1984 fi # check for lvm binary
1985 fi # check for bootoption nolvm
1989 # {{{ debnet: setup network based on an existing one found on a partition
1991 if checkbootparam 'debnet' ; then
1992 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1998 # {{{ disable console blanking
2000 if checkbootparam 'noblank' ; then
2001 einfo "Bootoption noblank found. Disabling monitor blanking."
2002 setterm -blank 0 ; eend $?
2007 # {{{ tohd= bootoption
2010 if checkbootparam 'tohd' ; then
2011 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2012 if [ -z "$TARGET" ] ; then
2013 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2014 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2018 if ! [ -b "$TARGET" ] ; then
2019 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2023 if grep -q $TARGET /proc/mounts ; then
2024 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2029 local MOUNTDIR=$(mktemp -d)
2031 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2032 einfo "Copyring live system to $TARGET - this might take a while"
2033 rsync -a --progress /live/image/live $MOUNTDIR
2037 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2039 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2048 # {{{ debootstrap: automatic installation
2049 config_debootstrap(){
2051 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2053 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2055 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2057 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2062 if checkbootparam 'target' ; then
2064 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2065 # notice: the following checks whether the given partition is available, if not the skip
2066 # execution of grml-debootstrap as it might result in data loss...
2067 if ! [ -r "$TARGET" ] ; then
2068 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2072 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2077 if checkbootparam 'grub' ; then
2079 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2082 if checkbootparam 'groot' ; then
2084 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2087 if checkbootparam 'release' ; then
2089 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2092 if checkbootparam 'mirror' ; then
2094 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2097 if checkbootparam 'boot_append' ; then
2099 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2102 if checkbootparam 'password' ; then
2104 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2107 # now check which options are available
2108 if [ -n "TARGET" ] ; then
2109 TARGETCMD="--target $TARGET"
2113 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2117 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2118 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2119 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2120 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2121 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2122 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2124 # and finally write script and execute it
2125 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2127 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2130 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2132 screen /usr/bin/grml-debootstrap_noninteractive
2133 einfo "Invoking a shell, just exit to continue booting..."
2136 fi # checkbootparam "BOOT_IMAGE=debian2hd
2140 config_virtualbox_shared_folders() {
2141 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
2142 einfo "VirtualBox detected, trying to set up Shared Folders."
2143 if ! modprobe -l | grep -q vboxsf.ko ; then
2144 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
2146 elif ! [ -x /usr/sbin/VBoxService ] ; then
2147 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
2152 einfo "Loading vboxsf driver."
2153 lsmod | grep -q vboxsf || modprobe vboxsf
2156 einfo "Adjusting /dev/vboxguest."
2157 chown root:vboxsf /dev/vboxguest
2158 chmod 660 /dev/vboxguest
2163 einfo "Adding $fstabuser to group vboxsf."
2164 adduser grml vboxsf &>/dev/null
2167 einfo "Starting VBoxService."
2168 VBoxService >/dev/null &
2176 # {{{ Support customization
2178 if checkbootparam 'distri'; then
2179 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2180 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2181 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2182 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2183 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2184 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2190 ## END OF FILE #################################################################
2191 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3