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 ################################################################################
9 # {{{ path, variables, signals, umask, zsh
10 export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin"
15 # old linuxrc version:
16 [ -d /cdrom ] && export LIVECD_PATH=/cdrom
17 # new initramfs layout:
18 [ -d /live/image ] && export LIVECD_PATH=/live/image
20 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
21 [ -z "$PS1" ] && trap "" 2 3 11
25 if [ -n "$ZSH_VERSION" ] ; then
31 # avoid 'no matches found: ...'
32 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
35 ### {{{ Utility Functions
39 case "$(cat $2)" in *$1*) return 0;; esac
45 case "$2" in *$1*) return 0;; esac
49 # Reread boot command line; echo last parameter's argument or return false.
51 stringinstring " $1=" "$CMDLINE" || return 1
52 result="${CMDLINE##*$1=}"
53 result="${result%%[ ]*}"
58 # Check boot commandline for specified option
60 stringinstring " $1" "$CMDLINE"
65 if [ "$1" = "yes" ] ; then
73 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
77 grep -q usb /etc/grml_version 2>>$DEBUG && return 0 || return 1
80 # execute flite only if it's present
82 [ -x /usr/bin/flite ] && flite -o play -t "$*"
86 # {{{ filesystems (proc, pts, sys) and fixes
88 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
92 stringinfile "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
96 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
100 # {{{ Read in boot parameters
101 [ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too
102 CMDLINE="$(cat /proc/cmdline)"
103 [ -d "${LIVECD_PATH}"/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
106 # {{{ Check if we are running from the grml-CD or HD
108 [ -e /etc/grml_cd ] || INSTALLED="yes"
112 checkbootparam "testcd" >>$DEBUG 2>&1 && TESTCD="yes"
115 # {{{ source lsb-functions , color handling
116 if checkbootparam "nocolor"; then
118 . /etc/grml/lsb-functions
119 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
121 . /etc/grml/lsb-functions
128 checkbootparam "debug" && BOOTDEBUG="yes"
129 stringinstring "BOOT_IMAGE=debug " "$CMDLINE" && BOOTDEBUG="yes"
132 if [ -n "$BOOTDEBUG" ]; then
133 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
134 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
135 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
136 einfo "Just exit the shell to continue boot process..."
140 if [ -r /etc/grml/screenrc ] ; then
141 einfo "Starting GNU screen to be able to use a full featured shell environment."
142 einfo "Just exit the shells (and therefore screen) to continue boot process..."
143 /bin/zsh -c "screen -c /etc/grml/screenrc"
145 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
146 einfo "Just exit the shell to continue boot process..."
158 if checkbootparam "log" || checkbootparam "debug" ; then
159 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
161 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
163 einfo "Starting bootlogd." # known to be *very* unreliable :(
164 bootlogd -r -c 1>>$DEBUG 2>&1 ; eend $?
172 # {{{ set firmware timeout via bootparam
174 if checkbootparam fwtimeout ; then
175 TIMEOUT="$(getbootparam 'fwtimeout' 2>>$DEBUG)"
176 einfo "Bootoption fwtimeout found. (Re)Loading firmware_class module."
177 rmmod firmware_class 1>>$DEBUG 2>&1
178 modprobe firmware_class ; eend $?
180 if [ -z "$TIMEOUT" ] ; then
181 TIMEOUT="100" # linux kernel default: 10
183 if [ -f /sys/class/firmware/timeout ] ; then
184 einfo "Setting timeout for firmware loading to ${TIMEOUT}."
185 echo 100 > /sys/class/firmware/timeout ; eend $?
190 ### {{{ language configuration / localization
193 einfo "Activating language settings:"
196 # people can specify $LANGUAGE and $CONSOLEFONT in a config file:
197 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
199 grep -q ' lang=.*-utf8' /proc/cmdline && UTF8='yes' || UTF8=''
201 # check for bootoption which overrides config from /etc/grml/autoconfig:
202 BOOT_LANGUAGE="$(getbootparam lang 2>>$DEBUG)"
203 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
205 # set default to 'en' in live-cd mode if $LANGUAGE is not yet set:
206 if [ -z "$INSTALLED" ] ; then
207 [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8'
210 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
211 if [ -n "$BOOT_LANGUAGE" ] ; then
212 [ -x /usr/sbin/grml-setlang ] && /usr/sbin/grml-setlang "$LANGUAGE"
216 if [ -z "$CONSOLEFONT" ] ; then
217 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
218 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
219 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
220 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
221 CONSOLEFONT='Uni3-Terminus16'
223 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
228 # export it now, so error messages get translated, too
229 if checkgrmlsmall ; then
230 export LANG='C' # grml-small does not provide any further locales
232 [ -r /etc/default/locale ] && . /etc/default/locale
236 # configure keyboard layout, read in already set values first:
237 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
239 # now allow keyboard override by boot commandline for later use:
240 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
241 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
242 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
243 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
244 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
246 # modify /etc/sysconfig/keyboard only in live-cd mode:
247 if [ -z "$INSTALLED" ] ; then
249 local LANGUAGE="$BOOT_LANGUAGE"
250 . /etc/grml/language-functions
251 # allow setting xkeyboard explicitly different than console keyboard
252 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
253 if [ -n "$KXKEYBOARD" ]; then
254 XKEYBOARD="$KXKEYBOARD"
255 KDEKEYBOARD="$KXKEYBOARD"
256 elif [ -n "$KKEYBOARD" ]; then
257 XKEYBOARD="$KKEYBOARD"
258 KDEKEYBOARD="$KKEYBOARD"
261 # duplicate of previous code to make sure /etc/grml/language-functions
262 # does not overwrite our values....
263 # now allow keyboard override by boot commandline for later use:
264 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
265 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
266 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
267 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
268 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
270 # write keyboard related variables to file for later use
271 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
272 if ! [ -e /etc/sysconfig/keyboard ] ; then
273 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
274 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
275 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
276 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
280 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
282 # activate unicode console if running within utf8 environment
283 if [ -r /etc/default/locale ] ; then
284 if grep -q "LANG=.*UTF" /etc/default/locale ; then
285 einfo "Setting up unicode environment."
286 unicode_start 2>>$DEBUG ; eend $?
290 # Set default keyboard before interactive setup
291 if [ -n "$KEYTABLE" ] ; then
292 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
293 loadkeys -q $KEYTABLE &
297 # we have to set up all consoles, therefore loop it over all ttys:
298 NUM_CONSOLES=$(fgconsole --next-available)
299 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
300 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
301 CUR_CONSOLE=$(fgconsole)
303 if [ -n "$CHARMAP" ] ; then
304 einfo "Running consolechars for ${CHARMAP}"
305 for vc in `seq 0 ${NUM_CONSOLES}` ; do
306 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
308 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
312 if checkbootparam noconsolefont ; then
313 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
315 if [ -n "$CONSOLEFONT" ] ; then
316 einfo "Running consolechars using ${CONSOLEFONT}"
317 for vc in `seq 0 ${NUM_CONSOLES}` ; do
318 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
320 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
331 if checkbootparam hostname ; then
332 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
333 einfo "Setting hostname to $HOSTNAME as requested."
334 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
335 hostname $HOSTNAME ; eend $?
337 hostname --file /etc/hostname
342 # fstabuser (needed when running from harddisk with username != grml {{{
344 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
345 if [ -n "$CONFIG_FSTAB_USER" ] ; then
346 fstabuser="$CONFIG_FSTAB_USER"
348 fstabuser=$(getent passwd 1000 | cut -d: -f1)
350 # if not yet set fall back to default 'grml' user
351 [ -n "$fstabuser" ] || fstabuser='grml'
355 # {{{ Set clock (Local time is more often used than GMT, so it is default)
357 # don't touch the files if running from harddisk:
358 if [ -z "$INSTALLED" ]; then
360 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
361 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
362 # hwclock uses the TZ variable
363 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
364 [ -n "$TZ" ] || TZ=Europe/Vienna
366 if ! [ -r /dev/rtc ] ; then
367 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
369 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
370 if [ -n "$ERROR" ] ; then
372 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
373 if [ -n "$ERROR" ] ; then
374 eerror "Problem running hwclock: $ERROR" ; eend 1
383 # {{{ print kernel info
385 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
386 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
387 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
388 if [ -r /proc/cpuinfo ] ; then
389 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
391 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
395 if [ -d /proc/xen ] ; then
397 einfo 'Running kernel featuring support for Xen detected' ; eend 0
403 # {{{ vmware specific stuff
405 if checkbootparam novmware ; then
406 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
408 if [ -z "$INSTALLED" ] ; then
409 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
410 if ! checkbootparam qemu ; then
411 if [ -r /etc/X11/xorg.conf.vmware ] ; then
412 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
413 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
416 elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
417 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
418 einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
419 cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
427 # {{{ qemu specific stuff
429 if checkbootparam qemu ; then
430 if [ -r /etc/X11/xorg.conf.example ] ; then
431 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
432 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
438 # {{{ ld.so.cache + depmod
440 if [ -n "$INSTALLED" ]; then
441 if ! [ -r /etc/grml.first.boot ] ; then
442 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
444 # Regenerate ld.so.cache and module dependencies on HD
445 einfo "Running ldconfig" ; ldconfig ; eend $?
446 einfo "Running depmod" ; depmod -a ; eend $?
447 touch /etc/grml.first.boot
457 # don't touch the files if running from harddisk:
458 if [ -z "$INSTALLED" ]; then
459 KTZ="$(getbootparam tz 2>>$DEBUG)"
460 if [ -n "$KTZ" ] ; then
461 einfo "Setting timezone."
462 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
464 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
470 # small computer / nearly no ram {{{
473 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
474 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
477 if checkbootparam "small"; then
478 einfo "Information: ${RAM} kB of RAM available." ; eend 0
479 einfo "Bootoption small detected. Activating small system."
480 if [ -r /etc/inittab.small ] ; then
481 mv /etc/inittab /etc/inittab.normal
482 mv /etc/inittab.small /etc/inittab
484 sed -i 's/^9/#&/' /etc/inittab
485 sed -i 's/^10/#&/' /etc/inittab
486 sed -i 's/^11/#&/' /etc/inittab
487 sed -i 's/^12/#&/' /etc/inittab
489 /sbin/telinit q ; eend $?
491 if checkgrmlsmall ; then
492 if [[ $RAM -lt 25000 ]] ; then
493 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
494 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
495 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
496 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
499 einfo "Information: ${RAM} kB of RAM available." ; eend 0
502 if [[ $RAM -lt 58000 ]] ; then
503 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
504 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
505 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
506 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
509 einfo "Information: ${RAM} kB of RAM available." ; eend 0
517 # skip startup of w3m {{{
519 if checkbootparam "fast"; then
520 ewarn "Bootoption fast detected. Skipping startup of w3m."
521 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
522 /sbin/telinit q ; eend $?
527 # activate serial console {{{
529 if checkbootparam "console"; then
530 einfo "Bootoption (for serial) console detected."
532 if [ -r /etc/mgetty/mgetty.config ] ; then
533 MODE=$(getbootparam console | awk -F, '{print $2}')
535 [ -n "$MODE" ] || MODE=9600 # default mode
536 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
537 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
540 einfo "Activating mgetty."
541 sed -i 's/^#T0/T0/' /etc/inittab
542 sed -i 's/^#T1/T1/' /etc/inittab
543 /sbin/telinit q ; eend $?
549 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
552 for DEVICE in /proc/ide/hd?; do
553 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
555 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
559 # {{{ Bring up loopback interface now
561 if [ -z "$INSTALLED" ] ; then
562 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
563 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
571 # firewire devices {{{
572 # the raw1394 driver does not yet export info into SYSFS,
573 # so let's create raw1394 device manually
574 # http://www.michael-prokop.at/blog/index.php?p=352
575 config_firewire_dev(){
576 if checkbootparam "nofirewiredev" ; then
577 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
579 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
580 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
581 # cd /dev && MAKEDEV video1394 raw1394
582 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
583 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
584 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
585 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
586 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
587 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
593 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
594 # otherwise we will get: passwd: Authentication token lock busy
596 if [ -z "$INSTALLED" ] ; then
604 if [ -n "$TESTCD" ]; then
605 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
606 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
609 if [ -n "${LIVECD_PATH}"/GRML ] ; then
610 ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
612 echo "${RED} *** Error: Could not find md5sum file. ***"
615 if [ "$RC" = "0" ]; then
616 einfo "Everything looks OK" ; eend 0
618 eerror 'Checksum failed for theses files:' ; eend 1
619 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
620 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
621 eerror '... RAM of your computer is broken.' ; eend 1
622 einfon "Hit return to continue, or press the reset button to quit."
631 # {{{ hardware detection via discover
633 if checkbootparam "nodisc" ; then
634 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
636 if [ -x /sbin/discover ] ; then
637 einfo "Discovering hardware. Trying to load the following modules in background:"
639 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)"
641 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
644 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
650 # {{{ hardware detection via hwinfo
652 if checkbootparam hwinfo >>$DEBUG 2>&1; then
653 einfo "Discovering hardware via hwinfo:"
654 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
655 echo -n " Loading modules: "
656 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
662 # {{{ disable hotplug agents on request
663 config_hotplug_agent(){
664 if checkbootparam "noagent" ; then
665 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
666 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
667 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
668 einfo "Disabling hotplug-agent(s) $AGENTNL"
669 for agent in $(echo -e $AGENTLIST) ; do
670 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
672 [ "$?" == "0" ] ; eend $?
677 # {{{ blacklist of hotplug-modules
678 config_hotplug_blacklist(){
679 if checkbootparam "black" ; then
680 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
681 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
682 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
683 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
684 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
685 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
693 if checkbootparam "nohotplug" ; then
694 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
696 if [ -r /etc/init.d/hotplug ] ; then
697 einfo "Starting hotplug system in background."
698 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
700 elif [ -r /etc/init.d/hotplug-light ] ; then
701 einfo "Starting hotplug-light system in background."
702 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
705 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
711 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
713 if checkbootparam "blacklist" ; then
714 if [ -z "$INSTALLED" ]; then
715 einfo "Bootoption blacklist found."
716 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
717 if [ -n "$BLACK" ] ; then
718 for module in $(echo ${BLACK//,/ }) ; do
719 einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
720 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
721 echo "blacklist $module" >> /etc/modprobe.d/grml
722 echo "alias $module off" >> /etc/modprobe.d/grml
723 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
726 eerror "No given module for blacklist found. Blacklisting will not work therefore."
729 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
731 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
740 if [ -d /proc/acpi ]; then
741 if checkbootparam "noacpi"; then
742 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
743 elif checkbootparam "nogrmlacpi" ; then
744 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
746 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
749 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
751 basename="${basename%%.*}"
752 case "$basename" in *_acpi)
753 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
755 modprobe $basename >>$DEBUG 2>&1 && found="yes"
756 local BASE="$BASE $basename"
758 if [ -n "$found" ] ; then
759 einfo "$BASE" ; eend 0
761 ewarn "(none)" ; eend 1
763 if ! ps x | grep -q /usr/sbin/acpid ; then
764 if ! [ -r /var/run/dbus/pid ] ; then
765 einfo "Starting acpi daemon."
766 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
768 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
769 eerror "Solution: please activate acpid via /etc/runlevel.conf"
773 ewarn "acpi daemon already running."
780 if checkbootparam "noapm"; then
781 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
783 modprobe apm power_off=1 >>$DEBUG 2>&1
784 if [ "$?" = "0" ] ; then
785 if [ -x /etc/init.d/apmd ] ;then
786 einfo "APM Bios found, enabling power management functions."
787 /etc/init.d/apmd start ; eend $?
790 eerror "Loading apm module failed." ; eend 1
797 # {{{ PCMCIA Check/Setup
798 # This needs to be done before other modules are being loaded (by hwsetup)
800 if checkbootparam "nopcmcia"; then
801 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
803 if /usr/sbin/laptop-detect ; then
804 einfo "Detected Laptop - checking for PCMCIA." && eend 0
805 modprobe pcmcia_core >>$DEBUG 2>&1
806 # Try Cardbus or normal PCMCIA socket drivers
807 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
808 if [ "$?" = "0" ]; then
809 modprobe ds >>$DEBUG 2>&1
810 if [ -d /proc/bus/pccard ] ; then
811 if [ -x /sbin/cardmgr ] ; then
812 einfo "PCMCIA found, starting cardmgr."
813 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
815 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
824 # {{{ run software synthesizer via speakup
826 if checkbootparam swspeak ; then
827 einfo "Bootoption swspeak found."
829 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
830 ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
832 einfo "Loading speakup_soft"
833 if modprobe speakup_soft ; then
836 flitewrapper "Fatal error setting up software speakup"
843 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
844 einfo "Kernel supports speakup." ; eend 0
846 if [ -x /etc/init.d/speech-dispatcher ] ; then
847 einfo "Starting speech-dispatcher."
848 /etc/init.d/speech-dispatcher start 1>>DEBUG ; eend $?
849 if [ -r /proc/speakup/synth_name ] ; then
850 einfo "Activating sftsyn via /proc in Kernel."
851 echo sftsyn > /proc/speakup/synth_name ; eend $?
852 elif [ -r /sys/modules/speakup/parameters/synth ] ; then
853 einfo "Activating sftsyn via /sys in Kernel."
854 echo sftsyn > /sys/modules/speakup/parameters/synth ; eend $?
856 eerror "Error when configuring sftsyn via /proc or /sys." ; eend 1
858 einfo "Just run swspeak if you want to use software synthesizer via speakup."
859 flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
861 eerror "speech-dispatcher not available. swspeak will not work without it." ; eend 1
862 flitewrapper "speech-dispatcher not available. speakup will not work without it."
866 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
867 flitewrapper "Kernel does not seem to support speakup. Sorry."
873 # {{{ support hardware synthesizer via speakup
875 if checkbootparam hwspeak ; then
876 einfo "Bootoption hwspeak found."
878 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
879 ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
881 for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
882 sed 's#.*speakup/##g ; s#.ko$##g' | \
883 grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
884 einfo "Trying to load $module"
891 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
892 einfo "Kernel should support speakup now." ; eend 0
893 flitewrapper "Kernel should support speakup now."
895 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
896 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
902 # {{{ Check for blind option or brltty
905 checkbootparam "blind" && BLIND="yes"
906 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
908 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
909 if [ -x /sbin/brltty ]; then
910 # Blind option detected, start brltty now.
911 # modprobe serial_core parport_serial generic_serial && echo "done"
916 if [ -n "$BRLTTY" ]; then
918 BRLTYPE="${BRLTTY%%,*}"
920 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
922 BRLDEV="${BRLTTY%%,*}"
924 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
926 BRLTEXT="${BRLTTY%%,*}"
931 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
932 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
933 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
934 einfo "Starting braille-display manager."
937 sleep 2 && BLINDSOUND="yes"
944 # {{{ Interactive configuration
945 config_interactive(){
946 ewarn "config_interactive is deprecated nowadays."
947 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
953 if checkbootparam forceagp ; then
954 # Probe for AGP. Hope this can fail safely
955 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
961 config_automounter(){
962 if checkbootparam automounter ; then
963 RUNLEVEL="$(runlevel)"
965 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
970 if [ -n "$AUTOMOUNTER" ]; then
971 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
972 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
973 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
974 anew="$d -fstype=auto,$2 :$i"
975 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
976 AUTOMOUNTS="$AUTOMOUNTS $d"
977 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
979 [ -d /mnt/$d ] && mkdir -p /mnt/$d
980 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
982 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
985 AUTOMOUNTS="floppy cdrom"
986 # Add new devices to /etc/fstab and /etc/auto.mnt
987 for i in /dev/cdrom?*; do
989 addautomount "$i" "ro"
994 if [ -n "$AUTOMOUNTER" ]; then
995 # Check for floppy dir, reinstall with automounter
996 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
997 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
998 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
999 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
1000 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
1001 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
1002 rm -f /etc/fstab.new
1003 # Replace paths from bootfloppy
1004 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
1005 mv -f /etc/fstab.new /etc/fstab
1006 # Start automounter now
1007 einfo "Starting automounter for ${AUTOMOUNTS}."
1008 /etc/init.d/autofs start >>$DEBUG ; eend $?
1013 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1017 while read major minor blocks partition relax; do
1018 partition="${partition##*/}"
1019 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1020 case "$partition" in
1021 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
1022 sd?) ;; # SCSI Harddisk, entire disk
1023 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
1024 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
1027 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1030 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1033 # {{{ Enable DMA for all IDE drives now if not disabled
1034 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1036 if checkbootparam "nodma"; then
1037 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1039 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1040 if test -d /proc/ide/$d; then
1041 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1042 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1043 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1044 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1045 echo "using_dma:1" >/proc/ide/$d/settings
1054 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1057 NOSWAP="yes" # we do not use swap by default!
1058 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1060 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1063 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1064 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1066 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1067 iszsh && setopt nonomatch
1068 if [ -x /usr/sbin/rebuildfstab ] ; then
1069 config_userfstab || fstabuser=grml
1070 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1072 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1074 fi # checkbootparam nofstab/forensic
1076 # Scan for swap, config, homedir - but only in live-mode
1077 if [ -z "$INSTALLED" ] ; then
1078 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1081 HOMEDIR="$(getbootparam home)"
1082 if [ -n "$partitions" ]; then
1083 while read p m f relax; do
1084 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1085 partoptions="users,exec"
1087 # it's a swap partition?
1090 if [ -n "$NOSWAP" ]; then
1091 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1094 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1095 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1096 if [ -n "$ANYSWAP" ] ; then
1097 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1098 swapon $p 2>>$DEBUG ; eend $?
1100 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1104 if [[ "$p" == LABEL* ]] ; then
1105 p=$(blkid -t $p | awk -F: '{print $1}')
1107 if grep -q $p /proc/swaps ; then
1108 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1110 if [ -b "$p" ] ; then
1111 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1112 swapon $p 2>>$DEBUG ; eend $?
1114 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1123 esac # it's a swap partition?
1128 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1129 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1131 # *) NONEFOUND='1'; continue ;;
1135 if [ -z "$NOSWAP" ] ; then
1136 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1137 # Activate swapfile, if exists
1138 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1140 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1141 mount -o remount,rw $m && MOUNTED=1
1142 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1144 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1146 fnew="$SWAPFILE swap swap defaults 0 0"
1147 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1148 GRML_SWP="$GRML_SWP $SWAPFILE"
1151 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1154 # use a image as home
1155 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1156 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1157 if [ -n "$HOMEDIR" ]; then
1158 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1162 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1164 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1169 # Umount, if not in use
1170 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1182 if [ -n "$MOUSE_DEVICE" ] ; then
1183 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1188 # {{{ IPv6 configuration
1189 # Load IPv6 kernel module and print IP adresses
1191 if checkbootparam "ipv6"; then
1192 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1194 # we probably need some time until stateless autoconfiguration has happened
1196 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1197 for DEVICE in `echo "$NETDEVICES"`; do
1200 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1201 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1203 for ADDR in `echo "$ADDRESSES"` ; do
1206 if [ "$COUNT" -eq "0" ] ; then
1207 einfo "(none)" ; eend 1
1217 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1219 if checkbootparam "nodhcp"; then
1220 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1222 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1223 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1224 for DEVICE in `echo "$NETDEVICES"` ; do
1225 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1227 ifconfig $DEVICE up >>$DEBUG 2>&1
1228 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1233 if [ -n "$INSTALLED" ] ; then
1234 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1241 # {{{ helper functions
1244 # search all partitions for a file in the root directory
1245 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1246 # See if it's already mounted
1247 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1248 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1249 [ -f "$i/$1" ] && FOUND="$i/$1"
1250 umount -l "$i" 2>>$DEBUG
1251 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1258 case "$(file -s $1)" in
1259 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1260 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1261 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1262 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1263 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1264 *data*) echo "invalid"; return 0;;
1265 *) echo "auto"; return 0;;
1269 # Try to mount this filesystem read-only, without or with encryption
1271 # Check if already mounted
1272 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1273 # Apparently, mount-aes DOES autodetect AES loopback files.
1274 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1275 # We need to mount crypto-loop files with initial rw support
1276 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1278 [ "$RC" = "0" ] && return 0
1280 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1282 while [ "$a" != "n" -a "$a" != "N" ]; do
1283 # We need to mount crypto-loop files with initial rw support
1284 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1285 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1286 # Problem with ioctl() from getpasswd()?
1296 if checkbootparam "nocpu"; then
1297 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1299 # check module dependencies
1301 if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1302 if [ -e /lib64 ] ; then
1303 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1305 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1310 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1311 einfo "Detecting CPU:"
1312 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)
1313 echo $CPU | sed 's/ \{1,\}/ /g'
1316 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
1319 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1320 # * it only if we have the according kernel modules available
1321 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1322 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1323 # -> parse output of the initscript and output it according to our look'n'feel
1324 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1325 if ! cpufreq_check ; then
1326 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1328 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1329 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1330 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1331 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1332 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1336 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1338 if [ -x /etc/init.d/loadcpufreq ] ; then
1339 SKIP_CPU_GOVERNOR=''
1340 LOADCPUFREQ=$(mktemp)
1341 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1342 if grep -q FATAL "$LOADCPUFREQ" ; then
1348 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1349 eerror "$line" ; eend $RC
1353 elif grep -q done "$LOADCPUFREQ" ; then
1354 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1355 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1356 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1358 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1362 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1363 . /usr/bin/cpufreq-detect.sh
1364 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1365 einfo "Loading modules ${MODULE}"
1366 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1368 if [[ $RC == 0 ]]; then
1375 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1379 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1380 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1381 if modprobe cpufreq_ondemand ; RC=$? ; then
1382 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1383 echo ondemand > $file
1393 fi # checkbootparam nocpu
1397 # {{{ autostart of ssh
1399 if checkbootparam ssh ; then
1401 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1402 einfo "Bootoption ssh found, trying to set password for user grml."
1404 if [ -z "$SSH_PASSWD" ] ; then
1405 if [ -x /usr/bin/apg ] ; then
1406 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1407 elif [ -x /usr/bin/gpw ] ; then
1408 SSH_PASSWD="$(gpw 1)"
1409 elif [ -x /usr/bin/pwgen ] ; then
1410 SSH_PASSWD="$(pwgen -1 8)"
1411 elif [ -x /usr/bin/hexdump ] ; then
1412 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1413 elif [ -n "$RANDOM" ] ; then
1414 SSH_PASSWD="grml${RANDOM}"
1417 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1421 if [ -n "$SSH_PASSWD" ] ; then
1422 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1427 # finally check if we have a password we can use:
1428 if [ -n "$SSH_PASSWD" ] ; then
1429 echo "grml:$SSH_PASSWD" | chpasswd -m
1432 einfo 'Starting secure shell server in background.'
1433 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1434 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1438 ewarn 'Warning: please change the password for user grml as soon as possible!'
1444 # {{{ set password for user grml
1446 if checkbootparam passwd >>$DEBUG 2>&1; then
1447 einfo "Bootoption passwd found."
1448 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1449 if [ -n "$PASSWD" ] ; then
1450 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1452 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1455 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1461 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1463 if checkbootparam home ; then
1464 HOMEDIR="$(getbootparam home)"
1468 if [ -n "$HOMEDIR" ]; then
1469 einfo "Bootoption home detected." && eend 0
1472 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1473 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1474 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1475 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1478 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1479 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1480 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1481 MYHOMEDIR="$HOMEDIR"
1483 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1484 MYHOMEDIR="$(findfile grml.img)"
1485 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1486 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1487 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1490 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1491 eerror "Option ignored." ; eend 1
1496 if [ -n "$MYHOMEDIR" ]; then
1497 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1498 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1499 while read device mountpoint fs relax; do
1500 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1503 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1507 # Note: This currently won't work with encrypted partitions
1508 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1509 if [ ! -f "$MYHOMEDIR" ]; then
1510 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1511 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1516 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1517 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1518 if [ -f "$MYHOMEDIR" ]; then
1519 # It's a loopback file, mount it over the /home/grml directory
1520 trymount "$MYHOMEDIR" /home/grml
1522 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1526 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1530 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1532 fi # mount -o remount,rw,...
1535 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1539 fi # if trymount ...
1541 fi # checkbootparam home
1545 # {{{ Check for scripts on CD-ROM
1546 config_cdrom_scripts(){
1547 if checkbootparam "script"; then
1548 for script in "${LIVECD_PATH}"/scripts/* ; do
1549 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1558 if ! [ -x /usr/bin/aumix ] ; then
1559 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1562 if ! [ -r /proc/asound/cards ] ; then
1563 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1567 if checkbootparam vol ; then
1568 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1569 if [ -z "$VOL" ] ; then
1570 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1577 if checkbootparam nosound ; then
1578 einfo "Muting sound devices on request."
1579 # some IBM notebooks require the following stuff:
1580 if [ -x /usr/bin/amixer ] ; then
1581 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1582 amixer set Front unmute 1>/dev/null
1583 amixer set Front 0% 1>/dev/null
1586 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1587 if [ -n "$ERROR" ] ; then
1589 eerror "Problem muting sound devices: $ERROR"
1593 elif [ -z "$INSTALLED" ]; then
1594 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1595 # some IBM notebooks require the following stuff:
1596 if [ -x /usr/bin/amixer ] ; then
1597 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1598 amixer set Front unmute 1>/dev/null
1599 amixer set Front ${VOL}% 1>/dev/null
1602 # by default assume '0' as volume for microphone:
1603 if checkbootparam micvol ; then
1604 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1609 # finally set the volumes:
1610 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1611 if [ -n "$ERROR" ] ; then
1613 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1623 # {{{ modem detection
1625 if checkbootparam "nomodem"; then
1626 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1628 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1629 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1630 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1638 # {{{ keyboard add-ons
1639 config_setkeycodes(){
1640 if checkbootparam "setkeycodes" ; then
1641 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1642 # MS MM keyboard add-on
1644 setkeycodes e001 126 &>/dev/null
1645 setkeycodes e059 127 &>/dev/null
1647 setkeycodes e03b 59 &>/dev/null
1648 setkeycodes e008 60 &>/dev/null
1649 setkeycodes e007 61 &>/dev/null
1650 setkeycodes e03e 62 &>/dev/null
1651 setkeycodes e03f 63 &>/dev/null
1652 setkeycodes e040 64 &>/dev/null
1653 setkeycodes e041 65 &>/dev/null
1654 setkeycodes e042 66 &>/dev/null
1655 setkeycodes e043 67 &>/dev/null
1656 setkeycodes e023 68 &>/dev/null
1657 setkeycodes e057 87 &>/dev/null
1658 setkeycodes e058 88 &>/dev/null
1660 setkeycodes e00a 89 e008 90 &>/dev/null
1667 config_wondershaper(){
1668 if checkbootparam "wondershaper" ; then
1669 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1674 if [ -n "$WONDER" ]; then
1676 DEVICE="${WONDER%%,*}"
1678 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1680 DOWNSTREAM="${WONDER%%,*}"
1682 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1684 UPSTREAM="${WONDER%%,*}"
1689 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1690 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1691 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1692 einfo "Starting wondershaper (${CMD}) in background."
1693 ( sh -c $CMD & ) && eend 0
1700 if checkbootparam "nosyslog"; then
1701 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1704 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1705 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1706 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1707 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1708 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1710 if [ -z "$SYSLOGD" ] ; then
1711 eerror "No syslog daemon found." ; eend 1
1713 einfo "Starting $SYSLOGD in background."
1714 /etc/init.d/$SYSLOGD start 1>>$DEBUG &
1723 if checkbootparam "nogpm"; then
1724 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1726 if ! [ -r /dev/input/mice ] ; then
1727 eerror "No mouse found - not starting GPM." ; eend 1
1729 einfo "Starting gpm in background."
1730 /etc/init.d/gpm start 1>>$DEBUG &
1731 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1740 if checkbootparam "services" ; then
1741 SERVICE="$(getbootparam services 2>>$DEBUG)"
1742 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1743 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1744 einfo "Starting service(s) ${SERVICENL} in background."
1745 for service in $(echo -e $SERVICELIST) ; do
1746 /etc/init.d/${service} start 1>>$DEBUG &
1748 [ "$?" == "0" ] ; eend $?
1755 if checkbootparam netconfig ; then
1756 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1757 CONFIGFILE='/tmp/netconfig.grml'
1760 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1761 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1763 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1765 while ! getconfig && [[ "$counter" != 0 ]] ; do
1766 echo -n "Sleeping for 5 seconds and trying to get config again... "
1767 counter=$(( counter-1 ))
1768 echo "$counter tries left" ; sleep 1
1770 if [ -r "$CONFIGFILE" ] ; then
1771 einfo "Downloading was successfull." ; eend 0
1772 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1773 md5sum $CONFIGFILE ; eend 0
1774 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1776 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1783 config_blindsound(){
1784 if checkbootparam "blind" ; then
1786 flitewrapper "welcome to the gremel system"
1793 if checkbootparam welcome ; then
1794 flitewrapper "welcome to the gremel system"
1799 # {{{ fix/workaround for unionfs
1801 if [ -z "$INSTALLED" ]; then
1802 touch /var/cache/apt/*cache.bin
1807 # {{{ create all /mnt-directories
1809 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1810 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1814 # {{{ start X window system via grml-x
1816 if checkbootparam startx ; then
1817 if [ -x /usr/X11R6/bin/X ] ; then
1818 if [ -z "$INSTALLED" ] ; then
1819 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1820 if [ -z "$WINDOWMANAGER" ] ; then
1821 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1822 WINDOWMANAGER="wm-ng"
1824 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1826 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1827 config_userfstab || fstabuser='grml'
1828 cat>|/etc/init.d/xstartup<<EOF
1830 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1831 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1833 chmod 755 /etc/init.d/xstartup
1835 # adjust inittab for xstartup
1836 if grep -q '^6:' /etc/inittab ; then
1837 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1838 else # just append tty6 to inittab if no definition is present:
1839 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1842 /sbin/telinit q ; eend $?
1844 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1845 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1847 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1851 eerror "We are not running from CD - startx will not work, skipping it.
1852 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1855 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1856 Boot parameter startx does not work therefore." ; eend 1
1862 # {{{ configuration framework
1864 if checkbootparam extract ; then
1865 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1866 EXTRACTOPTIONS="-- -x $EXTRACT"
1871 if checkbootparam noautoconfig || checkbootparam forensic ; then
1872 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1874 if [ -z "$INSTALLED" ] ; then
1875 einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1877 [ -d /mnt/grml ] || mkdir /mnt/grml
1878 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1879 # We do need the following fix so floppy disk is available to blkid in any case :-/
1880 if [ -r /dev/fd0 ] ; then
1881 einfo "Floppy device detected. Trying to access floppy disk."
1882 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1883 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1884 blkid /dev/fd0 1>>$DEBUG 2>&1
1887 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1888 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1889 if [[ $RC == 0 ]]; then
1890 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1893 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1894 if [ -n "$CONFIG" ]; then
1895 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1897 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1899 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1903 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1904 if [ -n "$SCRIPT" ]; then
1905 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1908 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1910 ewarn "No devices with label GRMLCFG found." ; eend 0
1919 if checkbootparam "config" ; then
1920 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1921 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1922 einfo "Bootoption config found. config is set to: $CONFIG"
1924 einfo "Trying to extract configuration file ${CONFIG}:"
1925 cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1929 if checkbootparam myconfig ; then
1930 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1931 if [ -n "$MOUNTDEVICE" ]; then
1932 if checkbootparam file ; then
1933 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1934 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1936 [ -d /mnt/grml ] || mkdir /mnt/grml
1937 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1938 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1939 if [[ $RC == 0 ]]; then
1940 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1943 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1944 if [ -n "$CONFIG" ]; then
1945 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1947 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1949 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1953 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1954 if [ -n "$SCRIPT" ]; then
1955 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1960 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1961 fi # mount $MOUNTDEVICE
1962 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1964 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1965 fi # [ -n "$MOUNTDEVICE" ]
1966 fi # checkbootparam myconfig
1968 if checkbootparam "partconf" ; then
1969 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1970 if [ -n "$MOUNTDEVICE" ]; then
1971 [ -d /mnt/grml ] || mkdir /mnt/grml
1972 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1973 if [[ $RC == 0 ]]; then
1974 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1975 einfo "Copying files from $MOUNTDEVICE over grml system."
1976 for file in `cat /etc/grml/partconf` ; do
1977 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1978 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1981 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1982 fi # mount $MOUNTDEVICE
1983 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1985 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1986 fi # [ -n "$MOUNTDEVICE" ]
1991 # {{{ /cdrom/.*-options
1993 if checkbootparam "debs" ; then
1994 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1995 einfo "Tring to install debian package(s) ${DEBS}"
1996 dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
2001 if checkbootparam "scripts" ; then
2002 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
2003 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
2004 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
2005 sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
2012 if checkbootparam "mypath" ; then
2013 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2014 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2015 touch /etc/grml/my_path
2016 chmod 644 /etc/grml/my_path
2017 # make sure the directories exist:
2019 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2020 if ! [ -d "$i" ] ; then
2021 einfo "Creating directory $i"
2022 mkdir -p "$i" ; eend $?
2025 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2033 if checkbootparam "distcc" ; then
2034 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2035 if [ -n "$OPTIONS" ]; then
2038 if [ -n "$OPTIONS" ]; then
2039 NET="${OPTIONS%%,*}"
2041 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2043 INTERFACE="${OPTIONS%%,*}"
2048 CONFIG=/etc/default/distcc
2049 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
2050 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2052 if [ -n "$INTERFACE" ] ; then
2053 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2056 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2057 counter=$(( counter-1 ))
2058 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2060 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2064 if [ -n "$IP" ] ; then
2065 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
2067 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2069 id distccd >/dev/null 2>&1 || \
2071 einfo "Creating distcc user" ; \
2072 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2075 einfo "Starting distcc for network ${NET}, listening on ${IP}."
2076 /etc/init.d/distcc start 1>/dev/null ; eend $?
2079 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2083 if checkbootparam "gcc"; then
2084 GCC="$(getbootparam gcc 2>>$DEBUG)"
2086 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2089 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2092 if checkbootparam "gpp"; then
2093 GPP="$(getbootparam gpp 2>>$DEBUG)"
2095 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2096 if [ -x /usr/bin/g++-${GPP} ] ; then
2098 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2100 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2101 if [ -x /usr/bin/cpp-${GPP} ] ; then
2103 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2112 # Notice: use it only on live-cd system, if running from harddisk please
2113 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2114 # in /etc/runlevel.conf
2116 MODULES_FILE=/etc/grml/modules
2117 if checkbootparam nomodules ; then
2118 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2119 elif [ -z "$INSTALLED" ]; then
2120 if [ -r $MODULES_FILE ] ; then
2121 einfo "Loading modules specified in ${MODULES_FILE}:"
2123 grep '^[^#]' $MODULES_FILE | \
2124 while read module args; do
2125 [ "$module" ] || continue
2127 modprobe $module $args ; eend $?
2131 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2138 config_915resolution(){
2139 if checkbootparam "915resolution" ; then
2140 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2141 if [ -x /usr/sbin/915resolution ]; then
2146 if [ -n "$OPTIONS" ]; then
2148 MODE="${OPTIONS%%,*}"
2150 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2152 XRESO="${OPTIONS%%,*}"
2154 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2156 YRESO="${OPTIONS%%,*}"
2161 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2162 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2171 if [ -z "$INSTALLED" ] ; then
2172 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2173 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2174 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2175 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2177 if ! [ -x /sbin/mdadm ] ; then
2178 eerror "mdadm not available, can not execute it." ; eend 1
2181 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2182 # find out whether we have a valid configuration file already
2183 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2184 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2185 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2186 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2188 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2191 if ! checkbootparam 'swraid' ; then
2193 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2196 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2201 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2203 *'No arrays found'*)
2204 ewarn "$line" ; eend 0
2207 einfo "$line" ; eend 0
2214 if [ -r /proc/mdstat ] ; then
2216 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2217 if [ -z "$MDSTAT" ] ; then
2218 ewarn "No active arrays found" ; eend 0
2223 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2224 einfo "active arrays: $line" ; eend 0
2230 fi # bootoption swraid
2232 fi # is /sbin/mdadm executable?
2233 fi # check for bootoptions
2234 fi # run only in live-cd mode
2238 # {{{ LVM (Logical Volumes)
2240 if [ -z "$INSTALLED" ] ; then
2241 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2242 if checkbootparam 'nolvm' ; then
2243 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2245 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2246 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2247 eerror "LVM not available, can not execute it." ; eend 1
2249 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2250 einfo "You seem to have logical volumes (LVM) on your system."
2252 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2254 if checkbootparam 'lvm' ; then
2255 einfo "Bootoption LVM found. Searching for logical volumes:"
2256 /etc/init.d/lvm2 start ; eend $?
2260 fi # check for lvm binary
2261 fi # check for bootoption nolvm
2262 fi # run only in live-cd mode
2266 # {{{ debnet: setup network based on an existing one found on a partition
2268 if checkbootparam "debnet" ; then
2269 iszsh && setopt shwordsplit
2270 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2271 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2274 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2276 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2277 for i in $DEVICES; do
2278 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2279 einfo "Scanning on $i"
2280 if [ -f /mnt/etc/network/interfaces ]; then
2281 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2289 if [ -n "$FOUND_DEBNET" ]; then
2290 einfo "Stopping network."
2291 pump -k 1>/dev/null 2>&1
2292 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2293 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2294 rm -rf /etc/network/run
2295 cp -a /mnt/etc/network /etc
2296 rm -rf /etc/network/run
2297 mkdir /etc/network/run
2298 umount /mnt ; eend $?
2299 einfo "Starting network."
2300 /etc/init.d/networking start ; eend $?
2302 eerror "/etc/network/interfaces not found." ; eend 1
2306 eerror "Error: /mnt already mounted." ; eend 1
2312 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2314 if grep -q ipw3945 /proc/modules ; then
2315 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2316 ewarn "Broken ipw3945 network interface found, reloading module."
2325 # {{{ disable console blanking
2327 if checkbootparam "noblank" ; then
2328 einfo "Bootoption noblank found. Disabling monitor blanking."
2329 setterm -blank 0 ; eend $?
2334 # {{{ grml2hd: automatic installation
2337 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2339 if checkbootparam "user" ; then
2341 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2342 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2345 if checkbootparam "filesystem" ; then
2347 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2348 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2351 if checkbootparam "partition" ; then
2353 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2354 # notice: the following checks whether the given partition is available, if not the skip
2355 # execution of grml2hd as it might result in data loss...
2356 if [ -r $PARTITION ] ; then
2357 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2359 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2363 if checkbootparam "mbr" ; then
2365 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2366 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2369 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2371 GRML2HD_NONINTERACTIVE='yes' grml2hd
2374 chmod 755 /usr/bin/grml2hd_noninteractive
2375 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2376 if [ -z "$GRML2HD_FAIL" ] ; then
2377 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2379 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2382 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2386 # {{{ debootstrap: automatic installation
2387 config_debootstrap(){
2389 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2391 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2393 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2395 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2400 if checkbootparam "target" ; then
2402 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2403 # notice: the following checks whether the given partition is available, if not the skip
2404 # execution of grml-debootstrap as it might result in data loss...
2405 if ! [ -r "$TARGET" ] ; then
2406 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2410 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2415 if checkbootparam "grub" ; then
2417 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2420 if checkbootparam "groot" ; then
2422 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2425 if checkbootparam "release" ; then
2427 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2430 if checkbootparam "mirror" ; then
2432 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2435 if checkbootparam "boot_append" ; then
2437 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2440 if checkbootparam "password" ; then
2442 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2445 # now check which options are available
2446 if [ -n "TARGET" ] ; then
2447 TARGETCMD="--target $TARGET"
2451 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2455 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2456 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2457 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2458 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2459 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2460 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2462 # and finally write script and execute it
2463 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2465 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2468 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2470 screen /usr/bin/grml-debootstrap_noninteractive
2471 einfo "Invoking a shell, just exit to continue booting..."
2474 fi # stringinstring "BOOT_IMAGE=debian2hd
2478 # {{{ Support customization
2480 if checkbootparam "distri"; then
2481 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2482 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2483 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2484 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2485 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2486 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2492 ### {{{ backwards compatible stuff
2493 config_environment(){
2494 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2497 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2501 ## END OF FILE #################################################################
2502 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3