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 Sep 20 15:31:56 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 /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 if checkgrmlsmall && [ -z "$INSTALLED" ] ; then
274 ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0
276 einfo "Setting up unicode environment."
277 unicode_start 2>>$DEBUG ; eend $?
282 # Set default keyboard before interactive setup
283 if [ -n "$KEYTABLE" ] ; then
284 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
285 loadkeys -q $KEYTABLE &
289 # we have to set up all consoles, therefore loop it over all ttys:
290 NUM_CONSOLES=`fgconsole --next-available`
291 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
292 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
293 if [ -n "$CHARMAP" ] ; then
294 einfo "Running consolechars for ${CHARMAP}"
295 for vc in `seq 0 ${NUM_CONSOLES}` ; do
296 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
300 if [ -n "$CONSOLEFONT" ] ; then
301 einfo "Running consolechars using ${CONSOLEFONT}"
302 for vc in `seq 0 ${NUM_CONSOLES}` ; do
303 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
314 if checkbootparam hostname ; then
315 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
316 einfo "Setting hostname to $HOSTNAME as requested."
317 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
318 hostname $HOSTNAME ; eend $?
320 hostname --file /etc/hostname
325 # fstabuser (needed when running from harddisk with username != grml {{{
327 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
328 if [ -n "$CONFIG_FSTAB_USER" ] ; then
329 fstabuser="$CONFIG_FSTAB_USER"
331 fstabuser=$(getent passwd 1000 | cut -d: -f1)
333 # if not yet set fall back to default 'grml' user
334 [ -n "$fstabuser" ] || fstabuser='grml'
338 # {{{ Set clock (Local time is more often used than GMT, so it is default)
340 # don't touch the files if running from harddisk:
341 if [ -z "$INSTALLED" ]; then
343 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
344 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
345 # hwclock uses the TZ variable
346 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
347 [ -n "$TZ" ] || TZ=Europe/Vienna
349 if ! [ -r /dev/rtc ] ; then
350 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
352 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
353 if [ -n "$ERROR" ] ; then
355 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
356 if [ -n "$ERROR" ] ; then
357 eerror "Problem running hwclock: $ERROR" ; eend 1
366 # {{{ print kernel info
368 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
369 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
370 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
371 if [ -r /proc/cpuinfo ] ; then
372 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
374 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
378 if [ -d /proc/xen ] ; then
380 einfo 'Running kernel featuring support for Xen detected' ; eend 0
386 # {{{ vmware specific stuff
388 if checkbootparam novmware ; then
389 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
391 if [ -z "$INSTALLED" ] ; then
392 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
393 if ! checkbootparam qemu ; then
394 if [ -r /etc/X11/xorg.conf.vmware ] ; then
395 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
396 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
405 # {{{ qemu specific stuff
407 if checkbootparam qemu ; then
408 if [ -r /etc/X11/xorg.conf.example ] ; then
409 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
410 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
416 # {{{ ld.so.cache + depmod
418 if [ -n "$INSTALLED" ]; then
419 if ! [ -r /etc/grml.first.boot ] ; then
420 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
422 # Regenerate ld.so.cache and module dependencies on HD
423 einfo "Running ldconfig" ; ldconfig ; eend $?
424 einfo "Running depmod" ; depmod -a ; eend $?
425 touch /etc/grml.first.boot
433 # update_progress {{{
435 # be sure we are non-blocking
436 (echo "$1" > /etc/sysconfig/progress) &
442 # don't touch the files if running from harddisk:
443 if [ -z "$INSTALLED" ]; then
444 KTZ="$(getbootparam tz 2>>$DEBUG)"
445 if [ -n "$KTZ" ] ; then
446 einfo "Setting timezone."
447 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
449 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
455 # small computer / nearly no ram {{{
458 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
459 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
462 if checkbootparam "small"; then
463 einfo "Information: ${RAM} kB of RAM available." ; eend 0
464 einfo "Bootoption small detected. Activating small system."
465 if [ -r /etc/inittab.small ] ; then
466 mv /etc/inittab /etc/inittab.normal
467 mv /etc/inittab.small /etc/inittab
469 sed -i 's/^9/#&/' /etc/inittab
470 sed -i 's/^10/#&/' /etc/inittab
471 sed -i 's/^11/#&/' /etc/inittab
472 sed -i 's/^12/#&/' /etc/inittab
474 /sbin/telinit q ; eend $?
476 if checkgrmlsmall ; then
477 if [[ $RAM -lt 25000 ]] ; then
478 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
479 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
480 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
481 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
484 einfo "Information: ${RAM} kB of RAM available." ; eend 0
487 if [[ $RAM -lt 58000 ]] ; then
488 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
489 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
490 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
491 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
494 einfo "Information: ${RAM} kB of RAM available." ; eend 0
502 # skip startup of w3m {{{
504 if checkbootparam "fast"; then
505 ewarn "Bootoption fast detected. Skipping startup of w3m."
506 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
507 /sbin/telinit q ; eend $?
512 # activate serial console {{{
514 if checkbootparam "console"; then
515 einfo "Bootoption (for serial) console detected."
517 if [ -r /etc/mgetty/mgetty.config ] ; then
518 MODE=$(getbootparam console | awk -F, '{print $2}')
520 [ -n "$MODE" ] || MODE=9600 # default mode
521 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
522 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
525 einfo "Activating mgetty."
526 sed -i 's/^#T0/T0/' /etc/inittab
527 sed -i 's/^#T1/T1/' /etc/inittab
528 /sbin/telinit q ; eend $?
534 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
537 for DEVICE in /proc/ide/hd?; do
538 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
540 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
544 # {{{ Bring up loopback interface now
546 if [ -z "$INSTALLED" ] ; then
547 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
548 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
556 # firewire devices {{{
557 # the raw1394 driver does not yet export info into SYSFS,
558 # so let's create raw1394 device manually
559 # http://www.michael-prokop.at/blog/index.php?p=352
560 config_firewire_dev(){
561 if checkbootparam "nofirewiredev" ; then
562 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
564 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
565 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
566 # cd /dev && MAKEDEV video1394 raw1394
567 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
568 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
569 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
570 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
571 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
572 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
578 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
579 # otherwise we will get: passwd: Authentication token lock busy
581 if [ -z "$INSTALLED" ] ; then
589 if [ -n "$TESTCD" ]; then
590 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
591 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
594 # /linuxrc grml version:
595 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
596 # live-initramfs version:
597 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
599 if [ -n "$TESTCD_PATH" ] ; then
600 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log )
602 echo "${RED} *** Error: Could not find md5sum file. ***"
605 if [ "$?" = "0" ]; then
606 echo " ${GREEN}Everything looks OK${NORMAL}"
608 echo "${RED} *** CHECKSUM FAILED FOR THESE FILES: ***"
609 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
610 echo "${RED} *** DATA ON YOUR CD MEDIUM IS POSSIBLY INCOMPLETE OR DAMAGED, ***${NORMAL}"
611 echo "${RED} *** OR YOUR COMPUTER HAS BAD RAM. ***${NORMAL}"
612 echo -n "${CYAN}Hit return to contine, or press the reset button to quit.${NORMAL}"
621 # {{{ hardware detection via discover
623 if checkbootparam "nodisc" ; then
624 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
626 if [ -x /sbin/discover ] ; then
627 einfo "Discovering hardware. Trying to load the following modules in background:"
629 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)"
631 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
634 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
640 # {{{ hardware detection via hwinfo
642 if checkbootparam hwinfo >>$DEBUG 2>&1; then
643 einfo "Discovering hardware via hwinfo:"
644 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
645 echo -n " Loading modules: "
646 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
652 # {{{ disable hotplug agents on request
653 config_hotplug_agent(){
654 if checkbootparam "noagent" ; then
655 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
656 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
657 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
658 einfo "Disabling hotplug-agent(s) $AGENTNL"
659 for agent in $(echo -e $AGENTLIST) ; do
660 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
662 [ "$?" == "0" ] ; eend $?
667 # {{{ blacklist of hotplug-modules
668 config_hotplug_blacklist(){
669 if checkbootparam "black" ; then
670 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
671 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
672 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
673 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
674 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
675 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
683 if checkbootparam "nohotplug" ; then
684 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
686 if [ -r /etc/init.d/hotplug ] ; then
687 einfo "Starting hotplug system in background."
688 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
690 elif [ -r /etc/init.d/hotplug-light ] ; then
691 einfo "Starting hotplug-light system in background."
692 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
695 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
701 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
703 if checkbootparam "blacklist" ; then
704 if [ -z "$INSTALLED" ]; then
705 einfo "Bootoption blacklist found."
706 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
707 if [ -n "$BLACK" ] ; then
708 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
709 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
710 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
711 echo "alias $BLACK off" >> /etc/modprobe.d/grml
712 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
714 eerror "No given module for blacklist found. Blacklisting will not work therefore."
717 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
719 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
728 if [ -d /proc/acpi ]; then
729 if checkbootparam "noacpi"; then
730 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
731 elif checkbootparam "nogrmlacpi" ; then
732 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
734 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
737 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
739 basename="${basename%%.*}"
740 case "$basename" in *_acpi)
741 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
743 modprobe $basename >>$DEBUG 2>&1 && found="yes"
744 local BASE="$BASE $basename"
746 if [ -n "$found" ] ; then
747 einfo "$BASE" ; eend 0
749 ewarn "(none)" ; eend 1
751 if ! [ -S /var/run/acpid.socket ] ; then
752 if ! [ -r /var/run/dbus/pid ] ; then
753 einfo "Starting acpi daemon."
754 /etc/init.d/acpid start 2>&1 1>>$DEBUG | logger ; eend $?
756 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
757 eerror "Solution: please activate acpid via /etc/runlevel.conf"
761 ewarn "acpi daemon already running."
768 if checkbootparam "noapm"; then
769 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
771 modprobe apm power_off=1 >>$DEBUG 2>&1
772 if [ "$?" = "0" ] ; then
773 if [ -x /etc/init.d/apmd ] ;then
774 einfo "APM Bios found, enabling power management functions."
775 /etc/init.d/apmd start ; eend $?
778 eerror "Loading apm module failed." ; eend 1
785 # {{{ PCMCIA Check/Setup
786 # This needs to be done before other modules are being loaded (by hwsetup)
788 if checkbootparam "nopcmcia"; then
789 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
791 if /usr/sbin/laptop-detect ; then
792 einfo "Detected Laptop - checking for PCMCIA." && eend 0
793 modprobe pcmcia_core >>$DEBUG 2>&1
794 # Try Cardbus or normal PCMCIA socket drivers
795 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
796 if [ "$?" = "0" ]; then
797 modprobe ds >>$DEBUG 2>&1
798 if [ -d /proc/bus/pccard ] ; then
799 if [ -x /sbin/cardmgr ] ; then
800 einfo "PCMCIA found, starting cardmgr."
801 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
803 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
812 # {{{ run software synthesizer via speakup
814 if checkbootparam swspeak ; then
815 if [ -d /proc/speakup/ ] ; then
816 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
818 if [ -x /etc/init.d/speech-dispatcher ] ; then
819 einfo "Starting speech-dispatcher."
820 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
821 einfo "Activating sftsyn in Kernel."
822 echo sftsyn >/proc/speakup/synth_name ; eend $?
823 einfo "Just run swspeak if you want to use software synthesizer via speakup."
824 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
826 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
827 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
831 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
832 flite -o play -t "Kernel does not seem to support speakup. Sorry."
838 # {{{ Check for blind option or brltty
841 checkbootparam "blind" && BLIND="yes"
842 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
844 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
845 if [ -x /sbin/brltty ]; then
846 # Blind option detected, start brltty now.
847 # modprobe serial_core parport_serial generic_serial && echo "done"
852 if [ -n "$BRLTTY" ]; then
854 BRLTYPE="${BRLTTY%%,*}"
856 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
858 BRLDEV="${BRLTTY%%,*}"
860 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
862 BRLTEXT="${BRLTTY%%,*}"
867 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
868 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
869 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
870 einfo "Starting braille-display manager."
873 sleep 2 && BLINDSOUND="yes"
880 # {{{ Interactive configuration
881 config_interactive(){
882 ewarn "config_interactive is deprecated nowadays."
883 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
889 if checkbootparam forceagp ; then
890 # Probe for AGP. Hope this can fail safely
891 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
897 config_automounter(){
898 if checkbootparam automounter ; then
899 RUNLEVEL="$(runlevel)"
901 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
906 if [ -n "$AUTOMOUNTER" ]; then
907 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
908 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
909 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
910 anew="$d -fstype=auto,$2 :$i"
911 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
912 AUTOMOUNTS="$AUTOMOUNTS $d"
913 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
915 [ -d /mnt/$d ] && mkdir -p /mnt/$d
916 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
918 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
921 AUTOMOUNTS="floppy cdrom"
922 # Add new devices to /etc/fstab and /etc/auto.mnt
923 for i in /dev/cdrom?*; do
925 addautomount "$i" "ro"
930 if [ -n "$AUTOMOUNTER" ]; then
931 # Check for floppy dir, reinstall with automounter
932 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
933 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
934 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
935 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
936 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
937 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
939 # Replace paths from bootfloppy
940 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
941 mv -f /etc/fstab.new /etc/fstab
942 # Start automounter now
943 einfo "Starting automounter for ${AUTOMOUNTS}."
944 /etc/init.d/autofs start >>$DEBUG ; eend $?
949 # {{{ Collect partitions from /proc/partitions first for enabling DMA
953 while read major minor blocks partition relax; do
954 partition="${partition##*/}"
955 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
957 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
958 sd?) ;; # SCSI Harddisk, entire disk
959 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
960 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
963 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
966 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
969 # {{{ Enable DMA for all IDE drives now if not disabled
970 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
972 if checkbootparam "nodma"; then
973 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
975 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
976 if test -d /proc/ide/$d; then
977 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
978 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
979 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
980 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
981 echo "using_dma:1" >/proc/ide/$d/settings
990 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
993 NOSWAP="yes" # we do not use swap by default!
994 if checkbootparam "swap" || checkbootparam "anyswap" ; then
996 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
999 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1000 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1002 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1003 iszsh && setopt nonomatch
1004 if [ -x /usr/sbin/rebuildfstab ] ; then
1005 config_userfstab || fstabuser=grml
1006 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1008 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1010 fi # checkbootparam nofstab/forensic
1012 # Scan for swap, config, homedir - but only in live-mode
1013 if [ -z "$INSTALLED" ] ; then
1014 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1017 HOMEDIR="$(getbootparam home)"
1018 if [ -n "$partitions" ]; then
1019 while read p m f relax; do
1020 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1021 partoptions="users,exec"
1023 # it's a swap partition?
1026 if [ -n "$NOSWAP" ]; then
1027 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1030 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1031 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1032 if [ -n "$ANYSWAP" ] ; then
1033 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1034 swapon $p 2>>$DEBUG ; eend $?
1036 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1040 if [[ "$p" == LABEL* ]] ; then
1041 p=$(blkid -t $p | awk -F: '{print $1}')
1043 if grep -q $p /proc/swaps ; then
1044 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1046 if [ -b "$p" ] ; then
1047 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1048 swapon $p 2>>$DEBUG ; eend $?
1050 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1059 esac # it's a swap partition?
1064 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1065 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1067 # *) NONEFOUND='1'; continue ;;
1071 if [ -z "$NOSWAP" ] ; then
1072 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1073 # Activate swapfile, if exists
1074 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1076 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1077 mount -o remount,rw $m && MOUNTED=1
1078 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1080 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1082 fnew="$SWAPFILE swap swap defaults 0 0"
1083 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1084 GRML_SWP="$GRML_SWP $SWAPFILE"
1087 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1090 # use a image as home
1091 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1092 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1093 if [ -n "$HOMEDIR" ]; then
1094 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1098 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1100 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1105 # Umount, if not in use
1106 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1118 if [ -n "$MOUSE_DEVICE" ] ; then
1119 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1124 # {{{ IPv6 configuration
1125 # Load IPv6 kernel module and print IP adresses
1127 if checkbootparam "ipv6"; then
1128 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1130 # we probably need some time until stateless autoconfiguration has happened
1132 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1133 for DEVICE in `echo "$NETDEVICES"`; do
1136 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1137 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1139 for ADDR in `echo "$ADDRESSES"` ; do
1142 if [ "$COUNT" -eq "0" ] ; then
1143 einfo "(none)" ; eend 1
1153 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1155 if checkbootparam "nodhcp"; then
1156 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1158 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1159 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1160 for DEVICE in `echo "$NETDEVICES"` ; do
1161 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1163 ifconfig $DEVICE up >>$DEBUG 2>&1
1164 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1169 if [ -n "$INSTALLED" ] ; then
1170 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1177 # {{{ helper functions
1180 # search all partitions for a file in the root directory
1181 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1182 # See if it's already mounted
1183 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1184 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1185 [ -f "$i/$1" ] && FOUND="$i/$1"
1186 umount -l "$i" 2>>$DEBUG
1187 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1194 case "$(file -s $1)" in
1195 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1196 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1197 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1198 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1199 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1200 *data*) echo "invalid"; return 0;;
1201 *) echo "auto"; return 0;;
1205 # Try to mount this filesystem read-only, without or with encryption
1207 # Check if already mounted
1208 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1209 # Apparently, mount-aes DOES autodetect AES loopback files.
1210 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1211 # We need to mount crypto-loop files with initial rw support
1212 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1214 [ "$RC" = "0" ] && return 0
1216 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1218 while [ "$a" != "n" -a "$a" != "N" ]; do
1219 # We need to mount crypto-loop files with initial rw support
1220 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1221 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1222 # Problem with ioctl() from getpasswd()?
1232 if checkbootparam "nocpu"; then
1233 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1235 # check module dependencies
1237 if [ -e /lib64 ] ; then
1238 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1240 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1244 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1245 einfo "Detecting CPU:"
1246 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)
1247 echo $CPU | sed 's/ \{1,\}/ /g'
1250 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
1253 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1254 # * it only if we have the according kernel modules available
1255 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1256 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1257 # -> parse output of the initscript and output it according to our look'n'feel
1258 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1259 if ! cpufreq_check ; then
1260 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1262 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1263 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1264 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1265 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1266 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1270 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1272 if [ -x /etc/init.d/loadcpufreq ] ; then
1273 SKIP_CPU_GOVERNOR=''
1274 LOADCPUFREQ=$(mktemp)
1275 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1276 if grep -q FATAL "$LOADCPUFREQ" ; then
1282 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1283 eerror "$line" ; eend $RC
1287 elif grep -q done "$LOADCPUFREQ" ; then
1288 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1289 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1290 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1292 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1296 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1297 . /usr/bin/cpufreq-detect.sh
1298 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1299 einfo "Loading modules ${MODULE}"
1300 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1302 if [[ $RC == 0 ]]; then
1309 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1313 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1314 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1315 if modprobe cpufreq_ondemand ; RC=$? ; then
1316 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1317 echo ondemand > $file
1327 fi # checkbootparam nocpu
1331 # {{{ autostart of ssh
1333 if checkbootparam ssh ; then
1334 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1335 einfo "Bootoption passwd found."
1336 if [ -n "$SSH_PASSWD" ] ; then
1337 echo "grml:$SSH_PASSWD" | chpasswd -m
1338 einfo "Starting secure shell server in background."
1339 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1340 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1343 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1346 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1352 # {{{ set password for user grml
1354 if checkbootparam passwd >>$DEBUG 2>&1; then
1355 einfo "Bootoption passwd found."
1356 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1357 if [ -n "$PASSWD" ] ; then
1358 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1360 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1363 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1369 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1371 if checkbootparam home ; then
1372 HOMEDIR="$(getbootparam home)"
1376 if [ -n "$HOMEDIR" ]; then
1377 einfo "Bootoption home detected." && eend 0
1380 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1381 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1382 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1383 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1386 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1387 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1388 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1389 MYHOMEDIR="$HOMEDIR"
1391 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1392 MYHOMEDIR="$(findfile grml.img)"
1393 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1394 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1395 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1398 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1399 eerror "Option ignored." ; eend 1
1404 if [ -n "$MYHOMEDIR" ]; then
1405 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1406 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1407 while read device mountpoint fs relax; do
1408 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1411 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1415 # Note: This currently won't work with encrypted partitions
1416 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1417 if [ ! -f "$MYHOMEDIR" ]; then
1418 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1419 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1424 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1425 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1426 if [ -f "$MYHOMEDIR" ]; then
1427 # It's a loopback file, mount it over the /home/grml directory
1428 trymount "$MYHOMEDIR" /home/grml
1430 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1434 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1438 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1440 fi # mount -o remount,rw,...
1443 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1447 fi # if trymount ...
1449 fi # checkbootparam home
1453 # {{{ Check for scripts on CD-ROM
1454 config_cdrom_scripts(){
1455 if checkbootparam "script"; then
1456 for script in /cdrom/scripts/* ; do
1457 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1466 if ! [ -x /usr/bin/aumix ] ; then
1467 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1470 if ! [ -r /proc/asound/cards ] ; then
1471 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1475 if checkbootparam vol ; then
1476 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1477 if [ -z "$VOL" ] ; then
1478 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1485 if checkbootparam nosound ; then
1486 einfo "Muting sound devices on request."
1487 # some IBM notebooks require the following stuff:
1488 if [ -x /usr/bin/amixer ] ; then
1489 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1490 amixer set Front unmute 1>/dev/null
1491 amixer set Front 0% 1>/dev/null
1494 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1495 if [ -n "$ERROR" ] ; then
1497 eerror "Problem muting sound devices: $ERROR"
1501 elif [ -z "$INSTALLED" ]; then
1502 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1503 # some IBM notebooks require the following stuff:
1504 if [ -x /usr/bin/amixer ] ; then
1505 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1506 amixer set Front unmute 1>/dev/null
1507 amixer set Front ${VOL}% 1>/dev/null
1510 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1511 if [ -n "$ERROR" ] ; then
1513 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1523 # {{{ modem detection
1525 if checkbootparam "nomodem"; then
1526 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1528 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1529 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1530 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1538 # {{{ keyboard add-ons
1539 config_setkeycodes(){
1540 if checkbootparam "setkeycodes" ; then
1541 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1542 # MS MM keyboard add-on
1544 setkeycodes e001 126 &>/dev/null
1545 setkeycodes e059 127 &>/dev/null
1547 setkeycodes e03b 59 &>/dev/null
1548 setkeycodes e008 60 &>/dev/null
1549 setkeycodes e007 61 &>/dev/null
1550 setkeycodes e03e 62 &>/dev/null
1551 setkeycodes e03f 63 &>/dev/null
1552 setkeycodes e040 64 &>/dev/null
1553 setkeycodes e041 65 &>/dev/null
1554 setkeycodes e042 66 &>/dev/null
1555 setkeycodes e043 67 &>/dev/null
1556 setkeycodes e023 68 &>/dev/null
1557 setkeycodes e057 87 &>/dev/null
1558 setkeycodes e058 88 &>/dev/null
1560 setkeycodes e00a 89 e008 90 &>/dev/null
1567 config_wondershaper(){
1568 if checkbootparam "wondershaper" ; then
1569 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1574 if [ -n "$WONDER" ]; then
1576 DEVICE="${WONDER%%,*}"
1578 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1580 DOWNSTREAM="${WONDER%%,*}"
1582 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1584 UPSTREAM="${WONDER%%,*}"
1589 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1590 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1591 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1592 einfo "Starting wondershaper (${CMD}) in background."
1593 ( sh -c $CMD & ) && eend 0
1600 if checkbootparam "nosyslog"; then
1601 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1603 einfo "Starting syslog-ng in background."
1604 /etc/init.d/syslog-ng start 1>>$DEBUG &
1612 if checkbootparam "nogpm"; then
1613 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1615 einfo "Starting gpm in background."
1616 # /etc/init.d/gpm start 1>>$DEBUG &
1617 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1625 if checkbootparam "services" ; then
1626 SERVICE="$(getbootparam services 2>>$DEBUG)"
1627 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1628 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1629 einfo "Starting service(s) ${SERVICENL} in background."
1630 for service in $(echo -e $SERVICELIST) ; do
1631 /etc/init.d/${service} start 1>>$DEBUG &
1633 [ "$?" == "0" ] ; eend $?
1640 if checkbootparam netconfig ; then
1641 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1642 CONFIGFILE='/tmp/netconfig.grml'
1645 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1646 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1648 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1650 while ! getconfig && [[ "$counter" != 0 ]] ; do
1651 echo -n "Sleeping for 5 seconds and trying to get config again... "
1652 counter=$(( counter-1 ))
1653 echo "$counter tries left" ; sleep 1
1655 if [ -r "$CONFIGFILE" ] ; then
1656 einfo "Downloading was successfull." ; eend 0
1657 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1658 md5sum $CONFIGFILE ; eend 0
1659 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1661 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1668 config_blindsound(){
1669 if checkbootparam "blind" ; then
1671 flite -o play -t "welcome to the gremel system"
1678 if checkbootparam welcome ; then
1679 flite -o play -t "welcome to the gremel system"
1684 # {{{ fix/workaround for unionfs
1686 if [ -z "$INSTALLED" ]; then
1687 touch /var/cache/apt/*cache.bin
1692 # {{{ create all /mnt-directories
1694 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1695 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1699 # {{{ start X window system via grml-x
1701 if checkbootparam startx ; then
1702 if [ -x /usr/X11R6/bin/X ] ; then
1703 if [ -z "$INSTALLED" ] ; then
1704 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1705 if [ -z "$WINDOWMANAGER" ] ; then
1706 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1707 WINDOWMANAGER="wm-ng"
1709 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1711 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1712 config_userfstab || fstabuser='grml'
1713 cat>|/etc/init.d/xstartup<<EOF
1715 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1716 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1718 chmod 755 /etc/init.d/xstartup
1720 # adjust inittab for xstartup
1721 if grep -q '^6:' /etc/inittab ; then
1722 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1723 else # just append tty6 to inittab if no definition is present:
1724 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1727 /sbin/telinit q ; eend $?
1729 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1730 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1732 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1736 eerror "We are not running from CD - startx will not work, skipping it.
1737 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1740 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1741 Boot parameter startx does not work therefore." ; eend 1
1747 # {{{ configuration framework
1749 if checkbootparam extract ; then
1750 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1751 EXTRACTOPTIONS="-- -x $EXTRACT"
1756 if checkbootparam noautoconfig || checkbootparam forensic ; then
1757 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1759 if [ -z "$INSTALLED" ] ; then
1760 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1762 [ -d /mnt/grml ] || mkdir /mnt/grml
1763 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1764 # We do need the following fix so floppy disk is available to blkid in any case :-/
1765 if [ -r /dev/fd0 ] ; then
1766 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1767 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1768 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1769 blkid /dev/fd0 1>>$DEBUG 2>&1
1772 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1773 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1774 if [[ $RC == 0 ]]; then
1775 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1778 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1779 if [ -n "$CONFIG" ]; then
1780 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1782 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1784 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1788 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1789 if [ -n "$SCRIPT" ]; then
1790 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1793 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1795 ewarn "No devices with label GRMLCFG found." ; eend 0
1804 if checkbootparam "config" ; then
1805 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1806 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1807 einfo "Bootoption config found. config is set to: $CONFIG"
1809 einfo "Trying to extract configuration file ${CONFIG}:"
1810 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1814 if checkbootparam myconfig ; then
1815 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1816 if [ -n "$MOUNTDEVICE" ]; then
1817 if checkbootparam file ; then
1818 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1819 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1821 [ -d /mnt/grml ] || mkdir /mnt/grml
1822 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1823 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1824 if [[ $RC == 0 ]]; then
1825 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1828 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1829 if [ -n "$CONFIG" ]; then
1830 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1832 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1834 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1838 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1839 if [ -n "$SCRIPT" ]; then
1840 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1845 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1846 fi # mount $MOUNTDEVICE
1847 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1849 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1850 fi # [ -n "$MOUNTDEVICE" ]
1851 fi # checkbootparam myconfig
1853 if checkbootparam "partconf" ; then
1854 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1855 if [ -n "$MOUNTDEVICE" ]; then
1856 [ -d /mnt/grml ] || mkdir /mnt/grml
1857 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1858 if [[ $RC == 0 ]]; then
1859 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1860 einfo "Copying files from $MOUNTDEVICE over grml system."
1861 for file in `cat /etc/grml/partconf` ; do
1862 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1863 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1866 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1867 fi # mount $MOUNTDEVICE
1868 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1870 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1871 fi # [ -n "$MOUNTDEVICE" ]
1876 # {{{ /cdrom/.*-options
1878 if checkbootparam "debs" ; then
1879 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1880 einfo "Tring to install debian package(s) ${DEBS}"
1881 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1886 if checkbootparam "scripts" ; then
1887 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1888 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1889 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1890 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1897 if checkbootparam "distcc" ; then
1898 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1899 if [ -n "$OPTIONS" ]; then
1902 if [ -n "$OPTIONS" ]; then
1903 NET="${OPTIONS%%,*}"
1905 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1907 INTERFACE="${OPTIONS%%,*}"
1912 CONFIG=/etc/default/distcc
1913 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1914 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1916 if [ -n "$INTERFACE" ] ; then
1917 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1920 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1921 counter=$(( counter-1 ))
1922 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1924 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1928 if [ -n "$IP" ] ; then
1929 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1931 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1933 id distccd >/dev/null 2>&1 || \
1935 einfo "Creating distcc user" ; \
1936 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1939 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1940 /etc/init.d/distcc start 1>/dev/null ; eend $?
1943 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1947 if checkbootparam "gcc"; then
1948 GCC="$(getbootparam gcc 2>>$DEBUG)"
1950 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1953 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1956 if checkbootparam "gpp"; then
1957 GPP="$(getbootparam gpp 2>>$DEBUG)"
1959 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1960 if [ -x /usr/bin/g++-${GPP} ] ; then
1962 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1964 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1965 if [ -x /usr/bin/cpp-${GPP} ] ; then
1967 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1976 # Notice: use it only on live-cd system, if running from harddisk please
1977 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1978 # in /etc/runlevel.conf
1980 MODULES_FILE=/etc/grml/modules
1981 if checkbootparam nomodules ; then
1982 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1983 elif [ -z "$INSTALLED" ]; then
1984 if [ -r $MODULES_FILE ] ; then
1985 einfo "Loading modules specified in ${MODULES_FILE}:"
1987 grep '^[^#]' $MODULES_FILE | \
1988 while read module args; do
1989 [ "$module" ] || continue
1991 modprobe $module $args ; eend $?
1995 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2002 config_915resolution(){
2003 if checkbootparam "915resolution" ; then
2004 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2005 if [ -x /usr/sbin/915resolution ]; then
2010 if [ -n "$OPTIONS" ]; then
2012 MODE="${OPTIONS%%,*}"
2014 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2016 XRESO="${OPTIONS%%,*}"
2018 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2020 YRESO="${OPTIONS%%,*}"
2025 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2026 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2035 if [ -z "$INSTALLED" ] ; then
2036 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2037 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2038 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2039 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2041 if ! [ -x /sbin/mdadm ] ; then
2042 eerror "mdadm not available, can not execute it." ; eend 1
2045 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2046 # find out whether we have a valid configuration file already
2047 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2048 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2049 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2050 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2052 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2055 if ! checkbootparam 'swraid' ; then
2057 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2060 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2065 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2067 *'No arrays found'*)
2068 ewarn "$line" ; eend 0
2071 einfo "$line" ; eend 0
2078 if [ -r /proc/mdstat ] ; then
2080 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2081 if [ -z "$MDSTAT" ] ; then
2082 ewarn "No active arrays found" ; eend 0
2087 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2088 einfo "active arrays: $line" ; eend 0
2094 fi # bootoption swraid
2096 fi # is /sbin/mdadm executable?
2097 fi # check for bootoptions
2098 fi # run only in live-cd mode
2102 # {{{ LVM (Logical Volumes)
2104 if [ -z "$INSTALLED" ] ; then
2105 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2106 if checkbootparam 'nolvm' ; then
2107 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2109 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2110 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2111 eerror "LVM not available, can not execute it." ; eend 1
2113 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2114 einfo "You seem to have logical volumes (LVM) on your system."
2116 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2118 if checkbootparam 'lvm' ; then
2119 einfo "Bootoption LVM found. Searching for logical volumes:"
2120 /etc/init.d/lvm2 start ; eend $?
2124 fi # check for lvm binary
2125 fi # check for bootoption nolvm
2126 fi # run only in live-cd mode
2130 # {{{ debnet: setup network based on an existing one found on a partition
2132 if checkbootparam "debnet" ; then
2133 iszsh && setopt shwordsplit
2134 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2135 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2138 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2140 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2141 for i in $DEVICES; do
2142 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2143 einfo "Scanning on $i"
2144 if [ -f /mnt/etc/network/interfaces ]; then
2145 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2153 if [ -n "$FOUND_DEBNET" ]; then
2154 einfo "Stopping network."
2155 pump -k 1>/dev/null 2>&1
2156 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2157 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2158 rm -rf /etc/network/run
2159 cp -a /mnt/etc/network /etc
2160 rm -rf /etc/network/run
2161 mkdir /etc/network/run
2162 umount /mnt ; eend $?
2163 einfo "Starting network."
2164 /etc/init.d/networking start ; eend $?
2166 eerror "/etc/network/interfaces not found." ; eend 1
2170 eerror "Error: /mnt already mounted." ; eend 1
2176 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2178 if grep -q ipw3945 /proc/modules ; then
2179 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2180 ewarn "Broken ipw3945 network interface found, reloading module."
2189 # {{{ disable console blanking
2191 if checkbootparam "noblank" ; then
2192 einfo "Bootoption noblank found. Disabling monitor blanking."
2193 setterm -blank 0 ; eend $?
2198 # {{{ grml2hd: automatic installation
2201 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2203 if checkbootparam "user" ; then
2205 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2206 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2209 if checkbootparam "filesystem" ; then
2211 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2212 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2215 if checkbootparam "partition" ; then
2217 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2218 # notice: the following checks whether the given partition is available, if not the skip
2219 # execution of grml2hd as it might result in data loss...
2220 if [ -r $PARTITION ] ; then
2221 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2223 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2227 if checkbootparam "mbr" ; then
2229 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2230 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2233 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2235 GRML2HD_NONINTERACTIVE='yes' grml2hd
2238 chmod 755 /usr/bin/grml2hd_noninteractive
2239 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2240 if [ -z "$GRML2HD_FAIL" ] ; then
2241 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2243 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2246 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2250 # {{{ debootstrap: automatic installation
2251 config_debootstrap(){
2253 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2255 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2257 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2259 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2264 if checkbootparam "target" ; then
2266 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2267 # notice: the following checks whether the given partition is available, if not the skip
2268 # execution of grml-debootstrap as it might result in data loss...
2269 if ! [ -r "$TARGET" ] ; then
2270 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2274 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2279 if checkbootparam "grub" ; then
2281 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2284 if checkbootparam "groot" ; then
2286 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2289 if checkbootparam "release" ; then
2291 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2294 if checkbootparam "mirror" ; then
2296 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2299 if checkbootparam "boot_append" ; then
2301 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2304 if checkbootparam "password" ; then
2306 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2309 # now check which options are available
2310 if [ -n "TARGET" ] ; then
2311 TARGETCMD="--target $TARGET"
2315 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2319 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2320 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2321 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2322 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2323 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2324 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2326 # and finally write script and execute it
2327 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2329 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2332 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2334 screen /usr/bin/grml-debootstrap_noninteractive
2335 einfo "Invoking a shell, just exit to continue booting..."
2338 fi # stringinstring "BOOT_IMAGE=debian2hd
2342 # {{{ Support customization
2344 if checkbootparam "distri"; then
2345 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2346 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2347 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2348 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2349 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2350 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2356 ### {{{ backwards compatible stuff
2357 config_environment(){
2358 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2361 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2365 ## END OF FILE #################################################################
2366 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3