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: Son Sep 30 14:15:11 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 einfo "Setting up unicode environment."
274 unicode_start 2>>$DEBUG ; eend $?
278 # Set default keyboard before interactive setup
279 if [ -n "$KEYTABLE" ] ; then
280 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
281 loadkeys -q $KEYTABLE &
285 # we have to set up all consoles, therefore loop it over all ttys:
286 NUM_CONSOLES=`fgconsole --next-available`
287 NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
288 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
289 if [ -n "$CHARMAP" ] ; then
290 einfo "Running consolechars for ${CHARMAP}"
291 for vc in `seq 0 ${NUM_CONSOLES}` ; do
292 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
296 if [ -n "$CONSOLEFONT" ] ; then
297 einfo "Running consolechars using ${CONSOLEFONT}"
298 for vc in `seq 0 ${NUM_CONSOLES}` ; do
299 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d
310 if checkbootparam hostname ; then
311 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
312 einfo "Setting hostname to $HOSTNAME as requested."
313 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
314 hostname $HOSTNAME ; eend $?
316 hostname --file /etc/hostname
321 # fstabuser (needed when running from harddisk with username != grml {{{
323 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
324 if [ -n "$CONFIG_FSTAB_USER" ] ; then
325 fstabuser="$CONFIG_FSTAB_USER"
327 fstabuser=$(getent passwd 1000 | cut -d: -f1)
329 # if not yet set fall back to default 'grml' user
330 [ -n "$fstabuser" ] || fstabuser='grml'
334 # {{{ Set clock (Local time is more often used than GMT, so it is default)
336 # don't touch the files if running from harddisk:
337 if [ -z "$INSTALLED" ]; then
339 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
340 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
341 # hwclock uses the TZ variable
342 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
343 [ -n "$TZ" ] || TZ=Europe/Vienna
345 if ! [ -r /dev/rtc ] ; then
346 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
348 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
349 if [ -n "$ERROR" ] ; then
351 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
352 if [ -n "$ERROR" ] ; then
353 eerror "Problem running hwclock: $ERROR" ; eend 1
362 # {{{ print kernel info
364 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
365 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
366 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
367 if [ -r /proc/cpuinfo ] ; then
368 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
370 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
374 if [ -d /proc/xen ] ; then
376 einfo 'Running kernel featuring support for Xen detected' ; eend 0
382 # {{{ vmware specific stuff
384 if checkbootparam novmware ; then
385 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
387 if [ -z "$INSTALLED" ] ; then
388 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
389 if ! checkbootparam qemu ; then
390 if [ -r /etc/X11/xorg.conf.vmware ] ; then
391 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
392 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
401 # {{{ qemu specific stuff
403 if checkbootparam qemu ; then
404 if [ -r /etc/X11/xorg.conf.example ] ; then
405 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
406 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
412 # {{{ ld.so.cache + depmod
414 if [ -n "$INSTALLED" ]; then
415 if ! [ -r /etc/grml.first.boot ] ; then
416 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
418 # Regenerate ld.so.cache and module dependencies on HD
419 einfo "Running ldconfig" ; ldconfig ; eend $?
420 einfo "Running depmod" ; depmod -a ; eend $?
421 touch /etc/grml.first.boot
429 # update_progress {{{
431 # be sure we are non-blocking
432 (echo "$1" > /etc/sysconfig/progress) &
438 # don't touch the files if running from harddisk:
439 if [ -z "$INSTALLED" ]; then
440 KTZ="$(getbootparam tz 2>>$DEBUG)"
441 if [ -n "$KTZ" ] ; then
442 einfo "Setting timezone."
443 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
445 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
451 # small computer / nearly no ram {{{
454 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
455 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
458 if checkbootparam "small"; then
459 einfo "Information: ${RAM} kB of RAM available." ; eend 0
460 einfo "Bootoption small detected. Activating small system."
461 if [ -r /etc/inittab.small ] ; then
462 mv /etc/inittab /etc/inittab.normal
463 mv /etc/inittab.small /etc/inittab
465 sed -i 's/^9/#&/' /etc/inittab
466 sed -i 's/^10/#&/' /etc/inittab
467 sed -i 's/^11/#&/' /etc/inittab
468 sed -i 's/^12/#&/' /etc/inittab
470 /sbin/telinit q ; eend $?
472 if checkgrmlsmall ; then
473 if [[ $RAM -lt 25000 ]] ; then
474 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
475 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
476 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
477 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
480 einfo "Information: ${RAM} kB of RAM available." ; eend 0
483 if [[ $RAM -lt 58000 ]] ; then
484 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
485 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
486 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
487 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
490 einfo "Information: ${RAM} kB of RAM available." ; eend 0
498 # skip startup of w3m {{{
500 if checkbootparam "fast"; then
501 ewarn "Bootoption fast detected. Skipping startup of w3m."
502 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
503 /sbin/telinit q ; eend $?
508 # activate serial console {{{
510 if checkbootparam "console"; then
511 einfo "Bootoption (for serial) console detected."
513 if [ -r /etc/mgetty/mgetty.config ] ; then
514 MODE=$(getbootparam console | awk -F, '{print $2}')
516 [ -n "$MODE" ] || MODE=9600 # default mode
517 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
518 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
521 einfo "Activating mgetty."
522 sed -i 's/^#T0/T0/' /etc/inittab
523 sed -i 's/^#T1/T1/' /etc/inittab
524 /sbin/telinit q ; eend $?
530 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
533 for DEVICE in /proc/ide/hd?; do
534 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
536 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
540 # {{{ Bring up loopback interface now
542 if [ -z "$INSTALLED" ] ; then
543 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
544 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
552 # firewire devices {{{
553 # the raw1394 driver does not yet export info into SYSFS,
554 # so let's create raw1394 device manually
555 # http://www.michael-prokop.at/blog/index.php?p=352
556 config_firewire_dev(){
557 if checkbootparam "nofirewiredev" ; then
558 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
560 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
561 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
562 # cd /dev && MAKEDEV video1394 raw1394
563 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
564 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
565 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
566 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
567 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
568 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
574 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
575 # otherwise we will get: passwd: Authentication token lock busy
577 if [ -z "$INSTALLED" ] ; then
585 if [ -n "$TESTCD" ]; then
586 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
587 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
590 # /linuxrc grml version:
591 [ -d /cdrom/GRML ] && TESTCD_PATH=/cdrom/GRML
592 # live-initramfs version:
593 [ -d /live/image/GRML ] && TESTCD_PATH=/live/image/GRML
595 if [ -n "$TESTCD_PATH" ] ; then
596 ( cd "$TESTCD_PATH" ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
598 echo "${RED} *** Error: Could not find md5sum file. ***"
601 if [ "$RC" = "0" ]; then
602 einfo "Everything looks OK" ; eend 0
604 eerror 'Checksum failed for theses files:' ; eend 1
605 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
606 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
607 eerror '... RAM of your computer is broken.' ; eend 1
608 einfon "Hit return to continue, or press the reset button to quit."
617 # {{{ hardware detection via discover
619 if checkbootparam "nodisc" ; then
620 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
622 if [ -x /sbin/discover ] ; then
623 einfo "Discovering hardware. Trying to load the following modules in background:"
625 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)"
627 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
630 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
636 # {{{ hardware detection via hwinfo
638 if checkbootparam hwinfo >>$DEBUG 2>&1; then
639 einfo "Discovering hardware via hwinfo:"
640 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
641 echo -n " Loading modules: "
642 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
648 # {{{ disable hotplug agents on request
649 config_hotplug_agent(){
650 if checkbootparam "noagent" ; then
651 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
652 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
653 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
654 einfo "Disabling hotplug-agent(s) $AGENTNL"
655 for agent in $(echo -e $AGENTLIST) ; do
656 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
658 [ "$?" == "0" ] ; eend $?
663 # {{{ blacklist of hotplug-modules
664 config_hotplug_blacklist(){
665 if checkbootparam "black" ; then
666 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
667 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
668 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
669 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
670 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
671 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
679 if checkbootparam "nohotplug" ; then
680 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
682 if [ -r /etc/init.d/hotplug ] ; then
683 einfo "Starting hotplug system in background."
684 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
686 elif [ -r /etc/init.d/hotplug-light ] ; then
687 einfo "Starting hotplug-light system in background."
688 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
691 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
697 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
699 if checkbootparam "blacklist" ; then
700 if [ -z "$INSTALLED" ]; then
701 einfo "Bootoption blacklist found."
702 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
703 if [ -n "$BLACK" ] ; then
704 einfo "Blacklisting module ${BLACK} via /etc/modprobe.d/grml."
705 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
706 echo "blacklist $BLACK" >> /etc/modprobe.d/grml
707 echo "alias $BLACK off" >> /etc/modprobe.d/grml
708 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
710 eerror "No given module for blacklist found. Blacklisting will not work therefore."
713 ewarn "Backlisting via bootoption does not work on harddisk installations." ; eend 1
715 einfo "Please blacklist the module(s) via /etc/modprobe.d/blacklist."
724 if [ -d /proc/acpi ]; then
725 if checkbootparam "noacpi"; then
726 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
727 elif checkbootparam "nogrmlacpi" ; then
728 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
730 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
733 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
735 basename="${basename%%.*}"
736 case "$basename" in *_acpi)
737 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
739 modprobe $basename >>$DEBUG 2>&1 && found="yes"
740 local BASE="$BASE $basename"
742 if [ -n "$found" ] ; then
743 einfo "$BASE" ; eend 0
745 ewarn "(none)" ; eend 1
747 if ! [ -S /var/run/acpid.socket ] ; then
748 if ! [ -r /var/run/dbus/pid ] ; then
749 einfo "Starting acpi daemon."
750 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
752 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
753 eerror "Solution: please activate acpid via /etc/runlevel.conf"
757 ewarn "acpi daemon already running."
764 if checkbootparam "noapm"; then
765 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
767 modprobe apm power_off=1 >>$DEBUG 2>&1
768 if [ "$?" = "0" ] ; then
769 if [ -x /etc/init.d/apmd ] ;then
770 einfo "APM Bios found, enabling power management functions."
771 /etc/init.d/apmd start ; eend $?
774 eerror "Loading apm module failed." ; eend 1
781 # {{{ PCMCIA Check/Setup
782 # This needs to be done before other modules are being loaded (by hwsetup)
784 if checkbootparam "nopcmcia"; then
785 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
787 if /usr/sbin/laptop-detect ; then
788 einfo "Detected Laptop - checking for PCMCIA." && eend 0
789 modprobe pcmcia_core >>$DEBUG 2>&1
790 # Try Cardbus or normal PCMCIA socket drivers
791 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
792 if [ "$?" = "0" ]; then
793 modprobe ds >>$DEBUG 2>&1
794 if [ -d /proc/bus/pccard ] ; then
795 if [ -x /sbin/cardmgr ] ; then
796 einfo "PCMCIA found, starting cardmgr."
797 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
799 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
808 # {{{ run software synthesizer via speakup
810 if checkbootparam swspeak ; then
811 if [ -d /proc/speakup/ ] ; then
812 einfo "Bootoption swspeak found. Kernel supports speakup." ; eend 0
814 if [ -x /etc/init.d/speech-dispatcher ] ; then
815 einfo "Starting speech-dispatcher."
816 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
817 einfo "Activating sftsyn in Kernel."
818 echo sftsyn >/proc/speakup/synth_name ; eend $?
819 einfo "Just run swspeak if you want to use software synthesizer via speakup."
820 flite -o play -t "Finished activating software speakup. Just run swspeak when booting finished."
822 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
823 flite -o play -t "speech-dispatcher not available. speakup will not work without it."
827 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
828 flite -o play -t "Kernel does not seem to support speakup. Sorry."
834 # {{{ Check for blind option or brltty
837 checkbootparam "blind" && BLIND="yes"
838 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
840 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
841 if [ -x /sbin/brltty ]; then
842 # Blind option detected, start brltty now.
843 # modprobe serial_core parport_serial generic_serial && echo "done"
848 if [ -n "$BRLTTY" ]; then
850 BRLTYPE="${BRLTTY%%,*}"
852 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
854 BRLDEV="${BRLTTY%%,*}"
856 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
858 BRLTEXT="${BRLTTY%%,*}"
863 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
864 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
865 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
866 einfo "Starting braille-display manager."
869 sleep 2 && BLINDSOUND="yes"
876 # {{{ Interactive configuration
877 config_interactive(){
878 ewarn "config_interactive is deprecated nowadays."
879 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
885 if checkbootparam forceagp ; then
886 # Probe for AGP. Hope this can fail safely
887 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
893 config_automounter(){
894 if checkbootparam automounter ; then
895 RUNLEVEL="$(runlevel)"
897 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
902 if [ -n "$AUTOMOUNTER" ]; then
903 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
904 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
905 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
906 anew="$d -fstype=auto,$2 :$i"
907 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
908 AUTOMOUNTS="$AUTOMOUNTS $d"
909 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
911 [ -d /mnt/$d ] && mkdir -p /mnt/$d
912 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
914 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
917 AUTOMOUNTS="floppy cdrom"
918 # Add new devices to /etc/fstab and /etc/auto.mnt
919 for i in /dev/cdrom?*; do
921 addautomount "$i" "ro"
926 if [ -n "$AUTOMOUNTER" ]; then
927 # Check for floppy dir, reinstall with automounter
928 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
929 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
930 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
931 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
932 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
933 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
935 # Replace paths from bootfloppy
936 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
937 mv -f /etc/fstab.new /etc/fstab
938 # Start automounter now
939 einfo "Starting automounter for ${AUTOMOUNTS}."
940 /etc/init.d/autofs start >>$DEBUG ; eend $?
945 # {{{ Collect partitions from /proc/partitions first for enabling DMA
949 while read major minor blocks partition relax; do
950 partition="${partition##*/}"
951 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
953 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
954 sd?) ;; # SCSI Harddisk, entire disk
955 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
956 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
959 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
962 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
965 # {{{ Enable DMA for all IDE drives now if not disabled
966 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
968 if checkbootparam "nodma"; then
969 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
971 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
972 if test -d /proc/ide/$d; then
973 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
974 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
975 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
976 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
977 echo "using_dma:1" >/proc/ide/$d/settings
986 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
989 NOSWAP="yes" # we do not use swap by default!
990 if checkbootparam "swap" || checkbootparam "anyswap" ; then
992 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
995 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
996 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
998 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
999 iszsh && setopt nonomatch
1000 if [ -x /usr/sbin/rebuildfstab ] ; then
1001 config_userfstab || fstabuser=grml
1002 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1004 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1006 fi # checkbootparam nofstab/forensic
1008 # Scan for swap, config, homedir - but only in live-mode
1009 if [ -z "$INSTALLED" ] ; then
1010 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1013 HOMEDIR="$(getbootparam home)"
1014 if [ -n "$partitions" ]; then
1015 while read p m f relax; do
1016 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1017 partoptions="users,exec"
1019 # it's a swap partition?
1022 if [ -n "$NOSWAP" ]; then
1023 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1026 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1027 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1028 if [ -n "$ANYSWAP" ] ; then
1029 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1030 swapon $p 2>>$DEBUG ; eend $?
1032 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1036 if [[ "$p" == LABEL* ]] ; then
1037 p=$(blkid -t $p | awk -F: '{print $1}')
1039 if grep -q $p /proc/swaps ; then
1040 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1042 if [ -b "$p" ] ; then
1043 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1044 swapon $p 2>>$DEBUG ; eend $?
1046 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1055 esac # it's a swap partition?
1060 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1061 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1063 # *) NONEFOUND='1'; continue ;;
1067 if [ -z "$NOSWAP" ] ; then
1068 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1069 # Activate swapfile, if exists
1070 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1072 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1073 mount -o remount,rw $m && MOUNTED=1
1074 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1076 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1078 fnew="$SWAPFILE swap swap defaults 0 0"
1079 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1080 GRML_SWP="$GRML_SWP $SWAPFILE"
1083 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1086 # use a image as home
1087 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1088 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1089 if [ -n "$HOMEDIR" ]; then
1090 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1094 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1096 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1101 # Umount, if not in use
1102 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1114 if [ -n "$MOUSE_DEVICE" ] ; then
1115 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1120 # {{{ IPv6 configuration
1121 # Load IPv6 kernel module and print IP adresses
1123 if checkbootparam "ipv6"; then
1124 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1126 # we probably need some time until stateless autoconfiguration has happened
1128 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1129 for DEVICE in `echo "$NETDEVICES"`; do
1132 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1133 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1135 for ADDR in `echo "$ADDRESSES"` ; do
1138 if [ "$COUNT" -eq "0" ] ; then
1139 einfo "(none)" ; eend 1
1149 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1151 if checkbootparam "nodhcp"; then
1152 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1154 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1155 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1156 for DEVICE in `echo "$NETDEVICES"` ; do
1157 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1159 ifconfig $DEVICE up >>$DEBUG 2>&1
1160 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1165 if [ -n "$INSTALLED" ] ; then
1166 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1173 # {{{ helper functions
1176 # search all partitions for a file in the root directory
1177 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1178 # See if it's already mounted
1179 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1180 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1181 [ -f "$i/$1" ] && FOUND="$i/$1"
1182 umount -l "$i" 2>>$DEBUG
1183 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1190 case "$(file -s $1)" in
1191 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1192 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1193 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1194 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1195 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1196 *data*) echo "invalid"; return 0;;
1197 *) echo "auto"; return 0;;
1201 # Try to mount this filesystem read-only, without or with encryption
1203 # Check if already mounted
1204 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1205 # Apparently, mount-aes DOES autodetect AES loopback files.
1206 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1207 # We need to mount crypto-loop files with initial rw support
1208 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1210 [ "$RC" = "0" ] && return 0
1212 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1214 while [ "$a" != "n" -a "$a" != "N" ]; do
1215 # We need to mount crypto-loop files with initial rw support
1216 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1217 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1218 # Problem with ioctl() from getpasswd()?
1228 if checkbootparam "nocpu"; then
1229 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1231 # check module dependencies
1233 if [ -e /lib64 ] ; then
1234 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1236 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1240 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1241 einfo "Detecting CPU:"
1242 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)
1243 echo $CPU | sed 's/ \{1,\}/ /g'
1246 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
1249 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1250 # * it only if we have the according kernel modules available
1251 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1252 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1253 # -> parse output of the initscript and output it according to our look'n'feel
1254 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1255 if ! cpufreq_check ; then
1256 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1258 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1259 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1260 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1261 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1262 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1266 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1268 if [ -x /etc/init.d/loadcpufreq ] ; then
1269 SKIP_CPU_GOVERNOR=''
1270 LOADCPUFREQ=$(mktemp)
1271 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1272 if grep -q FATAL "$LOADCPUFREQ" ; then
1278 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1279 eerror "$line" ; eend $RC
1283 elif grep -q done "$LOADCPUFREQ" ; then
1284 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1285 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1286 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1288 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1292 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1293 . /usr/bin/cpufreq-detect.sh
1294 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1295 einfo "Loading modules ${MODULE}"
1296 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1298 if [[ $RC == 0 ]]; then
1305 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1309 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1310 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1311 if modprobe cpufreq_ondemand ; RC=$? ; then
1312 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1313 echo ondemand > $file
1323 fi # checkbootparam nocpu
1327 # {{{ autostart of ssh
1329 if checkbootparam ssh ; then
1330 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1331 einfo "Bootoption passwd found."
1332 if [ -n "$SSH_PASSWD" ] ; then
1333 echo "grml:$SSH_PASSWD" | chpasswd -m
1334 einfo "Starting secure shell server in background."
1335 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1336 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1339 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1342 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1348 # {{{ set password for user grml
1350 if checkbootparam passwd >>$DEBUG 2>&1; then
1351 einfo "Bootoption passwd found."
1352 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1353 if [ -n "$PASSWD" ] ; then
1354 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1356 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1359 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1365 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1367 if checkbootparam home ; then
1368 HOMEDIR="$(getbootparam home)"
1372 if [ -n "$HOMEDIR" ]; then
1373 einfo "Bootoption home detected." && eend 0
1376 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1377 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1378 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1379 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1382 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1383 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1384 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1385 MYHOMEDIR="$HOMEDIR"
1387 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1388 MYHOMEDIR="$(findfile grml.img)"
1389 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1390 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1391 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1394 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1395 eerror "Option ignored." ; eend 1
1400 if [ -n "$MYHOMEDIR" ]; then
1401 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1402 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1403 while read device mountpoint fs relax; do
1404 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1407 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1411 # Note: This currently won't work with encrypted partitions
1412 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1413 if [ ! -f "$MYHOMEDIR" ]; then
1414 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1415 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1420 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1421 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1422 if [ -f "$MYHOMEDIR" ]; then
1423 # It's a loopback file, mount it over the /home/grml directory
1424 trymount "$MYHOMEDIR" /home/grml
1426 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1430 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1434 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1436 fi # mount -o remount,rw,...
1439 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1443 fi # if trymount ...
1445 fi # checkbootparam home
1449 # {{{ Check for scripts on CD-ROM
1450 config_cdrom_scripts(){
1451 if checkbootparam "script"; then
1452 for script in /cdrom/scripts/* ; do
1453 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1462 if ! [ -x /usr/bin/aumix ] ; then
1463 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1466 if ! [ -r /proc/asound/cards ] ; then
1467 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1471 if checkbootparam vol ; then
1472 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1473 if [ -z "$VOL" ] ; then
1474 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1481 if checkbootparam nosound ; then
1482 einfo "Muting sound devices on request."
1483 # some IBM notebooks require the following stuff:
1484 if [ -x /usr/bin/amixer ] ; then
1485 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1486 amixer set Front unmute 1>/dev/null
1487 amixer set Front 0% 1>/dev/null
1490 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1491 if [ -n "$ERROR" ] ; then
1493 eerror "Problem muting sound devices: $ERROR"
1497 elif [ -z "$INSTALLED" ]; then
1498 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1499 # some IBM notebooks require the following stuff:
1500 if [ -x /usr/bin/amixer ] ; then
1501 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1502 amixer set Front unmute 1>/dev/null
1503 amixer set Front ${VOL}% 1>/dev/null
1506 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $VOL 2>&1) ; RC=$?
1507 if [ -n "$ERROR" ] ; then
1509 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1519 # {{{ modem detection
1521 if checkbootparam "nomodem"; then
1522 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1524 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1525 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1526 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1534 # {{{ keyboard add-ons
1535 config_setkeycodes(){
1536 if checkbootparam "setkeycodes" ; then
1537 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1538 # MS MM keyboard add-on
1540 setkeycodes e001 126 &>/dev/null
1541 setkeycodes e059 127 &>/dev/null
1543 setkeycodes e03b 59 &>/dev/null
1544 setkeycodes e008 60 &>/dev/null
1545 setkeycodes e007 61 &>/dev/null
1546 setkeycodes e03e 62 &>/dev/null
1547 setkeycodes e03f 63 &>/dev/null
1548 setkeycodes e040 64 &>/dev/null
1549 setkeycodes e041 65 &>/dev/null
1550 setkeycodes e042 66 &>/dev/null
1551 setkeycodes e043 67 &>/dev/null
1552 setkeycodes e023 68 &>/dev/null
1553 setkeycodes e057 87 &>/dev/null
1554 setkeycodes e058 88 &>/dev/null
1556 setkeycodes e00a 89 e008 90 &>/dev/null
1563 config_wondershaper(){
1564 if checkbootparam "wondershaper" ; then
1565 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1570 if [ -n "$WONDER" ]; then
1572 DEVICE="${WONDER%%,*}"
1574 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1576 DOWNSTREAM="${WONDER%%,*}"
1578 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1580 UPSTREAM="${WONDER%%,*}"
1585 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1586 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1587 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1588 einfo "Starting wondershaper (${CMD}) in background."
1589 ( sh -c $CMD & ) && eend 0
1596 if checkbootparam "nosyslog"; then
1597 ewarn "Not starting syslog-ng as requested on boot commandline." ; eend 0
1599 einfo "Starting syslog-ng in background."
1600 /etc/init.d/syslog-ng start 1>>$DEBUG &
1608 if checkbootparam "nogpm"; then
1609 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1611 einfo "Starting gpm in background."
1612 # /etc/init.d/gpm start 1>>$DEBUG &
1613 ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1621 if checkbootparam "services" ; then
1622 SERVICE="$(getbootparam services 2>>$DEBUG)"
1623 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1624 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1625 einfo "Starting service(s) ${SERVICENL} in background."
1626 for service in $(echo -e $SERVICELIST) ; do
1627 /etc/init.d/${service} start 1>>$DEBUG &
1629 [ "$?" == "0" ] ; eend $?
1636 if checkbootparam netconfig ; then
1637 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1638 CONFIGFILE='/tmp/netconfig.grml'
1641 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1642 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1644 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1646 while ! getconfig && [[ "$counter" != 0 ]] ; do
1647 echo -n "Sleeping for 5 seconds and trying to get config again... "
1648 counter=$(( counter-1 ))
1649 echo "$counter tries left" ; sleep 1
1651 if [ -r "$CONFIGFILE" ] ; then
1652 einfo "Downloading was successfull." ; eend 0
1653 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1654 md5sum $CONFIGFILE ; eend 0
1655 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1657 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1664 config_blindsound(){
1665 if checkbootparam "blind" ; then
1667 flite -o play -t "welcome to the gremel system"
1674 if checkbootparam welcome ; then
1675 flite -o play -t "welcome to the gremel system"
1680 # {{{ fix/workaround for unionfs
1682 if [ -z "$INSTALLED" ]; then
1683 touch /var/cache/apt/*cache.bin
1688 # {{{ create all /mnt-directories
1690 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1691 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1695 # {{{ start X window system via grml-x
1697 if checkbootparam startx ; then
1698 if [ -x /usr/X11R6/bin/X ] ; then
1699 if [ -z "$INSTALLED" ] ; then
1700 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1701 if [ -z "$WINDOWMANAGER" ] ; then
1702 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1703 WINDOWMANAGER="wm-ng"
1705 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1707 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1708 config_userfstab || fstabuser='grml'
1709 cat>|/etc/init.d/xstartup<<EOF
1711 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1712 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1714 chmod 755 /etc/init.d/xstartup
1716 # adjust inittab for xstartup
1717 if grep -q '^6:' /etc/inittab ; then
1718 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1719 else # just append tty6 to inittab if no definition is present:
1720 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1723 /sbin/telinit q ; eend $?
1725 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1726 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1728 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1732 eerror "We are not running from CD - startx will not work, skipping it.
1733 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1736 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1737 Boot parameter startx does not work therefore." ; eend 1
1743 # {{{ configuration framework
1745 if checkbootparam extract ; then
1746 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1747 EXTRACTOPTIONS="-- -x $EXTRACT"
1752 if checkbootparam noautoconfig || checkbootparam forensic ; then
1753 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1755 if [ -z "$INSTALLED" ] ; then
1756 einfo "Searching for device(s) labeled with GRMLCFG." ; eend 0
1758 [ -d /mnt/grml ] || mkdir /mnt/grml
1759 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1760 # We do need the following fix so floppy disk is available to blkid in any case :-/
1761 if [ -r /dev/fd0 ] ; then
1762 einfo "Floppy device detected. Trying to access floppy disk. (Disable this via boot option: noautoconfig)"
1763 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1764 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1765 blkid /dev/fd0 1>>$DEBUG 2>&1
1768 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1769 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1770 if [[ $RC == 0 ]]; then
1771 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1774 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1775 if [ -n "$CONFIG" ]; then
1776 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1778 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1780 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1784 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1785 if [ -n "$SCRIPT" ]; then
1786 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1789 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1791 ewarn "No devices with label GRMLCFG found." ; eend 0
1800 if checkbootparam "config" ; then
1801 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1802 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1803 einfo "Bootoption config found. config is set to: $CONFIG"
1805 einfo "Trying to extract configuration file ${CONFIG}:"
1806 cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1810 if checkbootparam myconfig ; then
1811 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1812 if [ -n "$MOUNTDEVICE" ]; then
1813 if checkbootparam file ; then
1814 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1815 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1817 [ -d /mnt/grml ] || mkdir /mnt/grml
1818 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1819 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1820 if [[ $RC == 0 ]]; then
1821 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1824 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1825 if [ -n "$CONFIG" ]; then
1826 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1828 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1830 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1834 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1835 if [ -n "$SCRIPT" ]; then
1836 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1841 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1842 fi # mount $MOUNTDEVICE
1843 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1845 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1846 fi # [ -n "$MOUNTDEVICE" ]
1847 fi # checkbootparam myconfig
1849 if checkbootparam "partconf" ; then
1850 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1851 if [ -n "$MOUNTDEVICE" ]; then
1852 [ -d /mnt/grml ] || mkdir /mnt/grml
1853 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1854 if [[ $RC == 0 ]]; then
1855 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1856 einfo "Copying files from $MOUNTDEVICE over grml system."
1857 for file in `cat /etc/grml/partconf` ; do
1858 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1859 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1862 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1863 fi # mount $MOUNTDEVICE
1864 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1866 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1867 fi # [ -n "$MOUNTDEVICE" ]
1872 # {{{ /cdrom/.*-options
1874 if checkbootparam "debs" ; then
1875 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1876 einfo "Tring to install debian package(s) ${DEBS}"
1877 dpkg -i /cdrom/debs/$DEBS* ; eend $?
1882 if checkbootparam "scripts" ; then
1883 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1884 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1885 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1886 sh -c /cdrom/scripts/$SCRIPTS ; eend $?
1893 if checkbootparam "distcc" ; then
1894 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
1895 if [ -n "$OPTIONS" ]; then
1898 if [ -n "$OPTIONS" ]; then
1899 NET="${OPTIONS%%,*}"
1901 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
1903 INTERFACE="${OPTIONS%%,*}"
1908 CONFIG=/etc/default/distcc
1909 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
1910 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
1912 if [ -n "$INTERFACE" ] ; then
1913 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1916 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
1917 counter=$(( counter-1 ))
1918 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
1920 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
1924 if [ -n "$IP" ] ; then
1925 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
1927 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
1929 id distccd >/dev/null 2>&1 || \
1931 einfo "Creating distcc user" ; \
1932 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
1935 einfo "Starting distcc for network ${NET}, listening on ${IP}."
1936 /etc/init.d/distcc start 1>/dev/null ; eend $?
1939 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
1943 if checkbootparam "gcc"; then
1944 GCC="$(getbootparam gcc 2>>$DEBUG)"
1946 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
1949 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
1952 if checkbootparam "gpp"; then
1953 GPP="$(getbootparam gpp 2>>$DEBUG)"
1955 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
1956 if [ -x /usr/bin/g++-${GPP} ] ; then
1958 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
1960 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
1961 if [ -x /usr/bin/cpp-${GPP} ] ; then
1963 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
1972 # Notice: use it only on live-cd system, if running from harddisk please
1973 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
1974 # in /etc/runlevel.conf
1976 MODULES_FILE=/etc/grml/modules
1977 if checkbootparam nomodules ; then
1978 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
1979 elif [ -z "$INSTALLED" ]; then
1980 if [ -r $MODULES_FILE ] ; then
1981 einfo "Loading modules specified in ${MODULES_FILE}:"
1983 grep '^[^#]' $MODULES_FILE | \
1984 while read module args; do
1985 [ "$module" ] || continue
1987 modprobe $module $args ; eend $?
1991 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
1998 config_915resolution(){
1999 if checkbootparam "915resolution" ; then
2000 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2001 if [ -x /usr/sbin/915resolution ]; then
2006 if [ -n "$OPTIONS" ]; then
2008 MODE="${OPTIONS%%,*}"
2010 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2012 XRESO="${OPTIONS%%,*}"
2014 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2016 YRESO="${OPTIONS%%,*}"
2021 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2022 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2031 if [ -z "$INSTALLED" ] ; then
2032 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2033 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2034 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2035 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2037 if ! [ -x /sbin/mdadm ] ; then
2038 eerror "mdadm not available, can not execute it." ; eend 1
2041 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2042 # find out whether we have a valid configuration file already
2043 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2044 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2045 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2046 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2048 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2051 if ! checkbootparam 'swraid' ; then
2053 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2056 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2061 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2063 *'No arrays found'*)
2064 ewarn "$line" ; eend 0
2067 einfo "$line" ; eend 0
2074 if [ -r /proc/mdstat ] ; then
2076 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2077 if [ -z "$MDSTAT" ] ; then
2078 ewarn "No active arrays found" ; eend 0
2083 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2084 einfo "active arrays: $line" ; eend 0
2090 fi # bootoption swraid
2092 fi # is /sbin/mdadm executable?
2093 fi # check for bootoptions
2094 fi # run only in live-cd mode
2098 # {{{ LVM (Logical Volumes)
2100 if [ -z "$INSTALLED" ] ; then
2101 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2102 if checkbootparam 'nolvm' ; then
2103 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2105 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2106 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2107 eerror "LVM not available, can not execute it." ; eend 1
2109 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2110 einfo "You seem to have logical volumes (LVM) on your system."
2112 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2114 if checkbootparam 'lvm' ; then
2115 einfo "Bootoption LVM found. Searching for logical volumes:"
2116 /etc/init.d/lvm2 start ; eend $?
2120 fi # check for lvm binary
2121 fi # check for bootoption nolvm
2122 fi # run only in live-cd mode
2126 # {{{ debnet: setup network based on an existing one found on a partition
2128 if checkbootparam "debnet" ; then
2129 iszsh && setopt shwordsplit
2130 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2131 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2134 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2136 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2137 for i in $DEVICES; do
2138 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2139 einfo "Scanning on $i"
2140 if [ -f /mnt/etc/network/interfaces ]; then
2141 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2149 if [ -n "$FOUND_DEBNET" ]; then
2150 einfo "Stopping network."
2151 pump -k 1>/dev/null 2>&1
2152 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2153 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2154 rm -rf /etc/network/run
2155 cp -a /mnt/etc/network /etc
2156 rm -rf /etc/network/run
2157 mkdir /etc/network/run
2158 umount /mnt ; eend $?
2159 einfo "Starting network."
2160 /etc/init.d/networking start ; eend $?
2162 eerror "/etc/network/interfaces not found." ; eend 1
2166 eerror "Error: /mnt already mounted." ; eend 1
2172 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2174 if grep -q ipw3945 /proc/modules ; then
2175 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2176 ewarn "Broken ipw3945 network interface found, reloading module."
2185 # {{{ disable console blanking
2187 if checkbootparam "noblank" ; then
2188 einfo "Bootoption noblank found. Disabling monitor blanking."
2189 setterm -blank 0 ; eend $?
2194 # {{{ grml2hd: automatic installation
2197 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2199 if checkbootparam "user" ; then
2201 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2202 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2205 if checkbootparam "filesystem" ; then
2207 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2208 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2211 if checkbootparam "partition" ; then
2213 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2214 # notice: the following checks whether the given partition is available, if not the skip
2215 # execution of grml2hd as it might result in data loss...
2216 if [ -r $PARTITION ] ; then
2217 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2219 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2223 if checkbootparam "mbr" ; then
2225 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2226 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2229 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2231 GRML2HD_NONINTERACTIVE='yes' grml2hd
2234 chmod 755 /usr/bin/grml2hd_noninteractive
2235 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2236 if [ -z "$GRML2HD_FAIL" ] ; then
2237 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2239 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2242 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2246 # {{{ debootstrap: automatic installation
2247 config_debootstrap(){
2249 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2251 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2253 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2255 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2260 if checkbootparam "target" ; then
2262 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2263 # notice: the following checks whether the given partition is available, if not the skip
2264 # execution of grml-debootstrap as it might result in data loss...
2265 if ! [ -r "$TARGET" ] ; then
2266 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2270 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2275 if checkbootparam "grub" ; then
2277 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2280 if checkbootparam "groot" ; then
2282 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2285 if checkbootparam "release" ; then
2287 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2290 if checkbootparam "mirror" ; then
2292 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2295 if checkbootparam "boot_append" ; then
2297 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2300 if checkbootparam "password" ; then
2302 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2305 # now check which options are available
2306 if [ -n "TARGET" ] ; then
2307 TARGETCMD="--target $TARGET"
2311 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2315 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2316 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2317 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2318 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2319 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2320 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2322 # and finally write script and execute it
2323 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2325 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2328 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2330 screen /usr/bin/grml-debootstrap_noninteractive
2331 einfo "Invoking a shell, just exit to continue booting..."
2334 fi # stringinstring "BOOT_IMAGE=debian2hd
2338 # {{{ Support customization
2340 if checkbootparam "distri"; then
2341 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2342 if [ -r /cdrom/desktop/"$DISTRI".jpg ] ; then
2343 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file /cdrom/desktop/$DISTRI present" && eend 0
2344 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2345 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2346 cp /cdrom/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2352 ### {{{ backwards compatible stuff
2353 config_environment(){
2354 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2357 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2361 ## END OF FILE #################################################################
2362 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3