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: Fre Nov 16 08:45:53 CET 2007 [mika]
8 ################################################################################
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
21 if [ -n "$ZSH_VERSION" ] ; then
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
31 ### {{{ Utility Functions
35 case "$(cat $2)" in *$1*) return 0;; esac
41 case "$2" in *$1*) return 0;; esac
45 # Reread boot command line; echo last parameter's argument or return false.
47 stringinstring " $1=" "$CMDLINE" || return 1
48 result="${CMDLINE##*$1=}"
49 result="${result%%[ ]*}"
54 # Check boot commandline for specified option
56 stringinstring " $1" "$CMDLINE"
61 if [ "$1" = "yes" ] ; then
69 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
73 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 # {{{ filesystems (proc, pts, sys) and fixes
79 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
83 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
87 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
97 # {{{ Check if we are running from the grml-CD or HD
99 [ -e /etc/grml_cd ] || INSTALLED="yes"
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
109 . /etc/grml/lsb-functions
110 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
112 . /etc/grml/lsb-functions
119 if checkbootparam "debug"; then
122 if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
126 if [ -n "$BOOTDEBUG" ]; then
127 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
129 if [ -r /etc/grml/screenrc ] ; then
130 einfo "Starting GNU screen to be able to use a full featured shell environment."
131 einfo "Just exit the shells (and therefore screen) to continue boot process..."
132 /bin/zsh -c "screen -c /etc/grml/screenrc"
134 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135 einfo "Just exit the shell to continue boot process..."
146 if checkbootparam "log"; then
147 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
149 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
151 einfo "Starting bootlogd."
152 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
160 # {{{ set firmware timeout via bootparam
162 if checkbootparam fwtimeout ; then
163 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
164 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
165 rmmod firmware_class 1>>$DEBUG 2>&1
166 modprobe firmware_class ; eend $?
168 if [ -z "$TIMEOUT" ] ; then
169 TIMEOUT="100" # linux kernel default: 10
171 if [ -f /sys/class/firmware/timeout ] ; then
172 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
173 echo 100 > /sys/class/firmware/timeout ; eend $?
178 ### {{{ language configuration / localization
181 einfo "Activating language settings:"
184 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
185 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
187 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
189 # check for bootoption which overrides config from /etc/grml/autoconfig:
190 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
191 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
193 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
194 if [ -z "$INSTALLED" ] ; then
195 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
198 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
199 if [ -n "$BOOT_LANGUAGE" ] ; then
200 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
204 if [ -z "$CONSOLEFONT" ] ; then
205 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
206 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
207 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
208 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
209 CONSOLEFONT='Uni3-Terminus16'
211 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
216 # export it now, so error messages get translated, too
217 if checkgrmlsmall ; then
218 export LANG='C' # grml-small does not provide any further locales
220 [ -r /etc/default/locale ] && . /etc/default/locale
224 # configure keyboard layout, read in already set values first:
225 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
227 # now allow keyboard override by boot commandline for later use:
228 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
229 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
230 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
231 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
232 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
234 # modify /etc/sysconfig/keyboard only in live-cd mode:
235 if [ -z "$INSTALLED" ] ; then
237 local LANGUAGE="$BOOT_LANGUAGE"
238 . /etc/grml/language-functions
239 # allow setting xkeyboard explicitly different than console keyboard
240 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
241 if [ -n "$KXKEYBOARD" ]; then
242 XKEYBOARD="$KXKEYBOARD"
243 KDEKEYBOARD="$KXKEYBOARD"
244 elif [ -n "$KKEYBOARD" ]; then
245 XKEYBOARD="$KKEYBOARD"
246 KDEKEYBOARD="$KKEYBOARD"
249 # duplicate of previous code to make sure /etc/grml/language-functions
250 # does not overwrite our values....
251 # now allow keyboard override by boot commandline for later use:
252 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
253 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
254 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
255 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
256 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
258 # write keyboard related variables to file for later use
259 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
260 if ! [ -e /etc/sysconfig/keyboard ] ; then
261 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
262 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
263 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
264 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
268 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
270 # activate unicode console if running within utf8 environment
271 if [ -r /etc/default/locale ] ; then
272 if grep -q "LANG=.*UTF" /etc/default/locale ; then
273 einfo "Setting up unicode environment."
274 unicode_start 2>>$DEBUG ; eend $?
278 # Set default keyboard before interactive setup
279 if [ -n "$KEYTABLE" ] ; then
280 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281 loadkeys -q $KEYTABLE &
285 # we have to set up all consoles, therefore loop it over all ttys:
286 NUM_CONSOLES=$(fgconsole --next-available)
287 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
288 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
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 $?
410 # {{{ qemu specific stuff
412 if checkbootparam qemu ; then
413 if [ -r /etc/X11/xorg.conf.example ] ; then
414 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
415 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
421 # {{{ ld.so.cache + depmod
423 if [ -n "$INSTALLED" ]; then
424 if ! [ -r /etc/grml.first.boot ] ; then
425 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
427 # Regenerate ld.so.cache and module dependencies on HD
428 einfo "Running ldconfig" ; ldconfig ; eend $?
429 einfo "Running depmod" ; depmod -a ; eend $?
430 touch /etc/grml.first.boot
440 # don't touch the files if running from harddisk:
441 if [ -z "$INSTALLED" ]; then
442 KTZ="$(getbootparam tz 2>>$DEBUG)"
443 if [ -n "$KTZ" ] ; then
444 einfo "Setting timezone."
445 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
447 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
453 # small computer / nearly no ram {{{
456 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
457 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
460 if checkbootparam "small"; then
461 einfo "Information: ${RAM} kB of RAM available." ; eend 0
462 einfo "Bootoption small detected. Activating small system."
463 if [ -r /etc/inittab.small ] ; then
464 mv /etc/inittab /etc/inittab.normal
465 mv /etc/inittab.small /etc/inittab
467 sed -i 's/^9/#&/' /etc/inittab
468 sed -i 's/^10/#&/' /etc/inittab
469 sed -i 's/^11/#&/' /etc/inittab
470 sed -i 's/^12/#&/' /etc/inittab
472 /sbin/telinit q ; eend $?
474 if checkgrmlsmall ; then
475 if [[ $RAM -lt 25000 ]] ; then
476 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
477 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
478 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
479 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
482 einfo "Information: ${RAM} kB of RAM available." ; eend 0
485 if [[ $RAM -lt 58000 ]] ; then
486 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
487 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
488 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
489 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
492 einfo "Information: ${RAM} kB of RAM available." ; eend 0
500 # skip startup of w3m {{{
502 if checkbootparam "fast"; then
503 ewarn "Bootoption fast detected. Skipping startup of w3m."
504 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
505 /sbin/telinit q ; eend $?
510 # activate serial console {{{
512 if checkbootparam "console"; then
513 einfo "Bootoption (for serial) console detected."
515 if [ -r /etc/mgetty/mgetty.config ] ; then
516 MODE=$(getbootparam console | awk -F, '{print $2}')
518 [ -n "$MODE" ] || MODE=9600 # default mode
519 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
520 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
523 einfo "Activating mgetty."
524 sed -i 's/^#T0/T0/' /etc/inittab
525 sed -i 's/^#T1/T1/' /etc/inittab
526 /sbin/telinit q ; eend $?
532 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
535 for DEVICE in /proc/ide/hd?; do
536 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
538 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
542 # {{{ Bring up loopback interface now
544 if [ -z "$INSTALLED" ] ; then
545 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
546 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
554 # firewire devices {{{
555 # the raw1394 driver does not yet export info into SYSFS,
556 # so let's create raw1394 device manually
557 # http://www.michael-prokop.at/blog/index.php?p=352
558 config_firewire_dev(){
559 if checkbootparam "nofirewiredev" ; then
560 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
562 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
563 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
564 # cd /dev && MAKEDEV video1394 raw1394
565 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
566 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
567 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
568 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
569 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
570 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
576 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
577 # otherwise we will get: passwd: Authentication token lock busy
579 if [ -z "$INSTALLED" ] ; then
587 if [ -n "$TESTCD" ]; then
588 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
589 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
592 # /linuxrc grml version:
593 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
594 # live-initramfs version:
595 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
597 if [ -n "$TESTCD_PATH" ] ; then
598 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
600 echo "${RED} *** Error: Could not find md5sum file. ***"
603 if [ "$RC" = "0" ]; then
604 einfo "Everything looks OK" ; eend 0
606 eerror 'Checksum failed for theses files:' ; eend 1
607 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
608 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
609 eerror '... RAM of your computer is broken.' ; eend 1
610 einfon "Hit return to continue, or press the reset button to quit."
619 # {{{ hardware detection via discover
621 if checkbootparam "nodisc" ; then
622 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
624 if [ -x /sbin/discover ] ; then
625 einfo "Discovering hardware. Trying to load the following modules in background:"
627 einfo "$(discover --data-path=linux/module/name --data-path=linux/modules/options --format="%s %s" --data-version=`uname -r` --enable-bus all | sort -u | xargs echo)"
629 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
632 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
638 # {{{ hardware detection via hwinfo
640 if checkbootparam hwinfo >>$DEBUG 2>&1; then
641 einfo "Discovering hardware via hwinfo:"
642 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
643 echo -n " Loading modules: "
644 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
650 # {{{ disable hotplug agents on request
651 config_hotplug_agent(){
652 if checkbootparam "noagent" ; then
653 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
654 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
655 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
656 einfo "Disabling hotplug-agent(s) $AGENTNL"
657 for agent in $(echo -e $AGENTLIST) ; do
658 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
660 [ "$?" == "0" ] ; eend $?
665 # {{{ blacklist of hotplug-modules
666 config_hotplug_blacklist(){
667 if checkbootparam "black" ; then
668 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
669 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
670 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
671 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
672 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
673 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
681 if checkbootparam "nohotplug" ; then
682 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
684 if [ -r /etc/init.d/hotplug ] ; then
685 einfo "Starting hotplug system in background."
686 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
688 elif [ -r /etc/init.d/hotplug-light ] ; then
689 einfo "Starting hotplug-light system in background."
690 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
693 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
699 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
701 if checkbootparam "blacklist" ; then
702 if [ -z "$INSTALLED" ]; then
703 einfo "Bootoption blacklist found."
704 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
705 if [ -n "$BLACK" ] ; then
706 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
707 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
708 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
709 echo "alias $BLACK off" >> /etc/modprobe.d/grml
710 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
712 eerror "No given module for blacklist found. Blacklisting will not work therefore."
715 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
717 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
726 if [ -d /proc/acpi ]; then
727 if checkbootparam "noacpi"; then
728 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
729 elif checkbootparam "nogrmlacpi" ; then
730 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
732 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
735 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
737 basename="${basename%%.*}"
738 case "$basename" in *_acpi)
739 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
741 modprobe $basename >>$DEBUG 2>&1 && found="yes"
742 local BASE="$BASE $basename"
744 if [ -n "$found" ] ; then
745 einfo "$BASE" ; eend 0
747 ewarn "(none)" ; eend 1
749 if ! ps x | grep -q /usr/sbin/acpid ; then
750 if ! [ -r /var/run/dbus/pid ] ; then
751 einfo "Starting acpi daemon."
752 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
754 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
755 eerror "Solution: please activate acpid via /etc/runlevel.conf"
759 ewarn "acpi daemon already running."
766 if checkbootparam "noapm"; then
767 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
769 modprobe apm power_off=1 >>$DEBUG 2>&1
770 if [ "$?" = "0" ] ; then
771 if [ -x /etc/init.d/apmd ] ;then
772 einfo "APM Bios found, enabling power management functions."
773 /etc/init.d/apmd start ; eend $?
776 eerror "Loading apm module failed." ; eend 1
783 # {{{ PCMCIA Check/Setup
784 # This needs to be done before other modules are being loaded (by hwsetup)
786 if checkbootparam "nopcmcia"; then
787 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
789 if /usr/sbin/laptop-detect ; then
790 einfo "Detected Laptop - checking for PCMCIA." && eend 0
791 modprobe pcmcia_core >>$DEBUG 2>&1
792 # Try Cardbus or normal PCMCIA socket drivers
793 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
794 if [ "$?" = "0" ]; then
795 modprobe ds >>$DEBUG 2>&1
796 if [ -d /proc/bus/pccard ] ; then
797 if [ -x /sbin/cardmgr ] ; then
798 einfo "PCMCIA found, starting cardmgr."
799 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
801 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
810 # {{{ run software synthesizer via speakup
812 if checkbootparam swspeak ; then
813 if [ -d /proc/speakup/ ] ; then
814 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
816 if [ -x /etc/init.d/speech-dispatcher ] ; then
817 einfo "Starting speech-dispatcher."
818 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
819 einfo "Activating sftsyn in Kernel."
820 echo sftsyn >/proc/speakup/synth_name ; eend $?
821 einfo "Just run swspeak if you want to use software synthesizer via speakup."
822 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
824 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
825 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
829 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
830 flite -o play -t "Kernel does not seem to support speakup. Sorry."
836 # {{{ Check for blind option or brltty
839 checkbootparam "blind" && BLIND="yes"
840 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
842 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
843 if [ -x /sbin/brltty ]; then
844 # Blind option detected, start brltty now.
845 # modprobe serial_core parport_serial generic_serial && echo "done"
850 if [ -n "$BRLTTY" ]; then
852 BRLTYPE="${BRLTTY%%,*}"
854 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
856 BRLDEV="${BRLTTY%%,*}"
858 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
860 BRLTEXT="${BRLTTY%%,*}"
865 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
866 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
867 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
868 einfo "Starting braille-display manager."
871 sleep 2 && BLINDSOUND="yes"
878 # {{{ Interactive configuration
879 config_interactive(){
880 ewarn "config_interactive is deprecated nowadays."
881 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
887 if checkbootparam forceagp ; then
888 # Probe for AGP. Hope this can fail safely
889 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
895 config_automounter(){
896 if checkbootparam automounter ; then
897 RUNLEVEL="$(runlevel)"
899 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
904 if [ -n "$AUTOMOUNTER" ]; then
905 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
906 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
907 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
908 anew="$d -fstype=auto,$2 :$i"
909 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
910 AUTOMOUNTS="$AUTOMOUNTS $d"
911 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
913 [ -d /mnt/$d ] && mkdir -p /mnt/$d
914 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
916 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
919 AUTOMOUNTS="floppy cdrom"
920 # Add new devices to /etc/fstab and /etc/auto.mnt
921 for i in /dev/cdrom?*; do
923 addautomount "$i" "ro"
928 if [ -n "$AUTOMOUNTER" ]; then
929 # Check for floppy dir, reinstall with automounter
930 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
931 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
932 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
933 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
934 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
935 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
937 # Replace paths from bootfloppy
938 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
939 mv -f /etc/fstab.new /etc/fstab
940 # Start automounter now
941 einfo "Starting automounter for ${AUTOMOUNTS}."
942 /etc/init.d/autofs start >>$DEBUG ; eend $?
947 # {{{ Collect partitions from /proc/partitions first for enabling DMA
951 while read major minor blocks partition relax; do
952 partition="${partition##*/}"
953 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
955 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
956 sd?) ;; # SCSI Harddisk, entire disk
957 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
958 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
961 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
964 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
967 # {{{ Enable DMA for all IDE drives now if not disabled
968 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
970 if checkbootparam "nodma"; then
971 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
973 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
974 if test -d /proc/ide/$d; then
975 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
976 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
977 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
978 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
979 echo "using_dma:1" >/proc/ide/$d/settings
988 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
991 NOSWAP="yes" # we do not use swap by default!
992 if checkbootparam "swap" || checkbootparam "anyswap" ; then
994 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
997 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
998 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1000 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1001 iszsh && setopt nonomatch
1002 if [ -x /usr/sbin/rebuildfstab ] ; then
1003 config_userfstab || fstabuser=grml
1004 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1006 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1008 fi # checkbootparam nofstab/forensic
1010 # Scan for swap, config, homedir - but only in live-mode
1011 if [ -z "$INSTALLED" ] ; then
1012 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1015 HOMEDIR="$(getbootparam home)"
1016 if [ -n "$partitions" ]; then
1017 while read p m f relax; do
1018 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1019 partoptions="users,exec"
1021 # it's a swap partition?
1024 if [ -n "$NOSWAP" ]; then
1025 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1028 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1029 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1030 if [ -n "$ANYSWAP" ] ; then
1031 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1032 swapon $p 2>>$DEBUG ; eend $?
1034 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1038 if [[ "$p" == LABEL* ]] ; then
1039 p=$(blkid -t $p | awk -F: '{print $1}')
1041 if grep -q $p /proc/swaps ; then
1042 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1044 if [ -b "$p" ] ; then
1045 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1046 swapon $p 2>>$DEBUG ; eend $?
1048 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1057 esac # it's a swap partition?
1062 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1063 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1065 # *) NONEFOUND='1'; continue ;;
1069 if [ -z "$NOSWAP" ] ; then
1070 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1071 # Activate swapfile, if exists
1072 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1074 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1075 mount -o remount,rw $m && MOUNTED=1
1076 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1078 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1080 fnew="$SWAPFILE swap swap defaults 0 0"
1081 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1082 GRML_SWP="$GRML_SWP $SWAPFILE"
1085 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1088 # use a image as home
1089 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1090 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1091 if [ -n "$HOMEDIR" ]; then
1092 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1096 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1098 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1103 # Umount, if not in use
1104 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1116 if [ -n "$MOUSE_DEVICE" ] ; then
1117 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1122 # {{{ IPv6 configuration
1123 # Load IPv6 kernel module and print IP adresses
1125 if checkbootparam "ipv6"; then
1126 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1128 # we probably need some time until stateless autoconfiguration has happened
1130 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1131 for DEVICE in `echo "$NETDEVICES"`; do
1134 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1135 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1137 for ADDR in `echo "$ADDRESSES"` ; do
1140 if [ "$COUNT" -eq "0" ] ; then
1141 einfo "(none)" ; eend 1
1151 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1153 if checkbootparam "nodhcp"; then
1154 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1156 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1157 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1158 for DEVICE in `echo "$NETDEVICES"` ; do
1159 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1161 ifconfig $DEVICE up >>$DEBUG 2>&1
1162 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1167 if [ -n "$INSTALLED" ] ; then
1168 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1175 # {{{ helper functions
1178 # search all partitions for a file in the root directory
1179 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1180 # See if it's already mounted
1181 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1182 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1183 [ -f "$i/$1" ] && FOUND="$i/$1"
1184 umount -l "$i" 2>>$DEBUG
1185 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1192 case "$(file -s $1)" in
1193 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1194 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1195 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1196 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1197 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1198 *data*) echo "invalid"; return 0;;
1199 *) echo "auto"; return 0;;
1203 # Try to mount this filesystem read-only, without or with encryption
1205 # Check if already mounted
1206 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1207 # Apparently, mount-aes DOES autodetect AES loopback files.
1208 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1209 # We need to mount crypto-loop files with initial rw support
1210 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1212 [ "$RC" = "0" ] && return 0
1214 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1216 while [ "$a" != "n" -a "$a" != "N" ]; do
1217 # We need to mount crypto-loop files with initial rw support
1218 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1219 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1220 # Problem with ioctl() from getpasswd()?
1230 if checkbootparam "nocpu"; then
1231 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1233 # check module dependencies
1235 if [ -e /lib64 ] ; then
1236 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1238 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1242 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1243 einfo "Detecting CPU:"
1244 CPU=$(awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG)
1245 echo $CPU | sed 's/ \{1,\}/ /g'
1248 einfo "Detecting CPU: `awk -F: '/^processor/{printf " Processor"$2" is"};/^model name/{printf $2};/^vendor_id/{printf vendor};/^cpu MHz/{printf " %dMHz",int($2)};/^cache size/{printf ","$2" Cache"};/^$/{print ""}' /proc/cpuinfo 2>>$DEBUG` " ; eend 0
1251 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1252 # * it only if we have the according kernel modules available
1253 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1254 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1255 # -> parse output of the initscript and output it according to our look'n'feel
1256 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1257 if ! cpufreq_check ; then
1258 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1260 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1261 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1262 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1263 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1264 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1268 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1270 if [ -x /etc/init.d/loadcpufreq ] ; then
1271 SKIP_CPU_GOVERNOR=''
1272 LOADCPUFREQ=$(mktemp)
1273 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1274 if grep -q FATAL "$LOADCPUFREQ" ; then
1280 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1281 eerror "$line" ; eend $RC
1285 elif grep -q done "$LOADCPUFREQ" ; then
1286 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1287 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1288 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1290 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1294 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1295 . /usr/bin/cpufreq-detect.sh
1296 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1297 einfo "Loading modules ${MODULE}"
1298 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1300 if [[ $RC == 0 ]]; then
1307 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1311 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1312 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1313 if modprobe cpufreq_ondemand ; RC=$? ; then
1314 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1315 echo ondemand > $file
1325 fi # checkbootparam nocpu
1329 # {{{ autostart of ssh
1331 if checkbootparam ssh ; then
1332 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1333 einfo "Bootoption passwd found."
1334 if [ -n "$SSH_PASSWD" ] ; then
1335 echo "grml:$SSH_PASSWD" | chpasswd -m
1336 einfo "Starting secure shell server in background."
1337 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1338 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1341 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1344 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1350 # {{{ set password for user grml
1352 if checkbootparam passwd >>$DEBUG 2>&1; then
1353 einfo "Bootoption passwd found."
1354 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1355 if [ -n "$PASSWD" ] ; then
1356 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1358 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1361 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1367 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1369 if checkbootparam home ; then
1370 HOMEDIR="$(getbootparam home)"
1374 if [ -n "$HOMEDIR" ]; then
1375 einfo "Bootoption home detected." && eend 0
1378 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1379 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1380 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1381 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1384 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1385 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1386 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1387 MYHOMEDIR="$HOMEDIR"
1389 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1390 MYHOMEDIR="$(findfile grml.img)"
1391 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1392 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1393 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1396 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1397 eerror "Option ignored." ; eend 1
1402 if [ -n "$MYHOMEDIR" ]; then
1403 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1404 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1405 while read device mountpoint fs relax; do
1406 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1409 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1413 # Note: This currently won't work with encrypted partitions
1414 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1415 if [ ! -f "$MYHOMEDIR" ]; then
1416 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1417 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1422 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1423 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1424 if [ -f "$MYHOMEDIR" ]; then
1425 # It's a loopback file, mount it over the /home/grml directory
1426 trymount "$MYHOMEDIR" /home/grml
1428 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1432 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1436 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1438 fi # mount -o remount,rw,...
1441 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1445 fi # if trymount ...
1447 fi # checkbootparam home
1451 # {{{ Check for scripts on CD-ROM
1452 config_cdrom_scripts(){
1453 if checkbootparam "script"; then
1454 for script in /cdrom/scripts/* ; do
1455 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1464 if ! [ -x /usr/bin/aumix ] ; then
1465 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1468 if ! [ -r /proc/asound/cards ] ; then
1469 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1473 if checkbootparam vol ; then
1474 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1475 if [ -z "$VOL" ] ; then
1476 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1483 if checkbootparam nosound ; then
1484 einfo "Muting sound devices on request."
1485 # some IBM notebooks require the following stuff:
1486 if [ -x /usr/bin/amixer ] ; then
1487 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1488 amixer set Front unmute 1>/dev/null
1489 amixer set Front 0% 1>/dev/null
1492 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1493 if [ -n "$ERROR" ] ; then
1495 eerror "Problem muting sound devices: $ERROR"
1499 elif [ -z "$INSTALLED" ]; then
1500 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1501 # some IBM notebooks require the following stuff:
1502 if [ -x /usr/bin/amixer ] ; then
1503 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1504 amixer set Front unmute 1>/dev/null
1505 amixer set Front ${VOL}% 1>/dev/null
1508 # by default assume '0' as volume for microphone:
1509 if checkbootparam micvol ; then
1510 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1515 # finally set the volumes:
1516 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1517 if [ -n "$ERROR" ] ; then
1519 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1529 # {{{ modem detection
1531 if checkbootparam "nomodem"; then
1532 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1534 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1535 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1536 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1544 # {{{ keyboard add-ons
1545 config_setkeycodes(){
1546 if checkbootparam "setkeycodes" ; then
1547 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1548 # MS MM keyboard add-on
1550 setkeycodes e001 126 &>/dev/null
1551 setkeycodes e059 127 &>/dev/null
1553 setkeycodes e03b 59 &>/dev/null
1554 setkeycodes e008 60 &>/dev/null
1555 setkeycodes e007 61 &>/dev/null
1556 setkeycodes e03e 62 &>/dev/null
1557 setkeycodes e03f 63 &>/dev/null
1558 setkeycodes e040 64 &>/dev/null
1559 setkeycodes e041 65 &>/dev/null
1560 setkeycodes e042 66 &>/dev/null
1561 setkeycodes e043 67 &>/dev/null
1562 setkeycodes e023 68 &>/dev/null
1563 setkeycodes e057 87 &>/dev/null
1564 setkeycodes e058 88 &>/dev/null
1566 setkeycodes e00a 89 e008 90 &>/dev/null
1573 config_wondershaper(){
1574 if checkbootparam "wondershaper" ; then
1575 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1580 if [ -n "$WONDER" ]; then
1582 DEVICE="${WONDER%%,*}"
1584 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1586 DOWNSTREAM="${WONDER%%,*}"
1588 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1590 UPSTREAM="${WONDER%%,*}"
1595 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1596 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1597 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1598 einfo "Starting wondershaper (${CMD}) in background."
1599 ( sh -c $CMD & ) && eend 0
1606 if checkbootparam "nosyslog"; then
1607 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1609 einfo "Starting syslog-ng in background."
1610 /etc/init.d/syslog-ng start 1>>$DEBUG &
1618 if checkbootparam "nogpm"; then
1619 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1621 einfo "Starting gpm in background."
1622 # /etc/init.d/gpm start 1>>$DEBUG &
1623 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1631 if checkbootparam "services" ; then
1632 SERVICE="$(getbootparam services 2>>$DEBUG)"
1633 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1634 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1635 einfo "Starting service(s) ${SERVICENL} in background."
1636 for service in $(echo -e $SERVICELIST) ; do
1637 /etc/init.d/${service} start 1>>$DEBUG &
1639 [ "$?" == "0" ] ; eend $?
1646 if checkbootparam netconfig ; then
1647 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1648 CONFIGFILE='/tmp/netconfig.grml'
1651 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1652 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1654 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1656 while ! getconfig && [[ "$counter" != 0 ]] ; do
1657 echo -n "Sleeping for 5 seconds and trying to get config again... "
1658 counter=$(( counter-1 ))
1659 echo "$counter tries left" ; sleep 1
1661 if [ -r "$CONFIGFILE" ] ; then
1662 einfo "Downloading was successfull." ; eend 0
1663 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1664 md5sum $CONFIGFILE ; eend 0
1665 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1667 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1674 config_blindsound(){
1675 if checkbootparam "blind" ; then
1677 flite -o play -t "welcome to the gremel system"
1684 if checkbootparam welcome ; then
1685 flite -o play -t "welcome to the gremel system"
1690 # {{{ fix/workaround for unionfs
1692 if [ -z "$INSTALLED" ]; then
1693 touch /var/cache/apt/*cache.bin
1698 # {{{ create all /mnt-directories
1700 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1701 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1705 # {{{ start X window system via grml-x
1707 if checkbootparam startx ; then
1708 if [ -x /usr/X11R6/bin/X ] ; then
1709 if [ -z "$INSTALLED" ] ; then
1710 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1711 if [ -z "$WINDOWMANAGER" ] ; then
1712 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1713 WINDOWMANAGER="wm-ng"
1715 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1717 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1718 config_userfstab || fstabuser='grml'
1719 cat>|/etc/init.d/xstartup<<EOF
1721 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1722 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1724 chmod 755 /etc/init.d/xstartup
1726 # adjust inittab for xstartup
1727 if grep -q '^6:' /etc/inittab ; then
1728 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1729 else # just append tty6 to inittab if no definition is present:
1730 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1733 /sbin/telinit q ; eend $?
1735 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1736 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1738 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1742 eerror "We are not running from CD - startx will not work, skipping it.
1743 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1746 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1747 Boot parameter startx does not work therefore." ; eend 1
1753 # {{{ configuration framework
1755 if checkbootparam extract ; then
1756 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1757 EXTRACTOPTIONS="-- -x $EXTRACT"
1762 if checkbootparam noautoconfig || checkbootparam forensic ; then
1763 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1765 if [ -z "$INSTALLED" ] ; then
1766 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1768 [ -d /mnt/grml ] || mkdir /mnt/grml
1769 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1770 # We do need the following fix so floppy disk is available to blkid in any case :-/
1771 if [ -r /dev/fd0 ] ; then
1772 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1773 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1774 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1775 blkid /dev/fd0 1>>$DEBUG 2>&1
1778 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1779 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1780 if [[ $RC == 0 ]]; then
1781 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1784 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1785 if [ -n "$CONFIG" ]; then
1786 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1788 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1790 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1794 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1795 if [ -n "$SCRIPT" ]; then
1796 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1799 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1801 ewarn "No devices with label GRMLCFG found." ; eend 0
1810 if checkbootparam "config" ; then
1811 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1812 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1813 einfo "Bootoption config found. config is set to: $CONFIG"
1815 einfo "Trying to extract configuration file ${CONFIG}:"
1816 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1820 if checkbootparam myconfig ; then
1821 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1822 if [ -n "$MOUNTDEVICE" ]; then
1823 if checkbootparam file ; then
1824 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1825 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1827 [ -d /mnt/grml ] || mkdir /mnt/grml
1828 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1829 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1830 if [[ $RC == 0 ]]; then
1831 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1834 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1835 if [ -n "$CONFIG" ]; then
1836 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1838 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1840 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1844 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1845 if [ -n "$SCRIPT" ]; then
1846 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1851 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1852 fi # mount $MOUNTDEVICE
1853 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1855 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1856 fi # [ -n "$MOUNTDEVICE" ]
1857 fi # checkbootparam myconfig
1859 if checkbootparam "partconf" ; then
1860 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1861 if [ -n "$MOUNTDEVICE" ]; then
1862 [ -d /mnt/grml ] || mkdir /mnt/grml
1863 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1864 if [[ $RC == 0 ]]; then
1865 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1866 einfo "Copying files from $MOUNTDEVICE over grml system."
1867 for file in `cat /etc/grml/partconf` ; do
1868 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1869 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1872 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1873 fi # mount $MOUNTDEVICE
1874 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1876 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1877 fi # [ -n "$MOUNTDEVICE" ]
1882 # {{{ /cdrom/.*-options
1884 if checkbootparam "debs" ; then
1885 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1886 einfo "Tring to install debian package(s) ${DEBS}"
1887 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1892 if checkbootparam "scripts" ; then
1893 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1894 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1895 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1896 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1903 if checkbootparam "distcc" ; then
1904 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1905 if [ -n "$OPTIONS" ]; then
1908 if [ -n "$OPTIONS" ]; then
1909 NET="${OPTIONS%%,*}"
1911 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1913 INTERFACE="${OPTIONS%%,*}"
1918 CONFIG=/etc/default/distcc
1919 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1920 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1922 if [ -n "$INTERFACE" ] ; then
1923 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1926 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1927 counter=$(( counter-1 ))
1928 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1930 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1934 if [ -n "$IP" ] ; then
1935 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1937 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1939 id distccd >/dev/null 2>&1 || \
1941 einfo "Creating distcc user" ; \
1942 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1945 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1946 /etc/init.d/distcc start 1>/dev/null ; eend $?
1949 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1953 if checkbootparam "gcc"; then
1954 GCC="$(getbootparam gcc 2>>$DEBUG)"
1956 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1959 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1962 if checkbootparam "gpp"; then
1963 GPP="$(getbootparam gpp 2>>$DEBUG)"
1965 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1966 if [ -x /usr/bin/g++-${GPP} ] ; then
1968 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1970 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1971 if [ -x /usr/bin/cpp-${GPP} ] ; then
1973 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1982 # Notice: use it only on live-cd system, if running from harddisk please
1983 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1984 # in /etc/runlevel.conf
1986 MODULES_FILE=/etc/grml/modules
1987 if checkbootparam nomodules ; then
1988 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1989 elif [ -z "$INSTALLED" ]; then
1990 if [ -r $MODULES_FILE ] ; then
1991 einfo "Loading modules specified in ${MODULES_FILE}:"
1993 grep '^[^#]' $MODULES_FILE | \
1994 while read module args; do
1995 [ "$module" ] || continue
1997 modprobe $module $args ; eend $?
2001 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2008 config_915resolution(){
2009 if checkbootparam "915resolution" ; then
2010 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2011 if [ -x /usr/sbin/915resolution ]; then
2016 if [ -n "$OPTIONS" ]; then
2018 MODE="${OPTIONS%%,*}"
2020 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2022 XRESO="${OPTIONS%%,*}"
2024 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2026 YRESO="${OPTIONS%%,*}"
2031 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2032 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2041 if [ -z "$INSTALLED" ] ; then
2042 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2043 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2044 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2045 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2047 if ! [ -x /sbin/mdadm ] ; then
2048 eerror "mdadm not available, can not execute it." ; eend 1
2051 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2052 # find out whether we have a valid configuration file already
2053 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2054 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2055 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2056 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2058 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2061 if ! checkbootparam 'swraid' ; then
2063 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2066 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2071 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2073 *'No arrays found'*)
2074 ewarn "$line" ; eend 0
2077 einfo "$line" ; eend 0
2084 if [ -r /proc/mdstat ] ; then
2086 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2087 if [ -z "$MDSTAT" ] ; then
2088 ewarn "No active arrays found" ; eend 0
2093 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2094 einfo "active arrays: $line" ; eend 0
2100 fi # bootoption swraid
2102 fi # is /sbin/mdadm executable?
2103 fi # check for bootoptions
2104 fi # run only in live-cd mode
2108 # {{{ LVM (Logical Volumes)
2110 if [ -z "$INSTALLED" ] ; then
2111 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2112 if checkbootparam 'nolvm' ; then
2113 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2115 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2116 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2117 eerror "LVM not available, can not execute it." ; eend 1
2119 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2120 einfo "You seem to have logical volumes (LVM) on your system."
2122 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2124 if checkbootparam 'lvm' ; then
2125 einfo "Bootoption LVM found. Searching for logical volumes:"
2126 /etc/init.d/lvm2 start ; eend $?
2130 fi # check for lvm binary
2131 fi # check for bootoption nolvm
2132 fi # run only in live-cd mode
2136 # {{{ debnet: setup network based on an existing one found on a partition
2138 if checkbootparam "debnet" ; then
2139 iszsh && setopt shwordsplit
2140 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2141 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2144 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2146 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2147 for i in $DEVICES; do
2148 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2149 einfo "Scanning on $i"
2150 if [ -f /mnt/etc/network/interfaces ]; then
2151 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2159 if [ -n "$FOUND_DEBNET" ]; then
2160 einfo "Stopping network."
2161 pump -k 1>/dev/null 2>&1
2162 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2163 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2164 rm -rf /etc/network/run
2165 cp -a /mnt/etc/network /etc
2166 rm -rf /etc/network/run
2167 mkdir /etc/network/run
2168 umount /mnt ; eend $?
2169 einfo "Starting network."
2170 /etc/init.d/networking start ; eend $?
2172 eerror "/etc/network/interfaces not found." ; eend 1
2176 eerror "Error: /mnt already mounted." ; eend 1
2182 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2184 if grep -q ipw3945 /proc/modules ; then
2185 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2186 ewarn "Broken ipw3945 network interface found, reloading module."
2195 # {{{ disable console blanking
2197 if checkbootparam "noblank" ; then
2198 einfo "Bootoption noblank found. Disabling monitor blanking."
2199 setterm -blank 0 ; eend $?
2204 # {{{ grml2hd: automatic installation
2207 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2209 if checkbootparam "user" ; then
2211 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2212 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2215 if checkbootparam "filesystem" ; then
2217 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2218 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2221 if checkbootparam "partition" ; then
2223 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2224 # notice: the following checks whether the given partition is available, if not the skip
2225 # execution of grml2hd as it might result in data loss...
2226 if [ -r $PARTITION ] ; then
2227 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2229 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2233 if checkbootparam "mbr" ; then
2235 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2236 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2239 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2241 GRML2HD_NONINTERACTIVE='yes' grml2hd
2244 chmod 755 /usr/bin/grml2hd_noninteractive
2245 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2246 if [ -z "$GRML2HD_FAIL" ] ; then
2247 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2249 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2252 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2256 # {{{ debootstrap: automatic installation
2257 config_debootstrap(){
2259 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2261 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2263 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2265 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2270 if checkbootparam "target" ; then
2272 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2273 # notice: the following checks whether the given partition is available, if not the skip
2274 # execution of grml-debootstrap as it might result in data loss...
2275 if ! [ -r "$TARGET" ] ; then
2276 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2280 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2285 if checkbootparam "grub" ; then
2287 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2290 if checkbootparam "groot" ; then
2292 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2295 if checkbootparam "release" ; then
2297 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2300 if checkbootparam "mirror" ; then
2302 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2305 if checkbootparam "boot_append" ; then
2307 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2310 if checkbootparam "password" ; then
2312 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2315 # now check which options are available
2316 if [ -n "TARGET" ] ; then
2317 TARGETCMD="--target $TARGET"
2321 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2325 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2326 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2327 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2328 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2329 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2330 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2332 # and finally write script and execute it
2333 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2335 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2338 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2340 screen /usr/bin/grml-debootstrap_noninteractive
2341 einfo "Invoking a shell, just exit to continue booting..."
2344 fi # stringinstring "BOOT_IMAGE=debian2hd
2348 # {{{ Support customization
2350 if checkbootparam "distri"; then
2351 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2352 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2353 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2354 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2355 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2356 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2362 ### {{{ backwards compatible stuff
2363 config_environment(){
2364 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2367 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2371 ## END OF FILE #################################################################
2372 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3