2 # Filename: autoconfig.functions
3 # Purpose: basic system configuration and hardware setup for grml system
4 # Authors: grml-team (grml.org), (c) Klaus Knopper <knopper@knopper.net>, (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports: see http://grml.org/bugs/
6 # License: This file is licensed under the GPL v2.
7 # Latest change: Don Nov 15 11:46:04 CET 2007 [mika]
8 ################################################################################
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
21 if [ -n "$ZSH_VERSION" ] ; then
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
31 ### {{{ Utility Functions
35 case "$(cat $2)" in *$1*) return 0;; esac
41 case "$2" in *$1*) return 0;; esac
45 # Reread boot command line; echo last parameter's argument or return false.
47 stringinstring " $1=" "$CMDLINE" || return 1
48 result="${CMDLINE##*$1=}"
49 result="${result%%[ ]*}"
54 # Check boot commandline for specified option
56 stringinstring " $1" "$CMDLINE"
61 if [ "$1" = "yes" ] ; then
69 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
73 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 # {{{ filesystems (proc, pts, sys) and fixes
79 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
83 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
87 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
97 # {{{ Check if we are running from the grml-CD or HD
99 [ -e /etc/grml_cd ] || INSTALLED="yes"
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
109 . /etc/grml/lsb-functions
110 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
112 . /etc/grml/lsb-functions
119 if checkbootparam "debug"; then
122 if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
126 if [ -n "$BOOTDEBUG" ]; then
127 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
129 if [ -r /etc/grml/screenrc ] ; then
130 einfo "Starting GNU screen to be able to use a full featured shell environment."
131 einfo "Just exit the shells (and therefore screen) to continue boot process..."
132 /bin/zsh -c "screen -c /etc/grml/screenrc"
134 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135 einfo "Just exit the shell to continue boot process..."
146 if checkbootparam "log"; then
147 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
149 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
151 einfo "Starting bootlogd."
152 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
160 # {{{ set firmware timeout via bootparam
162 if checkbootparam fwtimeout ; then
163 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
164 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
165 rmmod firmware_class 1>>$DEBUG 2>&1
166 modprobe firmware_class ; eend $?
168 if [ -z "$TIMEOUT" ] ; then
169 TIMEOUT="100" # linux kernel default: 10
171 if [ -f /sys/class/firmware/timeout ] ; then
172 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
173 echo 100 > /sys/class/firmware/timeout ; eend $?
178 ### {{{ language configuration / localization
181 einfo "Activating language settings:"
184 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
185 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
187 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
189 # check for bootoption which overrides config from /etc/grml/autoconfig:
190 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
191 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
193 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
194 if [ -z "$INSTALLED" ] ; then
195 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
198 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
199 if [ -n "$BOOT_LANGUAGE" ] ; then
200 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
204 if [ -z "$CONSOLEFONT" ] ; then
205 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
206 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
207 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
208 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
209 CONSOLEFONT='Uni3-Terminus16'
211 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
216 # export it now, so error messages get translated, too
217 if checkgrmlsmall ; then
218 export LANG='C' # grml-small does not provide any further locales
220 [ -r /etc/default/locale ] && . /etc/default/locale
224 # configure keyboard layout, read in already set values first:
225 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
227 # now allow keyboard override by boot commandline for later use:
228 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
229 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
230 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
231 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
232 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
234 # modify /etc/sysconfig/keyboard only in live-cd mode:
235 if [ -z "$INSTALLED" ] ; then
237 local LANGUAGE="$BOOT_LANGUAGE"
238 . /etc/grml/language-functions
239 # allow setting xkeyboard explicitly different than console keyboard
240 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
241 if [ -n "$KXKEYBOARD" ]; then
242 XKEYBOARD="$KXKEYBOARD"
243 KDEKEYBOARD="$KXKEYBOARD"
244 elif [ -n "$KKEYBOARD" ]; then
245 XKEYBOARD="$KKEYBOARD"
246 KDEKEYBOARD="$KKEYBOARD"
249 # duplicate of previous code to make sure /etc/grml/language-functions
250 # does not overwrite our values....
251 # now allow keyboard override by boot commandline for later use:
252 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
253 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
254 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
255 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
256 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
258 # write keyboard related variables to file for later use
259 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
260 if ! [ -e /etc/sysconfig/keyboard ] ; then
261 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
262 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
263 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
264 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
268 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
270 # activate unicode console if running within utf8 environment
271 if [ -r /etc/default/locale ] ; then
272 if grep -q "LANG=.*UTF" /etc/default/locale ; then
273 einfo "Setting up unicode environment."
274 unicode_start 2>>$DEBUG ; eend $?
278 # Set default keyboard before interactive setup
279 if [ -n "$KEYTABLE" ] ; then
280 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281 loadkeys -q $KEYTABLE &
285 # we have to set up all consoles, therefore loop it over all ttys:
286 NUM_CONSOLES=`fgconsole --next-available`
287 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
288 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
290 if [ -n "$CHARMAP" ] ; then
291 einfo "Running consolechars for ${CHARMAP}"
292 for vc in `seq 0 ${NUM_CONSOLES}` ; do
293 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
298 if 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 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1513 if [ -n "$ERROR" ] ; then
1515 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1525 # {{{ modem detection
1527 if checkbootparam "nomodem"; then
1528 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1530 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1531 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1532 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1540 # {{{ keyboard add-ons
1541 config_setkeycodes(){
1542 if checkbootparam "setkeycodes" ; then
1543 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1544 # MS MM keyboard add-on
1546 setkeycodes e001 126 &>/dev/null
1547 setkeycodes e059 127 &>/dev/null
1549 setkeycodes e03b 59 &>/dev/null
1550 setkeycodes e008 60 &>/dev/null
1551 setkeycodes e007 61 &>/dev/null
1552 setkeycodes e03e 62 &>/dev/null
1553 setkeycodes e03f 63 &>/dev/null
1554 setkeycodes e040 64 &>/dev/null
1555 setkeycodes e041 65 &>/dev/null
1556 setkeycodes e042 66 &>/dev/null
1557 setkeycodes e043 67 &>/dev/null
1558 setkeycodes e023 68 &>/dev/null
1559 setkeycodes e057 87 &>/dev/null
1560 setkeycodes e058 88 &>/dev/null
1562 setkeycodes e00a 89 e008 90 &>/dev/null
1569 config_wondershaper(){
1570 if checkbootparam "wondershaper" ; then
1571 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1576 if [ -n "$WONDER" ]; then
1578 DEVICE="${WONDER%%,*}"
1580 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1582 DOWNSTREAM="${WONDER%%,*}"
1584 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1586 UPSTREAM="${WONDER%%,*}"
1591 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1592 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1593 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1594 einfo "Starting wondershaper (${CMD}) in background."
1595 ( sh -c $CMD & ) && eend 0
1602 if checkbootparam "nosyslog"; then
1603 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1605 einfo "Starting syslog-ng in background."
1606 /etc/init.d/syslog-ng start 1>>$DEBUG &
1614 if checkbootparam "nogpm"; then
1615 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1617 einfo "Starting gpm in background."
1618 # /etc/init.d/gpm start 1>>$DEBUG &
1619 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1627 if checkbootparam "services" ; then
1628 SERVICE="$(getbootparam services 2>>$DEBUG)"
1629 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1630 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1631 einfo "Starting service(s) ${SERVICENL} in background."
1632 for service in $(echo -e $SERVICELIST) ; do
1633 /etc/init.d/${service} start 1>>$DEBUG &
1635 [ "$?" == "0" ] ; eend $?
1642 if checkbootparam netconfig ; then
1643 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1644 CONFIGFILE='/tmp/netconfig.grml'
1647 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1648 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1650 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1652 while ! getconfig && [[ "$counter" != 0 ]] ; do
1653 echo -n "Sleeping for 5 seconds and trying to get config again... "
1654 counter=$(( counter-1 ))
1655 echo "$counter tries left" ; sleep 1
1657 if [ -r "$CONFIGFILE" ] ; then
1658 einfo "Downloading was successfull." ; eend 0
1659 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1660 md5sum $CONFIGFILE ; eend 0
1661 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1663 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1670 config_blindsound(){
1671 if checkbootparam "blind" ; then
1673 flite -o play -t "welcome to the gremel system"
1680 if checkbootparam welcome ; then
1681 flite -o play -t "welcome to the gremel system"
1686 # {{{ fix/workaround for unionfs
1688 if [ -z "$INSTALLED" ]; then
1689 touch /var/cache/apt/*cache.bin
1694 # {{{ create all /mnt-directories
1696 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1697 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1701 # {{{ start X window system via grml-x
1703 if checkbootparam startx ; then
1704 if [ -x /usr/X11R6/bin/X ] ; then
1705 if [ -z "$INSTALLED" ] ; then
1706 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1707 if [ -z "$WINDOWMANAGER" ] ; then
1708 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1709 WINDOWMANAGER="wm-ng"
1711 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1713 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1714 config_userfstab || fstabuser='grml'
1715 cat>|/etc/init.d/xstartup<<EOF
1717 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1718 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1720 chmod 755 /etc/init.d/xstartup
1722 # adjust inittab for xstartup
1723 if grep -q '^6:' /etc/inittab ; then
1724 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1725 else # just append tty6 to inittab if no definition is present:
1726 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1729 /sbin/telinit q ; eend $?
1731 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1732 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1734 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1738 eerror "We are not running from CD - startx will not work, skipping it.
1739 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1742 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1743 Boot parameter startx does not work therefore." ; eend 1
1749 # {{{ configuration framework
1751 if checkbootparam extract ; then
1752 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1753 EXTRACTOPTIONS="-- -x $EXTRACT"
1758 if checkbootparam noautoconfig || checkbootparam forensic ; then
1759 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1761 if [ -z "$INSTALLED" ] ; then
1762 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1764 [ -d /mnt/grml ] || mkdir /mnt/grml
1765 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1766 # We do need the following fix so floppy disk is available to blkid in any case :-/
1767 if [ -r /dev/fd0 ] ; then
1768 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1769 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1770 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1771 blkid /dev/fd0 1>>$DEBUG 2>&1
1774 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1775 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1776 if [[ $RC == 0 ]]; then
1777 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1780 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1781 if [ -n "$CONFIG" ]; then
1782 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1784 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1786 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1790 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1791 if [ -n "$SCRIPT" ]; then
1792 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1795 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1797 ewarn "No devices with label GRMLCFG found." ; eend 0
1806 if checkbootparam "config" ; then
1807 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1808 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1809 einfo "Bootoption config found. config is set to: $CONFIG"
1811 einfo "Trying to extract configuration file ${CONFIG}:"
1812 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1816 if checkbootparam myconfig ; then
1817 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1818 if [ -n "$MOUNTDEVICE" ]; then
1819 if checkbootparam file ; then
1820 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1821 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1823 [ -d /mnt/grml ] || mkdir /mnt/grml
1824 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1825 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1826 if [[ $RC == 0 ]]; then
1827 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1830 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1831 if [ -n "$CONFIG" ]; then
1832 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1834 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1836 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1840 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1841 if [ -n "$SCRIPT" ]; then
1842 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1847 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1848 fi # mount $MOUNTDEVICE
1849 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1851 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1852 fi # [ -n "$MOUNTDEVICE" ]
1853 fi # checkbootparam myconfig
1855 if checkbootparam "partconf" ; then
1856 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1857 if [ -n "$MOUNTDEVICE" ]; then
1858 [ -d /mnt/grml ] || mkdir /mnt/grml
1859 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1860 if [[ $RC == 0 ]]; then
1861 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1862 einfo "Copying files from $MOUNTDEVICE over grml system."
1863 for file in `cat /etc/grml/partconf` ; do
1864 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1865 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1868 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1869 fi # mount $MOUNTDEVICE
1870 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1872 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1873 fi # [ -n "$MOUNTDEVICE" ]
1878 # {{{ /cdrom/.*-options
1880 if checkbootparam "debs" ; then
1881 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1882 einfo "Tring to install debian package(s) ${DEBS}"
1883 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1888 if checkbootparam "scripts" ; then
1889 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1890 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1891 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1892 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1899 if checkbootparam "distcc" ; then
1900 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1901 if [ -n "$OPTIONS" ]; then
1904 if [ -n "$OPTIONS" ]; then
1905 NET="${OPTIONS%%,*}"
1907 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1909 INTERFACE="${OPTIONS%%,*}"
1914 CONFIG=/etc/default/distcc
1915 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1916 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1918 if [ -n "$INTERFACE" ] ; then
1919 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1922 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1923 counter=$(( counter-1 ))
1924 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1926 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1930 if [ -n "$IP" ] ; then
1931 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1933 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1935 id distccd >/dev/null 2>&1 || \
1937 einfo "Creating distcc user" ; \
1938 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1941 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1942 /etc/init.d/distcc start 1>/dev/null ; eend $?
1945 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1949 if checkbootparam "gcc"; then
1950 GCC="$(getbootparam gcc 2>>$DEBUG)"
1952 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1955 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1958 if checkbootparam "gpp"; then
1959 GPP="$(getbootparam gpp 2>>$DEBUG)"
1961 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1962 if [ -x /usr/bin/g++-${GPP} ] ; then
1964 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1966 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1967 if [ -x /usr/bin/cpp-${GPP} ] ; then
1969 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1978 # Notice: use it only on live-cd system, if running from harddisk please
1979 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1980 # in /etc/runlevel.conf
1982 MODULES_FILE=/etc/grml/modules
1983 if checkbootparam nomodules ; then
1984 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1985 elif [ -z "$INSTALLED" ]; then
1986 if [ -r $MODULES_FILE ] ; then
1987 einfo "Loading modules specified in ${MODULES_FILE}:"
1989 grep '^[^#]' $MODULES_FILE | \
1990 while read module args; do
1991 [ "$module" ] || continue
1993 modprobe $module $args ; eend $?
1997 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2004 config_915resolution(){
2005 if checkbootparam "915resolution" ; then
2006 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2007 if [ -x /usr/sbin/915resolution ]; then
2012 if [ -n "$OPTIONS" ]; then
2014 MODE="${OPTIONS%%,*}"
2016 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2018 XRESO="${OPTIONS%%,*}"
2020 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2022 YRESO="${OPTIONS%%,*}"
2027 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2028 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2037 if [ -z "$INSTALLED" ] ; then
2038 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2039 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2040 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2041 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2043 if ! [ -x /sbin/mdadm ] ; then
2044 eerror "mdadm not available, can not execute it." ; eend 1
2047 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2048 # find out whether we have a valid configuration file already
2049 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2050 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2051 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2052 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2054 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2057 if ! checkbootparam 'swraid' ; then
2059 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2062 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2067 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2069 *'No arrays found'*)
2070 ewarn "$line" ; eend 0
2073 einfo "$line" ; eend 0
2080 if [ -r /proc/mdstat ] ; then
2082 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2083 if [ -z "$MDSTAT" ] ; then
2084 ewarn "No active arrays found" ; eend 0
2089 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2090 einfo "active arrays: $line" ; eend 0
2096 fi # bootoption swraid
2098 fi # is /sbin/mdadm executable?
2099 fi # check for bootoptions
2100 fi # run only in live-cd mode
2104 # {{{ LVM (Logical Volumes)
2106 if [ -z "$INSTALLED" ] ; then
2107 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2108 if checkbootparam 'nolvm' ; then
2109 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2111 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2112 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2113 eerror "LVM not available, can not execute it." ; eend 1
2115 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2116 einfo "You seem to have logical volumes (LVM) on your system."
2118 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2120 if checkbootparam 'lvm' ; then
2121 einfo "Bootoption LVM found. Searching for logical volumes:"
2122 /etc/init.d/lvm2 start ; eend $?
2126 fi # check for lvm binary
2127 fi # check for bootoption nolvm
2128 fi # run only in live-cd mode
2132 # {{{ debnet: setup network based on an existing one found on a partition
2134 if checkbootparam "debnet" ; then
2135 iszsh && setopt shwordsplit
2136 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2137 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2140 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2142 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2143 for i in $DEVICES; do
2144 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2145 einfo "Scanning on $i"
2146 if [ -f /mnt/etc/network/interfaces ]; then
2147 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2155 if [ -n "$FOUND_DEBNET" ]; then
2156 einfo "Stopping network."
2157 pump -k 1>/dev/null 2>&1
2158 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2159 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2160 rm -rf /etc/network/run
2161 cp -a /mnt/etc/network /etc
2162 rm -rf /etc/network/run
2163 mkdir /etc/network/run
2164 umount /mnt ; eend $?
2165 einfo "Starting network."
2166 /etc/init.d/networking start ; eend $?
2168 eerror "/etc/network/interfaces not found." ; eend 1
2172 eerror "Error: /mnt already mounted." ; eend 1
2178 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2180 if grep -q ipw3945 /proc/modules ; then
2181 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2182 ewarn "Broken ipw3945 network interface found, reloading module."
2191 # {{{ disable console blanking
2193 if checkbootparam "noblank" ; then
2194 einfo "Bootoption noblank found. Disabling monitor blanking."
2195 setterm -blank 0 ; eend $?
2200 # {{{ grml2hd: automatic installation
2203 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2205 if checkbootparam "user" ; then
2207 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2208 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2211 if checkbootparam "filesystem" ; then
2213 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2214 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2217 if checkbootparam "partition" ; then
2219 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2220 # notice: the following checks whether the given partition is available, if not the skip
2221 # execution of grml2hd as it might result in data loss...
2222 if [ -r $PARTITION ] ; then
2223 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2225 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2229 if checkbootparam "mbr" ; then
2231 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2232 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2235 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2237 GRML2HD_NONINTERACTIVE='yes' grml2hd
2240 chmod 755 /usr/bin/grml2hd_noninteractive
2241 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2242 if [ -z "$GRML2HD_FAIL" ] ; then
2243 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2245 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2248 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2252 # {{{ debootstrap: automatic installation
2253 config_debootstrap(){
2255 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2257 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2259 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2261 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2266 if checkbootparam "target" ; then
2268 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2269 # notice: the following checks whether the given partition is available, if not the skip
2270 # execution of grml-debootstrap as it might result in data loss...
2271 if ! [ -r "$TARGET" ] ; then
2272 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2276 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2281 if checkbootparam "grub" ; then
2283 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2286 if checkbootparam "groot" ; then
2288 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2291 if checkbootparam "release" ; then
2293 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2296 if checkbootparam "mirror" ; then
2298 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2301 if checkbootparam "boot_append" ; then
2303 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2306 if checkbootparam "password" ; then
2308 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2311 # now check which options are available
2312 if [ -n "TARGET" ] ; then
2313 TARGETCMD="--target $TARGET"
2317 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2321 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2322 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2323 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2324 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2325 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2326 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2328 # and finally write script and execute it
2329 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2331 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2334 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2336 screen /usr/bin/grml-debootstrap_noninteractive
2337 einfo "Invoking a shell, just exit to continue booting..."
2340 fi # stringinstring "BOOT_IMAGE=debian2hd
2344 # {{{ Support customization
2346 if checkbootparam "distri"; then
2347 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2348 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2349 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2350 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2351 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2352 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2358 ### {{{ backwards compatible stuff
2359 config_environment(){
2360 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2363 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2367 ## END OF FILE #################################################################
2368 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3