2 # Filename: autoconfig.functions
3 # Purpose: basic system configuration and hardware setup for grml system
4 # Authors: grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports: see http://grml.org/bugs/
6 # License: This file is licensed under the GPL v2.
7 # Latest change: Don Nov 15 22:01:50 CET 2007 [mika]
8 ################################################################################
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
21 if [ -n "$ZSH_VERSION" ] ; then
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
31 ### {{{ Utility Functions
35 case "$(cat $2)" in *$1*) return 0;; esac
41 case "$2" in *$1*) return 0;; esac
45 # Reread boot command line; echo last parameter's argument or return false.
47 stringinstring " $1=" "$CMDLINE" || return 1
48 result="${CMDLINE##*$1=}"
49 result="${result%%[ ]*}"
54 # Check boot commandline for specified option
56 stringinstring " $1" "$CMDLINE"
61 if [ "$1" = "yes" ] ; then
69 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
73 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 # {{{ filesystems (proc, pts, sys) and fixes
79 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
83 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
87 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
97 # {{{ Check if we are running from the grml-CD or HD
99 [ -e /etc/grml_cd ] || INSTALLED="yes"
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
109 . /etc/grml/lsb-functions
110 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
112 . /etc/grml/lsb-functions
119 if checkbootparam "debug"; then
122 if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
126 if [ -n "$BOOTDEBUG" ]; then
127 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
129 if [ -r /etc/grml/screenrc ] ; then
130 einfo "Starting GNU screen to be able to use a full featured shell environment."
131 einfo "Just exit the shells (and therefore screen) to continue boot process..."
132 /bin/zsh -c "screen -c /etc/grml/screenrc"
134 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135 einfo "Just exit the shell to continue boot process..."
146 if checkbootparam "log"; then
147 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
149 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
151 einfo "Starting bootlogd."
152 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
160 # {{{ set firmware timeout via bootparam
162 if checkbootparam fwtimeout ; then
163 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
164 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
165 rmmod firmware_class 1>>$DEBUG 2>&1
166 modprobe firmware_class ; eend $?
168 if [ -z "$TIMEOUT" ] ; then
169 TIMEOUT="100" # linux kernel default: 10
171 if [ -f /sys/class/firmware/timeout ] ; then
172 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
173 echo 100 > /sys/class/firmware/timeout ; eend $?
178 ### {{{ language configuration / localization
181 einfo "Activating language settings:"
184 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
185 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
187 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
189 # check for bootoption which overrides config from /etc/grml/autoconfig:
190 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
191 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
193 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
194 if [ -z "$INSTALLED" ] ; then
195 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
198 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
199 if [ -n "$BOOT_LANGUAGE" ] ; then
200 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
204 if [ -z "$CONSOLEFONT" ] ; then
205 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
206 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
207 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
208 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
209 CONSOLEFONT='Uni3-Terminus16'
211 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
216 # export it now, so error messages get translated, too
217 if checkgrmlsmall ; then
218 export LANG='C' # grml-small does not provide any further locales
220 [ -r /etc/default/locale ] && . /etc/default/locale
224 # configure keyboard layout, read in already set values first:
225 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
227 # now allow keyboard override by boot commandline for later use:
228 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
229 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
230 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
231 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
232 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
234 # modify /etc/sysconfig/keyboard only in live-cd mode:
235 if [ -z "$INSTALLED" ] ; then
237 local LANGUAGE="$BOOT_LANGUAGE"
238 . /etc/grml/language-functions
239 # allow setting xkeyboard explicitly different than console keyboard
240 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
241 if [ -n "$KXKEYBOARD" ]; then
242 XKEYBOARD="$KXKEYBOARD"
243 KDEKEYBOARD="$KXKEYBOARD"
244 elif [ -n "$KKEYBOARD" ]; then
245 XKEYBOARD="$KKEYBOARD"
246 KDEKEYBOARD="$KKEYBOARD"
249 # duplicate of previous code to make sure /etc/grml/language-functions
250 # does not overwrite our values....
251 # now allow keyboard override by boot commandline for later use:
252 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
253 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
254 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
255 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
256 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
258 # write keyboard related variables to file for later use
259 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
260 if ! [ -e /etc/sysconfig/keyboard ] ; then
261 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
262 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
263 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
264 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
268 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
270 # activate unicode console if running within utf8 environment
271 if [ -r /etc/default/locale ] ; then
272 if grep -q "LANG=.*UTF" /etc/default/locale ; then
273 einfo "Setting up unicode environment."
274 unicode_start 2>>$DEBUG ; eend $?
278 # Set default keyboard before interactive setup
279 if [ -n "$KEYTABLE" ] ; then
280 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281 loadkeys -q $KEYTABLE &
285 # we have to set up all consoles, therefore loop it over all ttys:
286 NUM_CONSOLES=`fgconsole --next-available`
287 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
288 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
290 if [ -n "$CHARMAP" ] ; then
291 einfo "Running consolechars for ${CHARMAP}"
292 for vc in `seq 0 ${NUM_CONSOLES}` ; do
293 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
298 if checkbootparam noconsolefont ; then
299 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
301 if [ -n "$CONSOLEFONT" ] ; then
302 einfo "Running consolechars using ${CONSOLEFONT}"
303 for vc in `seq 0 ${NUM_CONSOLES}` ; do
304 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
316 if checkbootparam hostname ; then
317 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
318 einfo "Setting hostname to $HOSTNAME as requested."
319 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
320 hostname $HOSTNAME ; eend $?
322 hostname --file /etc/hostname
327 # fstabuser (needed when running from harddisk with username != grml {{{
329 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
330 if [ -n "$CONFIG_FSTAB_USER" ] ; then
331 fstabuser="$CONFIG_FSTAB_USER"
333 fstabuser=$(getent passwd 1000 | cut -d: -f1)
335 # if not yet set fall back to default 'grml' user
336 [ -n "$fstabuser" ] || fstabuser='grml'
340 # {{{ Set clock (Local time is more often used than GMT, so it is default)
342 # don't touch the files if running from harddisk:
343 if [ -z "$INSTALLED" ]; then
345 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
346 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
347 # hwclock uses the TZ variable
348 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
349 [ -n "$TZ" ] || TZ=Europe/Vienna
351 if ! [ -r /dev/rtc ] ; then
352 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
354 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
355 if [ -n "$ERROR" ] ; then
357 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
358 if [ -n "$ERROR" ] ; then
359 eerror "Problem running hwclock: $ERROR" ; eend 1
368 # {{{ print kernel info
370 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
371 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
372 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
373 if [ -r /proc/cpuinfo ] ; then
374 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
376 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
380 if [ -d /proc/xen ] ; then
382 einfo 'Running kernel featuring support for Xen detected' ; eend 0
388 # {{{ vmware specific stuff
390 if checkbootparam novmware ; then
391 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
393 if [ -z "$INSTALLED" ] ; then
394 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
395 if ! checkbootparam qemu ; then
396 if [ -r /etc/X11/xorg.conf.vmware ] ; then
397 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
398 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
407 # {{{ qemu specific stuff
409 if checkbootparam qemu ; then
410 if [ -r /etc/X11/xorg.conf.example ] ; then
411 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
412 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
418 # {{{ ld.so.cache + depmod
420 if [ -n "$INSTALLED" ]; then
421 if ! [ -r /etc/grml.first.boot ] ; then
422 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
424 # Regenerate ld.so.cache and module dependencies on HD
425 einfo "Running ldconfig" ; ldconfig ; eend $?
426 einfo "Running depmod" ; depmod -a ; eend $?
427 touch /etc/grml.first.boot
435 # update_progress {{{
437 # be sure we are non-blocking
438 (echo "$1" > /etc/sysconfig/progress) &
444 # don't touch the files if running from harddisk:
445 if [ -z "$INSTALLED" ]; then
446 KTZ="$(getbootparam tz 2>>$DEBUG)"
447 if [ -n "$KTZ" ] ; then
448 einfo "Setting timezone."
449 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
451 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
457 # small computer / nearly no ram {{{
460 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
461 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
464 if checkbootparam "small"; then
465 einfo "Information: ${RAM} kB of RAM available." ; eend 0
466 einfo "Bootoption small detected. Activating small system."
467 if [ -r /etc/inittab.small ] ; then
468 mv /etc/inittab /etc/inittab.normal
469 mv /etc/inittab.small /etc/inittab
471 sed -i 's/^9/#&/' /etc/inittab
472 sed -i 's/^10/#&/' /etc/inittab
473 sed -i 's/^11/#&/' /etc/inittab
474 sed -i 's/^12/#&/' /etc/inittab
476 /sbin/telinit q ; eend $?
478 if checkgrmlsmall ; then
479 if [[ $RAM -lt 25000 ]] ; then
480 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
481 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
482 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
483 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
486 einfo "Information: ${RAM} kB of RAM available." ; eend 0
489 if [[ $RAM -lt 58000 ]] ; then
490 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
491 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
492 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
493 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
496 einfo "Information: ${RAM} kB of RAM available." ; eend 0
504 # skip startup of w3m {{{
506 if checkbootparam "fast"; then
507 ewarn "Bootoption fast detected. Skipping startup of w3m."
508 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
509 /sbin/telinit q ; eend $?
514 # activate serial console {{{
516 if checkbootparam "console"; then
517 einfo "Bootoption (for serial) console detected."
519 if [ -r /etc/mgetty/mgetty.config ] ; then
520 MODE=$(getbootparam console | awk -F, '{print $2}')
522 [ -n "$MODE" ] || MODE=9600 # default mode
523 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
524 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
527 einfo "Activating mgetty."
528 sed -i 's/^#T0/T0/' /etc/inittab
529 sed -i 's/^#T1/T1/' /etc/inittab
530 /sbin/telinit q ; eend $?
536 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
539 for DEVICE in /proc/ide/hd?; do
540 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
542 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
546 # {{{ Bring up loopback interface now
548 if [ -z "$INSTALLED" ] ; then
549 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
550 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
558 # firewire devices {{{
559 # the raw1394 driver does not yet export info into SYSFS,
560 # so let's create raw1394 device manually
561 # http://www.michael-prokop.at/blog/index.php?p=352
562 config_firewire_dev(){
563 if checkbootparam "nofirewiredev" ; then
564 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
566 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
567 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
568 # cd /dev && MAKEDEV video1394 raw1394
569 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
570 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
571 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
572 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
573 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
574 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
580 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
581 # otherwise we will get: passwd: Authentication token lock busy
583 if [ -z "$INSTALLED" ] ; then
591 if [ -n "$TESTCD" ]; then
592 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
593 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
596 # /linuxrc grml version:
597 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
598 # live-initramfs version:
599 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
601 if [ -n "$TESTCD_PATH" ] ; then
602 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
604 echo "${RED} *** Error: Could not find md5sum file. ***"
607 if [ "$RC" = "0" ]; then
608 einfo "Everything looks OK" ; eend 0
610 eerror 'Checksum failed for theses files:' ; eend 1
611 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
612 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
613 eerror '... RAM of your computer is broken.' ; eend 1
614 einfon "Hit return to continue, or press the reset button to quit."
623 # {{{ hardware detection via discover
625 if checkbootparam "nodisc" ; then
626 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
628 if [ -x /sbin/discover ] ; then
629 einfo "Discovering hardware. Trying to load the following modules in background:"
631 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)"
633 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
636 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
642 # {{{ hardware detection via hwinfo
644 if checkbootparam hwinfo >>$DEBUG 2>&1; then
645 einfo "Discovering hardware via hwinfo:"
646 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
647 echo -n " Loading modules: "
648 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
654 # {{{ disable hotplug agents on request
655 config_hotplug_agent(){
656 if checkbootparam "noagent" ; then
657 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
658 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
659 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
660 einfo "Disabling hotplug-agent(s) $AGENTNL"
661 for agent in $(echo -e $AGENTLIST) ; do
662 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
664 [ "$?" == "0" ] ; eend $?
669 # {{{ blacklist of hotplug-modules
670 config_hotplug_blacklist(){
671 if checkbootparam "black" ; then
672 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
673 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
674 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
675 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
676 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
677 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
685 if checkbootparam "nohotplug" ; then
686 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
688 if [ -r /etc/init.d/hotplug ] ; then
689 einfo "Starting hotplug system in background."
690 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
692 elif [ -r /etc/init.d/hotplug-light ] ; then
693 einfo "Starting hotplug-light system in background."
694 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
697 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
703 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
705 if checkbootparam "blacklist" ; then
706 if [ -z "$INSTALLED" ]; then
707 einfo "Bootoption blacklist found."
708 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
709 if [ -n "$BLACK" ] ; then
710 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
711 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
712 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
713 echo "alias $BLACK off" >> /etc/modprobe.d/grml
714 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
716 eerror "No given module for blacklist found. Blacklisting will not work therefore."
719 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
721 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
730 if [ -d /proc/acpi ]; then
731 if checkbootparam "noacpi"; then
732 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
733 elif checkbootparam "nogrmlacpi" ; then
734 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
736 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
739 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
741 basename="${basename%%.*}"
742 case "$basename" in *_acpi)
743 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
745 modprobe $basename >>$DEBUG 2>&1 && found="yes"
746 local BASE="$BASE $basename"
748 if [ -n "$found" ] ; then
749 einfo "$BASE" ; eend 0
751 ewarn "(none)" ; eend 1
753 if ! ps x | grep -q /usr/sbin/acpid ; then
754 if ! [ -r /var/run/dbus/pid ] ; then
755 einfo "Starting acpi daemon."
756 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
758 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
759 eerror "Solution: please activate acpid via /etc/runlevel.conf"
763 ewarn "acpi daemon already running."
770 if checkbootparam "noapm"; then
771 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
773 modprobe apm power_off=1 >>$DEBUG 2>&1
774 if [ "$?" = "0" ] ; then
775 if [ -x /etc/init.d/apmd ] ;then
776 einfo "APM Bios found, enabling power management functions."
777 /etc/init.d/apmd start ; eend $?
780 eerror "Loading apm module failed." ; eend 1
787 # {{{ PCMCIA Check/Setup
788 # This needs to be done before other modules are being loaded (by hwsetup)
790 if checkbootparam "nopcmcia"; then
791 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
793 if /usr/sbin/laptop-detect ; then
794 einfo "Detected Laptop - checking for PCMCIA." && eend 0
795 modprobe pcmcia_core >>$DEBUG 2>&1
796 # Try Cardbus or normal PCMCIA socket drivers
797 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
798 if [ "$?" = "0" ]; then
799 modprobe ds >>$DEBUG 2>&1
800 if [ -d /proc/bus/pccard ] ; then
801 if [ -x /sbin/cardmgr ] ; then
802 einfo "PCMCIA found, starting cardmgr."
803 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
805 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
814 # {{{ run software synthesizer via speakup
816 if checkbootparam swspeak ; then
817 if [ -d /proc/speakup/ ] ; then
818 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
820 if [ -x /etc/init.d/speech-dispatcher ] ; then
821 einfo "Starting speech-dispatcher."
822 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
823 einfo "Activating sftsyn in Kernel."
824 echo sftsyn >/proc/speakup/synth_name ; eend $?
825 einfo "Just run swspeak if you want to use software synthesizer via speakup."
826 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
828 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
829 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
833 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
834 flite -o play -t "Kernel does not seem to support speakup. Sorry."
840 # {{{ Check for blind option or brltty
843 checkbootparam "blind" && BLIND="yes"
844 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
846 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
847 if [ -x /sbin/brltty ]; then
848 # Blind option detected, start brltty now.
849 # modprobe serial_core parport_serial generic_serial && echo "done"
854 if [ -n "$BRLTTY" ]; then
856 BRLTYPE="${BRLTTY%%,*}"
858 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
860 BRLDEV="${BRLTTY%%,*}"
862 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
864 BRLTEXT="${BRLTTY%%,*}"
869 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
870 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
871 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
872 einfo "Starting braille-display manager."
875 sleep 2 && BLINDSOUND="yes"
882 # {{{ Interactive configuration
883 config_interactive(){
884 ewarn "config_interactive is deprecated nowadays."
885 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
891 if checkbootparam forceagp ; then
892 # Probe for AGP. Hope this can fail safely
893 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
899 config_automounter(){
900 if checkbootparam automounter ; then
901 RUNLEVEL="$(runlevel)"
903 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
908 if [ -n "$AUTOMOUNTER" ]; then
909 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
910 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
911 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
912 anew="$d -fstype=auto,$2 :$i"
913 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
914 AUTOMOUNTS="$AUTOMOUNTS $d"
915 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
917 [ -d /mnt/$d ] && mkdir -p /mnt/$d
918 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
920 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
923 AUTOMOUNTS="floppy cdrom"
924 # Add new devices to /etc/fstab and /etc/auto.mnt
925 for i in /dev/cdrom?*; do
927 addautomount "$i" "ro"
932 if [ -n "$AUTOMOUNTER" ]; then
933 # Check for floppy dir, reinstall with automounter
934 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
935 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
936 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
937 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
938 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
939 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
941 # Replace paths from bootfloppy
942 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
943 mv -f /etc/fstab.new /etc/fstab
944 # Start automounter now
945 einfo "Starting automounter for ${AUTOMOUNTS}."
946 /etc/init.d/autofs start >>$DEBUG ; eend $?
951 # {{{ Collect partitions from /proc/partitions first for enabling DMA
955 while read major minor blocks partition relax; do
956 partition="${partition##*/}"
957 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
959 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
960 sd?) ;; # SCSI Harddisk, entire disk
961 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
962 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
965 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
968 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
971 # {{{ Enable DMA for all IDE drives now if not disabled
972 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
974 if checkbootparam "nodma"; then
975 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
977 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
978 if test -d /proc/ide/$d; then
979 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
980 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
981 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
982 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
983 echo "using_dma:1" >/proc/ide/$d/settings
992 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
995 NOSWAP="yes" # we do not use swap by default!
996 if checkbootparam "swap" || checkbootparam "anyswap" ; then
998 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1001 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1002 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1004 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1005 iszsh && setopt nonomatch
1006 if [ -x /usr/sbin/rebuildfstab ] ; then
1007 config_userfstab || fstabuser=grml
1008 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1010 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1012 fi # checkbootparam nofstab/forensic
1014 # Scan for swap, config, homedir - but only in live-mode
1015 if [ -z "$INSTALLED" ] ; then
1016 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1019 HOMEDIR="$(getbootparam home)"
1020 if [ -n "$partitions" ]; then
1021 while read p m f relax; do
1022 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1023 partoptions="users,exec"
1025 # it's a swap partition?
1028 if [ -n "$NOSWAP" ]; then
1029 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1032 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1033 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1034 if [ -n "$ANYSWAP" ] ; then
1035 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1036 swapon $p 2>>$DEBUG ; eend $?
1038 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1042 if [[ "$p" == LABEL* ]] ; then
1043 p=$(blkid -t $p | awk -F: '{print $1}')
1045 if grep -q $p /proc/swaps ; then
1046 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1048 if [ -b "$p" ] ; then
1049 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1050 swapon $p 2>>$DEBUG ; eend $?
1052 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1061 esac # it's a swap partition?
1066 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1067 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1069 # *) NONEFOUND='1'; continue ;;
1073 if [ -z "$NOSWAP" ] ; then
1074 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1075 # Activate swapfile, if exists
1076 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1078 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1079 mount -o remount,rw $m && MOUNTED=1
1080 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1082 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1084 fnew="$SWAPFILE swap swap defaults 0 0"
1085 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1086 GRML_SWP="$GRML_SWP $SWAPFILE"
1089 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1092 # use a image as home
1093 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1094 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1095 if [ -n "$HOMEDIR" ]; then
1096 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1100 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1102 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1107 # Umount, if not in use
1108 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1120 if [ -n "$MOUSE_DEVICE" ] ; then
1121 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1126 # {{{ IPv6 configuration
1127 # Load IPv6 kernel module and print IP adresses
1129 if checkbootparam "ipv6"; then
1130 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1132 # we probably need some time until stateless autoconfiguration has happened
1134 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1135 for DEVICE in `echo "$NETDEVICES"`; do
1138 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1139 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1141 for ADDR in `echo "$ADDRESSES"` ; do
1144 if [ "$COUNT" -eq "0" ] ; then
1145 einfo "(none)" ; eend 1
1155 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1157 if checkbootparam "nodhcp"; then
1158 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1160 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1161 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1162 for DEVICE in `echo "$NETDEVICES"` ; do
1163 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1165 ifconfig $DEVICE up >>$DEBUG 2>&1
1166 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1171 if [ -n "$INSTALLED" ] ; then
1172 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1179 # {{{ helper functions
1182 # search all partitions for a file in the root directory
1183 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1184 # See if it's already mounted
1185 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1186 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1187 [ -f "$i/$1" ] && FOUND="$i/$1"
1188 umount -l "$i" 2>>$DEBUG
1189 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1196 case "$(file -s $1)" in
1197 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1198 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1199 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1200 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1201 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1202 *data*) echo "invalid"; return 0;;
1203 *) echo "auto"; return 0;;
1207 # Try to mount this filesystem read-only, without or with encryption
1209 # Check if already mounted
1210 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1211 # Apparently, mount-aes DOES autodetect AES loopback files.
1212 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1213 # We need to mount crypto-loop files with initial rw support
1214 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1216 [ "$RC" = "0" ] && return 0
1218 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1220 while [ "$a" != "n" -a "$a" != "N" ]; do
1221 # We need to mount crypto-loop files with initial rw support
1222 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1223 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1224 # Problem with ioctl() from getpasswd()?
1234 if checkbootparam "nocpu"; then
1235 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1237 # check module dependencies
1239 if [ -e /lib64 ] ; then
1240 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1242 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1246 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1247 einfo "Detecting CPU:"
1248 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)
1249 echo $CPU | sed 's/ \{1,\}/ /g'
1252 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
1255 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1256 # * it only if we have the according kernel modules available
1257 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1258 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1259 # -> parse output of the initscript and output it according to our look'n'feel
1260 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1261 if ! cpufreq_check ; then
1262 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1264 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1265 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1266 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1267 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1268 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1272 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1274 if [ -x /etc/init.d/loadcpufreq ] ; then
1275 SKIP_CPU_GOVERNOR=''
1276 LOADCPUFREQ=$(mktemp)
1277 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1278 if grep -q FATAL "$LOADCPUFREQ" ; then
1284 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1285 eerror "$line" ; eend $RC
1289 elif grep -q done "$LOADCPUFREQ" ; then
1290 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1291 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1292 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1294 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1298 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1299 . /usr/bin/cpufreq-detect.sh
1300 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1301 einfo "Loading modules ${MODULE}"
1302 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1304 if [[ $RC == 0 ]]; then
1311 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1315 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1316 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1317 if modprobe cpufreq_ondemand ; RC=$? ; then
1318 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1319 echo ondemand > $file
1329 fi # checkbootparam nocpu
1333 # {{{ autostart of ssh
1335 if checkbootparam ssh ; then
1336 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1337 einfo "Bootoption passwd found."
1338 if [ -n "$SSH_PASSWD" ] ; then
1339 echo "grml:$SSH_PASSWD" | chpasswd -m
1340 einfo "Starting secure shell server in background."
1341 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1342 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1345 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1348 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1354 # {{{ set password for user grml
1356 if checkbootparam passwd >>$DEBUG 2>&1; then
1357 einfo "Bootoption passwd found."
1358 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1359 if [ -n "$PASSWD" ] ; then
1360 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1362 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1365 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1371 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1373 if checkbootparam home ; then
1374 HOMEDIR="$(getbootparam home)"
1378 if [ -n "$HOMEDIR" ]; then
1379 einfo "Bootoption home detected." && eend 0
1382 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1383 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1384 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1385 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1388 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1389 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1390 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1391 MYHOMEDIR="$HOMEDIR"
1393 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1394 MYHOMEDIR="$(findfile grml.img)"
1395 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1396 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1397 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1400 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1401 eerror "Option ignored." ; eend 1
1406 if [ -n "$MYHOMEDIR" ]; then
1407 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1408 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1409 while read device mountpoint fs relax; do
1410 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1413 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1417 # Note: This currently won't work with encrypted partitions
1418 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1419 if [ ! -f "$MYHOMEDIR" ]; then
1420 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1421 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1426 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1427 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1428 if [ -f "$MYHOMEDIR" ]; then
1429 # It's a loopback file, mount it over the /home/grml directory
1430 trymount "$MYHOMEDIR" /home/grml
1432 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1436 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1440 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1442 fi # mount -o remount,rw,...
1445 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1449 fi # if trymount ...
1451 fi # checkbootparam home
1455 # {{{ Check for scripts on CD-ROM
1456 config_cdrom_scripts(){
1457 if checkbootparam "script"; then
1458 for script in /cdrom/scripts/* ; do
1459 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1468 if ! [ -x /usr/bin/aumix ] ; then
1469 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1472 if ! [ -r /proc/asound/cards ] ; then
1473 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1477 if checkbootparam vol ; then
1478 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1479 if [ -z "$VOL" ] ; then
1480 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1487 if checkbootparam nosound ; then
1488 einfo "Muting sound devices on request."
1489 # some IBM notebooks require the following stuff:
1490 if [ -x /usr/bin/amixer ] ; then
1491 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1492 amixer set Front unmute 1>/dev/null
1493 amixer set Front 0% 1>/dev/null
1496 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1497 if [ -n "$ERROR" ] ; then
1499 eerror "Problem muting sound devices: $ERROR"
1503 elif [ -z "$INSTALLED" ]; then
1504 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1505 # some IBM notebooks require the following stuff:
1506 if [ -x /usr/bin/amixer ] ; then
1507 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1508 amixer set Front unmute 1>/dev/null
1509 amixer set Front ${VOL}% 1>/dev/null
1512 # by default assume '0' as volume for microphone:
1513 if checkbootparam micvol ; then
1514 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1519 # finally set the volumes:
1520 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1521 if [ -n "$ERROR" ] ; then
1523 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1533 # {{{ modem detection
1535 if checkbootparam "nomodem"; then
1536 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1538 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1539 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1540 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1548 # {{{ keyboard add-ons
1549 config_setkeycodes(){
1550 if checkbootparam "setkeycodes" ; then
1551 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1552 # MS MM keyboard add-on
1554 setkeycodes e001 126 &>/dev/null
1555 setkeycodes e059 127 &>/dev/null
1557 setkeycodes e03b 59 &>/dev/null
1558 setkeycodes e008 60 &>/dev/null
1559 setkeycodes e007 61 &>/dev/null
1560 setkeycodes e03e 62 &>/dev/null
1561 setkeycodes e03f 63 &>/dev/null
1562 setkeycodes e040 64 &>/dev/null
1563 setkeycodes e041 65 &>/dev/null
1564 setkeycodes e042 66 &>/dev/null
1565 setkeycodes e043 67 &>/dev/null
1566 setkeycodes e023 68 &>/dev/null
1567 setkeycodes e057 87 &>/dev/null
1568 setkeycodes e058 88 &>/dev/null
1570 setkeycodes e00a 89 e008 90 &>/dev/null
1577 config_wondershaper(){
1578 if checkbootparam "wondershaper" ; then
1579 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1584 if [ -n "$WONDER" ]; then
1586 DEVICE="${WONDER%%,*}"
1588 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1590 DOWNSTREAM="${WONDER%%,*}"
1592 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1594 UPSTREAM="${WONDER%%,*}"
1599 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1600 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1601 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1602 einfo "Starting wondershaper (${CMD}) in background."
1603 ( sh -c $CMD & ) && eend 0
1610 if checkbootparam "nosyslog"; then
1611 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1613 einfo "Starting syslog-ng in background."
1614 /etc/init.d/syslog-ng start 1>>$DEBUG &
1622 if checkbootparam "nogpm"; then
1623 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1625 einfo "Starting gpm in background."
1626 # /etc/init.d/gpm start 1>>$DEBUG &
1627 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1635 if checkbootparam "services" ; then
1636 SERVICE="$(getbootparam services 2>>$DEBUG)"
1637 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1638 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1639 einfo "Starting service(s) ${SERVICENL} in background."
1640 for service in $(echo -e $SERVICELIST) ; do
1641 /etc/init.d/${service} start 1>>$DEBUG &
1643 [ "$?" == "0" ] ; eend $?
1650 if checkbootparam netconfig ; then
1651 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1652 CONFIGFILE='/tmp/netconfig.grml'
1655 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1656 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1658 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1660 while ! getconfig && [[ "$counter" != 0 ]] ; do
1661 echo -n "Sleeping for 5 seconds and trying to get config again... "
1662 counter=$(( counter-1 ))
1663 echo "$counter tries left" ; sleep 1
1665 if [ -r "$CONFIGFILE" ] ; then
1666 einfo "Downloading was successfull." ; eend 0
1667 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1668 md5sum $CONFIGFILE ; eend 0
1669 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1671 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1678 config_blindsound(){
1679 if checkbootparam "blind" ; then
1681 flite -o play -t "welcome to the gremel system"
1688 if checkbootparam welcome ; then
1689 flite -o play -t "welcome to the gremel system"
1694 # {{{ fix/workaround for unionfs
1696 if [ -z "$INSTALLED" ]; then
1697 touch /var/cache/apt/*cache.bin
1702 # {{{ create all /mnt-directories
1704 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1705 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1709 # {{{ start X window system via grml-x
1711 if checkbootparam startx ; then
1712 if [ -x /usr/X11R6/bin/X ] ; then
1713 if [ -z "$INSTALLED" ] ; then
1714 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1715 if [ -z "$WINDOWMANAGER" ] ; then
1716 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1717 WINDOWMANAGER="wm-ng"
1719 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1721 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1722 config_userfstab || fstabuser='grml'
1723 cat>|/etc/init.d/xstartup<<EOF
1725 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1726 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1728 chmod 755 /etc/init.d/xstartup
1730 # adjust inittab for xstartup
1731 if grep -q '^6:' /etc/inittab ; then
1732 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1733 else # just append tty6 to inittab if no definition is present:
1734 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1737 /sbin/telinit q ; eend $?
1739 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1740 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1742 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1746 eerror "We are not running from CD - startx will not work, skipping it.
1747 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1750 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1751 Boot parameter startx does not work therefore." ; eend 1
1757 # {{{ configuration framework
1759 if checkbootparam extract ; then
1760 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1761 EXTRACTOPTIONS="-- -x $EXTRACT"
1766 if checkbootparam noautoconfig || checkbootparam forensic ; then
1767 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1769 if [ -z "$INSTALLED" ] ; then
1770 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1772 [ -d /mnt/grml ] || mkdir /mnt/grml
1773 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1774 # We do need the following fix so floppy disk is available to blkid in any case :-/
1775 if [ -r /dev/fd0 ] ; then
1776 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1777 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1778 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1779 blkid /dev/fd0 1>>$DEBUG 2>&1
1782 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1783 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1784 if [[ $RC == 0 ]]; then
1785 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1788 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1789 if [ -n "$CONFIG" ]; then
1790 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1792 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1794 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1798 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1799 if [ -n "$SCRIPT" ]; then
1800 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1803 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1805 ewarn "No devices with label GRMLCFG found." ; eend 0
1814 if checkbootparam "config" ; then
1815 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1816 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1817 einfo "Bootoption config found. config is set to: $CONFIG"
1819 einfo "Trying to extract configuration file ${CONFIG}:"
1820 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1824 if checkbootparam myconfig ; then
1825 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1826 if [ -n "$MOUNTDEVICE" ]; then
1827 if checkbootparam file ; then
1828 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1829 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1831 [ -d /mnt/grml ] || mkdir /mnt/grml
1832 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1833 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1834 if [[ $RC == 0 ]]; then
1835 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1838 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1839 if [ -n "$CONFIG" ]; then
1840 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1842 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1844 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1848 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1849 if [ -n "$SCRIPT" ]; then
1850 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1855 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1856 fi # mount $MOUNTDEVICE
1857 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1859 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1860 fi # [ -n "$MOUNTDEVICE" ]
1861 fi # checkbootparam myconfig
1863 if checkbootparam "partconf" ; then
1864 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1865 if [ -n "$MOUNTDEVICE" ]; then
1866 [ -d /mnt/grml ] || mkdir /mnt/grml
1867 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1868 if [[ $RC == 0 ]]; then
1869 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1870 einfo "Copying files from $MOUNTDEVICE over grml system."
1871 for file in `cat /etc/grml/partconf` ; do
1872 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1873 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1876 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1877 fi # mount $MOUNTDEVICE
1878 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1880 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1881 fi # [ -n "$MOUNTDEVICE" ]
1886 # {{{ /cdrom/.*-options
1888 if checkbootparam "debs" ; then
1889 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1890 einfo "Tring to install debian package(s) ${DEBS}"
1891 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1896 if checkbootparam "scripts" ; then
1897 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1898 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1899 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1900 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1907 if checkbootparam "distcc" ; then
1908 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1909 if [ -n "$OPTIONS" ]; then
1912 if [ -n "$OPTIONS" ]; then
1913 NET="${OPTIONS%%,*}"
1915 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1917 INTERFACE="${OPTIONS%%,*}"
1922 CONFIG=/etc/default/distcc
1923 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1924 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1926 if [ -n "$INTERFACE" ] ; then
1927 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1930 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1931 counter=$(( counter-1 ))
1932 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1934 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1938 if [ -n "$IP" ] ; then
1939 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1941 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1943 id distccd >/dev/null 2>&1 || \
1945 einfo "Creating distcc user" ; \
1946 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1949 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1950 /etc/init.d/distcc start 1>/dev/null ; eend $?
1953 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1957 if checkbootparam "gcc"; then
1958 GCC="$(getbootparam gcc 2>>$DEBUG)"
1960 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1963 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1966 if checkbootparam "gpp"; then
1967 GPP="$(getbootparam gpp 2>>$DEBUG)"
1969 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1970 if [ -x /usr/bin/g++-${GPP} ] ; then
1972 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1974 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1975 if [ -x /usr/bin/cpp-${GPP} ] ; then
1977 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1986 # Notice: use it only on live-cd system, if running from harddisk please
1987 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1988 # in /etc/runlevel.conf
1990 MODULES_FILE=/etc/grml/modules
1991 if checkbootparam nomodules ; then
1992 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1993 elif [ -z "$INSTALLED" ]; then
1994 if [ -r $MODULES_FILE ] ; then
1995 einfo "Loading modules specified in ${MODULES_FILE}:"
1997 grep '^[^#]' $MODULES_FILE | \
1998 while read module args; do
1999 [ "$module" ] || continue
2001 modprobe $module $args ; eend $?
2005 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2012 config_915resolution(){
2013 if checkbootparam "915resolution" ; then
2014 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2015 if [ -x /usr/sbin/915resolution ]; then
2020 if [ -n "$OPTIONS" ]; then
2022 MODE="${OPTIONS%%,*}"
2024 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2026 XRESO="${OPTIONS%%,*}"
2028 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2030 YRESO="${OPTIONS%%,*}"
2035 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2036 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2045 if [ -z "$INSTALLED" ] ; then
2046 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2047 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2048 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2049 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2051 if ! [ -x /sbin/mdadm ] ; then
2052 eerror "mdadm not available, can not execute it." ; eend 1
2055 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2056 # find out whether we have a valid configuration file already
2057 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2058 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2059 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2060 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2062 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2065 if ! checkbootparam 'swraid' ; then
2067 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2070 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2075 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2077 *'No arrays found'*)
2078 ewarn "$line" ; eend 0
2081 einfo "$line" ; eend 0
2088 if [ -r /proc/mdstat ] ; then
2090 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2091 if [ -z "$MDSTAT" ] ; then
2092 ewarn "No active arrays found" ; eend 0
2097 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2098 einfo "active arrays: $line" ; eend 0
2104 fi # bootoption swraid
2106 fi # is /sbin/mdadm executable?
2107 fi # check for bootoptions
2108 fi # run only in live-cd mode
2112 # {{{ LVM (Logical Volumes)
2114 if [ -z "$INSTALLED" ] ; then
2115 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2116 if checkbootparam 'nolvm' ; then
2117 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2119 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2120 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2121 eerror "LVM not available, can not execute it." ; eend 1
2123 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2124 einfo "You seem to have logical volumes (LVM) on your system."
2126 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2128 if checkbootparam 'lvm' ; then
2129 einfo "Bootoption LVM found. Searching for logical volumes:"
2130 /etc/init.d/lvm2 start ; eend $?
2134 fi # check for lvm binary
2135 fi # check for bootoption nolvm
2136 fi # run only in live-cd mode
2140 # {{{ debnet: setup network based on an existing one found on a partition
2142 if checkbootparam "debnet" ; then
2143 iszsh && setopt shwordsplit
2144 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2145 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2148 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2150 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2151 for i in $DEVICES; do
2152 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2153 einfo "Scanning on $i"
2154 if [ -f /mnt/etc/network/interfaces ]; then
2155 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2163 if [ -n "$FOUND_DEBNET" ]; then
2164 einfo "Stopping network."
2165 pump -k 1>/dev/null 2>&1
2166 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2167 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2168 rm -rf /etc/network/run
2169 cp -a /mnt/etc/network /etc
2170 rm -rf /etc/network/run
2171 mkdir /etc/network/run
2172 umount /mnt ; eend $?
2173 einfo "Starting network."
2174 /etc/init.d/networking start ; eend $?
2176 eerror "/etc/network/interfaces not found." ; eend 1
2180 eerror "Error: /mnt already mounted." ; eend 1
2186 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2188 if grep -q ipw3945 /proc/modules ; then
2189 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2190 ewarn "Broken ipw3945 network interface found, reloading module."
2199 # {{{ disable console blanking
2201 if checkbootparam "noblank" ; then
2202 einfo "Bootoption noblank found. Disabling monitor blanking."
2203 setterm -blank 0 ; eend $?
2208 # {{{ grml2hd: automatic installation
2211 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2213 if checkbootparam "user" ; then
2215 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2216 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2219 if checkbootparam "filesystem" ; then
2221 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2222 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2225 if checkbootparam "partition" ; then
2227 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2228 # notice: the following checks whether the given partition is available, if not the skip
2229 # execution of grml2hd as it might result in data loss...
2230 if [ -r $PARTITION ] ; then
2231 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2233 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2237 if checkbootparam "mbr" ; then
2239 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2240 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2243 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2245 GRML2HD_NONINTERACTIVE='yes' grml2hd
2248 chmod 755 /usr/bin/grml2hd_noninteractive
2249 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2250 if [ -z "$GRML2HD_FAIL" ] ; then
2251 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2253 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2256 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2260 # {{{ debootstrap: automatic installation
2261 config_debootstrap(){
2263 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2265 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2267 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2269 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2274 if checkbootparam "target" ; then
2276 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2277 # notice: the following checks whether the given partition is available, if not the skip
2278 # execution of grml-debootstrap as it might result in data loss...
2279 if ! [ -r "$TARGET" ] ; then
2280 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2284 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2289 if checkbootparam "grub" ; then
2291 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2294 if checkbootparam "groot" ; then
2296 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2299 if checkbootparam "release" ; then
2301 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2304 if checkbootparam "mirror" ; then
2306 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2309 if checkbootparam "boot_append" ; then
2311 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2314 if checkbootparam "password" ; then
2316 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2319 # now check which options are available
2320 if [ -n "TARGET" ] ; then
2321 TARGETCMD="--target $TARGET"
2325 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2329 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2330 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2331 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2332 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2333 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2334 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2336 # and finally write script and execute it
2337 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2339 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2342 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2344 screen /usr/bin/grml-debootstrap_noninteractive
2345 einfo "Invoking a shell, just exit to continue booting..."
2348 fi # stringinstring "BOOT_IMAGE=debian2hd
2352 # {{{ Support customization
2354 if checkbootparam "distri"; then
2355 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2356 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2357 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2358 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2359 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2360 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2366 ### {{{ backwards compatible stuff
2367 config_environment(){
2368 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2371 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2375 ## END OF FILE #################################################################
2376 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3