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:/usr/X11R6/bin"
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
101 # execute flite only if it's present
103 [ -x /usr/bin/flite ] && flite -o play -t "$*"
107 # {{{ filesystems (proc, pts, sys) and fixes
109 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
113 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
117 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
121 # {{{ Check if we are running in live mode or from HD
123 [ -e /etc/grml_cd ] || INSTALLED="yes"
127 checkbootparam 'testcd' >>$DEBUG 2>&1 && TESTCD="yes"
130 # {{{ source lsb-functions , color handling
131 if checkbootparam 'nocolor'; then
133 . /etc/grml/lsb-functions
134 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
136 . /etc/grml/lsb-functions
143 checkbootparam 'debug' && BOOTDEBUG="yes"
144 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
147 if [ -n "$BOOTDEBUG" ]; then
148 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
149 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
150 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
151 einfo "Just exit the shell to continue boot process..."
155 if [ -r /etc/grml/screenrc ] ; then
156 einfo "Starting GNU screen to be able to use a full featured shell environment."
157 einfo "Just exit the shells (and therefore screen) to continue boot process..."
158 /bin/zsh -c "screen -c /etc/grml/screenrc"
160 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
161 einfo "Just exit the shell to continue boot process..."
173 if checkbootparam 'log' || checkbootparam 'debug' ; then
174 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
176 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
178 einfo "Starting bootlogd." # known to be *very* unreliable :(
179 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
187 # {{{ set firmware timeout via bootparam
189 if checkbootparam 'fwtimeout' ; then
190 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
191 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
192 rmmod firmware_class >>$DEBUG 2>&1
193 modprobe firmware_class ; eend $?
195 if [ -z "$TIMEOUT" ] ; then
196 TIMEOUT="100" # linux kernel default: 10
198 if [ -f /sys/class/firmware/timeout ] ; then
199 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
200 echo 100 > /sys/class/firmware/timeout ; eend $?
205 ### {{{ language configuration / localization
208 einfo "Activating language settings:"
211 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
212 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
214 # check for bootoption which overrides config from /etc/grml/autoconfig
215 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
216 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
218 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
219 if [ -z "$INSTALLED" ] ; then
220 [ -n "$LANGUAGE" ] || LANGUAGE='en'
223 if [ -x /usr/sbin/grml-setlang ] ; then
224 # if bootoption lang is used update /etc/default/locale accordingly
225 if [ -n "$BOOT_LANGUAGE" ] ; then
226 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "$LANGUAGE"
227 # otherwise default to lang=en
229 checkgrmlsmall && /usr/sbin/grml-setlang "POSIX" || /usr/sbin/grml-setlang "en"
234 if [ -z "$CONSOLEFONT" ] ; then
235 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
236 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
237 CONSOLEFONT='Uni3-Terminus16'
239 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
242 CONSOLEFONT='Lat15-Terminus16'
247 # export it now, so error messages get translated, too
248 if checkgrmlsmall ; then
249 export LANG='C' # grml-small does not provide any further locales
251 [ -r /etc/default/locale ] && . /etc/default/locale
255 # configure keyboard layout, read in already set values first:
256 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
258 # now allow keyboard override by boot commandline for later use:
259 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
260 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
261 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
262 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
263 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
265 # modify /etc/sysconfig/keyboard only in live-cd mode:
266 if [ -z "$INSTALLED" ] ; then
268 local LANGUAGE="$BOOT_LANGUAGE"
269 . /etc/grml/language-functions
270 # allow setting xkeyboard explicitly different than console keyboard
271 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
272 if [ -n "$KXKEYBOARD" ]; then
273 XKEYBOARD="$KXKEYBOARD"
274 KDEKEYBOARD="$KXKEYBOARD"
275 elif [ -n "$KKEYBOARD" ]; then
276 XKEYBOARD="$KKEYBOARD"
277 KDEKEYBOARD="$KKEYBOARD"
280 # duplicate of previous code to make sure /etc/grml/language-functions
281 # does not overwrite our values....
282 # now allow keyboard override by boot commandline for later use:
283 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
284 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
285 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
286 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
287 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
289 # write keyboard related variables to file for later use
290 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
291 if ! [ -e /etc/sysconfig/keyboard ] ; then
292 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
293 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
294 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
295 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
299 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
301 # activate unicode console if running within utf8 environment
302 if [ -r /etc/default/locale ] ; then
303 if grep -q "LANG=.*UTF" /etc/default/locale ; then
304 einfo "Setting up unicode environment."
305 unicode_start >>$DEBUG 2>&1 ; eend $?
309 # Set default keyboard before interactive setup
310 if [ -n "$KEYTABLE" ] ; then
311 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
312 loadkeys -q $KEYTABLE &
316 # we have to set up all consoles, therefore loop it over all ttys:
317 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
318 if [ -n "$NUM_CONSOLES" ] ; then
319 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
320 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
322 CUR_CONSOLE=$(fgconsole 2>/dev/null)
324 if [ -x "$(which setfont)" ] ; then
326 elif [ -x "$(which consolechars)" ] ; then
327 use_consolechars=true
329 eerror "Neither setfont nor consolechars tool present, can not set font."
334 if [ -n "$CHARMAP" ] ; then
335 einfo "Setting font to ${CHARMAP}"
337 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
338 if $use_setfont ; then
339 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
340 elif $use_consolechars ; then
341 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
344 if [ -n "$CUR_CONSOLE" ] ; then
345 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
350 if checkbootparam 'noconsolefont' ; then
351 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
353 if [ -n "$CONSOLEFONT" ] ; then
354 einfo "Setting font to ${CONSOLEFONT}"
356 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
357 if $use_setfont ; then
358 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
359 elif $use_consolechars ; then
360 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
363 if [ -n "$CUR_CONSOLE" ] ; then
364 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
376 if checkbootparam 'hostname' ; then
377 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
378 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
379 einfo "Generating random hostname as no hostname was specified."
380 HOSTNAME="$(/usr/bin/random-hostname)"
383 einfo "Setting hostname to $HOSTNAME as requested."
384 grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
385 [ "$RC" = "0" ] && hostname $HOSTNAME
388 hostname --file /etc/hostname
393 # fstabuser (needed when running from harddisk with username != grml {{{
395 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
396 if [ -n "$CONFIG_FSTAB_USER" ] ; then
397 fstabuser="$CONFIG_FSTAB_USER"
399 fstabuser=$(getent passwd 1000 | cut -d: -f1)
401 # if not yet set fall back to default 'grml' user
402 [ -n "$fstabuser" ] || fstabuser='grml'
406 # {{{ Set clock (Local time is more often used than GMT, so it is default)
408 # don't touch the files if running from harddisk:
409 if [ -z "$INSTALLED" ]; then
410 # The default hardware clock timezone is stated as representing local time.
412 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
413 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
414 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
415 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
416 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
417 # hwclock uses the TZ variable
418 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
419 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
420 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
421 ewarn "Warning: unknown timezone $KTZ" ; eend 1
423 ewarn "Falling back to timezone $KTZ" ; eend 0
426 if ! [ -r /dev/rtc ] ; then
427 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
430 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
431 if [ -n "$ERROR" ] ; then
433 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
434 if [ -n "$ERROR" ] ; then
435 eerror "Problem running hwclock: $ERROR" ; eend 1
444 # {{{ print kernel info
446 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
447 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
448 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
449 if [ -r /proc/cpuinfo ] ; then
450 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
452 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
456 if [ -d /proc/xen ] ; then
458 einfo 'Running kernel featuring support for Xen detected' ; eend 0
464 # {{{ ld.so.cache + depmod
466 if [ -n "$INSTALLED" ]; then
467 if ! [ -r /etc/grml.first.boot ] ; then
468 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
470 # Regenerate ld.so.cache and module dependencies on HD
471 einfo "Running ldconfig" ; ldconfig ; eend $?
472 einfo "Running depmod" ; depmod -a ; eend $?
473 touch /etc/grml.first.boot
483 # don't touch the files if running from harddisk:
484 if [ -z "$INSTALLED" ]; then
485 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
486 if [ -n "$KTZ" ] ; then
487 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
489 ewarn "Warning: unknown timezone $KTZ"; eend 0
491 einfo "Setting timezone."
493 area=$(echo $KTZ | cut -d '/' -f1)
494 zone=$(echo $KTZ | cut -d '/' -f2)
495 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
496 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
498 echo $KTZ > /etc/timezone
500 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
507 # small computer / nearly no ram {{{
510 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
511 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
514 if checkbootparam 'small'; then
515 einfo "Information: ${RAM} kB of RAM available." ; eend 0
516 einfo "Bootoption small detected. Activating small system."
517 if [ -r /etc/inittab.small ] ; then
518 mv /etc/inittab /etc/inittab.normal
519 mv /etc/inittab.small /etc/inittab
521 sed -i 's/^9/#&/' /etc/inittab
522 sed -i 's/^10/#&/' /etc/inittab
523 sed -i 's/^11/#&/' /etc/inittab
524 sed -i 's/^12/#&/' /etc/inittab
526 /sbin/telinit q ; eend $?
528 if checkgrmlsmall ; then
529 if [[ $RAM -lt 25000 ]] ; then
530 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
531 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
532 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
533 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
536 einfo "Information: ${RAM} kB of RAM available." ; eend 0
539 if [[ $RAM -lt 58000 ]] ; then
540 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
541 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
542 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
543 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
546 einfo "Information: ${RAM} kB of RAM available." ; eend 0
554 # skip startup of w3m {{{
556 if checkbootparam 'fast'; then
557 ewarn "Bootoption fast detected. Skipping startup of grml-quickconfig."
558 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
559 /sbin/telinit q ; eend $?
564 # activate serial console {{{
566 if checkbootparam 'console'; then
571 einfo "Bootoption for serial console detected:"
575 line="${line#*[$ws]}"
577 while [ -n "$line" ]; do
581 local device="${this%%,*}"
582 local device="${device##*=}"
583 if echo $serial | grep -q ttyS ; then
584 local option="${serial##*,}"
585 # default (works for kvm & CO):
586 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
587 # ... unless overriden by command line:
589 115200*) speed=115200 ;;
590 57600*) speed=57600 ;;
591 38400*) speed=38400 ;;
592 19200*) speed=19200 ;;
599 einfo "Activating console login on device ${device} with speed ${speed}."
600 local number="${device#ttyS}"
601 sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/bin/zsh-login $speed vt100 || sleep 30\"" /etc/inittab
608 this="${line%%[$ws]*}"
609 line="${line#*[$ws]}"
612 if [ -n "$telinitq" ]; then
620 # {{{ Bring up loopback interface now
622 if [ -z "$INSTALLED" ] ; then
623 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
624 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
632 # firewire devices {{{
633 # the raw1394 driver does not yet export info into SYSFS,
634 # so let's create raw1394 device manually
635 # http://www.michael-prokop.at/blog/index.php?p=352
636 config_firewire_dev(){
637 if checkbootparam 'nofirewiredev' ; then
638 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
640 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
641 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
642 # cd /dev && MAKEDEV video1394 raw1394
643 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
644 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
645 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
646 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
647 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
648 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
654 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
655 # otherwise we will get: passwd: Authentication token lock busy
657 if [ -z "$INSTALLED" ] ; then
665 if [ -n "$TESTCD" ]; then
666 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
667 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
670 if [ -n "${LIVECD_PATH}"/GRML ] ; then
671 ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
673 echo "${RED} *** Error: Could not find md5sum file. ***"
676 if [ "$RC" = "0" ]; then
677 einfo "Everything looks OK" ; eend 0
679 eerror 'Checksum failed for theses files:' ; eend 1
680 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
681 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
682 eerror '... RAM of your computer is broken.' ; eend 1
683 einfon "Hit return to continue, or press the reset button to quit."
692 # {{{ hardware detection via hwinfo
694 if checkbootparam 'hwinfo' >>$DEBUG 2>&1; then
695 einfo "Discovering hardware via hwinfo:"
696 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
697 echo -n " Loading modules: "
698 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
704 # {{{ disable hotplug agents on request
705 config_hotplug_agent(){
706 if checkbootparam 'noagent' ; then
707 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
708 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
709 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
710 einfo "Disabling hotplug-agent(s) $AGENTNL"
711 for agent in $(echo -e $AGENTLIST) ; do
712 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
714 [ "$?" == "0" ] ; eend $?
719 # {{{ blacklist of hotplug-modules
720 config_hotplug_blacklist(){
721 if checkbootparam 'black' ; then
722 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
723 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
724 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
725 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
726 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
727 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
735 if checkbootparam 'nohotplug' ; then
736 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
738 if [ -r /etc/init.d/hotplug ] ; then
739 einfo "Starting hotplug system in background."
740 /etc/init.d/hotplug start >>$DEBUG 2>>$DEBUG &
742 elif [ -r /etc/init.d/hotplug-light ] ; then
743 einfo "Starting hotplug-light system in background."
744 /etc/init.d/hotplug-light start >>$DEBUG 2>>$DEBUG &
747 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
753 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
755 if checkbootparam 'blacklist' ; then
756 if [ -z "$INSTALLED" ]; then
757 einfo "Bootoption blacklist found."
758 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
759 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
760 if [ -n "$BLACK" ] ; then
761 for module in $(echo ${BLACK//,/ }) ; do
762 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
763 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
764 echo "blacklist $module" >> "$BLACKLIST_FILE"
765 echo "alias $module off" >> "$BLACKLIST_FILE"
766 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
769 eerror "No given module for blacklist found. Blacklisting will not work therefore."
772 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
774 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
783 if [ -d /proc/acpi ]; then
784 if checkbootparam 'noacpi'; then
785 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
786 elif checkbootparam 'nogrmlacpi' ; then
787 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
789 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
792 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
794 basename="${basename%%.*}"
795 case "$basename" in *_acpi)
796 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
798 modprobe $basename >>$DEBUG 2>&1 && found="yes"
799 local BASE="$BASE $basename"
801 if [ -n "$found" ] ; then
802 einfo "$BASE" ; eend 0
804 ewarn "(none)" ; eend 1
806 if ! ps x | grep -q /usr/sbin/acpid ; then
807 if ! [ -r /var/run/dbus/pid ] ; then
808 einfo "Starting acpi daemon."
809 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
811 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
812 eerror "Solution: please activate acpid via /etc/runlevel.conf"
816 ewarn "acpi daemon already running."
823 if checkbootparam 'noapm'; then
824 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
826 modprobe apm power_off=1 >>$DEBUG 2>&1
827 if [ "$?" = "0" ] ; then
828 if [ -x /etc/init.d/apmd ] ;then
829 einfo "APM Bios found, enabling power management functions."
830 /etc/init.d/apmd start ; eend $?
833 eerror "Loading apm module failed." ; eend 1
840 # {{{ PCMCIA Check/Setup
841 # This needs to be done before other modules are being loaded (by hwsetup)
843 if checkbootparam 'nopcmcia'; then
844 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
846 if /usr/sbin/laptop-detect ; then
847 einfo "Detected Laptop - checking for PCMCIA." && eend 0
848 modprobe pcmcia_core >>$DEBUG 2>&1
849 # Try Cardbus or normal PCMCIA socket drivers
850 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
851 if [ "$?" = "0" ]; then
852 modprobe ds >>$DEBUG 2>&1
853 if [ -d /proc/bus/pccard ] ; then
854 if [ -x /sbin/cardmgr ] ; then
855 einfo "PCMCIA found, starting cardmgr."
856 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
858 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
867 # {{{ run software synthesizer via speakup
869 if checkbootparam 'swspeak' ; then
870 einfo "Bootoption swspeak found."
872 if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
873 ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
875 einfo "Loading speakup_soft"
876 if modprobe speakup_soft ; then
879 flitewrapper "Fatal error setting up software speakup"
886 if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
887 einfo "Kernel supports speakup." ; eend 0
889 einfo "Just run swspeak if you want to use software synthesizer via speakup."
890 flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
893 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
894 flitewrapper "Kernel does not seem to support speakup. Sorry."
900 # {{{ support hardware synthesizer via speakup
902 if checkbootparam 'speakup.synth' ; then
903 einfo "Bootoption speakup.synth found."
906 module="$(getbootparam 'speakup.synth' 2>>$DEBUG)"
907 if [ -z "$module" ] ; then
908 eerror "Sorry, no speakup module specified for bootoption speakup.synth."
909 flitewrapper "Sorry, no speakup module specified for bootoption speakup.synth."
911 einfo "Trying to load $module"
912 modprobe "speakup_${module}"
916 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
917 einfo "Kernel should support speakup now." ; eend 0
918 flitewrapper "Kernel should support speakup now."
920 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
921 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
927 elif checkbootparam 'hwspeak' ; then
928 einfo "Bootoption hwspeak found."
930 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
931 ewarn "Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
933 if ! [ -d "/lib/modules/${KERNEL}/extra/speakup/" ] ; then
934 eerror "Kernel does not provide speakup modules, sorry." ; eend 1
936 for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
937 sed 's#.*speakup/##g ; s#.ko$##g' | \
938 grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
939 einfo "Trying to load $module"
947 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
948 einfo "Kernel should support speakup now." ; eend 0
949 flitewrapper "Kernel should support speakup now."
951 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
952 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
958 # {{{ Check for blind option or brltty
961 checkbootparam 'blind' && BLIND="yes"
962 BRLTTY="$(getbootparam 'brltty' 2>>$DEBUG)"
964 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
965 if [ -x /sbin/brltty ]; then
966 # Blind option detected, start brltty now.
967 # modprobe serial_core parport_serial generic_serial && echo "done"
972 if [ -n "$BRLTTY" ]; then
974 BRLTYPE="${BRLTTY%%,*}"
976 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
978 BRLDEV="${BRLTTY%%,*}"
980 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
982 BRLTEXT="${BRLTTY%%,*}"
987 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
988 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
989 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
990 einfo "Starting braille-display manager."
993 sleep 2 && BLINDSOUND="yes"
1002 if checkbootparam 'forceagp' ; then
1003 # Probe for AGP. Hope this can fail safely
1004 grep -q "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
1010 config_automounter(){
1011 if checkbootparam 'automounter' ; then
1012 RUNLEVEL="$(runlevel)"
1014 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
1019 if [ -n "$AUTOMOUNTER" ]; then
1020 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
1021 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
1022 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
1023 anew="$d -fstype=auto,$2 :$i"
1024 grep -q "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
1025 AUTOMOUNTS="$AUTOMOUNTS $d"
1026 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
1028 [ -d /mnt/$d ] && mkdir -p /mnt/$d
1029 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
1031 grep -q "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
1034 AUTOMOUNTS="floppy cdrom"
1035 # Add new devices to /etc/fstab and /etc/auto.mnt
1036 for i in /dev/cdrom?*; do
1038 addautomount "$i" "ro"
1043 if [ -n "$AUTOMOUNTER" ]; then
1044 # Check for floppy dir, reinstall with automounter
1045 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
1046 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
1047 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
1048 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
1049 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
1050 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
1051 rm -f /etc/fstab.new
1052 # Replace paths from bootfloppy
1053 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
1054 mv -f /etc/fstab.new /etc/fstab
1055 # Start automounter now
1056 einfo "Starting automounter for ${AUTOMOUNTS}."
1057 /etc/init.d/autofs start >>$DEBUG ; eend $?
1062 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1066 while read major minor blocks partition relax; do
1067 partition="${partition##*/}"
1068 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1069 case "$partition" in
1070 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
1071 sd?) ;; # SCSI Harddisk, entire disk
1072 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
1073 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
1076 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1079 check_partitions >/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1082 # {{{ Enable DMA for all IDE drives now if not disabled
1083 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1085 if checkbootparam 'nodma'; then
1086 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1088 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1089 if test -d /proc/ide/$d; then
1090 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1091 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1092 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1093 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1094 echo "using_dma:1" >/proc/ide/$d/settings
1103 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1106 NOSWAP="yes" # we do not use swap by default!
1107 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
1109 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
1112 # Scan for swap, config, homedir - but only in live-mode
1113 if [ -z "$INSTALLED" ] ; then
1114 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1117 HOMEDIR="$(getbootparam 'home')"
1118 if [ -n "$partitions" ]; then
1119 while read p m f relax; do
1120 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1121 partoptions="users,exec"
1123 # it's a swap partition?
1126 if [ -n "$NOSWAP" ]; then
1127 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1130 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1131 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1132 if [ -n "$ANYSWAP" ] ; then
1133 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1134 swapon $p 2>>$DEBUG ; eend $?
1136 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1140 if [[ "$p" == LABEL* ]] ; then
1141 p=$(blkid -t $p | awk -F: '{print $1}')
1143 if grep -q $p /proc/swaps ; then
1144 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1146 if [ -b "$p" ] ; then
1147 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1148 swapon $p 2>>$DEBUG ; eend $?
1150 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1159 esac # it's a swap partition?
1164 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1165 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1167 # *) NONEFOUND='1'; continue ;;
1171 if [ -z "$NOSWAP" ] ; then
1172 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1173 # Activate swapfile, if exists
1174 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1176 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1177 mount -o remount,rw $m && MOUNTED=1
1178 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1180 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1182 fnew="$SWAPFILE swap swap defaults 0 0"
1183 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1184 GRML_SWP="$GRML_SWP $SWAPFILE"
1187 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1190 # use a image as home
1191 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1192 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1193 if [ -n "$HOMEDIR" ]; then
1194 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1198 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1200 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1205 # Umount, if not in use
1206 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1218 if [ -n "$MOUSE_DEVICE" ] ; then
1219 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1224 # {{{ IPv6 configuration
1225 # Load IPv6 kernel module and print IP adresses
1227 if checkbootparam 'ipv6'; then
1228 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1230 # we probably need some time until stateless autoconfiguration has happened
1232 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1233 for DEVICE in `echo "$NETDEVICES"`; do
1236 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1237 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1239 for ADDR in `echo "$ADDRESSES"` ; do
1242 if [ "$COUNT" -eq "0" ] ; then
1243 einfo "(none)" ; eend 1
1255 if checkbootparam 'nocpu'; then
1256 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1260 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
1261 einfo "Detecting CPU:"
1262 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)
1263 echo $CPU | sed 's/ \{1,\}/ /g'
1266 einfo "Detecting 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
1269 # Virtual Box supports ACPI and laptop-detect would return with '0', so check for it:
1270 if [ -r /proc/acpi/battery/BAT0/info ] && grep -q 'OEM info:.*innotek' /proc/acpi/battery/BAT0/info ; then
1271 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1275 if [ -x /etc/init.d/loadcpufreq ] ; then
1276 einfo "Trying to set up cpu frequency scaling:"
1278 SKIP_CPU_GOVERNOR=''
1279 LOADCPUFREQ=$(mktemp)
1280 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1281 if grep -q FATAL "$LOADCPUFREQ" ; then
1287 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1288 eerror "$line" ; eend $RC
1292 elif grep -q done "$LOADCPUFREQ" ; then
1293 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1294 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1295 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1297 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1303 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1304 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1306 if modprobe cpufreq_ondemand ; RC=$? ; then
1307 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1308 echo ondemand > $file
1319 # {{{ autostart of ssh
1321 if checkbootparam 'ssh' ; then
1323 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1324 einfo "Bootoption ssh found, trying to set password for user grml."
1326 if [ -z "$SSH_PASSWD" ] ; then
1327 if [ -x /usr/bin/apg ] ; then
1328 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1329 elif [ -x /usr/bin/gpw ] ; then
1330 SSH_PASSWD="$(gpw 1)"
1331 elif [ -x /usr/bin/pwgen ] ; then
1332 SSH_PASSWD="$(pwgen -1 8)"
1333 elif [ -x /usr/bin/hexdump ] ; then
1334 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1335 elif [ -n "$RANDOM" ] ; then
1336 SSH_PASSWD="grml${RANDOM}"
1339 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1343 if [ -n "$SSH_PASSWD" ] ; then
1344 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1349 # finally check if we have a password we can use:
1350 if [ -n "$SSH_PASSWD" ] ; then
1351 # chpasswd sucks, seriously.
1352 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1353 echo "grml:$SSH_PASSWD" | chpasswd -m
1355 echo "grml:$SSH_PASSWD" | chpasswd
1359 einfo 'Starting secure shell server in background.'
1360 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
1361 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
1365 ewarn 'Warning: please change the password for user grml as soon as possible!'
1371 # {{{ autostart of x11vnc
1374 USER=grml # TODO: make it dynamically configurable
1375 if checkbootparam 'vnc' ; then
1377 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1378 einfo "Bootoption vnc found, trying to set password for user $USER."
1380 if [ -z "$VNC_PASSWD" ] ; then
1381 if [ -x /usr/bin/apg ] ; then
1382 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1383 elif [ -x /usr/bin/gpw ] ; then
1384 VNC_PASSWD="$(gpw 1)"
1385 elif [ -x /usr/bin/pwgen ] ; then
1386 VNC_PASSWD="$(pwgen -1 8)"
1387 elif [ -x /usr/bin/hexdump ] ; then
1388 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1389 elif [ -n "$RANDOM" ] ; then
1390 VNC_PASSWD="${USER}${RANDOM}"
1393 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1397 if [ -n "$VNC_PASSWD" ] ; then
1398 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1403 # finally check if we have a password we can use:
1404 if [ -n "$VNC_PASSWD" ] ; then
1406 VNCDIR="/home/${USER}/.vnc"
1407 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1409 if [ ! -x /usr/bin/x11vnc ] ; then
1410 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1413 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1414 /bin/chown -R "$USER": "$VNCDIR"
1417 if checkbootparam 'vnc_connect' ; then
1419 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1420 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1421 #store the options in a file
1422 VNCDIR="/home/${USER}/.vnc"
1423 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1424 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1430 # {{{ set password for user grml
1432 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1433 einfo "Bootoption passwd found."
1434 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1435 if [ -n "$PASSWD" ] ; then
1436 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1438 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1441 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1449 if ! [ -x /usr/bin/amixer ] ; then
1450 eerror "amixer binary not available. Can not set sound volumes therefore."
1453 if ! [ -r /proc/asound/cards ] ; then
1454 ewarn "No soundcard present, skipping mixer settings therefore."
1459 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1460 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1463 if checkbootparam 'vol' ; then
1464 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1465 if [ -z "$VOL" ] ; then
1466 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1474 if checkbootparam 'nosound' ; then
1475 einfo "Muting sound devices on request."
1476 ERROR=$(amixer -q set Master mute)
1478 if [ -n "$ERROR" ] ; then
1480 eerror "Problem muting sound devices: $ERROR"
1484 elif [ -z "$INSTALLED" ] ; then
1485 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1487 if checkbootparam 'micvol' ; then
1488 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1493 for CONTROL in Master PCM ; do
1494 if amixer -q | grep -q "Simple mixer control '$CONTROL'" ; then
1495 amixer -q set "${CONTROL}" "${VOL}"%
1500 if [ ${MICVOL} -ne 0 ] ; then
1501 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1502 amixer -q set "Mic" $MICVOL &> /dev/null
1505 fi # checkbootparam 'nosound'
1512 # {{{ modem detection
1514 if checkbootparam 'nomodem'; then
1515 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1517 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1518 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1519 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1528 config_wondershaper(){
1529 if checkbootparam 'wondershaper' ; then
1530 WONDER="$(getbootparam 'wondershaper' 2>>$DEBUG)"
1535 if [ -n "$WONDER" ]; then
1537 DEVICE="${WONDER%%,*}"
1539 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1541 DOWNSTREAM="${WONDER%%,*}"
1543 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1545 UPSTREAM="${WONDER%%,*}"
1550 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1551 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1552 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1553 einfo "Starting wondershaper (${CMD}) in background."
1554 ( sh -c $CMD & ) && eend 0
1561 if checkbootparam 'nosyslog'; then
1562 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1565 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1566 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1567 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1568 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1569 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1571 if [ -z "$SYSLOGD" ] ; then
1572 eerror "No syslog daemon found." ; eend 1
1574 einfo "Starting $SYSLOGD in background."
1575 /etc/init.d/$SYSLOGD start >>$DEBUG &
1584 if checkbootparam 'nogpm'; then
1585 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1587 if ! [ -r /dev/input/mice ] ; then
1588 eerror "No mouse found - not starting GPM." ; eend 1
1590 einfo "Starting gpm in background."
1591 /etc/init.d/gpm start >>$DEBUG &
1592 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1601 if checkbootparam 'services' ; then
1602 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1603 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1604 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1605 einfo "Starting service(s) ${SERVICENL} in background."
1606 for service in $(echo -e $SERVICELIST) ; do
1607 /etc/init.d/${service} start >>$DEBUG &
1609 [ "$?" == "0" ] ; eend $?
1616 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1617 SOURCE=$(eval echo "$1")
1620 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1621 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1623 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1625 while ! getconfig && [[ "$counter" != 0 ]] ; do
1626 echo -n "Sleeping for 1 second and trying to get config again... "
1627 counter=$(( counter-1 ))
1628 echo "$counter tries left" ; sleep 1
1630 if [ -s "$TARGET" ] ; then
1631 einfo "Downloading was successfull." ; eend 0
1632 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1633 md5sum ${TARGET} ; eend 0
1636 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1644 if checkbootparam 'netconfig' ; then
1645 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1646 CONFIGFILE='/tmp/netconfig.grml'
1648 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1649 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1656 # {{{ remote scripts
1657 config_netscript() {
1658 if checkbootparam 'netscript' ; then
1659 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1660 SCRIPTFILE='/tmp/netscript.grml'
1662 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1663 chmod +x ${SCRIPTFILE}
1664 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1672 config_blindsound(){
1673 if checkbootparam 'blind' ; then
1675 flitewrapper "welcome to the gremel system"
1682 if checkbootparam 'welcome' ; then
1683 flitewrapper "welcome to the gremel system"
1688 # {{{ fix/workaround for unionfs
1690 if [ -z "$INSTALLED" ]; then
1691 touch /var/cache/apt/*cache.bin
1696 # {{{ start X window system via grml-x
1698 # make sure we start X only if startx is used *before* a nostartx option
1699 # so it's possible to disable automatic X startup using nostart
1700 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1701 if [ -x "$(which X)" ] ; then
1702 if [ -z "$INSTALLED" ] ; then
1703 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1704 if [ -z "$WINDOWMANAGER" ] ; then
1705 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1706 WINDOWMANAGER="wm-ng"
1708 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1710 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1711 config_userfstab || fstabuser='grml'
1712 cat>|/etc/init.d/xstartup<<EOF
1714 su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
1716 chmod 755 /etc/init.d/xstartup
1718 # adjust inittab for xstartup
1719 if grep -q '^6:' /etc/inittab ; then
1720 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
1721 else # just append tty6 to inittab if no definition is present:
1722 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1725 /sbin/telinit q ; eend $?
1727 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1728 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1730 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1734 eerror "We are not running in live mode - startx will not work, skipping it."
1735 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1738 eerror "/usr/X11R6/bin/X is not present on this grml flavour."
1739 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1745 # {{{ configuration framework
1747 if checkbootparam 'extract' ; then
1748 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1749 EXTRACTOPTIONS="-- -x $EXTRACT"
1753 config_finddcsdir() {
1754 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1755 # on the command line, nothing is changed and the dcs files are
1756 # searched within the .iso, $dcs-dir is set to the root directory
1758 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1759 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1760 # set, $dcs-dir is set to the root directory within the .iso.
1761 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1762 # foo, even if a GRMLCFG partition is present.
1765 # autoconfig, see issue673
1766 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1767 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1768 if checkbootparam 'noautoconfig' || checkbootparam 'forensic' ; then
1769 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1771 if [ -z "$INSTALLED" ] ; then
1772 if checkbootparam 'myconfig' ; then
1773 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1774 if [ -z "$DCSDEVICE" ]; then
1775 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1776 fi # [ -z "$DCSDEVICE" ]
1777 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1778 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1780 # We do need the following fix so floppy disk is available to blkid in any case :-/
1781 if [ -r /dev/fd0 ] ; then
1782 einfo "Floppy device detected. Trying to access floppy disk."
1783 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 >>$DEBUG 2>&1 ; then
1784 blkid /dev/fd0 >>$DEBUG 2>&1
1787 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1788 if [ -n "$DCSDEVICE" ]; then
1789 DCSMP="/mnt/grmlcfg"
1794 # if not specified/present then assume default:
1795 if [ -z "$DCSDEVICE" ]; then
1796 DCSDIR="/live/image"
1799 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1800 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1801 if [ -n "$DCSDIR" ]; then
1802 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1804 [ -d $DCSMP ] || mkdir $DCSMP
1805 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1806 mount -o ro -t auto $DCSDEVICE $DCSMP ; RC="$?"
1807 if [[ $RC == 0 ]]; then
1808 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1810 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1819 if [ -n "$DCSDIR" -a "$DCSDIR" != "/live/image" ] ; then
1820 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1821 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1822 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1828 if checkbootparam 'partconf' ; then
1829 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1830 if [ -n "$MOUNTDEVICE" ]; then
1831 [ -d /mnt/grml ] || mkdir /mnt/grml
1832 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1833 if [[ $RC == 0 ]]; then
1834 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1835 einfo "Copying files from $MOUNTDEVICE over grml system."
1836 for file in `cat /etc/grml/partconf` ; do
1837 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1838 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1841 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1842 fi # mount $MOUNTDEVICE
1843 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1845 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1846 fi # [ -n "$MOUNTDEVICE" ]
1851 # {{{ /cdrom/.*-options
1853 if checkbootparam 'debs' ; then
1854 iszsh && setopt localoptions shwordsplit
1855 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1856 if [ -z "$DEBS" ] ; then
1859 if ! echo $DEBS | grep -q '/'; then
1860 # backwards compatibility: if no path is given get debs from debs/
1863 einfo "Tring to install debian package(s) ${DEBS}"
1864 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1865 dpkg -i $DEBS ; eend $?
1870 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1871 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1872 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1873 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1875 if ! echo $SCRIPTS | grep -q '/'; then
1876 # backwards compatibility: if no path is given get scripts from scripts/
1877 SCRIPTS="scripts/$SCRIPTS"
1879 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1880 # we are executing from a GRMLCFG labeled fs
1881 # kick everything we have done before and start over
1882 SCRIPTS="$(cd ${DCSDIR}; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1884 if [ -n "$SCRIPTS" ]; then
1885 SCRIPTS="${DCSDIR}/$SCRIPTS"
1886 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1887 einfo "Trying to execute ${SCRIPTS}"
1889 elif [ -d "$SCRIPTS" ]; then
1890 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1893 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1901 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1902 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1903 if [ -z "$CONFIG" ]; then
1904 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1906 if [ -n "$CONFIG" ]; then
1907 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1908 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1910 cp -a ${DCSDIR}/${CONFIG}/* /
1911 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1912 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1915 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1917 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1924 # {{{ confing_umount_dcsdir
1925 config_umount_dcsdir(){
1926 # umount $DCSMP if it was mounted by finddcsdir
1927 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1933 if checkbootparam 'mypath' ; then
1934 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1935 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1936 touch /etc/grml/my_path
1937 chmod 644 /etc/grml/my_path
1938 # make sure the directories exist:
1940 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1941 if ! [ -d "$i" ] ; then
1942 einfo "Creating directory $i"
1943 mkdir -p "$i" ; eend $?
1946 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1954 if checkbootparam 'distcc' ; then
1955 OPTIONS="$(getbootparam 'distcc' 2>>$DEBUG)"
1956 if [ -n "$OPTIONS" ]; then
1959 if [ -n "$OPTIONS" ]; then
1960 NET="${OPTIONS%%,*}"
1962 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1964 INTERFACE="${OPTIONS%%,*}"
1969 CONFIG=/etc/default/distcc
1970 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1971 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1973 if [ -n "$INTERFACE" ] ; then
1974 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1977 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1978 counter=$(( counter-1 ))
1979 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1981 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1985 if [ -n "$IP" ] ; then
1986 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1988 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1990 id distccd >/dev/null 2>&1 || \
1992 einfo "Creating distcc user" ; \
1993 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1996 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1997 /etc/init.d/distcc start >/dev/null ; eend $?
2000 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2004 if checkbootparam 'gcc'; then
2005 GCC="$(getbootparam 'gcc' 2>>$DEBUG)"
2007 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2010 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2013 if checkbootparam 'gpp'; then
2014 GPP="$(getbootparam 'gpp' 2>>$DEBUG)"
2016 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2017 if [ -x /usr/bin/g++-${GPP} ] ; then
2019 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2021 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2022 if [ -x /usr/bin/cpp-${GPP} ] ; then
2024 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2033 # Notice: use it only on live-cd system, if running from harddisk please
2034 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2035 # in /etc/runlevel.conf
2037 MODULES_FILE=/etc/grml/modules
2038 if checkbootparam 'nomodules' ; then
2039 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2040 elif [ -z "$INSTALLED" ]; then
2041 if [ -r $MODULES_FILE ] ; then
2042 einfo "Loading modules specified in ${MODULES_FILE}:"
2044 grep '^[^#]' $MODULES_FILE | \
2045 while read module args; do
2046 [ "$module" ] || continue
2048 modprobe $module $args ; eend $?
2052 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2059 config_915resolution(){
2060 if checkbootparam '915resolution' ; then
2061 OPTIONS="$(getbootparam '915resolution' 2>>$DEBUG)"
2062 if [ -x /usr/sbin/915resolution ]; then
2067 if [ -n "$OPTIONS" ]; then
2069 MODE="${OPTIONS%%,*}"
2071 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2073 XRESO="${OPTIONS%%,*}"
2075 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2077 YRESO="${OPTIONS%%,*}"
2082 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2083 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2092 [ -n "$INSTALLED" ] && return 0
2094 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2095 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
2096 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2097 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2099 if ! [ -x /sbin/mdadm ] ; then
2100 eerror "mdadm not available, can not execute it." ; eend 1
2103 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2104 # find out whether we have a valid configuration file already
2105 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2106 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2107 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2108 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2110 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2113 if ! checkbootparam 'swraid' ; then
2115 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2118 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2123 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2125 *'No arrays found'*)
2126 ewarn "$line" ; eend 0
2129 einfo "$line" ; eend 0
2136 if [ -r /proc/mdstat ] ; then
2138 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2139 if [ -z "$MDSTAT" ] ; then
2140 ewarn "No active arrays found" ; eend 0
2145 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2146 einfo "active arrays: $line" ; eend 0
2152 fi # bootoption swraid
2154 fi # is /sbin/mdadm executable?
2155 fi # check for bootoptions
2161 [ -n "$INSTALLED" ] && return 0
2163 if checkbootparam 'nodmraid' ; then
2164 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
2168 if ! [ -x /sbin/dmraid ] ; then
2169 eerror "dmraid not available, can not execute it." ; eend 1
2174 # usage: dmraid_wrapper <dmraid_option>
2175 [ -n "$1" ] || return 1
2182 for line in $(dmraid $1 ; echo errcode:$?); do
2184 *'no block devices found'*)
2185 einfo "No block devices found" ; eend 0
2189 einfo "No active dmraid devices found" ; eend 0
2208 if checkbootparam 'dmraid' ; then
2209 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
2210 if [ "$ACTION" = "off" ] ; then
2211 # Deactivates all active software RAID sets:
2212 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
2215 # Activate all software RAID sets discovered:
2216 einfo "Activating present dmraid sets (as requested via dmraid):"
2223 # by default (no special bootoptions) discover all software RAID devices:
2224 einfo "Searching for any present dmraid sets:"
2229 # {{{ LVM (Logical Volumes)
2231 [ -n "$INSTALLED" ] && return 0
2233 if checkbootparam 'nolvm' ; then
2234 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2236 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2237 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2238 eerror "LVM not available, can not execute it." ; eend 1
2240 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
2241 einfo "You seem to have logical volumes (LVM) on your system."
2243 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2245 if checkbootparam 'lvm' ; then
2246 einfo "Bootoption LVM found. Searching for logical volumes:"
2247 /etc/init.d/lvm2 start ; eend $?
2251 fi # check for lvm binary
2252 fi # check for bootoption nolvm
2256 # {{{ debnet: setup network based on an existing one found on a partition
2258 if checkbootparam 'debnet' ; then
2259 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2265 # {{{ disable console blanking
2267 if checkbootparam 'noblank' ; then
2268 einfo "Bootoption noblank found. Disabling monitor blanking."
2269 setterm -blank 0 ; eend $?
2274 # {{{ tohd= bootoption
2277 if checkbootparam 'tohd' ; then
2278 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2279 if [ -z "$TARGET" ] ; then
2280 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2281 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2285 if ! [ -b "$TARGET" ] ; then
2286 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2290 if grep -q $TARGET /proc/mounts ; then
2291 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2296 local MOUNTDIR=$(mktemp -d)
2298 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2299 einfo "Copyring live system to $TARGET - this might take a while"
2300 rsync -a --progress /live/image/live $MOUNTDIR
2304 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2306 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2315 # {{{ grml2hd: automatic installation
2318 if checkbootparam "grml2hd" || checkbootparam "BOOT_IMAGE=grml2hd" ; then
2320 if checkbootparam 'user' ; then
2322 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2323 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2326 if checkbootparam 'filesystem' ; then
2328 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2329 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2332 if checkbootparam 'partition' ; then
2334 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2335 # notice: the following checks whether the given partition is available, if not the skip
2336 # execution of grml2hd as it might result in data loss...
2337 if [ -r $PARTITION ] ; then
2338 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2340 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2344 if checkbootparam 'mbr' ; then
2346 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2347 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2350 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2352 GRML2HD_NONINTERACTIVE='yes' grml2hd
2355 chmod 755 /usr/bin/grml2hd_noninteractive
2356 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2357 if [ -z "$GRML2HD_FAIL" ] ; then
2358 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2360 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2363 fi # if checkbootparam "BOOT_IMAGE=grml2hd ...
2367 # {{{ debootstrap: automatic installation
2368 config_debootstrap(){
2370 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
2372 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2374 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2376 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2381 if checkbootparam 'target' ; then
2383 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2384 # notice: the following checks whether the given partition is available, if not the skip
2385 # execution of grml-debootstrap as it might result in data loss...
2386 if ! [ -r "$TARGET" ] ; then
2387 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2391 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2396 if checkbootparam 'grub' ; then
2398 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2401 if checkbootparam 'groot' ; then
2403 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2406 if checkbootparam 'release' ; then
2408 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2411 if checkbootparam 'mirror' ; then
2413 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2416 if checkbootparam 'boot_append' ; then
2418 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2421 if checkbootparam 'password' ; then
2423 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2426 # now check which options are available
2427 if [ -n "TARGET" ] ; then
2428 TARGETCMD="--target $TARGET"
2432 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2436 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2437 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2438 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2439 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2440 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2441 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2443 # and finally write script and execute it
2444 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2446 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2449 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2451 screen /usr/bin/grml-debootstrap_noninteractive
2452 einfo "Invoking a shell, just exit to continue booting..."
2455 fi # checkbootparam "BOOT_IMAGE=debian2hd
2459 # {{{ Support customization
2461 if checkbootparam 'distri'; then
2462 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2463 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2464 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2465 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2466 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2467 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2473 ## END OF FILE #################################################################
2474 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3