2 # Filename: autoconfig.functions
3 # Purpose: basic system configuration and hardware setup for grml system
4 # Authors: grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (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 # Latest change: Don Nov 15 11:46:04 CET 2007 [mika]
8 ################################################################################
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
21 if [ -n "$ZSH_VERSION" ] ; then
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
31 ### {{{ Utility Functions
35 case "$(cat $2)" in *$1*) return 0;; esac
41 case "$2" in *$1*) return 0;; esac
45 # Reread boot command line; echo last parameter's argument or return false.
47 stringinstring " $1=" "$CMDLINE" || return 1
48 result="${CMDLINE##*$1=}"
49 result="${result%%[ ]*}"
54 # Check boot commandline for specified option
56 stringinstring " $1" "$CMDLINE"
61 if [ "$1" = "yes" ] ; then
69 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
73 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 # {{{ filesystems (proc, pts, sys) and fixes
79 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
83 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
87 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
97 # {{{ Check if we are running from the grml-CD or HD
99 [ -e /etc/grml_cd ] || INSTALLED="yes"
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
109 . /etc/grml/lsb-functions
110 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
112 . /etc/grml/lsb-functions
119 if checkbootparam "debug"; then
122 if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
126 if [ -n "$BOOTDEBUG" ]; then
127 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
129 if [ -r /etc/grml/screenrc ] ; then
130 einfo "Starting GNU screen to be able to use a full featured shell environment."
131 einfo "Just exit the shells (and therefore screen) to continue boot process..."
132 /bin/zsh -c "screen -c /etc/grml/screenrc"
134 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135 einfo "Just exit the shell to continue boot process..."
146 if checkbootparam "log"; then
147 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
149 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
151 einfo "Starting bootlogd."
152 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
160 # {{{ set firmware timeout via bootparam
162 if checkbootparam fwtimeout ; then
163 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
164 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
165 rmmod firmware_class 1>>$DEBUG 2>&1
166 modprobe firmware_class ; eend $?
168 if [ -z "$TIMEOUT" ] ; then
169 TIMEOUT="100" # linux kernel default: 10
171 if [ -f /sys/class/firmware/timeout ] ; then
172 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
173 echo 100 > /sys/class/firmware/timeout ; eend $?
178 ### {{{ language configuration / localization
181 einfo "Activating language settings:"
184 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
185 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
187 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
189 # check for bootoption which overrides config from /etc/grml/autoconfig:
190 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
191 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
193 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
194 if [ -z "$INSTALLED" ] ; then
195 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
198 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
199 if [ -n "$BOOT_LANGUAGE" ] ; then
200 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
204 if [ -z "$CONSOLEFONT" ] ; then
205 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
206 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
207 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
208 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
209 CONSOLEFONT='Uni3-Terminus16'
211 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
216 # export it now, so error messages get translated, too
217 if checkgrmlsmall ; then
218 export LANG='C' # grml-small does not provide any further locales
220 [ -r /etc/default/locale ] && . /etc/default/locale
224 # configure keyboard layout, read in already set values first:
225 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
227 # now allow keyboard override by boot commandline for later use:
228 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
229 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
230 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
231 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
232 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
234 # modify /etc/sysconfig/keyboard only in live-cd mode:
235 if [ -z "$INSTALLED" ] ; then
237 local LANGUAGE="$BOOT_LANGUAGE"
238 . /etc/grml/language-functions
239 # allow setting xkeyboard explicitly different than console keyboard
240 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
241 if [ -n "$KXKEYBOARD" ]; then
242 XKEYBOARD="$KXKEYBOARD"
243 KDEKEYBOARD="$KXKEYBOARD"
244 elif [ -n "$KKEYBOARD" ]; then
245 XKEYBOARD="$KKEYBOARD"
246 KDEKEYBOARD="$KKEYBOARD"
249 # duplicate of previous code to make sure /etc/grml/language-functions
250 # does not overwrite our values....
251 # now allow keyboard override by boot commandline for later use:
252 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
253 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
254 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
255 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
256 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
258 # write keyboard related variables to file for later use
259 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
260 if ! [ -e /etc/sysconfig/keyboard ] ; then
261 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
262 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
263 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
264 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
268 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
270 # activate unicode console if running within utf8 environment
271 if [ -r /etc/default/locale ] ; then
272 if grep -q "LANG=.*UTF" /etc/default/locale ; then
273 einfo "Setting up unicode environment."
274 unicode_start 2>>$DEBUG ; eend $?
278 # Set default keyboard before interactive setup
279 if [ -n "$KEYTABLE" ] ; then
280 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281 loadkeys -q $KEYTABLE &
285 # we have to set up all consoles, therefore loop it over all ttys:
286 NUM_CONSOLES=`fgconsole --next-available`
287 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
288 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
290 if [ -n "$CHARMAP" ] ; then
291 einfo "Running consolechars for ${CHARMAP}"
292 for vc in `seq 0 ${NUM_CONSOLES}` ; do
293 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
298 if [ -n "$CONSOLEFONT" ] ; then
299 einfo "Running consolechars using ${CONSOLEFONT}"
300 for vc in `seq 0 ${NUM_CONSOLES}` ; do
301 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
312 if checkbootparam hostname ; then
313 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
314 einfo "Setting hostname to $HOSTNAME as requested."
315 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
316 hostname $HOSTNAME ; eend $?
318 hostname --file /etc/hostname
323 # fstabuser (needed when running from harddisk with username != grml {{{
325 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
326 if [ -n "$CONFIG_FSTAB_USER" ] ; then
327 fstabuser="$CONFIG_FSTAB_USER"
329 fstabuser=$(getent passwd 1000 | cut -d: -f1)
331 # if not yet set fall back to default 'grml' user
332 [ -n "$fstabuser" ] || fstabuser='grml'
336 # {{{ Set clock (Local time is more often used than GMT, so it is default)
338 # don't touch the files if running from harddisk:
339 if [ -z "$INSTALLED" ]; then
341 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
342 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
343 # hwclock uses the TZ variable
344 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
345 [ -n "$TZ" ] || TZ=Europe/Vienna
347 if ! [ -r /dev/rtc ] ; then
348 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
350 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
351 if [ -n "$ERROR" ] ; then
353 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
354 if [ -n "$ERROR" ] ; then
355 eerror "Problem running hwclock: $ERROR" ; eend 1
364 # {{{ print kernel info
366 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
367 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
368 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
369 if [ -r /proc/cpuinfo ] ; then
370 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
372 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
376 if [ -d /proc/xen ] ; then
378 einfo 'Running kernel featuring support for Xen detected' ; eend 0
384 # {{{ vmware specific stuff
386 if checkbootparam novmware ; then
387 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
389 if [ -z "$INSTALLED" ] ; then
390 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
391 if ! checkbootparam qemu ; then
392 if [ -r /etc/X11/xorg.conf.vmware ] ; then
393 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
394 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
403 # {{{ qemu specific stuff
405 if checkbootparam qemu ; then
406 if [ -r /etc/X11/xorg.conf.example ] ; then
407 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
408 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
414 # {{{ ld.so.cache + depmod
416 if [ -n "$INSTALLED" ]; then
417 if ! [ -r /etc/grml.first.boot ] ; then
418 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
420 # Regenerate ld.so.cache and module dependencies on HD
421 einfo "Running ldconfig" ; ldconfig ; eend $?
422 einfo "Running depmod" ; depmod -a ; eend $?
423 touch /etc/grml.first.boot
431 # update_progress {{{
433 # be sure we are non-blocking
434 (echo "$1" > /etc/sysconfig/progress) &
440 # don't touch the files if running from harddisk:
441 if [ -z "$INSTALLED" ]; then
442 KTZ="$(getbootparam tz 2>>$DEBUG)"
443 if [ -n "$KTZ" ] ; then
444 einfo "Setting timezone."
445 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
447 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
453 # small computer / nearly no ram {{{
456 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
457 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
460 if checkbootparam "small"; then
461 einfo "Information: ${RAM} kB of RAM available." ; eend 0
462 einfo "Bootoption small detected. Activating small system."
463 if [ -r /etc/inittab.small ] ; then
464 mv /etc/inittab /etc/inittab.normal
465 mv /etc/inittab.small /etc/inittab
467 sed -i 's/^9/#&/' /etc/inittab
468 sed -i 's/^10/#&/' /etc/inittab
469 sed -i 's/^11/#&/' /etc/inittab
470 sed -i 's/^12/#&/' /etc/inittab
472 /sbin/telinit q ; eend $?
474 if checkgrmlsmall ; then
475 if [[ $RAM -lt 25000 ]] ; then
476 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
477 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
478 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
479 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
482 einfo "Information: ${RAM} kB of RAM available." ; eend 0
485 if [[ $RAM -lt 58000 ]] ; then
486 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
487 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
488 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
489 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
492 einfo "Information: ${RAM} kB of RAM available." ; eend 0
500 # skip startup of w3m {{{
502 if checkbootparam "fast"; then
503 ewarn "Bootoption fast detected. Skipping startup of w3m."
504 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
505 /sbin/telinit q ; eend $?
510 # activate serial console {{{
512 if checkbootparam "console"; then
513 einfo "Bootoption (for serial) console detected."
515 if [ -r /etc/mgetty/mgetty.config ] ; then
516 MODE=$(getbootparam console | awk -F, '{print $2}')
518 [ -n "$MODE" ] || MODE=9600 # default mode
519 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
520 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
523 einfo "Activating mgetty."
524 sed -i 's/^#T0/T0/' /etc/inittab
525 sed -i 's/^#T1/T1/' /etc/inittab
526 /sbin/telinit q ; eend $?
532 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
535 for DEVICE in /proc/ide/hd?; do
536 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
538 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
542 # {{{ Bring up loopback interface now
544 if [ -z "$INSTALLED" ] ; then
545 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
546 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
554 # firewire devices {{{
555 # the raw1394 driver does not yet export info into SYSFS,
556 # so let's create raw1394 device manually
557 # http://www.michael-prokop.at/blog/index.php?p=352
558 config_firewire_dev(){
559 if checkbootparam "nofirewiredev" ; then
560 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
562 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
563 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
564 # cd /dev && MAKEDEV video1394 raw1394
565 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
566 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
567 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
568 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
569 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
570 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
576 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
577 # otherwise we will get: passwd: Authentication token lock busy
579 if [ -z "$INSTALLED" ] ; then
587 if [ -n "$TESTCD" ]; then
588 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
589 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
592 # /linuxrc grml version:
593 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
594 # live-initramfs version:
595 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
597 if [ -n "$TESTCD_PATH" ] ; then
598 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
600 echo "${RED} *** Error: Could not find md5sum file. ***"
603 if [ "$RC" = "0" ]; then
604 einfo "Everything looks OK" ; eend 0
606 eerror 'Checksum failed for theses files:' ; eend 1
607 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
608 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
609 eerror '... RAM of your computer is broken.' ; eend 1
610 einfon "Hit return to continue, or press the reset button to quit."
619 # {{{ hardware detection via discover
621 if checkbootparam "nodisc" ; then
622 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
624 if [ -x /sbin/discover ] ; then
625 einfo "Discovering hardware. Trying to load the following modules in background:"
627 einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
629 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
632 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
638 # {{{ hardware detection via hwinfo
640 if checkbootparam hwinfo >>$DEBUG 2>&1; then
641 einfo "Discovering hardware via hwinfo:"
642 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
643 echo -n " Loading modules: "
644 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
650 # {{{ disable hotplug agents on request
651 config_hotplug_agent(){
652 if checkbootparam "noagent" ; then
653 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
654 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
655 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
656 einfo "Disabling hotplug-agent(s) $AGENTNL"
657 for agent in $(echo -e $AGENTLIST) ; do
658 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
660 [ "$?" == "0" ] ; eend $?
665 # {{{ blacklist of hotplug-modules
666 config_hotplug_blacklist(){
667 if checkbootparam "black" ; then
668 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
669 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
670 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
671 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
672 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
673 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
681 if checkbootparam "nohotplug" ; then
682 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
684 if [ -r /etc/init.d/hotplug ] ; then
685 einfo "Starting hotplug system in background."
686 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
688 elif [ -r /etc/init.d/hotplug-light ] ; then
689 einfo "Starting hotplug-light system in background."
690 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
693 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
699 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
701 if checkbootparam "blacklist" ; then
702 if [ -z "$INSTALLED" ]; then
703 einfo "Bootoption blacklist found."
704 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
705 if [ -n "$BLACK" ] ; then
706 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
707 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
708 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
709 echo "alias $BLACK off" >> /etc/modprobe.d/grml
710 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
712 eerror "No given module for blacklist found. Blacklisting will not work therefore."
715 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
717 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
726 if [ -d /proc/acpi ]; then
727 if checkbootparam "noacpi"; then
728 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
729 elif checkbootparam "nogrmlacpi" ; then
730 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
732 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
735 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
737 basename="${basename%%.*}"
738 case "$basename" in *_acpi)
739 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
741 modprobe $basename >>$DEBUG 2>&1 && found="yes"
742 local BASE="$BASE $basename"
744 if [ -n "$found" ] ; then
745 einfo "$BASE" ; eend 0
747 ewarn "(none)" ; eend 1
749 if ! ps x | grep -q /usr/sbin/acpid ; then
750 if ! [ -r /var/run/dbus/pid ] ; then
751 einfo "Starting acpi daemon."
752 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
754 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
755 eerror "Solution: please activate acpid via /etc/runlevel.conf"
759 ewarn "acpi daemon already running."
766 if checkbootparam "noapm"; then
767 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
769 modprobe apm power_off=1 >>$DEBUG 2>&1
770 if [ "$?" = "0" ] ; then
771 if [ -x /etc/init.d/apmd ] ;then
772 einfo "APM Bios found, enabling power management functions."
773 /etc/init.d/apmd start ; eend $?
776 eerror "Loading apm module failed." ; eend 1
783 # {{{ PCMCIA Check/Setup
784 # This needs to be done before other modules are being loaded (by hwsetup)
786 if checkbootparam "nopcmcia"; then
787 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
789 if /usr/sbin/laptop-detect ; then
790 einfo "Detected Laptop - checking for PCMCIA." && eend 0
791 modprobe pcmcia_core >>$DEBUG 2>&1
792 # Try Cardbus or normal PCMCIA socket drivers
793 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
794 if [ "$?" = "0" ]; then
795 modprobe ds >>$DEBUG 2>&1
796 if [ -d /proc/bus/pccard ] ; then
797 if [ -x /sbin/cardmgr ] ; then
798 einfo "PCMCIA found, starting cardmgr."
799 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
801 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
810 # {{{ run software synthesizer via speakup
812 if checkbootparam swspeak ; then
813 if [ -d /proc/speakup/ ] ; then
814 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
816 if [ -x /etc/init.d/speech-dispatcher ] ; then
817 einfo "Starting speech-dispatcher."
818 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
819 einfo "Activating sftsyn in Kernel."
820 echo sftsyn >/proc/speakup/synth_name ; eend $?
821 einfo "Just run swspeak if you want to use software synthesizer via speakup."
822 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
824 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
825 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
829 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
830 flite -o play -t "Kernel does not seem to support speakup. Sorry."
836 # {{{ Check for blind option or brltty
839 checkbootparam "blind" && BLIND="yes"
840 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
842 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
843 if [ -x /sbin/brltty ]; then
844 # Blind option detected, start brltty now.
845 # modprobe serial_core parport_serial generic_serial && echo "done"
850 if [ -n "$BRLTTY" ]; then
852 BRLTYPE="${BRLTTY%%,*}"
854 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
856 BRLDEV="${BRLTTY%%,*}"
858 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
860 BRLTEXT="${BRLTTY%%,*}"
865 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
866 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
867 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
868 einfo "Starting braille-display manager."
871 sleep 2 && BLINDSOUND="yes"
878 # {{{ Interactive configuration
879 config_interactive(){
880 ewarn "config_interactive is deprecated nowadays."
881 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
887 if checkbootparam forceagp ; then
888 # Probe for AGP. Hope this can fail safely
889 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
895 config_automounter(){
896 if checkbootparam automounter ; then
897 RUNLEVEL="$(runlevel)"
899 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
904 if [ -n "$AUTOMOUNTER" ]; then
905 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
906 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
907 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
908 anew="$d -fstype=auto,$2 :$i"
909 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
910 AUTOMOUNTS="$AUTOMOUNTS $d"
911 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
913 [ -d /mnt/$d ] && mkdir -p /mnt/$d
914 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
916 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
919 AUTOMOUNTS="floppy cdrom"
920 # Add new devices to /etc/fstab and /etc/auto.mnt
921 for i in /dev/cdrom?*; do
923 addautomount "$i" "ro"
928 if [ -n "$AUTOMOUNTER" ]; then
929 # Check for floppy dir, reinstall with automounter
930 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
931 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
932 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
933 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
934 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
935 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
937 # Replace paths from bootfloppy
938 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
939 mv -f /etc/fstab.new /etc/fstab
940 # Start automounter now
941 einfo "Starting automounter for ${AUTOMOUNTS}."
942 /etc/init.d/autofs start >>$DEBUG ; eend $?
947 # {{{ Collect partitions from /proc/partitions first for enabling DMA
951 while read major minor blocks partition relax; do
952 partition="${partition##*/}"
953 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
955 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
956 sd?) ;; # SCSI Harddisk, entire disk
957 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
958 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
961 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
964 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
967 # {{{ Enable DMA for all IDE drives now if not disabled
968 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
970 if checkbootparam "nodma"; then
971 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
973 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
974 if test -d /proc/ide/$d; then
975 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
976 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
977 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
978 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
979 echo "using_dma:1" >/proc/ide/$d/settings
988 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
991 NOSWAP="yes" # we do not use swap by default!
992 if checkbootparam "swap" || checkbootparam "anyswap" ; then
994 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
997 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
998 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1000 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1001 iszsh && setopt nonomatch
1002 if [ -x /usr/sbin/rebuildfstab ] ; then
1003 config_userfstab || fstabuser=grml
1004 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1006 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1008 fi # checkbootparam nofstab/forensic
1010 # Scan for swap, config, homedir - but only in live-mode
1011 if [ -z "$INSTALLED" ] ; then
1012 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1015 HOMEDIR="$(getbootparam home)"
1016 if [ -n "$partitions" ]; then
1017 while read p m f relax; do
1018 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1019 partoptions="users,exec"
1021 # it's a swap partition?
1024 if [ -n "$NOSWAP" ]; then
1025 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1028 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1029 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1030 if [ -n "$ANYSWAP" ] ; then
1031 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1032 swapon $p 2>>$DEBUG ; eend $?
1034 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1038 if [[ "$p" == LABEL* ]] ; then
1039 p=$(blkid -t $p | awk -F: '{print $1}')
1041 if grep -q $p /proc/swaps ; then
1042 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1044 if [ -b "$p" ] ; then
1045 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1046 swapon $p 2>>$DEBUG ; eend $?
1048 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1057 esac # it's a swap partition?
1062 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1063 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1065 # *) NONEFOUND='1'; continue ;;
1069 if [ -z "$NOSWAP" ] ; then
1070 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1071 # Activate swapfile, if exists
1072 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1074 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1075 mount -o remount,rw $m && MOUNTED=1
1076 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1078 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1080 fnew="$SWAPFILE swap swap defaults 0 0"
1081 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1082 GRML_SWP="$GRML_SWP $SWAPFILE"
1085 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1088 # use a image as home
1089 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1090 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1091 if [ -n "$HOMEDIR" ]; then
1092 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1096 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1098 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1103 # Umount, if not in use
1104 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1116 if [ -n "$MOUSE_DEVICE" ] ; then
1117 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1122 # {{{ IPv6 configuration
1123 # Load IPv6 kernel module and print IP adresses
1125 if checkbootparam "ipv6"; then
1126 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1128 # we probably need some time until stateless autoconfiguration has happened
1130 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1131 for DEVICE in `echo "$NETDEVICES"`; do
1134 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1135 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1137 for ADDR in `echo "$ADDRESSES"` ; do
1140 if [ "$COUNT" -eq "0" ] ; then
1141 einfo "(none)" ; eend 1
1151 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1153 if checkbootparam "nodhcp"; then
1154 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1156 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1157 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1158 for DEVICE in `echo "$NETDEVICES"` ; do
1159 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1161 ifconfig $DEVICE up >>$DEBUG 2>&1
1162 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1167 if [ -n "$INSTALLED" ] ; then
1168 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1175 # {{{ helper functions
1178 # search all partitions for a file in the root directory
1179 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1180 # See if it's already mounted
1181 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1182 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1183 [ -f "$i/$1" ] && FOUND="$i/$1"
1184 umount -l "$i" 2>>$DEBUG
1185 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1192 case "$(file -s $1)" in
1193 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1194 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1195 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1196 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1197 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1198 *data*) echo "invalid"; return 0;;
1199 *) echo "auto"; return 0;;
1203 # Try to mount this filesystem read-only, without or with encryption
1205 # Check if already mounted
1206 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1207 # Apparently, mount-aes DOES autodetect AES loopback files.
1208 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1209 # We need to mount crypto-loop files with initial rw support
1210 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1212 [ "$RC" = "0" ] && return 0
1214 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1216 while [ "$a" != "n" -a "$a" != "N" ]; do
1217 # We need to mount crypto-loop files with initial rw support
1218 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1219 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1220 # Problem with ioctl() from getpasswd()?
1230 if checkbootparam "nocpu"; then
1231 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1233 # check module dependencies
1235 if [ -e /lib64 ] ; then
1236 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1238 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1242 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1243 einfo "Detecting CPU:"
1244 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)
1245 echo $CPU | sed 's/ \{1,\}/ /g'
1248 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
1251 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1252 # * it only if we have the according kernel modules available
1253 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1254 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1255 # -> parse output of the initscript and output it according to our look'n'feel
1256 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1257 if ! cpufreq_check ; then
1258 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1260 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1261 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1262 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1263 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1264 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1268 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1270 if [ -x /etc/init.d/loadcpufreq ] ; then
1271 SKIP_CPU_GOVERNOR=''
1272 LOADCPUFREQ=$(mktemp)
1273 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1274 if grep -q FATAL "$LOADCPUFREQ" ; then
1280 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1281 eerror "$line" ; eend $RC
1285 elif grep -q done "$LOADCPUFREQ" ; then
1286 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1287 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1288 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1290 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1294 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1295 . /usr/bin/cpufreq-detect.sh
1296 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1297 einfo "Loading modules ${MODULE}"
1298 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1300 if [[ $RC == 0 ]]; then
1307 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1311 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1312 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1313 if modprobe cpufreq_ondemand ; RC=$? ; then
1314 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1315 echo ondemand > $file
1325 fi # checkbootparam nocpu
1329 # {{{ autostart of ssh
1331 if checkbootparam ssh ; then
1332 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1333 einfo "Bootoption passwd found."
1334 if [ -n "$SSH_PASSWD" ] ; then
1335 echo "grml:$SSH_PASSWD" | chpasswd -m
1336 einfo "Starting secure shell server in background."
1337 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1338 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1341 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1344 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1350 # {{{ set password for user grml
1352 if checkbootparam passwd >>$DEBUG 2>&1; then
1353 einfo "Bootoption passwd found."
1354 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1355 if [ -n "$PASSWD" ] ; then
1356 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1358 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1361 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1367 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1369 if checkbootparam home ; then
1370 HOMEDIR="$(getbootparam home)"
1374 if [ -n "$HOMEDIR" ]; then
1375 einfo "Bootoption home detected." && eend 0
1378 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1379 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1380 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1381 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1384 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1385 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1386 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1387 MYHOMEDIR="$HOMEDIR"
1389 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1390 MYHOMEDIR="$(findfile grml.img)"
1391 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1392 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1393 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1396 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1397 eerror "Option ignored." ; eend 1
1402 if [ -n "$MYHOMEDIR" ]; then
1403 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1404 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1405 while read device mountpoint fs relax; do
1406 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1409 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1413 # Note: This currently won't work with encrypted partitions
1414 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1415 if [ ! -f "$MYHOMEDIR" ]; then
1416 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1417 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1422 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1423 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1424 if [ -f "$MYHOMEDIR" ]; then
1425 # It's a loopback file, mount it over the /home/grml directory
1426 trymount "$MYHOMEDIR" /home/grml
1428 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1432 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1436 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1438 fi # mount -o remount,rw,...
1441 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1445 fi # if trymount ...
1447 fi # checkbootparam home
1451 # {{{ Check for scripts on CD-ROM
1452 config_cdrom_scripts(){
1453 if checkbootparam "script"; then
1454 for script in /cdrom/scripts/* ; do
1455 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1464 if ! [ -x /usr/bin/aumix ] ; then
1465 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1468 if ! [ -r /proc/asound/cards ] ; then
1469 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1473 if checkbootparam vol ; then
1474 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1475 if [ -z "$VOL" ] ; then
1476 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1483 if checkbootparam nosound ; then
1484 einfo "Muting sound devices on request."
1485 # some IBM notebooks require the following stuff:
1486 if [ -x /usr/bin/amixer ] ; then
1487 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1488 amixer set Front unmute 1>/dev/null
1489 amixer set Front 0% 1>/dev/null
1492 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1493 if [ -n "$ERROR" ] ; then
1495 eerror "Problem muting sound devices: $ERROR"
1499 elif [ -z "$INSTALLED" ]; then
1500 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1501 # some IBM notebooks require the following stuff:
1502 if [ -x /usr/bin/amixer ] ; then
1503 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1504 amixer set Front unmute 1>/dev/null
1505 amixer set Front ${VOL}% 1>/dev/null
1508 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1509 if [ -n "$ERROR" ] ; then
1511 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1521 # {{{ modem detection
1523 if checkbootparam "nomodem"; then
1524 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1526 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1527 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1528 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1536 # {{{ keyboard add-ons
1537 config_setkeycodes(){
1538 if checkbootparam "setkeycodes" ; then
1539 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1540 # MS MM keyboard add-on
1542 setkeycodes e001 126 &>/dev/null
1543 setkeycodes e059 127 &>/dev/null
1545 setkeycodes e03b 59 &>/dev/null
1546 setkeycodes e008 60 &>/dev/null
1547 setkeycodes e007 61 &>/dev/null
1548 setkeycodes e03e 62 &>/dev/null
1549 setkeycodes e03f 63 &>/dev/null
1550 setkeycodes e040 64 &>/dev/null
1551 setkeycodes e041 65 &>/dev/null
1552 setkeycodes e042 66 &>/dev/null
1553 setkeycodes e043 67 &>/dev/null
1554 setkeycodes e023 68 &>/dev/null
1555 setkeycodes e057 87 &>/dev/null
1556 setkeycodes e058 88 &>/dev/null
1558 setkeycodes e00a 89 e008 90 &>/dev/null
1565 config_wondershaper(){
1566 if checkbootparam "wondershaper" ; then
1567 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1572 if [ -n "$WONDER" ]; then
1574 DEVICE="${WONDER%%,*}"
1576 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1578 DOWNSTREAM="${WONDER%%,*}"
1580 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1582 UPSTREAM="${WONDER%%,*}"
1587 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1588 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1589 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1590 einfo "Starting wondershaper (${CMD}) in background."
1591 ( sh -c $CMD & ) && eend 0
1598 if checkbootparam "nosyslog"; then
1599 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1601 einfo "Starting syslog-ng in background."
1602 /etc/init.d/syslog-ng start 1>>$DEBUG &
1610 if checkbootparam "nogpm"; then
1611 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1613 einfo "Starting gpm in background."
1614 # /etc/init.d/gpm start 1>>$DEBUG &
1615 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1623 if checkbootparam "services" ; then
1624 SERVICE="$(getbootparam services 2>>$DEBUG)"
1625 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1626 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1627 einfo "Starting service(s) ${SERVICENL} in background."
1628 for service in $(echo -e $SERVICELIST) ; do
1629 /etc/init.d/${service} start 1>>$DEBUG &
1631 [ "$?" == "0" ] ; eend $?
1638 if checkbootparam netconfig ; then
1639 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1640 CONFIGFILE='/tmp/netconfig.grml'
1643 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1644 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1646 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1648 while ! getconfig && [[ "$counter" != 0 ]] ; do
1649 echo -n "Sleeping for 5 seconds and trying to get config again... "
1650 counter=$(( counter-1 ))
1651 echo "$counter tries left" ; sleep 1
1653 if [ -r "$CONFIGFILE" ] ; then
1654 einfo "Downloading was successfull." ; eend 0
1655 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1656 md5sum $CONFIGFILE ; eend 0
1657 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1659 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1666 config_blindsound(){
1667 if checkbootparam "blind" ; then
1669 flite -o play -t "welcome to the gremel system"
1676 if checkbootparam welcome ; then
1677 flite -o play -t "welcome to the gremel system"
1682 # {{{ fix/workaround for unionfs
1684 if [ -z "$INSTALLED" ]; then
1685 touch /var/cache/apt/*cache.bin
1690 # {{{ create all /mnt-directories
1692 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1693 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1697 # {{{ start X window system via grml-x
1699 if checkbootparam startx ; then
1700 if [ -x /usr/X11R6/bin/X ] ; then
1701 if [ -z "$INSTALLED" ] ; then
1702 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1703 if [ -z "$WINDOWMANAGER" ] ; then
1704 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1705 WINDOWMANAGER="wm-ng"
1707 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1709 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1710 config_userfstab || fstabuser='grml'
1711 cat>|/etc/init.d/xstartup<<EOF
1713 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1714 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
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 ; /bin/zsh"|' /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 ; /bin/zsh"' >> /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 from CD - startx will not work, skipping it.
1735 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 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"
1754 if checkbootparam noautoconfig || checkbootparam forensic ; then
1755 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1757 if [ -z "$INSTALLED" ] ; then
1758 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1760 [ -d /mnt/grml ] || mkdir /mnt/grml
1761 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1762 # We do need the following fix so floppy disk is available to blkid in any case :-/
1763 if [ -r /dev/fd0 ] ; then
1764 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1765 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1766 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1767 blkid /dev/fd0 1>>$DEBUG 2>&1
1770 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1771 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1772 if [[ $RC == 0 ]]; then
1773 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1776 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1777 if [ -n "$CONFIG" ]; then
1778 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1780 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1782 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1786 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1787 if [ -n "$SCRIPT" ]; then
1788 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1791 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1793 ewarn "No devices with label GRMLCFG found." ; eend 0
1802 if checkbootparam "config" ; then
1803 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1804 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1805 einfo "Bootoption config found. config is set to: $CONFIG"
1807 einfo "Trying to extract configuration file ${CONFIG}:"
1808 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1812 if checkbootparam myconfig ; then
1813 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1814 if [ -n "$MOUNTDEVICE" ]; then
1815 if checkbootparam file ; then
1816 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1817 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1819 [ -d /mnt/grml ] || mkdir /mnt/grml
1820 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1821 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1822 if [[ $RC == 0 ]]; then
1823 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1826 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1827 if [ -n "$CONFIG" ]; then
1828 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1830 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1832 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1836 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1837 if [ -n "$SCRIPT" ]; then
1838 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1843 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1844 fi # mount $MOUNTDEVICE
1845 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1847 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1848 fi # [ -n "$MOUNTDEVICE" ]
1849 fi # checkbootparam myconfig
1851 if checkbootparam "partconf" ; then
1852 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1853 if [ -n "$MOUNTDEVICE" ]; then
1854 [ -d /mnt/grml ] || mkdir /mnt/grml
1855 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1856 if [[ $RC == 0 ]]; then
1857 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1858 einfo "Copying files from $MOUNTDEVICE over grml system."
1859 for file in `cat /etc/grml/partconf` ; do
1860 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1861 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1864 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1865 fi # mount $MOUNTDEVICE
1866 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1868 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1869 fi # [ -n "$MOUNTDEVICE" ]
1874 # {{{ /cdrom/.*-options
1876 if checkbootparam "debs" ; then
1877 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1878 einfo "Tring to install debian package(s) ${DEBS}"
1879 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1884 if checkbootparam "scripts" ; then
1885 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1886 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1887 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1888 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1895 if checkbootparam "distcc" ; then
1896 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1897 if [ -n "$OPTIONS" ]; then
1900 if [ -n "$OPTIONS" ]; then
1901 NET="${OPTIONS%%,*}"
1903 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1905 INTERFACE="${OPTIONS%%,*}"
1910 CONFIG=/etc/default/distcc
1911 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1912 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1914 if [ -n "$INTERFACE" ] ; then
1915 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1918 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1919 counter=$(( counter-1 ))
1920 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1922 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1926 if [ -n "$IP" ] ; then
1927 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1929 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1931 id distccd >/dev/null 2>&1 || \
1933 einfo "Creating distcc user" ; \
1934 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1937 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1938 /etc/init.d/distcc start 1>/dev/null ; eend $?
1941 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1945 if checkbootparam "gcc"; then
1946 GCC="$(getbootparam gcc 2>>$DEBUG)"
1948 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1951 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1954 if checkbootparam "gpp"; then
1955 GPP="$(getbootparam gpp 2>>$DEBUG)"
1957 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1958 if [ -x /usr/bin/g++-${GPP} ] ; then
1960 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1962 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1963 if [ -x /usr/bin/cpp-${GPP} ] ; then
1965 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1974 # Notice: use it only on live-cd system, if running from harddisk please
1975 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1976 # in /etc/runlevel.conf
1978 MODULES_FILE=/etc/grml/modules
1979 if checkbootparam nomodules ; then
1980 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1981 elif [ -z "$INSTALLED" ]; then
1982 if [ -r $MODULES_FILE ] ; then
1983 einfo "Loading modules specified in ${MODULES_FILE}:"
1985 grep '^[^#]' $MODULES_FILE | \
1986 while read module args; do
1987 [ "$module" ] || continue
1989 modprobe $module $args ; eend $?
1993 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2000 config_915resolution(){
2001 if checkbootparam "915resolution" ; then
2002 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2003 if [ -x /usr/sbin/915resolution ]; then
2008 if [ -n "$OPTIONS" ]; then
2010 MODE="${OPTIONS%%,*}"
2012 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2014 XRESO="${OPTIONS%%,*}"
2016 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2018 YRESO="${OPTIONS%%,*}"
2023 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2024 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2033 if [ -z "$INSTALLED" ] ; then
2034 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2035 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2036 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2037 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2039 if ! [ -x /sbin/mdadm ] ; then
2040 eerror "mdadm not available, can not execute it." ; eend 1
2043 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2044 # find out whether we have a valid configuration file already
2045 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2046 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2047 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2048 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2050 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2053 if ! checkbootparam 'swraid' ; then
2055 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2058 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2063 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2065 *'No arrays found'*)
2066 ewarn "$line" ; eend 0
2069 einfo "$line" ; eend 0
2076 if [ -r /proc/mdstat ] ; then
2078 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2079 if [ -z "$MDSTAT" ] ; then
2080 ewarn "No active arrays found" ; eend 0
2085 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2086 einfo "active arrays: $line" ; eend 0
2092 fi # bootoption swraid
2094 fi # is /sbin/mdadm executable?
2095 fi # check for bootoptions
2096 fi # run only in live-cd mode
2100 # {{{ LVM (Logical Volumes)
2102 if [ -z "$INSTALLED" ] ; then
2103 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2104 if checkbootparam 'nolvm' ; then
2105 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2107 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2108 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2109 eerror "LVM not available, can not execute it." ; eend 1
2111 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2112 einfo "You seem to have logical volumes (LVM) on your system."
2114 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2116 if checkbootparam 'lvm' ; then
2117 einfo "Bootoption LVM found. Searching for logical volumes:"
2118 /etc/init.d/lvm2 start ; eend $?
2122 fi # check for lvm binary
2123 fi # check for bootoption nolvm
2124 fi # run only in live-cd mode
2128 # {{{ debnet: setup network based on an existing one found on a partition
2130 if checkbootparam "debnet" ; then
2131 iszsh && setopt shwordsplit
2132 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2133 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2136 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2138 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2139 for i in $DEVICES; do
2140 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2141 einfo "Scanning on $i"
2142 if [ -f /mnt/etc/network/interfaces ]; then
2143 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2151 if [ -n "$FOUND_DEBNET" ]; then
2152 einfo "Stopping network."
2153 pump -k 1>/dev/null 2>&1
2154 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2155 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2156 rm -rf /etc/network/run
2157 cp -a /mnt/etc/network /etc
2158 rm -rf /etc/network/run
2159 mkdir /etc/network/run
2160 umount /mnt ; eend $?
2161 einfo "Starting network."
2162 /etc/init.d/networking start ; eend $?
2164 eerror "/etc/network/interfaces not found." ; eend 1
2168 eerror "Error: /mnt already mounted." ; eend 1
2174 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2176 if grep -q ipw3945 /proc/modules ; then
2177 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2178 ewarn "Broken ipw3945 network interface found, reloading module."
2187 # {{{ disable console blanking
2189 if checkbootparam "noblank" ; then
2190 einfo "Bootoption noblank found. Disabling monitor blanking."
2191 setterm -blank 0 ; eend $?
2196 # {{{ grml2hd: automatic installation
2199 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2201 if checkbootparam "user" ; then
2203 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2204 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2207 if checkbootparam "filesystem" ; then
2209 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2210 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2213 if checkbootparam "partition" ; then
2215 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2216 # notice: the following checks whether the given partition is available, if not the skip
2217 # execution of grml2hd as it might result in data loss...
2218 if [ -r $PARTITION ] ; then
2219 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2221 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2225 if checkbootparam "mbr" ; then
2227 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2228 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2231 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2233 GRML2HD_NONINTERACTIVE='yes' grml2hd
2236 chmod 755 /usr/bin/grml2hd_noninteractive
2237 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2238 if [ -z "$GRML2HD_FAIL" ] ; then
2239 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2241 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2244 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2248 # {{{ debootstrap: automatic installation
2249 config_debootstrap(){
2251 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2253 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2255 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2257 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2262 if checkbootparam "target" ; then
2264 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2265 # notice: the following checks whether the given partition is available, if not the skip
2266 # execution of grml-debootstrap as it might result in data loss...
2267 if ! [ -r "$TARGET" ] ; then
2268 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2272 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2277 if checkbootparam "grub" ; then
2279 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2282 if checkbootparam "groot" ; then
2284 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2287 if checkbootparam "release" ; then
2289 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2292 if checkbootparam "mirror" ; then
2294 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2297 if checkbootparam "boot_append" ; then
2299 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2302 if checkbootparam "password" ; then
2304 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2307 # now check which options are available
2308 if [ -n "TARGET" ] ; then
2309 TARGETCMD="--target $TARGET"
2313 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2317 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2318 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2319 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2320 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2321 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2322 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2324 # and finally write script and execute it
2325 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2327 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2330 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2332 screen /usr/bin/grml-debootstrap_noninteractive
2333 einfo "Invoking a shell, just exit to continue booting..."
2336 fi # stringinstring "BOOT_IMAGE=debian2hd
2340 # {{{ Support customization
2342 if checkbootparam "distri"; then
2343 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2344 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2345 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2346 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2347 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2348 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2354 ### {{{ backwards compatible stuff
2355 config_environment(){
2356 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2359 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2363 ## END OF FILE #################################################################
2364 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3