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: Die Sep 04 12:36:35 CEST 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 /GRML/etc/grml_cd ] || [ -r /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 # {{{ Check if we are in interactive startup mode
162 stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes"
165 # {{{ set firmware timeout via bootparam
167 if checkbootparam fwtimeout ; then
168 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
169 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
170 rmmod firmware_class 1>>$DEBUG 2>&1
171 modprobe firmware_class ; eend $?
173 if [ -z "$TIMEOUT" ] ; then
174 TIMEOUT="100" # linux kernel default: 10
176 if [ -f /sys/class/firmware/timeout ] ; then
177 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
178 echo 100 > /sys/class/firmware/timeout ; eend $?
183 ### {{{ language configuration / localization
186 einfo "Activating language settings:"
189 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
190 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
192 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
194 # check for bootoption which overrides config from /etc/grml/autoconfig:
195 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
196 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
198 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
199 if [ -z "$INSTALLED" ] ; then
200 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
203 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
204 if [ -n "$BOOT_LANGUAGE" ] ; then
205 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
209 if [ -z "$CONSOLEFONT" ] ; then
210 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
211 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
212 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
213 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
214 CONSOLEFONT='Uni3-Terminus16'
216 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
221 # export it now, so error messages get translated, too
222 if checkgrmlsmall ; then
223 export LANG='C' # grml-small does not provide any further locales
225 [ -r /etc/default/locale ] && . /etc/default/locale
229 # configure keyboard layout, read in already set values first:
230 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
232 # now allow keyboard override by boot commandline for later use:
233 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
234 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
235 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
236 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
237 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
239 # modify /etc/sysconfig/keyboard only in live-cd mode:
240 if [ -z "$INSTALLED" ] ; then
242 local LANGUAGE="$BOOT_LANGUAGE"
243 . /etc/grml/language-functions
244 # allow setting xkeyboard explicitly different than console keyboard
245 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
246 if [ -n "$KXKEYBOARD" ]; then
247 XKEYBOARD="$KXKEYBOARD"
248 KDEKEYBOARD="$KXKEYBOARD"
249 elif [ -n "$KKEYBOARD" ]; then
250 XKEYBOARD="$KKEYBOARD"
251 KDEKEYBOARD="$KKEYBOARD"
254 # duplicate of previous code to make sure /etc/grml/language-functions
255 # does not overwrite our values....
256 # now allow keyboard override by boot commandline for later use:
257 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
258 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
259 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
260 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
261 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
263 # write keyboard related variables to file for later use
264 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
265 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
266 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
267 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
268 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
271 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
273 # activate unicode console if running within utf8 environment
274 if [ -r /etc/default/locale ] ; then
275 if grep -q "LANG=.*UTF" /etc/default/locale ; then
276 if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
277 ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
279 einfo "Setting up unicode environment."
280 unicode_start 2>>$DEBUG ; eend $?
285 # Set default keyboard before interactive setup
286 if [ -n "$KEYTABLE" ] ; then
287 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
288 loadkeys -q $KEYTABLE &
292 # we have to set up all consoles, therefore loop it over all ttys:
293 NUM_CONSOLES=`fgconsole --next-available`
294 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
295 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
296 if [ -n "$CHARMAP" ] ; then
297 einfo "Running consolechars for ${CHARMAP}"
298 for vc in `seq 0 ${NUM_CONSOLES}` ; do
299 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
303 if [ -n "$CONSOLEFONT" ] ; then
304 einfo "Running consolechars using ${CONSOLEFONT}"
305 for vc in `seq 0 ${NUM_CONSOLES}` ; do
306 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
317 if checkbootparam hostname ; then
318 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
319 einfo "Setting hostname to $HOSTNAME as requested."
320 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
321 hostname $HOSTNAME ; eend $?
323 hostname --file /etc/hostname
328 # fstabuser (needed when running from harddisk with username != grml {{{
330 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
331 if [ -n "$CONFIG_FSTAB_USER" ] ; then
332 fstabuser="$CONFIG_FSTAB_USER"
334 fstabuser=$(getent passwd 1000 | cut -d: -f1)
336 # if not yet set fall back to default 'grml' user
337 [ -n "$fstabuser" ] || fstabuser='grml'
341 # {{{ Set clock (Local time is more often used than GMT, so it is default)
343 # don't touch the files if running from harddisk:
344 if [ -z "$INSTALLED" ]; then
346 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
347 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
348 # hwclock uses the TZ variable
349 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
350 [ -n "$TZ" ] || TZ=Europe/Vienna
352 if ! [ -r /dev/rtc ] ; then
353 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
355 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
356 if [ -n "$ERROR" ] ; then
358 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
359 if [ -n "$ERROR" ] ; then
360 eerror "Problem running hwclock: $ERROR" ; eend 1
369 # {{{ print kernel info
371 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
372 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
373 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
374 if [ -r /proc/cpuinfo ] ; then
375 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
377 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
381 if [ -d /proc/xen ] ; then
383 einfo 'Running kernel featuring support for Xen detected' ; eend 0
389 # {{{ vmware specific stuff
391 if checkbootparam novmware ; then
392 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
394 if [ -z "$INSTALLED" ] ; then
395 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
396 if ! checkbootparam qemu ; then
397 if [ -r /etc/X11/xorg.conf.vmware ] ; then
398 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
399 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
408 # {{{ qemu specific stuff
410 if checkbootparam qemu ; then
411 if [ -r /etc/X11/xorg.conf.example ] ; then
412 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
413 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
419 # {{{ ld.so.cache + depmod
421 if [ -n "$INSTALLED" ]; then
422 if ! [ -r /etc/grml.first.boot ] ; then
423 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
425 # Regenerate ld.so.cache and module dependencies on HD
426 einfo "Running ldconfig" ; ldconfig ; eend $?
427 einfo "Running depmod" ; depmod -a ; eend $?
428 touch /etc/grml.first.boot
436 # update_progress {{{
438 # be sure we are non-blocking
439 (echo "$1" > /etc/sysconfig/progress) &
445 # don't touch the files if running from harddisk:
446 if [ -z "$INSTALLED" ]; then
447 KTZ="$(getbootparam tz 2>>$DEBUG)"
448 if [ -n "$KTZ" ] ; then
449 einfo "Setting timezone."
450 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
452 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
458 # small computer / nearly no ram {{{
461 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
462 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
465 if checkbootparam "small"; then
466 einfo "Information: ${RAM} kB of RAM available." ; eend 0
467 einfo "Bootoption small detected. Activating small system."
468 if [ -r /etc/inittab.small ] ; then
469 mv /etc/inittab /etc/inittab.normal
470 mv /etc/inittab.small /etc/inittab
472 sed -i 's/^9/#&/' /etc/inittab
473 sed -i 's/^10/#&/' /etc/inittab
474 sed -i 's/^11/#&/' /etc/inittab
475 sed -i 's/^12/#&/' /etc/inittab
477 /sbin/telinit q ; eend $?
479 if checkgrmlsmall ; then
480 if [[ $RAM -lt 25000 ]] ; then
481 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
482 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
483 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
484 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
487 einfo "Information: ${RAM} kB of RAM available." ; eend 0
490 if [[ $RAM -lt 58000 ]] ; then
491 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
492 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
493 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
494 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
497 einfo "Information: ${RAM} kB of RAM available." ; eend 0
505 # skip startup of w3m {{{
507 if checkbootparam "fast"; then
508 ewarn "Bootoption fast detected. Skipping startup of w3m."
509 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
510 /sbin/telinit q ; eend $?
515 # activate serial console {{{
517 if checkbootparam "console"; then
518 einfo "Bootoption (for serial) console detected."
520 if [ -r /etc/mgetty/mgetty.config ] ; then
521 MODE=$(getbootparam console | awk -F, '{print $2}')
523 [ -n "$MODE" ] || MODE=9600 # default mode
524 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
525 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
528 einfo "Activating mgetty."
529 sed -i 's/^#T0/T0/' /etc/inittab
530 sed -i 's/^#T1/T1/' /etc/inittab
531 /sbin/telinit q ; eend $?
537 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
540 for DEVICE in /proc/ide/hd?; do
541 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
543 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
547 # {{{ Bring up loopback interface now
549 if [ -z "$INSTALLED" ] ; then
550 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
551 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
559 # firewire devices {{{
560 # the raw1394 driver does not yet export info into SYSFS,
561 # so let's create raw1394 device manually
562 # http://www.michael-prokop.at/blog/index.php?p=352
563 config_firewire_dev(){
564 if checkbootparam "nofirewiredev" ; then
565 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
567 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
568 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
569 # cd /dev && MAKEDEV video1394 raw1394
570 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
571 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
572 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
573 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
574 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
575 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
581 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
582 # otherwise we will get: passwd: Authentication token lock busy
584 if [ -z "$INSTALLED" ] ; then
592 if [ -n "$TESTCD" ]; then
593 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
594 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
597 # /linuxrc grml version:
598 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
599 # live-initramfs version:
600 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
602 if [ -n "$TESTCD_PATH" ] ; then
603 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
605 echo "${RED} *** Error: Could not find md5sum file. ***"
608 if [ "$?" = "0" ]; then
609 echo " ${GREEN}Everything looks OK${NORMAL}"
611 echo "${RED} *** CHECKSUM FAILED FOR THESE FILES: ***"
612 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
613 echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
614 echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM. ***${NORMAL}"
615 echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}"
624 # {{{ hardware detection via discover
626 if checkbootparam "nodisc" ; then
627 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
629 if [ -x /sbin/discover ] ; then
630 einfo "Discovering hardware. Trying to load the following modules in background:"
632 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)"
634 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
637 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
643 # {{{ hardware detection via hwinfo
645 if checkbootparam hwinfo >>$DEBUG 2>&1; then
646 einfo "Discovering hardware via hwinfo:"
647 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
648 echo -n " Loading modules: "
649 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
655 # {{{ disable hotplug agents on request
656 config_hotplug_agent(){
657 if checkbootparam "noagent" ; then
658 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
659 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
660 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
661 einfo "Disabling hotplug-agent(s) $AGENTNL"
662 for agent in $(echo -e $AGENTLIST) ; do
663 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
665 [ "$?" == "0" ] ; eend $?
670 # {{{ blacklist of hotplug-modules
671 config_hotplug_blacklist(){
672 if checkbootparam "black" ; then
673 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
674 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
675 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
676 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
677 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
678 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
686 if checkbootparam "nohotplug" ; then
687 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
689 if [ -r /etc/init.d/hotplug ] ; then
690 einfo "Starting hotplug system in background."
691 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
693 elif [ -r /etc/init.d/hotplug-light ] ; then
694 einfo "Starting hotplug-light system in background."
695 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
698 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
704 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
706 if checkbootparam "blacklist" ; then
707 if [ -z "$INSTALLED" ]; then
708 einfo "Bootoption blacklist found."
709 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
710 if [ -n "$BLACK" ] ; then
711 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
712 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
713 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
714 echo "alias $BLACK off" >> /etc/modprobe.d/grml
715 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
717 eerror "No given module for blacklist found. Blacklisting will not work therefore."
720 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
722 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
731 if [ -d /proc/acpi ]; then
732 if checkbootparam "noacpi"; then
733 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
734 elif checkbootparam "nogrmlacpi" ; then
735 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
737 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
740 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
742 basename="${basename%%.*}"
743 case "$basename" in *_acpi)
744 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
746 modprobe $basename >>$DEBUG 2>&1 && found="yes"
747 local BASE="$BASE $basename"
749 if [ -n "$found" ] ; then
750 einfo "$BASE" ; eend 0
752 ewarn "(none)" ; eend 1
754 if ! [ -S /var/run/acpid.socket ] ; then
755 if ! [ -r /var/run/dbus/pid ] ; then
756 einfo "Starting acpi daemon."
757 /etc/init.d/acpid start >>$DEBUG ; eend $?
759 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
760 eerror "Solution: please activate acpid via /etc/runlevel.conf"
764 ewarn "acpi daemon already running."
771 if checkbootparam "noapm"; then
772 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
774 modprobe apm power_off=1 >>$DEBUG 2>&1
775 if [ "$?" = "0" ] ; then
776 if [ -x /etc/init.d/apmd ] ;then
777 einfo "APM Bios found, enabling power management functions."
778 /etc/init.d/apmd start ; eend $?
781 eerror "Loading apm module failed." ; eend 1
788 # {{{ PCMCIA Check/Setup
789 # This needs to be done before other modules are being loaded (by hwsetup)
791 if checkbootparam "nopcmcia"; then
792 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
794 if /usr/sbin/laptop-detect ; then
795 einfo "Detected Laptop - checking for PCMCIA." && eend 0
796 modprobe pcmcia_core >>$DEBUG 2>&1
797 # Try Cardbus or normal PCMCIA socket drivers
798 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
799 if [ "$?" = "0" ]; then
800 modprobe ds >>$DEBUG 2>&1
801 if [ -d /proc/bus/pccard ] ; then
802 if [ -x /sbin/cardmgr ] ; then
803 einfo "PCMCIA found, starting cardmgr."
804 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
806 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
815 # {{{ run software synthesizer via speakup
817 if checkbootparam swspeak ; then
818 if [ -d /proc/speakup/ ] ; then
819 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
821 if [ -x /etc/init.d/speech-dispatcher ] ; then
822 einfo "Starting speech-dispatcher."
823 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
824 einfo "Activating sftsyn in Kernel."
825 echo sftsyn >/proc/speakup/synth_name ; eend $?
826 einfo "Just run swspeak if you want to use software synthesizer via speakup."
827 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
829 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
830 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
834 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
835 flite -o play -t "Kernel does not seem to support speakup. Sorry."
841 # {{{ Check for blind option or brltty
844 checkbootparam "blind" && BLIND="yes"
845 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
847 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
848 if [ -x /sbin/brltty ]; then
849 # Blind option detected, start brltty now.
850 # modprobe serial_core parport_serial generic_serial && echo "done"
855 if [ -n "$BRLTTY" ]; then
857 BRLTYPE="${BRLTTY%%,*}"
859 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
861 BRLDEV="${BRLTTY%%,*}"
863 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
865 BRLTEXT="${BRLTTY%%,*}"
870 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
871 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
872 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
873 einfo "Starting braille-display manager."
876 sleep 2 && BLINDSOUND="yes"
883 # {{{ Interactive configuration
884 config_interactive(){
885 if [ -n "$INTERACTIVE" ] ; then
886 einfo "Entering interactive configuration second stage."
888 echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}"
889 echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] "
891 [ "$a" != "n" ] && /usr/sbin/dpkg-reconfigure console-data ; eend $?
893 echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] "
895 [ "$a" != "n" ] && alsaconf && ( exec aumix -m 0 >>$DEBUG 2>&1 & ) ; eend $?
897 echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] "
899 [ "$a" != "n" ] && xorgcfg -textmode ; eend $?
900 echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}"
908 if checkbootparam forceagp ; then
909 # Probe for AGP. Hope this can fail safely
910 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
916 config_automounter(){
917 if checkbootparam automounter ; then
918 RUNLEVEL="$(runlevel)"
920 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
925 if [ -n "$AUTOMOUNTER" ]; then
926 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
927 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
928 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
929 anew="$d -fstype=auto,$2 :$i"
930 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
931 AUTOMOUNTS="$AUTOMOUNTS $d"
932 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
934 [ -d /mnt/$d ] && mkdir -p /mnt/$d
935 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
937 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
940 AUTOMOUNTS="floppy cdrom"
941 # Add new devices to /etc/fstab and /etc/auto.mnt
942 for i in /dev/cdrom?*; do
944 addautomount "$i" "ro"
949 if [ -n "$AUTOMOUNTER" ]; then
950 # Check for floppy dir, reinstall with automounter
951 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
952 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
953 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
954 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
955 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
956 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
958 # Replace paths from bootfloppy
959 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
960 mv -f /etc/fstab.new /etc/fstab
961 # Start automounter now
962 einfo "Starting automounter for ${AUTOMOUNTS}."
963 /etc/init.d/autofs start >>$DEBUG ; eend $?
968 # {{{ Collect partitions from /proc/partitions first for enabling DMA
972 while read major minor blocks partition relax; do
973 partition="${partition##*/}"
974 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
976 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
977 sd?) ;; # SCSI Harddisk, entire disk
978 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
979 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
982 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
985 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
988 # {{{ Enable DMA for all IDE drives now if not disabled
989 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
991 if checkbootparam "nodma"; then
992 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
994 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
995 if test -d /proc/ide/$d; then
996 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
997 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
998 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
999 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1000 echo "using_dma:1" >/proc/ide/$d/settings
1009 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1012 NOSWAP="yes" # we do not use swap by default!
1013 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1015 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1018 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1019 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1021 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1022 iszsh && setopt nonomatch
1023 if [ -x /usr/sbin/rebuildfstab ] ; then
1024 config_userfstab || fstabuser=grml
1025 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1027 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1029 fi # checkbootparam nofstab/forensic
1031 # Scan for swap, config, homedir - but only in live-mode
1032 if [ -z "$INSTALLED" ] ; then
1033 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1036 HOMEDIR="$(getbootparam home)"
1037 if [ -n "$partitions" ]; then
1038 while read p m f relax; do
1039 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1040 partoptions="users,exec"
1042 # it's a swap partition?
1045 if [ -n "$NOSWAP" ]; then
1046 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1049 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1050 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1051 if [ -n "$ANYSWAP" ] ; then
1052 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1053 swapon $p 2>>$DEBUG ; eend $?
1055 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1059 if [[ "$p" == LABEL* ]] ; then
1060 p=$(blkid -t $p | awk -F: '{print $1}')
1062 if grep -q $p /proc/swaps ; then
1063 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1065 if [ -b "$p" ] ; then
1066 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1067 swapon $p 2>>$DEBUG ; eend $?
1069 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1078 esac # it's a swap partition?
1083 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1084 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1086 # *) NONEFOUND='1'; continue ;;
1090 if [ -z "$NOSWAP" ] ; then
1091 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1092 # Activate swapfile, if exists
1093 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1095 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1096 mount -o remount,rw $m && MOUNTED=1
1097 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1099 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1101 fnew="$SWAPFILE swap swap defaults 0 0"
1102 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1103 GRML_SWP="$GRML_SWP $SWAPFILE"
1106 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1109 # use a image as home
1110 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1111 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1112 if [ -n "$HOMEDIR" ]; then
1113 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1117 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1119 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1124 # Umount, if not in use
1125 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1137 if [ -n "$MOUSE_DEVICE" ] ; then
1138 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1143 # {{{ IPv6 configuration
1144 # Load IPv6 kernel module and print IP adresses
1146 if checkbootparam "ipv6"; then
1147 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1149 # we probably need some time until stateless autoconfiguration has happened
1151 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1152 for DEVICE in `echo "$NETDEVICES"`; do
1155 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1156 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1158 for ADDR in `echo "$ADDRESSES"` ; do
1161 if [ "$COUNT" -eq "0" ] ; then
1162 einfo "(none)" ; eend 1
1172 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1174 if checkbootparam "nodhcp"; then
1175 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1177 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1178 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1179 for DEVICE in `echo "$NETDEVICES"` ; do
1180 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1182 ifconfig $DEVICE up >>$DEBUG 2>&1
1183 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1188 if [ -n "$INSTALLED" ] ; then
1189 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1196 # {{{ helper functions
1199 # search all partitions for a file in the root directory
1200 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1201 # See if it's already mounted
1202 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1203 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1204 [ -f "$i/$1" ] && FOUND="$i/$1"
1205 umount -l "$i" 2>>$DEBUG
1206 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1213 case "$(file -s $1)" in
1214 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1215 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1216 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1217 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1218 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1219 *data*) echo "invalid"; return 0;;
1220 *) echo "auto"; return 0;;
1224 # Try to mount this filesystem read-only, without or with encryption
1226 # Check if already mounted
1227 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1228 # Apparently, mount-aes DOES autodetect AES loopback files.
1229 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1230 # We need to mount crypto-loop files with initial rw support
1231 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1233 [ "$RC" = "0" ] && return 0
1235 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1237 while [ "$a" != "n" -a "$a" != "N" ]; do
1238 # We need to mount crypto-loop files with initial rw support
1239 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1240 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1241 # Problem with ioctl() from getpasswd()?
1251 if checkbootparam "nocpu"; then
1252 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1254 # check module dependencies
1256 if [ -e /lib64 ] ; then
1257 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1259 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1263 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1264 einfo "Detecting CPU:"
1265 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)
1266 echo $CPU | sed 's/ \{1,\}/ /g'
1269 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
1272 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1273 # * it only if we have the according kernel modules available
1274 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1275 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1276 # -> parse output of the initscript and output it according to our look'n'feel
1277 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1278 if ! cpufreq_check ; then
1279 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1281 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1282 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1283 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1284 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1285 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1289 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1291 if [ -x /etc/init.d/loadcpufreq ] ; then
1292 SKIP_CPU_GOVERNOR=''
1293 LOADCPUFREQ=$(mktemp)
1294 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1295 if grep -q FATAL "$LOADCPUFREQ" ; then
1301 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1302 eerror "$line" ; eend $RC
1306 elif grep -q done "$LOADCPUFREQ" ; then
1307 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1308 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1309 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1311 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1315 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1316 . /usr/bin/cpufreq-detect.sh
1317 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1318 einfo "Loading modules ${MODULE}"
1319 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1321 if [[ $RC == 0 ]]; then
1328 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1332 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1333 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1334 if modprobe cpufreq_ondemand ; RC=$? ; then
1335 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1336 echo ondemand > $file
1346 fi # checkbootparam nocpu
1350 # {{{ autostart of ssh
1352 if checkbootparam ssh ; then
1353 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1354 einfo "Bootoption passwd found."
1355 if [ -n "$SSH_PASSWD" ] ; then
1356 echo "grml:$SSH_PASSWD" | chpasswd -m
1357 einfo "Starting secure shell server in background."
1358 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1359 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1362 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1365 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1371 # {{{ set password for user grml
1373 if checkbootparam passwd >>$DEBUG 2>&1; then
1374 einfo "Bootoption passwd found."
1375 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1376 if [ -n "$PASSWD" ] ; then
1377 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1379 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1382 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1388 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1390 if checkbootparam home ; then
1391 HOMEDIR="$(getbootparam home)"
1395 if [ -n "$HOMEDIR" ]; then
1396 einfo "Bootoption home detected." && eend 0
1399 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1400 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1401 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1402 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1405 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1406 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1407 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1408 MYHOMEDIR="$HOMEDIR"
1410 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1411 MYHOMEDIR="$(findfile grml.img)"
1412 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1413 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1414 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1417 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1418 eerror "Option ignored." ; eend 1
1423 if [ -n "$MYHOMEDIR" ]; then
1424 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1425 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1426 while read device mountpoint fs relax; do
1427 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1430 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1434 # Note: This currently won't work with encrypted partitions
1435 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1436 if [ ! -f "$MYHOMEDIR" ]; then
1437 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1438 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1443 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1444 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1445 if [ -f "$MYHOMEDIR" ]; then
1446 # It's a loopback file, mount it over the /home/grml directory
1447 trymount "$MYHOMEDIR" /home/grml
1449 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1453 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1457 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1459 fi # mount -o remount,rw,...
1462 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1466 fi # if trymount ...
1468 fi # checkbootparam home
1472 # {{{ Check for scripts on CD-ROM
1473 config_cdrom_scripts(){
1474 if checkbootparam "script"; then
1475 for script in /cdrom/scripts/* ; do
1476 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1485 if ! [ -x /usr/bin/aumix ] ; then
1486 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1489 if ! [ -r /proc/asound/cards ] ; then
1490 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1494 if checkbootparam vol ; then
1495 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1496 if [ -z "$VOL" ] ; then
1497 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1504 if checkbootparam nosound ; then
1505 einfo "Muting sound devices on request."
1506 # some IBM notebooks require the following stuff:
1507 if [ -x /usr/bin/amixer ] ; then
1508 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1509 amixer set Front unmute 1>/dev/null
1510 amixer set Front 0% 1>/dev/null
1513 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1514 if [ -n "$ERROR" ] ; then
1516 eerror "Problem muting sound devices: $ERROR"
1520 elif [ -z "$INSTALLED" ]; then
1521 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1522 # some IBM notebooks require the following stuff:
1523 if [ -x /usr/bin/amixer ] ; then
1524 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1525 amixer set Front unmute 1>/dev/null
1526 amixer set Front ${VOL}% 1>/dev/null
1529 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1530 if [ -n "$ERROR" ] ; then
1532 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1542 # {{{ modem detection
1544 if checkbootparam "nomodem"; then
1545 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1547 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1548 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1549 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1557 # {{{ keyboard add-ons
1558 config_setkeycodes(){
1559 if checkbootparam "setkeycodes" ; then
1560 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1561 # MS MM keyboard add-on
1563 setkeycodes e001 126 &>/dev/null
1564 setkeycodes e059 127 &>/dev/null
1566 setkeycodes e03b 59 &>/dev/null
1567 setkeycodes e008 60 &>/dev/null
1568 setkeycodes e007 61 &>/dev/null
1569 setkeycodes e03e 62 &>/dev/null
1570 setkeycodes e03f 63 &>/dev/null
1571 setkeycodes e040 64 &>/dev/null
1572 setkeycodes e041 65 &>/dev/null
1573 setkeycodes e042 66 &>/dev/null
1574 setkeycodes e043 67 &>/dev/null
1575 setkeycodes e023 68 &>/dev/null
1576 setkeycodes e057 87 &>/dev/null
1577 setkeycodes e058 88 &>/dev/null
1579 setkeycodes e00a 89 e008 90 &>/dev/null
1586 config_wondershaper(){
1587 if checkbootparam "wondershaper" ; then
1588 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1593 if [ -n "$WONDER" ]; then
1595 DEVICE="${WONDER%%,*}"
1597 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1599 DOWNSTREAM="${WONDER%%,*}"
1601 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1603 UPSTREAM="${WONDER%%,*}"
1608 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1609 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1610 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1611 einfo "Starting wondershaper (${CMD}) in background."
1612 ( sh -c $CMD & ) && eend 0
1619 if checkbootparam "nosyslog"; then
1620 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1622 einfo "Starting syslog-ng in background."
1623 /etc/init.d/syslog-ng start 1>>$DEBUG &
1631 if checkbootparam "nogpm"; then
1632 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1634 einfo "Starting gpm in background."
1635 # /etc/init.d/gpm start 1>>$DEBUG &
1636 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1644 if checkbootparam "services" ; then
1645 SERVICE="$(getbootparam services 2>>$DEBUG)"
1646 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1647 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1648 einfo "Starting service(s) ${SERVICENL} in background."
1649 for service in $(echo -e $SERVICELIST) ; do
1650 /etc/init.d/${service} start 1>>$DEBUG &
1652 [ "$?" == "0" ] ; eend $?
1659 if checkbootparam netconfig ; then
1660 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1661 CONFIGFILE='/tmp/netconfig.grml'
1664 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1665 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1667 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1669 while ! getconfig && [[ "$counter" != 0 ]] ; do
1670 echo -n "Sleeping for 5 seconds and trying to get config again... "
1671 counter=$(( counter-1 ))
1672 echo "$counter tries left" ; sleep 1
1674 if [ -r "$CONFIGFILE" ] ; then
1675 einfo "Downloading was successfull." ; eend 0
1676 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1677 md5sum $CONFIGFILE ; eend 0
1678 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1680 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1687 config_blindsound(){
1688 if checkbootparam "blind" ; then
1690 flite -o play -t "welcome to the gremel system"
1697 if checkbootparam welcome ; then
1698 flite -o play -t "welcome to the gremel system"
1703 # {{{ fix/workaround for unionfs
1705 if [ -z "$INSTALLED" ]; then
1706 touch /var/cache/apt/*cache.bin
1711 # {{{ create all /mnt-directories
1713 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1714 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1718 # {{{ start X window system via grml-x
1720 if checkbootparam startx ; then
1721 if [ -x /usr/X11R6/bin/X ] ; then
1722 if [ -z "$INSTALLED" ] ; then
1723 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1724 if [ -z "$WINDOWMANAGER" ] ; then
1725 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1726 WINDOWMANAGER="wm-ng"
1728 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1730 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1731 config_userfstab || fstabuser='grml'
1732 cat>|/etc/init.d/xstartup<<EOF
1734 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1735 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1737 chmod 755 /etc/init.d/xstartup
1739 # adjust inittab for xstartup
1740 if grep -q '^6:' /etc/inittab ; then
1741 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1742 else # just append tty6 to inittab if no definition is present:
1743 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1746 /sbin/telinit q ; eend $?
1748 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1749 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1751 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1755 eerror "We are not running from CD - startx will not work, skipping it.
1756 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1759 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1760 Boot parameter startx does not work therefore." ; eend 1
1766 # {{{ configuration framework
1768 if checkbootparam extract ; then
1769 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1770 EXTRACTOPTIONS="-- -x $EXTRACT"
1775 if checkbootparam noautoconfig || checkbootparam forensic ; then
1776 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1778 if [ -z "$INSTALLED" ] ; then
1779 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1781 [ -d /mnt/grml ] || mkdir /mnt/grml
1782 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1783 # We do need the following fix so floppy disk is available to blkid in any case :-/
1784 if [ -r /dev/fd0 ] ; then
1785 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1786 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1787 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1788 blkid /dev/fd0 1>>$DEBUG 2>&1
1791 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1792 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1793 if [[ $RC == 0 ]]; then
1794 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1797 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1798 if [ -n "$CONFIG" ]; then
1799 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1801 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1803 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1807 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1808 if [ -n "$SCRIPT" ]; then
1809 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1812 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1814 ewarn "No devices with label GRMLCFG found." ; eend 0
1823 if checkbootparam "config" ; then
1824 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1825 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1826 einfo "Bootoption config found. config is set to: $CONFIG"
1828 einfo "Trying to extract configuration file ${CONFIG}:"
1829 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1833 if checkbootparam myconfig ; then
1834 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1835 if [ -n "$MOUNTDEVICE" ]; then
1836 if checkbootparam file ; then
1837 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1838 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1840 [ -d /mnt/grml ] || mkdir /mnt/grml
1841 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1842 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1843 if [[ $RC == 0 ]]; then
1844 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1847 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1848 if [ -n "$CONFIG" ]; then
1849 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1851 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1853 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1857 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1858 if [ -n "$SCRIPT" ]; then
1859 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
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 myconfig provided. Skipping." ; eend 1
1869 fi # [ -n "$MOUNTDEVICE" ]
1870 fi # checkbootparam myconfig
1872 if checkbootparam "partconf" ; then
1873 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1874 if [ -n "$MOUNTDEVICE" ]; then
1875 [ -d /mnt/grml ] || mkdir /mnt/grml
1876 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1877 if [[ $RC == 0 ]]; then
1878 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1879 einfo "Copying files from $MOUNTDEVICE over grml system."
1880 for file in `cat /etc/grml/partconf` ; do
1881 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1882 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1885 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1886 fi # mount $MOUNTDEVICE
1887 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1889 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1890 fi # [ -n "$MOUNTDEVICE" ]
1895 # {{{ /cdrom/.*-options
1897 if checkbootparam "debs" ; then
1898 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1899 einfo "Tring to install debian package(s) ${DEBS}"
1900 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1905 if checkbootparam "scripts" ; then
1906 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1907 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1908 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1909 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1916 if checkbootparam "distcc" ; then
1917 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1918 if [ -n "$OPTIONS" ]; then
1921 if [ -n "$OPTIONS" ]; then
1922 NET="${OPTIONS%%,*}"
1924 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1926 INTERFACE="${OPTIONS%%,*}"
1931 CONFIG=/etc/default/distcc
1932 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1933 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1935 if [ -n "$INTERFACE" ] ; then
1936 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1939 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1940 counter=$(( counter-1 ))
1941 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1943 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1947 if [ -n "$IP" ] ; then
1948 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1950 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1952 id distccd >/dev/null 2>&1 || \
1954 einfo "Creating distcc user" ; \
1955 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1958 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1959 /etc/init.d/distcc start 1>/dev/null ; eend $?
1962 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1966 if checkbootparam "gcc"; then
1967 GCC="$(getbootparam gcc 2>>$DEBUG)"
1969 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1972 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1975 if checkbootparam "gpp"; then
1976 GPP="$(getbootparam gpp 2>>$DEBUG)"
1978 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1979 if [ -x /usr/bin/g++-${GPP} ] ; then
1981 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1983 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1984 if [ -x /usr/bin/cpp-${GPP} ] ; then
1986 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1995 # Notice: use it only on live-cd system, if running from harddisk please
1996 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1997 # in /etc/runlevel.conf
1999 MODULES_FILE=/etc/grml/modules
2000 if checkbootparam nomodules ; then
2001 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2002 elif [ -z "$INSTALLED" ]; then
2003 if [ -r $MODULES_FILE ] ; then
2004 einfo "Loading modules specified in ${MODULES_FILE}:"
2006 grep '^[^#]' $MODULES_FILE | \
2007 while read module args; do
2008 [ "$module" ] || continue
2010 modprobe $module $args ; eend $?
2014 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2021 config_915resolution(){
2022 if checkbootparam "915resolution" ; then
2023 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2024 if [ -x /usr/sbin/915resolution ]; then
2029 if [ -n "$OPTIONS" ]; then
2031 MODE="${OPTIONS%%,*}"
2033 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2035 XRESO="${OPTIONS%%,*}"
2037 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2039 YRESO="${OPTIONS%%,*}"
2044 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2045 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2054 if [ -z "$INSTALLED" ] ; then
2055 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2056 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2057 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2058 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2060 if ! [ -x /sbin/mdadm ] ; then
2061 eerror "mdadm not available, can not execute it." ; eend 1
2064 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2065 # find out whether we have a valid configuration file already
2066 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2067 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2068 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2069 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2071 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2074 if ! checkbootparam 'swraid' ; then
2076 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2079 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2084 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2086 *'No arrays found'*)
2087 ewarn "$line" ; eend 0
2090 einfo "$line" ; eend 0
2097 if [ -r /proc/mdstat ] ; then
2099 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2100 if [ -z "$MDSTAT" ] ; then
2101 ewarn "No active arrays found" ; eend 0
2106 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2107 einfo "active arrays: $line" ; eend 0
2113 fi # bootoption swraid
2115 fi # is /sbin/mdadm executable?
2116 fi # check for bootoptions
2117 fi # run only in live-cd mode
2121 # {{{ LVM (Logical Volumes)
2123 if [ -z "$INSTALLED" ] ; then
2124 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2125 if checkbootparam 'nolvm' ; then
2126 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2128 if ! [ -x /sbin/lvm -a -x /etc/init.d/lvm2 -a -x /sbin/lvdisplay ] ; then
2129 eerror "LVM not available, can not execute it." ; eend 1
2131 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2132 einfo "You seem to have logical volumes (LVM) on your system."
2134 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2136 if checkbootparam 'lvm' ; then
2137 einfo "Bootoption LVM found. Searching for logical volumes:"
2138 /etc/init.d/lvm2 start ; eend $?
2142 fi # check for lvm binary
2143 fi # check for bootoption nolvm
2144 fi # run only in live-cd mode
2148 # {{{ debnet: setup network based on an existing one found on a partition
2150 if checkbootparam "debnet" ; then
2151 iszsh && setopt shwordsplit
2152 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2153 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2156 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2158 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2159 for i in $DEVICES; do
2160 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2161 einfo "Scanning on $i"
2162 if [ -f /mnt/etc/network/interfaces ]; then
2163 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2171 if [ -n "$FOUND_DEBNET" ]; then
2172 einfo "Stopping network."
2173 pump -k 1>/dev/null 2>&1
2174 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2175 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2176 rm -rf /etc/network/run
2177 cp -a /mnt/etc/network /etc
2178 rm -rf /etc/network/run
2179 mkdir /etc/network/run
2180 umount /mnt ; eend $?
2181 einfo "Starting network."
2182 /etc/init.d/networking start ; eend $?
2184 eerror "/etc/network/interfaces not found." ; eend 1
2188 eerror "Error: /mnt already mounted." ; eend 1
2194 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2196 if grep -q ipw3945 /proc/modules ; then
2197 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2198 ewarn "Broken ipw3945 network interface found, reloading module."
2207 # {{{ disable console blanking
2209 if checkbootparam "noblank" ; then
2210 einfo "Bootoption noblank found. Disabling monitor blanking."
2211 setterm -blank 0 ; eend $?
2216 # {{{ grml2hd: automatic installation
2219 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2221 if checkbootparam "user" ; then
2223 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2224 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2227 if checkbootparam "filesystem" ; then
2229 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2230 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2233 if checkbootparam "partition" ; then
2235 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2236 # notice: the following checks whether the given partition is available, if not the skip
2237 # execution of grml2hd as it might result in data loss...
2238 if [ -r $PARTITION ] ; then
2239 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2241 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2245 if checkbootparam "mbr" ; then
2247 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2248 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2251 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2253 GRML2HD_NONINTERACTIVE='yes' grml2hd
2256 chmod 755 /usr/bin/grml2hd_noninteractive
2257 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2258 if [ -z "$GRML2HD_FAIL" ] ; then
2259 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2261 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2264 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2268 # {{{ debootstrap: automatic installation
2269 config_debootstrap(){
2271 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2273 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2275 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2277 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2282 if checkbootparam "target" ; then
2284 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2285 # notice: the following checks whether the given partition is available, if not the skip
2286 # execution of grml-debootstrap as it might result in data loss...
2287 if ! [ -r "$TARGET" ] ; then
2288 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2292 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2297 if checkbootparam "grub" ; then
2299 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2302 if checkbootparam "groot" ; then
2304 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2307 if checkbootparam "release" ; then
2309 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2312 if checkbootparam "mirror" ; then
2314 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2317 if checkbootparam "boot_append" ; then
2319 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2322 if checkbootparam "password" ; then
2324 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2327 # now check which options are available
2328 if [ -n "TARGET" ] ; then
2329 TARGETCMD="--target $TARGET"
2333 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2337 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2338 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2339 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2340 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2341 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2342 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2344 # and finally write script and execute it
2345 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2347 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2350 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2352 screen /usr/bin/grml-debootstrap_noninteractive
2353 einfo "Invoking a shell, just exit to continue booting..."
2356 fi # stringinstring "BOOT_IMAGE=debian2hd
2360 # {{{ Support customization
2362 if checkbootparam "distri"; then
2363 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2364 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2365 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2366 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2367 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2368 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2374 ### {{{ backwards compatible stuff
2375 config_environment(){
2376 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2379 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2383 ## END OF FILE #################################################################
2384 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3