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 Aug 02 11:01:10 CEST 2007 [mika]
8 ################################################################################
10 # {{{ path, variables, signals, umask, zsh
11 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
16 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
17 [ -z "$PS1" ] && trap "" 2 3 11
21 if [ -n "$ZSH_VERSION" ] ; then
27 # avoid 'no matches found: ...'
28 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
31 ### {{{ Utility Functions
35 case "$(cat $2)" in *$1*) return 0;; esac
41 case "$2" in *$1*) return 0;; esac
45 # Reread boot command line; echo last parameter's argument or return false.
47 stringinstring " $1=" "$CMDLINE" || return 1
48 result="${CMDLINE##*$1=}"
49 result="${result%%[ ]*}"
54 # Check boot commandline for specified option
56 stringinstring " $1" "$CMDLINE"
61 if [ "$1" = "yes" ] ; then
69 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
73 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 # {{{ filesystems (proc, pts, sys) and fixes
79 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
83 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
87 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
91 # {{{ Read in boot parameters
92 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
93 CMDLINE="$(cat /proc/cmdline)"
94 [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')"
97 # {{{ Check if we are running from the grml-CD or HD
99 [ -e /GRML/etc/grml_cd ] || INSTALLED="yes"
103 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
106 # {{{ source lsb-functions , color handling
107 if checkbootparam "nocolor"; then
109 . /etc/grml/lsb-functions
110 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
112 . /etc/grml/lsb-functions
119 if checkbootparam "debug"; then
122 if stringinstring "BOOT_IMAGE=debug " "$CMDLINE" ; then
126 if [ -n "$BOOTDEBUG" ]; then
127 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
129 if [ -r /etc/grml/screenrc ] ; then
130 einfo "Starting GNU screen to be able to use a full featured shell environment."
131 einfo "Just exit the shells (and therefore screen) to continue boot process..."
132 /bin/zsh -c "screen -c /etc/grml/screenrc"
134 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
135 einfo "Just exit the shell to continue boot process..."
146 if checkbootparam "log"; then
147 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
149 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot."
151 einfo "Starting bootlogd."
152 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
160 # {{{ Check if we are in interactive startup mode
162 stringinstring "BOOT_IMAGE=expert " "$CMDLINE" && INTERACTIVE="yes"
165 # {{{ set firmware timeout via bootparam
167 if checkbootparam fwtimeout ; then
168 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
169 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
170 rmmod firmware_class 1>>$DEBUG 2>&1
171 modprobe firmware_class ; eend $?
173 if [ -z "$TIMEOUT" ] ; then
174 TIMEOUT="100" # linux kernel default: 10
176 if [ -f /sys/class/firmware/timeout ] ; then
177 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
178 echo 100 > /sys/class/firmware/timeout ; eend $?
183 ### {{{ language configuration / localization
186 einfo "Activating language settings:"
189 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
190 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
192 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
194 # check for bootoption which overrides config from /etc/grml/autoconfig:
195 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
196 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
198 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
199 if [ -z "$INSTALLED" ] ; then
200 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
203 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
204 if [ -n "$BOOT_LANGUAGE" ] ; then
205 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
209 if [ -z "$CONSOLEFONT" ] ; then
210 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
211 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
212 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
213 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
214 CONSOLEFONT='Uni3-Terminus16'
216 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
221 # export it now, so error messages get translated, too
222 if checkgrmlsmall ; then
223 export LANG='C' # grml-small does not provide any further locales
225 [ -r /etc/default/locale ] && . /etc/default/locale
229 # configure keyboard layout, read in already set values first:
230 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
232 # now allow keyboard override by boot commandline for later use:
233 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
234 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
235 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
236 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
237 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
239 # modify /etc/sysconfig/keyboard only in live-cd mode:
240 if [ -z "$INSTALLED" ] ; then
242 local LANGUAGE="$BOOT_LANGUAGE"
243 . /etc/grml/language-functions
244 # allow setting xkeyboard explicitly different than console keyboard
245 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
246 if [ -n "$KXKEYBOARD" ]; then
247 XKEYBOARD="$KXKEYBOARD"
248 KDEKEYBOARD="$KXKEYBOARD"
249 elif [ -n "$KKEYBOARD" ]; then
250 XKEYBOARD="$KKEYBOARD"
251 KDEKEYBOARD="$KKEYBOARD"
254 # duplicate of previous code to make sure /etc/grml/language-functions
255 # does not overwrite our values....
256 # now allow keyboard override by boot commandline for later use:
257 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
258 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
259 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
260 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
261 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
263 # write keyboard related variables to file for later use
264 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
265 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
266 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
267 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
268 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
271 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
273 # activate unicode console if running within utf8 environment
274 if [ -r /etc/default/locale ] ; then
275 if grep -q "LANG=.*UTF" /etc/default/locale ; then
276 if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
277 ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
279 einfo "Setting up unicode environment."
280 unicode_start 2>>$DEBUG ; eend $?
285 # Set default keyboard before interactive setup
286 if [ -n "$KEYTABLE" ] ; then
287 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
288 loadkeys -q $KEYTABLE &
292 # we have to set up all consoles, therefore loop it over all ttys:
293 NUM_CONSOLES=`fgconsole --next-available`
294 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
295 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
296 if [ -n "$CHARMAP" ] ; then
297 einfo "Running consolechars for ${CHARMAP}"
298 for vc in `seq 0 ${NUM_CONSOLES}` ; do
299 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
303 if [ -n "$CONSOLEFONT" ] ; then
304 einfo "Running consolechars using ${CONSOLEFONT}"
305 for vc in `seq 0 ${NUM_CONSOLES}` ; do
306 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
317 if checkbootparam hostname ; then
318 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
319 einfo "Setting hostname to $HOSTNAME as requested."
320 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
321 hostname $HOSTNAME ; eend $?
323 hostname --file /etc/hostname
328 # fstabuser (needed when running from harddisk with username != grml {{{
330 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
331 if [ -n "$CONFIG_FSTAB_USER" ] ; then
332 fstabuser="$CONFIG_FSTAB_USER"
334 fstabuser=$(getent passwd 1000 | cut -d: -f1)
336 # if not yet set fall back to default 'grml' user
337 [ -n "$fstabuser" ] || fstabuser='grml'
341 # {{{ Set clock (Local time is more often used than GMT, so it is default)
343 # don't touch the files if running from harddisk:
344 if [ -z "$INSTALLED" ]; then
346 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
347 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
348 # hwclock uses the TZ variable
349 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
350 [ -n "$TZ" ] || TZ=Europe/Vienna
352 if ! [ -r /dev/rtc ] ; then
353 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
355 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
356 if [ -n "$ERROR" ] ; then
358 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
359 if [ -n "$ERROR" ] ; then
360 eerror "Problem running hwclock: $ERROR" ; eend 1
369 # {{{ print kernel info
371 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
372 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
373 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
374 if [ -r /proc/cpuinfo ] ; then
375 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
377 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
381 if [ -d /proc/xen ] ; then
383 einfo 'Running kernel featuring support for Xen detected' ; eend 0
389 # {{{ vmware specific stuff
391 if checkbootparam novmware ; then
392 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
394 if [ -z "$INSTALLED" ] ; then
395 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
396 if ! checkbootparam qemu ; then
397 if [ -r /etc/X11/xorg.conf.vmware ] ; then
398 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
399 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
408 # {{{ qemu specific stuff
410 if checkbootparam qemu ; then
411 if [ -r /etc/X11/xorg.conf.example ] ; then
412 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
413 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
419 # {{{ ld.so.cache + depmod
421 if [ -n "$INSTALLED" ]; then
422 if ! [ -r /etc/grml.first.boot ] ; then
423 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
425 # Regenerate ld.so.cache and module dependencies on HD
426 einfo "Running ldconfig" ; ldconfig ; eend $?
427 einfo "Running depmod" ; depmod -a ; eend $?
428 touch /etc/grml.first.boot
436 # update_progress {{{
438 # be sure we are non-blocking
439 (echo "$1" > /etc/sysconfig/progress) &
445 # don't touch the files if running from harddisk:
446 if [ -z "$INSTALLED" ]; then
447 KTZ="$(getbootparam tz 2>>$DEBUG)"
448 if [ -n "$KTZ" ] ; then
449 einfo "Setting timezone."
450 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
452 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
458 # small computer / nearly no ram {{{
461 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
462 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
465 if checkbootparam "small"; then
466 einfo "Information: ${RAM} kB of RAM available." ; eend 0
467 einfo "Bootoption small detected. Activating small system."
468 if [ -r /etc/inittab.small ] ; then
469 mv /etc/inittab /etc/inittab.normal
470 mv /etc/inittab.small /etc/inittab
472 sed -i 's/^9/#&/' /etc/inittab
473 sed -i 's/^10/#&/' /etc/inittab
474 sed -i 's/^11/#&/' /etc/inittab
475 sed -i 's/^12/#&/' /etc/inittab
477 /sbin/telinit q ; eend $?
479 if checkgrmlsmall ; then
480 if [[ $RAM -lt 25000 ]] ; then
481 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
482 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
483 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
484 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
487 einfo "Information: ${RAM} kB of RAM available." ; eend 0
490 if [[ $RAM -lt 58000 ]] ; then
491 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
492 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
493 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
494 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
497 einfo "Information: ${RAM} kB of RAM available." ; eend 0
505 # skip startup of w3m {{{
507 if checkbootparam "fast"; then
508 ewarn "Bootoption fast detected. Skipping startup of w3m."
509 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
510 /sbin/telinit q ; eend $?
515 # activate serial console {{{
517 if checkbootparam "console"; then
518 einfo "Bootoption (for serial) console detected."
520 if [ -r /etc/mgetty/mgetty.config ] ; then
521 MODE=$(getbootparam console | awk -F, '{print $2}')
523 [ -n "$MODE" ] || MODE=9600 # default mode
524 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
525 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
528 einfo "Activating mgetty."
529 sed -i 's/^#T0/T0/' /etc/inittab
530 sed -i 's/^#T1/T1/' /etc/inittab
531 /sbin/telinit q ; eend $?
537 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
540 for DEVICE in /proc/ide/hd?; do
541 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
543 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
547 # {{{ Bring up loopback interface now
549 if [ -z "$INSTALLED" ] ; then
550 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
551 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
559 # firewire devices {{{
560 # the raw1394 driver does not yet export info into SYSFS,
561 # so let's create raw1394 device manually
562 # http://www.michael-prokop.at/blog/index.php?p=352
563 config_firewire_dev(){
564 if checkbootparam "nofirewiredev" ; then
565 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
567 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
568 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
569 # cd /dev && MAKEDEV video1394 raw1394
570 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
571 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
572 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
573 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
574 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
575 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
581 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
582 # otherwise we will get: passwd: Authentication token lock busy
584 if [ -z "$INSTALLED" ] ; then
592 if [ -n "$TESTCD" ]; then
593 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
594 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
596 ( cd /cdrom/GRML/ ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
597 if [ "$?" = "0" ]; then
598 echo " ${GREEN}Everything looks OK${NORMAL}"
600 echo "${RED} *** CHECKSUM FAILED FOR THESE FILES: ***"
601 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
602 echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
603 echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM. ***${NORMAL}"
604 echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}
\a\a\a "
612 # {{{ hardware detection via discover
614 if checkbootparam "nodisc" ; then
615 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
617 if [ -x /sbin/discover ] ; then
618 einfo "Discovering hardware. Trying to load the following modules in background:"
620 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)"
622 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
625 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
631 # {{{ hardware detection via hwinfo
633 if checkbootparam hwinfo >>$DEBUG 2>&1; then
634 einfo "Discovering hardware via hwinfo:"
635 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
636 echo -n " Loading modules: "
637 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
643 # {{{ disable hotplug agents on request
644 config_hotplug_agent(){
645 if checkbootparam "noagent" ; then
646 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
647 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
648 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
649 einfo "Disabling hotplug-agent(s) $AGENTNL"
650 for agent in $(echo -e $AGENTLIST) ; do
651 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
653 [ "$?" == "0" ] ; eend $?
658 # {{{ blacklist of hotplug-modules
659 config_hotplug_blacklist(){
660 if checkbootparam "black" ; then
661 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
662 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
663 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
664 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
665 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
666 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
674 if checkbootparam "nohotplug" ; then
675 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
677 if [ -r /etc/init.d/hotplug ] ; then
678 einfo "Starting hotplug system in background."
679 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
681 elif [ -r /etc/init.d/hotplug-light ] ; then
682 einfo "Starting hotplug-light system in background."
683 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
686 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
692 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
694 if checkbootparam "blacklist" ; then
695 if [ -z "$INSTALLED" ]; then
696 einfo "Bootoption blacklist found."
697 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
698 if [ -n "$BLACK" ] ; then
699 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
700 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
701 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
702 echo "alias $BLACK off" >> /etc/modprobe.d/grml
703 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
705 eerror "No given module for blacklist found. Blacklisting will not work therefore."
708 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
710 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
719 if [ -d /proc/acpi ]; then
720 if checkbootparam "noacpi"; then
721 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
722 elif checkbootparam "nogrmlacpi" ; then
723 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
725 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
728 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
730 basename="${basename%%.*}"
731 case "$basename" in *_acpi)
732 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
734 modprobe $basename >>$DEBUG 2>&1 && found="yes"
735 local BASE="$BASE $basename"
737 if [ -n "$found" ] ; then
738 einfo "$BASE" ; eend 0
740 ewarn "(none)" ; eend 1
742 if ! [ -S /var/run/acpid.socket ] ; then
743 if ! [ -r /var/run/dbus/pid ] ; then
744 einfo "Starting acpi daemon."
745 /etc/init.d/acpid start >>$DEBUG ; eend $?
747 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
748 eerror "Solution: please activate acpid via /etc/runlevel.conf"
752 ewarn "acpi daemon already running."
759 if checkbootparam "noapm"; then
760 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
762 modprobe apm power_off=1 >>$DEBUG 2>&1
763 if [ "$?" = "0" ] ; then
764 if [ -x /etc/init.d/apmd ] ;then
765 einfo "APM Bios found, enabling power management functions."
766 /etc/init.d/apmd start ; eend $?
769 eerror "Loading apm module failed." ; eend 1
776 # {{{ PCMCIA Check/Setup
777 # This needs to be done before other modules are being loaded (by hwsetup)
779 if checkbootparam "nopcmcia"; then
780 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
782 if /usr/sbin/laptop-detect ; then
783 einfo "Detected Laptop - checking for PCMCIA." && eend 0
784 modprobe pcmcia_core >>$DEBUG 2>&1
785 # Try Cardbus or normal PCMCIA socket drivers
786 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
787 if [ "$?" = "0" ]; then
788 modprobe ds >>$DEBUG 2>&1
789 if [ -d /proc/bus/pccard ] ; then
790 if [ -x /sbin/cardmgr ] ; then
791 einfo "PCMCIA found, starting cardmgr."
792 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
794 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
803 # {{{ run software synthesizer via speakup
805 if checkbootparam swspeak ; then
806 if [ -d /proc/speakup/ ] ; then
807 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
809 if [ -x /etc/init.d/speech-dispatcher ] ; then
810 einfo "Starting speech-dispatcher."
811 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
812 einfo "Activating sftsyn in Kernel."
813 echo sftsyn >/proc/speakup/synth_name ; eend $?
814 einfo "Just run swspeak if you want to use software synthesizer via speakup."
815 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
817 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
818 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
822 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
823 flite -o play -t "Kernel does not seem to support speakup. Sorry."
829 # {{{ Check for blind option or brltty
832 checkbootparam "blind" && BLIND="yes"
833 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
835 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
836 if [ -x /sbin/brltty ]; then
837 # Blind option detected, start brltty now.
838 # modprobe serial_core parport_serial generic_serial && echo "done"
843 if [ -n "$BRLTTY" ]; then
845 BRLTYPE="${BRLTTY%%,*}"
847 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
849 BRLDEV="${BRLTTY%%,*}"
851 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
853 BRLTEXT="${BRLTTY%%,*}"
858 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
859 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
860 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
861 einfo "Starting braille-display manager."
864 sleep 2 && BLINDSOUND="yes"
871 # {{{ Interactive configuration
872 config_interactive(){
873 if [ -n "$INTERACTIVE" ] ; then
874 einfo "Entering interactive configuration second stage."
876 echo " ${GREEN}Your console keyboard defaults to: ${MAGENTA}${KEYTABLE}"
877 echo -n "${CYAN}Do you want to (re)configure your console keyboard?${NORMAL} [Y/n] "
879 [ "$a" != "n" ] && /usr/sbin/dpkg-reconfigure console-data ; eend $?
881 echo -n "${CYAN}Do you want to (re)configure your soundcard?${NORMAL} [Y/n] "
883 [ "$a" != "n" ] && alsaconf && ( exec aumix -m 0 >>$DEBUG 2>&1 & ) ; eend $?
885 echo -n "${CYAN}Do you want to (re)configure your graphics (X11) subsystem?${NORMAL} [Y/n] "
887 [ "$a" != "n" ] && xorgcfg -textmode ; eend $?
888 echo " ${GREEN}Interactive configuration finished. Everything else should be fine for now.${NORMAL}"
896 if checkbootparam forceagp ; then
897 # Probe for AGP. Hope this can fail safely
898 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
904 config_automounter(){
905 if checkbootparam automounter ; then
906 RUNLEVEL="$(runlevel)"
908 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
913 if [ -n "$AUTOMOUNTER" ]; then
914 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
915 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
916 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
917 anew="$d -fstype=auto,$2 :$i"
918 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
919 AUTOMOUNTS="$AUTOMOUNTS $d"
920 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
922 [ -d /mnt/$d ] && mkdir -p /mnt/$d
923 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
925 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
928 AUTOMOUNTS="floppy cdrom"
929 # Add new devices to /etc/fstab and /etc/auto.mnt
930 for i in /dev/cdrom?*; do
932 addautomount "$i" "ro"
937 if [ -n "$AUTOMOUNTER" ]; then
938 # Check for floppy dir, reinstall with automounter
939 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
940 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
941 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
942 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
943 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
944 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
946 # Replace paths from bootfloppy
947 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
948 mv -f /etc/fstab.new /etc/fstab
949 # Start automounter now
950 einfo "Starting automounter for ${AUTOMOUNTS}."
951 /etc/init.d/autofs start >>$DEBUG ; eend $?
956 # {{{ Collect partitions from /proc/partitions first for enabling DMA
960 while read major minor blocks partition relax; do
961 partition="${partition##*/}"
962 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
964 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
965 sd?) ;; # SCSI Harddisk, entire disk
966 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
967 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
970 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
973 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
976 # {{{ Enable DMA for all IDE drives now if not disabled
977 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
979 if checkbootparam "nodma"; then
980 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
982 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
983 if test -d /proc/ide/$d; then
984 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
985 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
986 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
987 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
988 echo "using_dma:1" >/proc/ide/$d/settings
997 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1000 NOSWAP="yes" # we do not use swap by default!
1001 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1003 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1006 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1007 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1009 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1010 iszsh && setopt nonomatch
1011 if [ -x /usr/sbin/rebuildfstab ] ; then
1012 config_userfstab || fstabuser=grml
1013 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1015 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1017 fi # checkbootparam nofstab/forensic
1019 # Scan for swap, config, homedir - but only in live-mode
1020 if [ -z "$INSTALLED" ] ; then
1021 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1024 HOMEDIR="$(getbootparam home)"
1025 if [ -n "$partitions" ]; then
1026 while read p m f relax; do
1027 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1028 partoptions="users,exec"
1030 # it's a swap partition?
1033 if [ -n "$NOSWAP" ]; then
1034 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1037 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1038 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1039 if [ -n "$ANYSWAP" ] ; then
1040 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1041 swapon $p 2>>$DEBUG ; eend $?
1043 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1047 if [[ "$p" == LABEL* ]] ; then
1048 p=$(blkid -t $p | awk -F: '{print $1}')
1050 if grep -q $p /proc/swaps ; then
1051 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1053 if [ -b "$p" ] ; then
1054 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1055 swapon $p 2>>$DEBUG ; eend $?
1057 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1066 esac # it's a swap partition?
1071 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1072 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1074 # *) NONEFOUND='1'; continue ;;
1078 if [ -z "$NOSWAP" ] ; then
1079 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1080 # Activate swapfile, if exists
1081 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1083 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1084 mount -o remount,rw $m && MOUNTED=1
1085 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1087 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1089 fnew="$SWAPFILE swap swap defaults 0 0"
1090 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1091 GRML_SWP="$GRML_SWP $SWAPFILE"
1094 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1097 # use a image as home
1098 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1099 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1100 if [ -n "$HOMEDIR" ]; then
1101 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1105 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1107 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1112 # Umount, if not in use
1113 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1125 if [ -n "$MOUSE_DEVICE" ] ; then
1126 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1131 # {{{ IPv6 configuration
1132 # Load IPv6 kernel module and print IP adresses
1134 if checkbootparam "ipv6"; then
1135 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1137 # we probably need some time until stateless autoconfiguration has happened
1139 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1140 for DEVICE in `echo "$NETDEVICES"`; do
1143 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1144 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1146 for ADDR in `echo "$ADDRESSES"` ; do
1149 if [ "$COUNT" -eq "0" ] ; then
1150 einfo "(none)" ; eend 1
1160 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1162 if checkbootparam "nodhcp"; then
1163 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1165 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1166 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1167 for DEVICE in `echo "$NETDEVICES"` ; do
1168 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1170 ifconfig $DEVICE up >>$DEBUG 2>&1
1171 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1176 if [ -n "$INSTALLED" ] ; then
1177 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1184 # {{{ helper functions
1187 # search all partitions for a file in the root directory
1188 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1189 # See if it's already mounted
1190 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1191 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1192 [ -f "$i/$1" ] && FOUND="$i/$1"
1193 umount -l "$i" 2>>$DEBUG
1194 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1201 case "$(file -s $1)" in
1202 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1203 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1204 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1205 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1206 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1207 *data*) echo "invalid"; return 0;;
1208 *) echo "auto"; return 0;;
1212 # Try to mount this filesystem read-only, without or with encryption
1214 # Check if already mounted
1215 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1216 # Apparently, mount-aes DOES autodetect AES loopback files.
1217 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1218 # We need to mount crypto-loop files with initial rw support
1219 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1221 [ "$RC" = "0" ] && return 0
1223 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1225 while [ "$a" != "n" -a "$a" != "N" ]; do
1226 # We need to mount crypto-loop files with initial rw support
1227 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1228 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1229 # Problem with ioctl() from getpasswd()?
1239 if checkbootparam "nocpu"; then
1240 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1242 # check module dependencies
1244 if [ -e /lib64 ] ; then
1245 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1247 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1251 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1252 einfo "Detecting CPU:"
1253 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)
1254 echo $CPU | sed 's/ \{1,\}/ /g'
1257 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
1260 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1261 # * it only if we have the according kernel modules available
1262 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1263 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1264 # -> parse output of the initscript and output it according to our look'n'feel
1265 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1266 if ! cpufreq_check ; then
1267 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1269 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1270 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1271 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1272 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1273 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1277 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1279 if [ -x /etc/init.d/loadcpufreq ] ; then
1280 SKIP_CPU_GOVERNOR=''
1281 LOADCPUFREQ=$(mktemp)
1282 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1283 if grep -q FATAL "$LOADCPUFREQ" ; then
1289 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1290 eerror "$line" ; eend $RC
1294 elif grep -q done "$LOADCPUFREQ" ; then
1295 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1296 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1297 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1299 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1303 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1304 . /usr/bin/cpufreq-detect.sh
1305 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1306 einfo "Loading modules ${MODULE}"
1307 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1309 if [[ $RC == 0 ]]; then
1316 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1320 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1321 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1322 if modprobe cpufreq_ondemand ; RC=$? ; then
1323 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1324 echo ondemand > $file
1334 fi # checkbootparam nocpu
1338 # {{{ autostart of ssh
1340 if checkbootparam ssh ; then
1341 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1342 einfo "Bootoption passwd found."
1343 if [ -n "$SSH_PASSWD" ] ; then
1344 echo "grml:$SSH_PASSWD" | chpasswd -m
1345 einfo "Starting secure shell server in background."
1346 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1347 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1350 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1353 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1359 # {{{ set password for user grml
1361 if checkbootparam passwd >>$DEBUG 2>&1; then
1362 einfo "Bootoption passwd found."
1363 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1364 if [ -n "$PASSWD" ] ; then
1365 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1367 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1370 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1376 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1378 if checkbootparam home ; then
1379 HOMEDIR="$(getbootparam home)"
1383 if [ -n "$HOMEDIR" ]; then
1384 einfo "Bootoption home detected." && eend 0
1387 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1388 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1389 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1390 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1393 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1394 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1395 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1396 MYHOMEDIR="$HOMEDIR"
1398 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1399 MYHOMEDIR="$(findfile grml.img)"
1400 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1401 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1402 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1405 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1406 eerror "Option ignored." ; eend 1
1411 if [ -n "$MYHOMEDIR" ]; then
1412 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1413 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1414 while read device mountpoint fs relax; do
1415 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1418 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1422 # Note: This currently won't work with encrypted partitions
1423 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1424 if [ ! -f "$MYHOMEDIR" ]; then
1425 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1426 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1431 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1432 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1433 if [ -f "$MYHOMEDIR" ]; then
1434 # It's a loopback file, mount it over the /home/grml directory
1435 trymount "$MYHOMEDIR" /home/grml
1437 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1441 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1445 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1447 fi # mount -o remount,rw,...
1450 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1454 fi # if trymount ...
1456 fi # checkbootparam home
1460 # {{{ Check for scripts on CD-ROM
1461 config_cdrom_scripts(){
1462 if checkbootparam "script"; then
1463 for script in /cdrom/scripts/* ; do
1464 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1473 if ! [ -x /usr/bin/aumix ] ; then
1474 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1477 if ! [ -r /proc/asound/cards ] ; then
1478 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1482 if checkbootparam vol ; then
1483 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1484 if [ -z "$VOL" ] ; then
1485 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1492 if checkbootparam nosound ; then
1493 einfo "Muting sound devices on request."
1494 # some IBM notebooks require the following stuff:
1495 if [ -x /usr/bin/amixer ] ; then
1496 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1497 amixer set Front unmute 1>/dev/null
1498 amixer set Front 0% 1>/dev/null
1501 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1502 if [ -n "$ERROR" ] ; then
1504 eerror "Problem muting sound devices: $ERROR"
1508 elif [ -z "$INSTALLED" ]; then
1509 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1510 # some IBM notebooks require the following stuff:
1511 if [ -x /usr/bin/amixer ] ; then
1512 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1513 amixer set Front unmute 1>/dev/null
1514 amixer set Front ${VOL}% 1>/dev/null
1517 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1518 if [ -n "$ERROR" ] ; then
1520 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1530 # {{{ modem detection
1532 if checkbootparam "nomodem"; then
1533 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1535 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1536 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1537 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1545 # {{{ keyboard add-ons
1546 config_setkeycodes(){
1547 if checkbootparam "setkeycodes" ; then
1548 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1549 # MS MM keyboard add-on
1551 setkeycodes e001 126 &>/dev/null
1552 setkeycodes e059 127 &>/dev/null
1554 setkeycodes e03b 59 &>/dev/null
1555 setkeycodes e008 60 &>/dev/null
1556 setkeycodes e007 61 &>/dev/null
1557 setkeycodes e03e 62 &>/dev/null
1558 setkeycodes e03f 63 &>/dev/null
1559 setkeycodes e040 64 &>/dev/null
1560 setkeycodes e041 65 &>/dev/null
1561 setkeycodes e042 66 &>/dev/null
1562 setkeycodes e043 67 &>/dev/null
1563 setkeycodes e023 68 &>/dev/null
1564 setkeycodes e057 87 &>/dev/null
1565 setkeycodes e058 88 &>/dev/null
1567 setkeycodes e00a 89 e008 90 &>/dev/null
1574 config_wondershaper(){
1575 if checkbootparam "wondershaper" ; then
1576 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1581 if [ -n "$WONDER" ]; then
1583 DEVICE="${WONDER%%,*}"
1585 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1587 DOWNSTREAM="${WONDER%%,*}"
1589 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1591 UPSTREAM="${WONDER%%,*}"
1596 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1597 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1598 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1599 einfo "Starting wondershaper (${CMD}) in background."
1600 ( sh -c $CMD & ) && eend 0
1607 if checkbootparam "nosyslog"; then
1608 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1610 einfo "Starting syslog-ng in background."
1611 /etc/init.d/syslog-ng start 1>>$DEBUG &
1619 if checkbootparam "nogpm"; then
1620 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1622 einfo "Starting gpm in background."
1623 # /etc/init.d/gpm start 1>>$DEBUG &
1624 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1632 if checkbootparam "services" ; then
1633 SERVICE="$(getbootparam services 2>>$DEBUG)"
1634 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1635 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1636 einfo "Starting service(s) ${SERVICENL} in background."
1637 for service in $(echo -e $SERVICELIST) ; do
1638 /etc/init.d/${service} start 1>>$DEBUG &
1640 [ "$?" == "0" ] ; eend $?
1647 if checkbootparam netconfig ; then
1648 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1649 CONFIGFILE='/tmp/netconfig.grml'
1652 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1653 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1655 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1657 while ! getconfig && [[ "$counter" != 0 ]] ; do
1658 echo -n "Sleeping for 5 seconds and trying to get config again... "
1659 counter=$(( counter-1 ))
1660 echo "$counter tries left" ; sleep 1
1662 if [ -r "$CONFIGFILE" ] ; then
1663 einfo "Downloading was successfull." ; eend 0
1664 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1665 md5sum $CONFIGFILE ; eend 0
1666 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1668 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1675 config_blindsound(){
1676 if checkbootparam "blind" ; then
1678 flite -o play -t "welcome to the gremel system"
1685 if checkbootparam welcome ; then
1686 flite -o play -t "welcome to the gremel system"
1691 # {{{ fix/workaround for unionfs
1693 if [ -z "$INSTALLED" ]; then
1694 touch /var/cache/apt/*cache.bin
1699 # {{{ create all /mnt-directories
1701 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1702 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1706 # {{{ start X window system via grml-x
1708 if checkbootparam startx ; then
1709 if [ -x /usr/X11R6/bin/X ] ; then
1710 if [ -z "$INSTALLED" ] ; then
1711 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1712 if [ -z "$WINDOWMANAGER" ] ; then
1713 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1714 WINDOWMANAGER="wm-ng"
1716 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1718 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1719 config_userfstab || fstabuser='grml'
1720 cat>|/etc/init.d/xstartup<<EOF
1722 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1723 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1725 chmod 755 /etc/init.d/xstartup
1727 # adjust inittab for xstartup
1728 if grep -q '^6:' /etc/inittab ; then
1729 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1730 else # just append tty6 to inittab if no definition is present:
1731 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1734 /sbin/telinit q ; eend $?
1736 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1737 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1739 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1743 eerror "We are not running from CD - startx will not work, skipping it.
1744 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1747 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1748 Boot parameter startx does not work therefore." ; eend 1
1754 # {{{ configuration framework
1756 if checkbootparam extract ; then
1757 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1758 EXTRACTOPTIONS="-- -x $EXTRACT"
1763 if checkbootparam noautoconfig || checkbootparam forensic ; then
1764 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1766 if [ -z "$INSTALLED" ] ; then
1767 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1769 [ -d /mnt/grml ] || mkdir /mnt/grml
1770 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1771 # We do need the following fix so floppy disk is available to blkid in any case :-/
1772 if [ -r /dev/fd0 ] ; then
1773 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1774 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1775 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1776 blkid /dev/fd0 1>>$DEBUG 2>&1
1779 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1780 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1781 if [[ $RC == 0 ]]; then
1782 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1785 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1786 if [ -n "$CONFIG" ]; then
1787 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1789 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1791 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1795 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1796 if [ -n "$SCRIPT" ]; then
1797 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1800 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1802 ewarn "No devices with label GRMLCFG found." ; eend 0
1811 if checkbootparam "config" ; then
1812 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1813 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1814 einfo "Bootoption config found. config is set to: $CONFIG"
1816 einfo "Trying to extract configuration file ${CONFIG}:"
1817 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1821 if checkbootparam myconfig ; then
1822 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1823 if [ -n "$MOUNTDEVICE" ]; then
1824 if checkbootparam file ; then
1825 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1826 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1828 [ -d /mnt/grml ] || mkdir /mnt/grml
1829 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1830 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1831 if [[ $RC == 0 ]]; then
1832 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1835 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1836 if [ -n "$CONFIG" ]; then
1837 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1839 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1841 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1845 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1846 if [ -n "$SCRIPT" ]; then
1847 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1852 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1853 fi # mount $MOUNTDEVICE
1854 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1856 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1857 fi # [ -n "$MOUNTDEVICE" ]
1858 fi # checkbootparam myconfig
1860 if checkbootparam "partconf" ; then
1861 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1862 if [ -n "$MOUNTDEVICE" ]; then
1863 [ -d /mnt/grml ] || mkdir /mnt/grml
1864 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1865 if [[ $RC == 0 ]]; then
1866 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1867 einfo "Copying files from $MOUNTDEVICE over grml system."
1868 for file in `cat /etc/grml/partconf` ; do
1869 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1870 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1873 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1874 fi # mount $MOUNTDEVICE
1875 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1877 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1878 fi # [ -n "$MOUNTDEVICE" ]
1883 # {{{ /cdrom/.*-options
1885 if checkbootparam "debs" ; then
1886 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1887 einfo "Tring to install debian package(s) ${DEBS}"
1888 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1893 if checkbootparam "scripts" ; then
1894 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1895 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1896 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1897 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1904 if checkbootparam "distcc" ; then
1905 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1906 if [ -n "$OPTIONS" ]; then
1909 if [ -n "$OPTIONS" ]; then
1910 NET="${OPTIONS%%,*}"
1912 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1914 INTERFACE="${OPTIONS%%,*}"
1919 CONFIG=/etc/default/distcc
1920 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1921 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1923 if [ -n "$INTERFACE" ] ; then
1924 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1927 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1928 counter=$(( counter-1 ))
1929 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1931 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1935 if [ -n "$IP" ] ; then
1936 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1938 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1940 id distccd >/dev/null 2>&1 || \
1942 einfo "Creating distcc user" ; \
1943 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1946 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1947 /etc/init.d/distcc start 1>/dev/null ; eend $?
1950 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1954 if checkbootparam "gcc"; then
1955 GCC="$(getbootparam gcc 2>>$DEBUG)"
1957 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1960 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1963 if checkbootparam "gpp"; then
1964 GPP="$(getbootparam gpp 2>>$DEBUG)"
1966 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1967 if [ -x /usr/bin/g++-${GPP} ] ; then
1969 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1971 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1972 if [ -x /usr/bin/cpp-${GPP} ] ; then
1974 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1983 # Notice: use it only on live-cd system, if running from harddisk please
1984 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1985 # in /etc/runlevel.conf
1987 MODULES_FILE=/etc/grml/modules
1988 if checkbootparam nomodules ; then
1989 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1990 elif [ -z "$INSTALLED" ]; then
1991 if [ -r $MODULES_FILE ] ; then
1992 einfo "Loading modules specified in ${MODULES_FILE}:"
1994 grep '^[^#]' $MODULES_FILE | \
1995 while read module args; do
1996 [ "$module" ] || continue
1998 modprobe $module $args ; eend $?
2002 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2009 config_915resolution(){
2010 if checkbootparam "915resolution" ; then
2011 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2012 if [ -x /usr/sbin/915resolution ]; then
2017 if [ -n "$OPTIONS" ]; then
2019 MODE="${OPTIONS%%,*}"
2021 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2023 XRESO="${OPTIONS%%,*}"
2025 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2027 YRESO="${OPTIONS%%,*}"
2032 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2033 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2042 if [ -z "$INSTALLED" ] ; then
2043 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2044 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2045 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2046 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2048 if ! [ -x /sbin/mdadm ] ; then
2049 eerror "mdadm not available, can not execute it." ; eend 1
2052 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2053 # find out whether we have a valid configuration file already
2054 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2055 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2056 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2057 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2059 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2062 if ! checkbootparam 'swraid' ; then
2064 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2067 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2072 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2074 *'No arrays found'*)
2075 ewarn "$line" ; eend 0
2078 einfo "$line" ; eend 0
2085 if [ -r /proc/mdstat ] ; then
2087 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2088 if [ -z "$MDSTAT" ] ; then
2089 ewarn "No active arrays found" ; eend 0
2094 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2095 einfo "active arrays: $line" ; eend 0
2101 fi # bootoption swraid
2103 fi # is /sbin/mdadm executable?
2104 fi # check for bootoptions
2105 fi # run only in live-cd mode
2109 # {{{ LVM (Logical Volumes)
2111 if [ -z "$INSTALLED" ] ; then
2112 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2113 if checkbootparam 'nolvm' ; then
2114 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2116 if ! [ -x /sbin/lvm -a -x /etc/init.d/lvm2 -a -x /sbin/lvdisplay ] ; then
2117 eerror "LVM not available, can not execute it." ; eend 1
2119 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2120 einfo "You seem to have logical volumes (LVM) on your system."
2122 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2124 if checkbootparam 'lvm' ; then
2125 einfo "Bootoption LVM found. Searching for logical volumes:"
2126 /etc/init.d/lvm2 start ; eend $?
2130 fi # check for lvm binary
2131 fi # check for bootoption nolvm
2132 fi # run only in live-cd mode
2136 # {{{ debnet: setup network based on an existing one found on a partition
2138 if checkbootparam "debnet" ; then
2139 iszsh && setopt shwordsplit
2140 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2141 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2144 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2146 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2147 for i in $DEVICES; do
2148 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2149 einfo "Scanning on $i"
2150 if [ -f /mnt/etc/network/interfaces ]; then
2151 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2159 if [ -n "$FOUND_DEBNET" ]; then
2160 einfo "Stopping network."
2161 pump -k 1>/dev/null 2>&1
2162 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2163 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2164 rm -rf /etc/network/run
2165 cp -a /mnt/etc/network /etc
2166 rm -rf /etc/network/run
2167 mkdir /etc/network/run
2168 umount /mnt ; eend $?
2169 einfo "Starting network."
2170 /etc/init.d/networking start ; eend $?
2172 eerror "/etc/network/interfaces not found." ; eend 1
2176 eerror "Error: /mnt already mounted." ; eend 1
2182 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2184 if grep -q ipw3945 /proc/modules ; then
2185 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2186 ewarn "Broken ipw3945 network interface found, reloading module."
2195 # {{{ disable console blanking
2197 if checkbootparam "noblank" ; then
2198 einfo "Bootoption noblank found. Disabling monitor blanking."
2199 setterm -blank 0 ; eend $?
2204 # {{{ grml2hd: automatic installation
2207 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2209 if checkbootparam "user" ; then
2211 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2212 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2215 if checkbootparam "filesystem" ; then
2217 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2218 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2221 if checkbootparam "partition" ; then
2223 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2224 # notice: the following checks whether the given partition is available, if not the skip
2225 # execution of grml2hd as it might result in data loss...
2226 if [ -r $PARTITION ] ; then
2227 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2229 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2233 if checkbootparam "mbr" ; then
2235 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2236 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2239 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2241 GRML2HD_NONINTERACTIVE='yes' grml2hd
2244 chmod 755 /usr/bin/grml2hd_noninteractive
2245 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2246 if [ -z "$GRML2HD_FAIL" ] ; then
2247 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2249 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2252 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2256 # {{{ debootstrap: automatic installation
2257 config_debootstrap(){
2259 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2261 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2263 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2265 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2270 if checkbootparam "target" ; then
2272 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2273 # notice: the following checks whether the given partition is available, if not the skip
2274 # execution of grml-debootstrap as it might result in data loss...
2275 if ! [ -r "$TARGET" ] ; then
2276 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2280 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2285 if checkbootparam "grub" ; then
2287 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2290 if checkbootparam "groot" ; then
2292 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2295 if checkbootparam "release" ; then
2297 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2300 if checkbootparam "mirror" ; then
2302 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2305 if checkbootparam "boot_append" ; then
2307 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2310 if checkbootparam "password" ; then
2312 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2315 # now check which options are available
2316 if [ -n "TARGET" ] ; then
2317 TARGETCMD="--target $TARGET"
2321 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2325 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2326 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2327 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2328 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2329 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2330 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2332 # and finally write script and execute it
2333 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2335 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2338 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2340 screen /usr/bin/grml-debootstrap_noninteractive
2341 einfo "Invoking a shell, just exit to continue booting..."
2344 fi # stringinstring "BOOT_IMAGE=debian2hd
2348 # {{{ Support customization
2350 if checkbootparam "distri"; then
2351 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2352 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2353 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2354 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2355 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2356 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2362 ### {{{ backwards compatible stuff
2363 config_environment(){
2364 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2367 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2371 ## END OF FILE #################################################################
2372 # vim:foldmethod=marker expandtab ai ft=zsh