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: Mon Jän 14 21:34:16 CET 2008 [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
289 CUR_CONSOLE=$(fgconsole)
291 if [ -n "$CHARMAP" ] ; then
292 einfo "Running consolechars for ${CHARMAP}"
293 for vc in `seq 0 ${NUM_CONSOLES}` ; do
294 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
296 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
300 if checkbootparam noconsolefont ; then
301 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
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 ; RC=$?
308 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
319 if checkbootparam hostname ; then
320 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
321 einfo "Setting hostname to $HOSTNAME as requested."
322 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
323 hostname $HOSTNAME ; eend $?
325 hostname --file /etc/hostname
330 # fstabuser (needed when running from harddisk with username != grml {{{
332 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
333 if [ -n "$CONFIG_FSTAB_USER" ] ; then
334 fstabuser="$CONFIG_FSTAB_USER"
336 fstabuser=$(getent passwd 1000 | cut -d: -f1)
338 # if not yet set fall back to default 'grml' user
339 [ -n "$fstabuser" ] || fstabuser='grml'
343 # {{{ Set clock (Local time is more often used than GMT, so it is default)
345 # don't touch the files if running from harddisk:
346 if [ -z "$INSTALLED" ]; then
348 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
349 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
350 # hwclock uses the TZ variable
351 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
352 [ -n "$TZ" ] || TZ=Europe/Vienna
354 if ! [ -r /dev/rtc ] ; then
355 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
357 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
358 if [ -n "$ERROR" ] ; then
360 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
361 if [ -n "$ERROR" ] ; then
362 eerror "Problem running hwclock: $ERROR" ; eend 1
371 # {{{ print kernel info
373 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
374 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
375 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
376 if [ -r /proc/cpuinfo ] ; then
377 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
379 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
383 if [ -d /proc/xen ] ; then
385 einfo 'Running kernel featuring support for Xen detected' ; eend 0
391 # {{{ vmware specific stuff
393 if checkbootparam novmware ; then
394 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
396 if [ -z "$INSTALLED" ] ; then
397 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
398 if ! checkbootparam qemu ; then
399 if [ -r /etc/X11/xorg.conf.vmware ] ; then
400 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
401 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
404 elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
405 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
406 einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
407 cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
415 # {{{ qemu specific stuff
417 if checkbootparam qemu ; then
418 if [ -r /etc/X11/xorg.conf.example ] ; then
419 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
420 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
426 # {{{ ld.so.cache + depmod
428 if [ -n "$INSTALLED" ]; then
429 if ! [ -r /etc/grml.first.boot ] ; then
430 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
432 # Regenerate ld.so.cache and module dependencies on HD
433 einfo "Running ldconfig" ; ldconfig ; eend $?
434 einfo "Running depmod" ; depmod -a ; eend $?
435 touch /etc/grml.first.boot
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 ; RC=$? )
605 echo "${RED} *** Error: Could not find md5sum file. ***"
608 if [ "$RC" = "0" ]; then
609 einfo "Everything looks OK" ; eend 0
611 eerror 'Checksum failed for theses files:' ; eend 1
612 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
613 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
614 eerror '... RAM of your computer is broken.' ; eend 1
615 einfon "Hit return to continue, or press the reset button to quit."
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 for module in $(echo ${BLACK//,/ }) ; do
712 einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
713 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
714 echo "blacklist $module" >> /etc/modprobe.d/grml
715 echo "alias $module off" >> /etc/modprobe.d/grml
716 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
719 eerror "No given module for blacklist found. Blacklisting will not work therefore."
722 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
724 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
733 if [ -d /proc/acpi ]; then
734 if checkbootparam "noacpi"; then
735 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
736 elif checkbootparam "nogrmlacpi" ; then
737 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
739 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
742 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
744 basename="${basename%%.*}"
745 case "$basename" in *_acpi)
746 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
748 modprobe $basename >>$DEBUG 2>&1 && found="yes"
749 local BASE="$BASE $basename"
751 if [ -n "$found" ] ; then
752 einfo "$BASE" ; eend 0
754 ewarn "(none)" ; eend 1
756 if ! ps x | grep -q /usr/sbin/acpid ; then
757 if ! [ -r /var/run/dbus/pid ] ; then
758 einfo "Starting acpi daemon."
759 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
761 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
762 eerror "Solution: please activate acpid via /etc/runlevel.conf"
766 ewarn "acpi daemon already running."
773 if checkbootparam "noapm"; then
774 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
776 modprobe apm power_off=1 >>$DEBUG 2>&1
777 if [ "$?" = "0" ] ; then
778 if [ -x /etc/init.d/apmd ] ;then
779 einfo "APM Bios found, enabling power management functions."
780 /etc/init.d/apmd start ; eend $?
783 eerror "Loading apm module failed." ; eend 1
790 # {{{ PCMCIA Check/Setup
791 # This needs to be done before other modules are being loaded (by hwsetup)
793 if checkbootparam "nopcmcia"; then
794 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
796 if /usr/sbin/laptop-detect ; then
797 einfo "Detected Laptop - checking for PCMCIA." && eend 0
798 modprobe pcmcia_core >>$DEBUG 2>&1
799 # Try Cardbus or normal PCMCIA socket drivers
800 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
801 if [ "$?" = "0" ]; then
802 modprobe ds >>$DEBUG 2>&1
803 if [ -d /proc/bus/pccard ] ; then
804 if [ -x /sbin/cardmgr ] ; then
805 einfo "PCMCIA found, starting cardmgr."
806 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
808 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
817 # {{{ run software synthesizer via speakup
819 if checkbootparam swspeak ; then
820 if [ -d /proc/speakup/ ] ; then
821 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
823 if [ -x /etc/init.d/speech-dispatcher ] ; then
824 einfo "Starting speech-dispatcher."
825 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
826 einfo "Activating sftsyn in Kernel."
827 echo sftsyn >/proc/speakup/synth_name ; eend $?
828 einfo "Just run swspeak if you want to use software synthesizer via speakup."
829 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
831 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
832 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
836 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
837 flite -o play -t "Kernel does not seem to support speakup. Sorry."
843 # {{{ Check for blind option or brltty
846 checkbootparam "blind" && BLIND="yes"
847 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
849 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
850 if [ -x /sbin/brltty ]; then
851 # Blind option detected, start brltty now.
852 # modprobe serial_core parport_serial generic_serial && echo "done"
857 if [ -n "$BRLTTY" ]; then
859 BRLTYPE="${BRLTTY%%,*}"
861 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
863 BRLDEV="${BRLTTY%%,*}"
865 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
867 BRLTEXT="${BRLTTY%%,*}"
872 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
873 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
874 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
875 einfo "Starting braille-display manager."
878 sleep 2 && BLINDSOUND="yes"
885 # {{{ Interactive configuration
886 config_interactive(){
887 ewarn "config_interactive is deprecated nowadays."
888 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
894 if checkbootparam forceagp ; then
895 # Probe for AGP. Hope this can fail safely
896 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
902 config_automounter(){
903 if checkbootparam automounter ; then
904 RUNLEVEL="$(runlevel)"
906 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
911 if [ -n "$AUTOMOUNTER" ]; then
912 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
913 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
914 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
915 anew="$d -fstype=auto,$2 :$i"
916 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
917 AUTOMOUNTS="$AUTOMOUNTS $d"
918 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
920 [ -d /mnt/$d ] && mkdir -p /mnt/$d
921 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
923 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
926 AUTOMOUNTS="floppy cdrom"
927 # Add new devices to /etc/fstab and /etc/auto.mnt
928 for i in /dev/cdrom?*; do
930 addautomount "$i" "ro"
935 if [ -n "$AUTOMOUNTER" ]; then
936 # Check for floppy dir, reinstall with automounter
937 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
938 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
939 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
940 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
941 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
942 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
944 # Replace paths from bootfloppy
945 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
946 mv -f /etc/fstab.new /etc/fstab
947 # Start automounter now
948 einfo "Starting automounter for ${AUTOMOUNTS}."
949 /etc/init.d/autofs start >>$DEBUG ; eend $?
954 # {{{ Collect partitions from /proc/partitions first for enabling DMA
958 while read major minor blocks partition relax; do
959 partition="${partition##*/}"
960 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
962 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
963 sd?) ;; # SCSI Harddisk, entire disk
964 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
965 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
968 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
971 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
974 # {{{ Enable DMA for all IDE drives now if not disabled
975 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
977 if checkbootparam "nodma"; then
978 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
980 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
981 if test -d /proc/ide/$d; then
982 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
983 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
984 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
985 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
986 echo "using_dma:1" >/proc/ide/$d/settings
995 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
998 NOSWAP="yes" # we do not use swap by default!
999 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1001 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1004 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1005 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1007 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1008 iszsh && setopt nonomatch
1009 if [ -x /usr/sbin/rebuildfstab ] ; then
1010 config_userfstab || fstabuser=grml
1011 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1013 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1015 fi # checkbootparam nofstab/forensic
1017 # Scan for swap, config, homedir - but only in live-mode
1018 if [ -z "$INSTALLED" ] ; then
1019 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1022 HOMEDIR="$(getbootparam home)"
1023 if [ -n "$partitions" ]; then
1024 while read p m f relax; do
1025 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1026 partoptions="users,exec"
1028 # it's a swap partition?
1031 if [ -n "$NOSWAP" ]; then
1032 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1035 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1036 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1037 if [ -n "$ANYSWAP" ] ; then
1038 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1039 swapon $p 2>>$DEBUG ; eend $?
1041 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1045 if [[ "$p" == LABEL* ]] ; then
1046 p=$(blkid -t $p | awk -F: '{print $1}')
1048 if grep -q $p /proc/swaps ; then
1049 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1051 if [ -b "$p" ] ; then
1052 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1053 swapon $p 2>>$DEBUG ; eend $?
1055 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1064 esac # it's a swap partition?
1069 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1070 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1072 # *) NONEFOUND='1'; continue ;;
1076 if [ -z "$NOSWAP" ] ; then
1077 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1078 # Activate swapfile, if exists
1079 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1081 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1082 mount -o remount,rw $m && MOUNTED=1
1083 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1085 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1087 fnew="$SWAPFILE swap swap defaults 0 0"
1088 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1089 GRML_SWP="$GRML_SWP $SWAPFILE"
1092 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1095 # use a image as home
1096 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1097 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1098 if [ -n "$HOMEDIR" ]; then
1099 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1103 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1105 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1110 # Umount, if not in use
1111 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1123 if [ -n "$MOUSE_DEVICE" ] ; then
1124 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1129 # {{{ IPv6 configuration
1130 # Load IPv6 kernel module and print IP adresses
1132 if checkbootparam "ipv6"; then
1133 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1135 # we probably need some time until stateless autoconfiguration has happened
1137 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1138 for DEVICE in `echo "$NETDEVICES"`; do
1141 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1142 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1144 for ADDR in `echo "$ADDRESSES"` ; do
1147 if [ "$COUNT" -eq "0" ] ; then
1148 einfo "(none)" ; eend 1
1158 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1160 if checkbootparam "nodhcp"; then
1161 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1163 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1164 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1165 for DEVICE in `echo "$NETDEVICES"` ; do
1166 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1168 ifconfig $DEVICE up >>$DEBUG 2>&1
1169 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1174 if [ -n "$INSTALLED" ] ; then
1175 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1182 # {{{ helper functions
1185 # search all partitions for a file in the root directory
1186 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1187 # See if it's already mounted
1188 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1189 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1190 [ -f "$i/$1" ] && FOUND="$i/$1"
1191 umount -l "$i" 2>>$DEBUG
1192 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1199 case "$(file -s $1)" in
1200 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1201 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1202 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1203 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1204 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1205 *data*) echo "invalid"; return 0;;
1206 *) echo "auto"; return 0;;
1210 # Try to mount this filesystem read-only, without or with encryption
1212 # Check if already mounted
1213 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1214 # Apparently, mount-aes DOES autodetect AES loopback files.
1215 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1216 # We need to mount crypto-loop files with initial rw support
1217 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1219 [ "$RC" = "0" ] && return 0
1221 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1223 while [ "$a" != "n" -a "$a" != "N" ]; do
1224 # We need to mount crypto-loop files with initial rw support
1225 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1226 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1227 # Problem with ioctl() from getpasswd()?
1237 if checkbootparam "nocpu"; then
1238 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1240 # check module dependencies
1242 if [ -e /lib64 ] ; then
1243 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1245 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1249 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1250 einfo "Detecting CPU:"
1251 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)
1252 echo $CPU | sed 's/ \{1,\}/ /g'
1255 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
1258 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1259 # * it only if we have the according kernel modules available
1260 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1261 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1262 # -> parse output of the initscript and output it according to our look'n'feel
1263 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1264 if ! cpufreq_check ; then
1265 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1267 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1268 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1269 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1270 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1271 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1275 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1277 if [ -x /etc/init.d/loadcpufreq ] ; then
1278 SKIP_CPU_GOVERNOR=''
1279 LOADCPUFREQ=$(mktemp)
1280 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1281 if grep -q FATAL "$LOADCPUFREQ" ; then
1287 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1288 eerror "$line" ; eend $RC
1292 elif grep -q done "$LOADCPUFREQ" ; then
1293 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1294 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1295 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1297 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1301 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1302 . /usr/bin/cpufreq-detect.sh
1303 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1304 einfo "Loading modules ${MODULE}"
1305 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1307 if [[ $RC == 0 ]]; then
1314 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1318 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1319 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1320 if modprobe cpufreq_ondemand ; RC=$? ; then
1321 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1322 echo ondemand > $file
1332 fi # checkbootparam nocpu
1336 # {{{ autostart of ssh
1338 if checkbootparam ssh ; then
1339 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1340 einfo "Bootoption passwd found."
1341 if [ -n "$SSH_PASSWD" ] ; then
1342 echo "grml:$SSH_PASSWD" | chpasswd -m
1343 einfo "Starting secure shell server in background."
1344 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1345 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1348 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1351 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1357 # {{{ set password for user grml
1359 if checkbootparam passwd >>$DEBUG 2>&1; then
1360 einfo "Bootoption passwd found."
1361 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1362 if [ -n "$PASSWD" ] ; then
1363 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1365 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1368 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1374 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1376 if checkbootparam home ; then
1377 HOMEDIR="$(getbootparam home)"
1381 if [ -n "$HOMEDIR" ]; then
1382 einfo "Bootoption home detected." && eend 0
1385 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1386 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1387 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1388 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1391 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1392 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1393 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1394 MYHOMEDIR="$HOMEDIR"
1396 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1397 MYHOMEDIR="$(findfile grml.img)"
1398 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1399 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1400 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1403 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1404 eerror "Option ignored." ; eend 1
1409 if [ -n "$MYHOMEDIR" ]; then
1410 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1411 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1412 while read device mountpoint fs relax; do
1413 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1416 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1420 # Note: This currently won't work with encrypted partitions
1421 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1422 if [ ! -f "$MYHOMEDIR" ]; then
1423 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1424 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1429 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1430 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1431 if [ -f "$MYHOMEDIR" ]; then
1432 # It's a loopback file, mount it over the /home/grml directory
1433 trymount "$MYHOMEDIR" /home/grml
1435 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1439 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1443 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1445 fi # mount -o remount,rw,...
1448 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1452 fi # if trymount ...
1454 fi # checkbootparam home
1458 # {{{ Check for scripts on CD-ROM
1459 config_cdrom_scripts(){
1460 if checkbootparam "script"; then
1461 for script in /cdrom/scripts/* ; do
1462 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1471 if ! [ -x /usr/bin/aumix ] ; then
1472 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1475 if ! [ -r /proc/asound/cards ] ; then
1476 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1480 if checkbootparam vol ; then
1481 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1482 if [ -z "$VOL" ] ; then
1483 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1490 if checkbootparam nosound ; then
1491 einfo "Muting sound devices on request."
1492 # some IBM notebooks require the following stuff:
1493 if [ -x /usr/bin/amixer ] ; then
1494 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1495 amixer set Front unmute 1>/dev/null
1496 amixer set Front 0% 1>/dev/null
1499 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1500 if [ -n "$ERROR" ] ; then
1502 eerror "Problem muting sound devices: $ERROR"
1506 elif [ -z "$INSTALLED" ]; then
1507 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1508 # some IBM notebooks require the following stuff:
1509 if [ -x /usr/bin/amixer ] ; then
1510 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1511 amixer set Front unmute 1>/dev/null
1512 amixer set Front ${VOL}% 1>/dev/null
1515 # by default assume '0' as volume for microphone:
1516 if checkbootparam micvol ; then
1517 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1522 # finally set the volumes:
1523 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1524 if [ -n "$ERROR" ] ; then
1526 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1536 # {{{ modem detection
1538 if checkbootparam "nomodem"; then
1539 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1541 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1542 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1543 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1551 # {{{ keyboard add-ons
1552 config_setkeycodes(){
1553 if checkbootparam "setkeycodes" ; then
1554 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1555 # MS MM keyboard add-on
1557 setkeycodes e001 126 &>/dev/null
1558 setkeycodes e059 127 &>/dev/null
1560 setkeycodes e03b 59 &>/dev/null
1561 setkeycodes e008 60 &>/dev/null
1562 setkeycodes e007 61 &>/dev/null
1563 setkeycodes e03e 62 &>/dev/null
1564 setkeycodes e03f 63 &>/dev/null
1565 setkeycodes e040 64 &>/dev/null
1566 setkeycodes e041 65 &>/dev/null
1567 setkeycodes e042 66 &>/dev/null
1568 setkeycodes e043 67 &>/dev/null
1569 setkeycodes e023 68 &>/dev/null
1570 setkeycodes e057 87 &>/dev/null
1571 setkeycodes e058 88 &>/dev/null
1573 setkeycodes e00a 89 e008 90 &>/dev/null
1580 config_wondershaper(){
1581 if checkbootparam "wondershaper" ; then
1582 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1587 if [ -n "$WONDER" ]; then
1589 DEVICE="${WONDER%%,*}"
1591 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1593 DOWNSTREAM="${WONDER%%,*}"
1595 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1597 UPSTREAM="${WONDER%%,*}"
1602 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1603 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1604 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1605 einfo "Starting wondershaper (${CMD}) in background."
1606 ( sh -c $CMD & ) && eend 0
1613 if checkbootparam "nosyslog"; then
1614 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1616 einfo "Starting syslog-ng in background."
1617 /etc/init.d/syslog-ng start 1>>$DEBUG &
1625 if checkbootparam "nogpm"; then
1626 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1628 einfo "Starting gpm in background."
1629 # /etc/init.d/gpm start 1>>$DEBUG &
1630 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1638 if checkbootparam "services" ; then
1639 SERVICE="$(getbootparam services 2>>$DEBUG)"
1640 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1641 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1642 einfo "Starting service(s) ${SERVICENL} in background."
1643 for service in $(echo -e $SERVICELIST) ; do
1644 /etc/init.d/${service} start 1>>$DEBUG &
1646 [ "$?" == "0" ] ; eend $?
1653 if checkbootparam netconfig ; then
1654 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1655 CONFIGFILE='/tmp/netconfig.grml'
1658 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1659 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1661 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1663 while ! getconfig && [[ "$counter" != 0 ]] ; do
1664 echo -n "Sleeping for 5 seconds and trying to get config again... "
1665 counter=$(( counter-1 ))
1666 echo "$counter tries left" ; sleep 1
1668 if [ -r "$CONFIGFILE" ] ; then
1669 einfo "Downloading was successfull." ; eend 0
1670 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1671 md5sum $CONFIGFILE ; eend 0
1672 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1674 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1681 config_blindsound(){
1682 if checkbootparam "blind" ; then
1684 flite -o play -t "welcome to the gremel system"
1691 if checkbootparam welcome ; then
1692 flite -o play -t "welcome to the gremel system"
1697 # {{{ fix/workaround for unionfs
1699 if [ -z "$INSTALLED" ]; then
1700 touch /var/cache/apt/*cache.bin
1705 # {{{ create all /mnt-directories
1707 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1708 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1712 # {{{ start X window system via grml-x
1714 if checkbootparam startx ; then
1715 if [ -x /usr/X11R6/bin/X ] ; then
1716 if [ -z "$INSTALLED" ] ; then
1717 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1718 if [ -z "$WINDOWMANAGER" ] ; then
1719 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1720 WINDOWMANAGER="wm-ng"
1722 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1724 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1725 config_userfstab || fstabuser='grml'
1726 cat>|/etc/init.d/xstartup<<EOF
1728 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1729 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1731 chmod 755 /etc/init.d/xstartup
1733 # adjust inittab for xstartup
1734 if grep -q '^6:' /etc/inittab ; then
1735 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1736 else # just append tty6 to inittab if no definition is present:
1737 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1740 /sbin/telinit q ; eend $?
1742 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1743 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1745 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1749 eerror "We are not running from CD - startx will not work, skipping it.
1750 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1753 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1754 Boot parameter startx does not work therefore." ; eend 1
1760 # {{{ configuration framework
1762 if checkbootparam extract ; then
1763 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1764 EXTRACTOPTIONS="-- -x $EXTRACT"
1769 if checkbootparam noautoconfig || checkbootparam forensic ; then
1770 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1772 if [ -z "$INSTALLED" ] ; then
1773 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1775 [ -d /mnt/grml ] || mkdir /mnt/grml
1776 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1777 # We do need the following fix so floppy disk is available to blkid in any case :-/
1778 if [ -r /dev/fd0 ] ; then
1779 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1780 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1781 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1782 blkid /dev/fd0 1>>$DEBUG 2>&1
1785 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1786 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1787 if [[ $RC == 0 ]]; then
1788 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1791 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1792 if [ -n "$CONFIG" ]; then
1793 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1795 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1797 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1801 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1802 if [ -n "$SCRIPT" ]; then
1803 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1806 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1808 ewarn "No devices with label GRMLCFG found." ; eend 0
1817 if checkbootparam "config" ; then
1818 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1819 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1820 einfo "Bootoption config found. config is set to: $CONFIG"
1822 einfo "Trying to extract configuration file ${CONFIG}:"
1823 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1827 if checkbootparam myconfig ; then
1828 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1829 if [ -n "$MOUNTDEVICE" ]; then
1830 if checkbootparam file ; then
1831 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1832 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1834 [ -d /mnt/grml ] || mkdir /mnt/grml
1835 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1836 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1837 if [[ $RC == 0 ]]; then
1838 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1841 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1842 if [ -n "$CONFIG" ]; then
1843 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1845 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1847 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1851 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1852 if [ -n "$SCRIPT" ]; then
1853 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1858 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1859 fi # mount $MOUNTDEVICE
1860 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1862 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1863 fi # [ -n "$MOUNTDEVICE" ]
1864 fi # checkbootparam myconfig
1866 if checkbootparam "partconf" ; then
1867 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1868 if [ -n "$MOUNTDEVICE" ]; then
1869 [ -d /mnt/grml ] || mkdir /mnt/grml
1870 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1871 if [[ $RC == 0 ]]; then
1872 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1873 einfo "Copying files from $MOUNTDEVICE over grml system."
1874 for file in `cat /etc/grml/partconf` ; do
1875 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1876 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1879 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1880 fi # mount $MOUNTDEVICE
1881 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1883 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1884 fi # [ -n "$MOUNTDEVICE" ]
1889 # {{{ /cdrom/.*-options
1891 if checkbootparam "debs" ; then
1892 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1893 einfo "Tring to install debian package(s) ${DEBS}"
1894 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1899 if checkbootparam "scripts" ; then
1900 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1901 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1902 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1903 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1910 if checkbootparam "distcc" ; then
1911 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1912 if [ -n "$OPTIONS" ]; then
1915 if [ -n "$OPTIONS" ]; then
1916 NET="${OPTIONS%%,*}"
1918 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1920 INTERFACE="${OPTIONS%%,*}"
1925 CONFIG=/etc/default/distcc
1926 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1927 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1929 if [ -n "$INTERFACE" ] ; then
1930 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1933 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1934 counter=$(( counter-1 ))
1935 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1937 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1941 if [ -n "$IP" ] ; then
1942 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1944 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1946 id distccd >/dev/null 2>&1 || \
1948 einfo "Creating distcc user" ; \
1949 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1952 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1953 /etc/init.d/distcc start 1>/dev/null ; eend $?
1956 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1960 if checkbootparam "gcc"; then
1961 GCC="$(getbootparam gcc 2>>$DEBUG)"
1963 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1966 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1969 if checkbootparam "gpp"; then
1970 GPP="$(getbootparam gpp 2>>$DEBUG)"
1972 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1973 if [ -x /usr/bin/g++-${GPP} ] ; then
1975 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1977 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1978 if [ -x /usr/bin/cpp-${GPP} ] ; then
1980 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1989 # Notice: use it only on live-cd system, if running from harddisk please
1990 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1991 # in /etc/runlevel.conf
1993 MODULES_FILE=/etc/grml/modules
1994 if checkbootparam nomodules ; then
1995 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1996 elif [ -z "$INSTALLED" ]; then
1997 if [ -r $MODULES_FILE ] ; then
1998 einfo "Loading modules specified in ${MODULES_FILE}:"
2000 grep '^[^#]' $MODULES_FILE | \
2001 while read module args; do
2002 [ "$module" ] || continue
2004 modprobe $module $args ; eend $?
2008 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2015 config_915resolution(){
2016 if checkbootparam "915resolution" ; then
2017 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2018 if [ -x /usr/sbin/915resolution ]; then
2023 if [ -n "$OPTIONS" ]; then
2025 MODE="${OPTIONS%%,*}"
2027 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2029 XRESO="${OPTIONS%%,*}"
2031 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2033 YRESO="${OPTIONS%%,*}"
2038 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2039 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2048 if [ -z "$INSTALLED" ] ; then
2049 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2050 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2051 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2052 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2054 if ! [ -x /sbin/mdadm ] ; then
2055 eerror "mdadm not available, can not execute it." ; eend 1
2058 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2059 # find out whether we have a valid configuration file already
2060 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2061 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2062 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2063 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2065 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2068 if ! checkbootparam 'swraid' ; then
2070 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2073 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2078 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2080 *'No arrays found'*)
2081 ewarn "$line" ; eend 0
2084 einfo "$line" ; eend 0
2091 if [ -r /proc/mdstat ] ; then
2093 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2094 if [ -z "$MDSTAT" ] ; then
2095 ewarn "No active arrays found" ; eend 0
2100 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2101 einfo "active arrays: $line" ; eend 0
2107 fi # bootoption swraid
2109 fi # is /sbin/mdadm executable?
2110 fi # check for bootoptions
2111 fi # run only in live-cd mode
2115 # {{{ LVM (Logical Volumes)
2117 if [ -z "$INSTALLED" ] ; then
2118 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2119 if checkbootparam 'nolvm' ; then
2120 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2122 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2123 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2124 eerror "LVM not available, can not execute it." ; eend 1
2126 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2127 einfo "You seem to have logical volumes (LVM) on your system."
2129 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2131 if checkbootparam 'lvm' ; then
2132 einfo "Bootoption LVM found. Searching for logical volumes:"
2133 /etc/init.d/lvm2 start ; eend $?
2137 fi # check for lvm binary
2138 fi # check for bootoption nolvm
2139 fi # run only in live-cd mode
2143 # {{{ debnet: setup network based on an existing one found on a partition
2145 if checkbootparam "debnet" ; then
2146 iszsh && setopt shwordsplit
2147 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2148 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2151 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2153 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2154 for i in $DEVICES; do
2155 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2156 einfo "Scanning on $i"
2157 if [ -f /mnt/etc/network/interfaces ]; then
2158 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2166 if [ -n "$FOUND_DEBNET" ]; then
2167 einfo "Stopping network."
2168 pump -k 1>/dev/null 2>&1
2169 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2170 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2171 rm -rf /etc/network/run
2172 cp -a /mnt/etc/network /etc
2173 rm -rf /etc/network/run
2174 mkdir /etc/network/run
2175 umount /mnt ; eend $?
2176 einfo "Starting network."
2177 /etc/init.d/networking start ; eend $?
2179 eerror "/etc/network/interfaces not found." ; eend 1
2183 eerror "Error: /mnt already mounted." ; eend 1
2189 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2191 if grep -q ipw3945 /proc/modules ; then
2192 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2193 ewarn "Broken ipw3945 network interface found, reloading module."
2202 # {{{ disable console blanking
2204 if checkbootparam "noblank" ; then
2205 einfo "Bootoption noblank found. Disabling monitor blanking."
2206 setterm -blank 0 ; eend $?
2211 # {{{ grml2hd: automatic installation
2214 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2216 if checkbootparam "user" ; then
2218 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2219 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2222 if checkbootparam "filesystem" ; then
2224 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2225 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2228 if checkbootparam "partition" ; then
2230 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2231 # notice: the following checks whether the given partition is available, if not the skip
2232 # execution of grml2hd as it might result in data loss...
2233 if [ -r $PARTITION ] ; then
2234 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2236 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2240 if checkbootparam "mbr" ; then
2242 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2243 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2246 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2248 GRML2HD_NONINTERACTIVE='yes' grml2hd
2251 chmod 755 /usr/bin/grml2hd_noninteractive
2252 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2253 if [ -z "$GRML2HD_FAIL" ] ; then
2254 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2256 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2259 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2263 # {{{ debootstrap: automatic installation
2264 config_debootstrap(){
2266 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2268 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2270 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2272 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2277 if checkbootparam "target" ; then
2279 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2280 # notice: the following checks whether the given partition is available, if not the skip
2281 # execution of grml-debootstrap as it might result in data loss...
2282 if ! [ -r "$TARGET" ] ; then
2283 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2287 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2292 if checkbootparam "grub" ; then
2294 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2297 if checkbootparam "groot" ; then
2299 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2302 if checkbootparam "release" ; then
2304 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2307 if checkbootparam "mirror" ; then
2309 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2312 if checkbootparam "boot_append" ; then
2314 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2317 if checkbootparam "password" ; then
2319 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2322 # now check which options are available
2323 if [ -n "TARGET" ] ; then
2324 TARGETCMD="--target $TARGET"
2328 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2332 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2333 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2334 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2335 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2336 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2337 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2339 # and finally write script and execute it
2340 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2342 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2345 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2347 screen /usr/bin/grml-debootstrap_noninteractive
2348 einfo "Invoking a shell, just exit to continue booting..."
2351 fi # stringinstring "BOOT_IMAGE=debian2hd
2355 # {{{ Support customization
2357 if checkbootparam "distri"; then
2358 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2359 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2360 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2361 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2362 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2363 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2369 ### {{{ backwards compatible stuff
2370 config_environment(){
2371 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2374 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2378 ## END OF FILE #################################################################
2379 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3