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_soft /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_soft /proc/modules ; then
844 einfo "Kernel supports speakup." ; eend 0
846 einfo "Just run swspeak if you want to use software synthesizer via speakup."
847 flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
850 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
851 flitewrapper "Kernel does not seem to support speakup. Sorry."
857 # {{{ support hardware synthesizer via speakup
859 if checkbootparam hwspeak ; then
860 einfo "Bootoption hwspeak found."
862 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
863 ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
865 for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
866 sed 's#.*speakup/##g ; s#.ko$##g' | \
867 grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
868 einfo "Trying to load $module"
875 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
876 einfo "Kernel should support speakup now." ; eend 0
877 flitewrapper "Kernel should support speakup now."
879 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
880 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
886 # {{{ Check for blind option or brltty
889 checkbootparam "blind" && BLIND="yes"
890 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
892 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
893 if [ -x /sbin/brltty ]; then
894 # Blind option detected, start brltty now.
895 # modprobe serial_core parport_serial generic_serial && echo "done"
900 if [ -n "$BRLTTY" ]; then
902 BRLTYPE="${BRLTTY%%,*}"
904 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
906 BRLDEV="${BRLTTY%%,*}"
908 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
910 BRLTEXT="${BRLTTY%%,*}"
915 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
916 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
917 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
918 einfo "Starting braille-display manager."
921 sleep 2 && BLINDSOUND="yes"
928 # {{{ Interactive configuration
929 config_interactive(){
930 ewarn "config_interactive is deprecated nowadays."
931 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
937 if checkbootparam forceagp ; then
938 # Probe for AGP. Hope this can fail safely
939 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
945 config_automounter(){
946 if checkbootparam automounter ; then
947 RUNLEVEL="$(runlevel)"
949 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
954 if [ -n "$AUTOMOUNTER" ]; then
955 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
956 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
957 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
958 anew="$d -fstype=auto,$2 :$i"
959 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
960 AUTOMOUNTS="$AUTOMOUNTS $d"
961 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
963 [ -d /mnt/$d ] && mkdir -p /mnt/$d
964 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
966 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
969 AUTOMOUNTS="floppy cdrom"
970 # Add new devices to /etc/fstab and /etc/auto.mnt
971 for i in /dev/cdrom?*; do
973 addautomount "$i" "ro"
978 if [ -n "$AUTOMOUNTER" ]; then
979 # Check for floppy dir, reinstall with automounter
980 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
981 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
982 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
983 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
984 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
985 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
987 # Replace paths from bootfloppy
988 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
989 mv -f /etc/fstab.new /etc/fstab
990 # Start automounter now
991 einfo "Starting automounter for ${AUTOMOUNTS}."
992 /etc/init.d/autofs start >>$DEBUG ; eend $?
997 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1001 while read major minor blocks partition relax; do
1002 partition="${partition##*/}"
1003 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1004 case "$partition" in
1005 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
1006 sd?) ;; # SCSI Harddisk, entire disk
1007 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
1008 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
1011 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1014 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1017 # {{{ Enable DMA for all IDE drives now if not disabled
1018 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1020 if checkbootparam "nodma"; then
1021 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1023 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1024 if test -d /proc/ide/$d; then
1025 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1026 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1027 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1028 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1029 echo "using_dma:1" >/proc/ide/$d/settings
1038 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1041 NOSWAP="yes" # we do not use swap by default!
1042 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1044 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1047 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1048 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1050 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1051 iszsh && setopt nonomatch
1052 if [ -x /usr/sbin/rebuildfstab ] ; then
1053 config_userfstab || fstabuser=grml
1054 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1056 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1058 fi # checkbootparam nofstab/forensic
1060 # Scan for swap, config, homedir - but only in live-mode
1061 if [ -z "$INSTALLED" ] ; then
1062 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1065 HOMEDIR="$(getbootparam home)"
1066 if [ -n "$partitions" ]; then
1067 while read p m f relax; do
1068 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1069 partoptions="users,exec"
1071 # it's a swap partition?
1074 if [ -n "$NOSWAP" ]; then
1075 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1078 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1079 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1080 if [ -n "$ANYSWAP" ] ; then
1081 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1082 swapon $p 2>>$DEBUG ; eend $?
1084 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1088 if [[ "$p" == LABEL* ]] ; then
1089 p=$(blkid -t $p | awk -F: '{print $1}')
1091 if grep -q $p /proc/swaps ; then
1092 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1094 if [ -b "$p" ] ; then
1095 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1096 swapon $p 2>>$DEBUG ; eend $?
1098 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1107 esac # it's a swap partition?
1112 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1113 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1115 # *) NONEFOUND='1'; continue ;;
1119 if [ -z "$NOSWAP" ] ; then
1120 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1121 # Activate swapfile, if exists
1122 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1124 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1125 mount -o remount,rw $m && MOUNTED=1
1126 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1128 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1130 fnew="$SWAPFILE swap swap defaults 0 0"
1131 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1132 GRML_SWP="$GRML_SWP $SWAPFILE"
1135 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1138 # use a image as home
1139 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1140 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1141 if [ -n "$HOMEDIR" ]; then
1142 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1146 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1148 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1153 # Umount, if not in use
1154 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1166 if [ -n "$MOUSE_DEVICE" ] ; then
1167 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1172 # {{{ IPv6 configuration
1173 # Load IPv6 kernel module and print IP adresses
1175 if checkbootparam "ipv6"; then
1176 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1178 # we probably need some time until stateless autoconfiguration has happened
1180 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1181 for DEVICE in `echo "$NETDEVICES"`; do
1184 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1185 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1187 for ADDR in `echo "$ADDRESSES"` ; do
1190 if [ "$COUNT" -eq "0" ] ; then
1191 einfo "(none)" ; eend 1
1201 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1203 if checkbootparam "nodhcp"; then
1204 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1206 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1207 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1208 for DEVICE in `echo "$NETDEVICES"` ; do
1209 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1211 ifconfig $DEVICE up >>$DEBUG 2>&1
1212 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1217 if [ -n "$INSTALLED" ] ; then
1218 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1225 # {{{ helper functions
1228 # search all partitions for a file in the root directory
1229 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1230 # See if it's already mounted
1231 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1232 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1233 [ -f "$i/$1" ] && FOUND="$i/$1"
1234 umount -l "$i" 2>>$DEBUG
1235 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1242 case "$(file -s $1)" in
1243 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1244 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1245 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1246 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1247 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1248 *data*) echo "invalid"; return 0;;
1249 *) echo "auto"; return 0;;
1253 # Try to mount this filesystem read-only, without or with encryption
1255 # Check if already mounted
1256 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1257 # Apparently, mount-aes DOES autodetect AES loopback files.
1258 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1259 # We need to mount crypto-loop files with initial rw support
1260 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1262 [ "$RC" = "0" ] && return 0
1264 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1266 while [ "$a" != "n" -a "$a" != "N" ]; do
1267 # We need to mount crypto-loop files with initial rw support
1268 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1269 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1270 # Problem with ioctl() from getpasswd()?
1280 if checkbootparam "nocpu"; then
1281 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1283 # check module dependencies
1285 if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1286 if [ -e /lib64 ] ; then
1287 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1289 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1294 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1295 einfo "Detecting CPU:"
1296 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)
1297 echo $CPU | sed 's/ \{1,\}/ /g'
1300 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
1303 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1304 # * it only if we have the according kernel modules available
1305 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1306 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1307 # -> parse output of the initscript and output it according to our look'n'feel
1308 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1309 if ! cpufreq_check ; then
1310 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1312 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1313 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1314 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1315 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1316 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1320 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1322 if [ -x /etc/init.d/loadcpufreq ] ; then
1323 SKIP_CPU_GOVERNOR=''
1324 LOADCPUFREQ=$(mktemp)
1325 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1326 if grep -q FATAL "$LOADCPUFREQ" ; then
1332 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1333 eerror "$line" ; eend $RC
1337 elif grep -q done "$LOADCPUFREQ" ; then
1338 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1339 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1340 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1342 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1346 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1347 . /usr/bin/cpufreq-detect.sh
1348 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1349 einfo "Loading modules ${MODULE}"
1350 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1352 if [[ $RC == 0 ]]; then
1359 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1363 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1364 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1365 if modprobe cpufreq_ondemand ; RC=$? ; then
1366 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1367 echo ondemand > $file
1377 fi # checkbootparam nocpu
1381 # {{{ autostart of ssh
1383 if checkbootparam ssh ; then
1385 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1386 einfo "Bootoption ssh found, trying to set password for user grml."
1388 if [ -z "$SSH_PASSWD" ] ; then
1389 if [ -x /usr/bin/apg ] ; then
1390 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1391 elif [ -x /usr/bin/gpw ] ; then
1392 SSH_PASSWD="$(gpw 1)"
1393 elif [ -x /usr/bin/pwgen ] ; then
1394 SSH_PASSWD="$(pwgen -1 8)"
1395 elif [ -x /usr/bin/hexdump ] ; then
1396 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1397 elif [ -n "$RANDOM" ] ; then
1398 SSH_PASSWD="grml${RANDOM}"
1401 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1405 if [ -n "$SSH_PASSWD" ] ; then
1406 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1411 # finally check if we have a password we can use:
1412 if [ -n "$SSH_PASSWD" ] ; then
1413 echo "grml:$SSH_PASSWD" | chpasswd -m
1416 einfo 'Starting secure shell server in background.'
1417 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1418 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1422 ewarn 'Warning: please change the password for user grml as soon as possible!'
1428 # {{{ set password for user grml
1430 if checkbootparam passwd >>$DEBUG 2>&1; then
1431 einfo "Bootoption passwd found."
1432 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1433 if [ -n "$PASSWD" ] ; then
1434 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1436 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1439 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1445 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1447 if checkbootparam home ; then
1448 HOMEDIR="$(getbootparam home)"
1452 if [ -n "$HOMEDIR" ]; then
1453 einfo "Bootoption home detected." && eend 0
1456 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1457 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1458 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1459 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1462 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1463 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1464 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1465 MYHOMEDIR="$HOMEDIR"
1467 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1468 MYHOMEDIR="$(findfile grml.img)"
1469 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1470 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1471 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1474 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1475 eerror "Option ignored." ; eend 1
1480 if [ -n "$MYHOMEDIR" ]; then
1481 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1482 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1483 while read device mountpoint fs relax; do
1484 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1487 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1491 # Note: This currently won't work with encrypted partitions
1492 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1493 if [ ! -f "$MYHOMEDIR" ]; then
1494 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1495 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1500 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1501 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1502 if [ -f "$MYHOMEDIR" ]; then
1503 # It's a loopback file, mount it over the /home/grml directory
1504 trymount "$MYHOMEDIR" /home/grml
1506 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1510 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1514 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1516 fi # mount -o remount,rw,...
1519 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1523 fi # if trymount ...
1525 fi # checkbootparam home
1529 # {{{ Check for scripts on CD-ROM
1530 config_cdrom_scripts(){
1531 if checkbootparam "script"; then
1532 for script in "${LIVECD_PATH}"/scripts/* ; do
1533 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1542 if ! [ -x /usr/bin/aumix ] ; then
1543 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1546 if ! [ -r /proc/asound/cards ] ; then
1547 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1551 if checkbootparam vol ; then
1552 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1553 if [ -z "$VOL" ] ; then
1554 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1561 if checkbootparam nosound ; then
1562 einfo "Muting sound devices on request."
1563 # some IBM notebooks require the following stuff:
1564 if [ -x /usr/bin/amixer ] ; then
1565 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1566 amixer set Front unmute 1>/dev/null
1567 amixer set Front 0% 1>/dev/null
1570 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1571 if [ -n "$ERROR" ] ; then
1573 eerror "Problem muting sound devices: $ERROR"
1577 elif [ -z "$INSTALLED" ]; then
1578 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
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 ${VOL}% 1>/dev/null
1586 # by default assume '0' as volume for microphone:
1587 if checkbootparam micvol ; then
1588 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1593 # finally set the volumes:
1594 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1595 if [ -n "$ERROR" ] ; then
1597 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1607 # {{{ modem detection
1609 if checkbootparam "nomodem"; then
1610 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1612 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1613 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1614 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1622 # {{{ keyboard add-ons
1623 config_setkeycodes(){
1624 if checkbootparam "setkeycodes" ; then
1625 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1626 # MS MM keyboard add-on
1628 setkeycodes e001 126 &>/dev/null
1629 setkeycodes e059 127 &>/dev/null
1631 setkeycodes e03b 59 &>/dev/null
1632 setkeycodes e008 60 &>/dev/null
1633 setkeycodes e007 61 &>/dev/null
1634 setkeycodes e03e 62 &>/dev/null
1635 setkeycodes e03f 63 &>/dev/null
1636 setkeycodes e040 64 &>/dev/null
1637 setkeycodes e041 65 &>/dev/null
1638 setkeycodes e042 66 &>/dev/null
1639 setkeycodes e043 67 &>/dev/null
1640 setkeycodes e023 68 &>/dev/null
1641 setkeycodes e057 87 &>/dev/null
1642 setkeycodes e058 88 &>/dev/null
1644 setkeycodes e00a 89 e008 90 &>/dev/null
1651 config_wondershaper(){
1652 if checkbootparam "wondershaper" ; then
1653 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1658 if [ -n "$WONDER" ]; then
1660 DEVICE="${WONDER%%,*}"
1662 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1664 DOWNSTREAM="${WONDER%%,*}"
1666 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1668 UPSTREAM="${WONDER%%,*}"
1673 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1674 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1675 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1676 einfo "Starting wondershaper (${CMD}) in background."
1677 ( sh -c $CMD & ) && eend 0
1684 if checkbootparam "nosyslog"; then
1685 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1688 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1689 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1690 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1691 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1692 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1694 if [ -z "$SYSLOGD" ] ; then
1695 eerror "No syslog daemon found." ; eend 1
1697 einfo "Starting $SYSLOGD in background."
1698 /etc/init.d/$SYSLOGD start 1>>$DEBUG &
1707 if checkbootparam "nogpm"; then
1708 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1710 if ! [ -r /dev/input/mice ] ; then
1711 eerror "No mouse found - not starting GPM." ; eend 1
1713 einfo "Starting gpm in background."
1714 /etc/init.d/gpm start 1>>$DEBUG &
1715 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1724 if checkbootparam "services" ; then
1725 SERVICE="$(getbootparam services 2>>$DEBUG)"
1726 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1727 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1728 einfo "Starting service(s) ${SERVICENL} in background."
1729 for service in $(echo -e $SERVICELIST) ; do
1730 /etc/init.d/${service} start 1>>$DEBUG &
1732 [ "$?" == "0" ] ; eend $?
1739 if checkbootparam netconfig ; then
1740 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1741 CONFIGFILE='/tmp/netconfig.grml'
1744 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1745 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1747 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1749 while ! getconfig && [[ "$counter" != 0 ]] ; do
1750 echo -n "Sleeping for 5 seconds and trying to get config again... "
1751 counter=$(( counter-1 ))
1752 echo "$counter tries left" ; sleep 1
1754 if [ -r "$CONFIGFILE" ] ; then
1755 einfo "Downloading was successfull." ; eend 0
1756 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1757 md5sum $CONFIGFILE ; eend 0
1758 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1760 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1767 config_blindsound(){
1768 if checkbootparam "blind" ; then
1770 flitewrapper "welcome to the gremel system"
1777 if checkbootparam welcome ; then
1778 flitewrapper "welcome to the gremel system"
1783 # {{{ fix/workaround for unionfs
1785 if [ -z "$INSTALLED" ]; then
1786 touch /var/cache/apt/*cache.bin
1791 # {{{ create all /mnt-directories
1793 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1794 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1798 # {{{ start X window system via grml-x
1800 if checkbootparam startx ; then
1801 if [ -x /usr/X11R6/bin/X ] ; then
1802 if [ -z "$INSTALLED" ] ; then
1803 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1804 if [ -z "$WINDOWMANAGER" ] ; then
1805 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1806 WINDOWMANAGER="wm-ng"
1808 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1810 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1811 config_userfstab || fstabuser='grml'
1812 cat>|/etc/init.d/xstartup<<EOF
1814 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1815 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1817 chmod 755 /etc/init.d/xstartup
1819 # adjust inittab for xstartup
1820 if grep -q '^6:' /etc/inittab ; then
1821 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1822 else # just append tty6 to inittab if no definition is present:
1823 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1826 /sbin/telinit q ; eend $?
1828 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1829 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1831 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1835 eerror "We are not running from CD - startx will not work, skipping it.
1836 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1839 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1840 Boot parameter startx does not work therefore." ; eend 1
1846 # {{{ configuration framework
1848 if checkbootparam extract ; then
1849 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1850 EXTRACTOPTIONS="-- -x $EXTRACT"
1855 if checkbootparam noautoconfig || checkbootparam forensic ; then
1856 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1858 if [ -z "$INSTALLED" ] ; then
1859 einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1861 [ -d /mnt/grml ] || mkdir /mnt/grml
1862 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1863 # We do need the following fix so floppy disk is available to blkid in any case :-/
1864 if [ -r /dev/fd0 ] ; then
1865 einfo "Floppy device detected. Trying to access floppy disk."
1866 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1867 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1868 blkid /dev/fd0 1>>$DEBUG 2>&1
1871 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1872 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1873 if [[ $RC == 0 ]]; then
1874 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1877 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1878 if [ -n "$CONFIG" ]; then
1879 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1881 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1883 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1887 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1888 if [ -n "$SCRIPT" ]; then
1889 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1892 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1894 ewarn "No devices with label GRMLCFG found." ; eend 0
1903 if checkbootparam "config" ; then
1904 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1905 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1906 einfo "Bootoption config found. config is set to: $CONFIG"
1908 einfo "Trying to extract configuration file ${CONFIG}:"
1909 cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1913 if checkbootparam myconfig ; then
1914 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1915 if [ -n "$MOUNTDEVICE" ]; then
1916 if checkbootparam file ; then
1917 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1918 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1920 [ -d /mnt/grml ] || mkdir /mnt/grml
1921 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1922 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1923 if [[ $RC == 0 ]]; then
1924 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1927 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1928 if [ -n "$CONFIG" ]; then
1929 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1931 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1933 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1937 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1938 if [ -n "$SCRIPT" ]; then
1939 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1944 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1945 fi # mount $MOUNTDEVICE
1946 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1948 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1949 fi # [ -n "$MOUNTDEVICE" ]
1950 fi # checkbootparam myconfig
1952 if checkbootparam "partconf" ; then
1953 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1954 if [ -n "$MOUNTDEVICE" ]; then
1955 [ -d /mnt/grml ] || mkdir /mnt/grml
1956 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1957 if [[ $RC == 0 ]]; then
1958 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1959 einfo "Copying files from $MOUNTDEVICE over grml system."
1960 for file in `cat /etc/grml/partconf` ; do
1961 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1962 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1965 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1966 fi # mount $MOUNTDEVICE
1967 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1969 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1970 fi # [ -n "$MOUNTDEVICE" ]
1975 # {{{ /cdrom/.*-options
1977 if checkbootparam "debs" ; then
1978 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1979 einfo "Tring to install debian package(s) ${DEBS}"
1980 dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
1985 if checkbootparam "scripts" ; then
1986 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1987 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1988 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1989 sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
1996 if checkbootparam "mypath" ; then
1997 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1998 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1999 touch /etc/grml/my_path
2000 chmod 644 /etc/grml/my_path
2001 # make sure the directories exist:
2003 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2004 if ! [ -d "$i" ] ; then
2005 einfo "Creating directory $i"
2006 mkdir -p "$i" ; eend $?
2009 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2017 if checkbootparam "distcc" ; then
2018 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2019 if [ -n "$OPTIONS" ]; then
2022 if [ -n "$OPTIONS" ]; then
2023 NET="${OPTIONS%%,*}"
2025 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2027 INTERFACE="${OPTIONS%%,*}"
2032 CONFIG=/etc/default/distcc
2033 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
2034 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2036 if [ -n "$INTERFACE" ] ; then
2037 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2040 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2041 counter=$(( counter-1 ))
2042 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2044 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2048 if [ -n "$IP" ] ; then
2049 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
2051 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2053 id distccd >/dev/null 2>&1 || \
2055 einfo "Creating distcc user" ; \
2056 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2059 einfo "Starting distcc for network ${NET}, listening on ${IP}."
2060 /etc/init.d/distcc start 1>/dev/null ; eend $?
2063 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2067 if checkbootparam "gcc"; then
2068 GCC="$(getbootparam gcc 2>>$DEBUG)"
2070 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2073 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2076 if checkbootparam "gpp"; then
2077 GPP="$(getbootparam gpp 2>>$DEBUG)"
2079 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2080 if [ -x /usr/bin/g++-${GPP} ] ; then
2082 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2084 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2085 if [ -x /usr/bin/cpp-${GPP} ] ; then
2087 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2096 # Notice: use it only on live-cd system, if running from harddisk please
2097 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2098 # in /etc/runlevel.conf
2100 MODULES_FILE=/etc/grml/modules
2101 if checkbootparam nomodules ; then
2102 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2103 elif [ -z "$INSTALLED" ]; then
2104 if [ -r $MODULES_FILE ] ; then
2105 einfo "Loading modules specified in ${MODULES_FILE}:"
2107 grep '^[^#]' $MODULES_FILE | \
2108 while read module args; do
2109 [ "$module" ] || continue
2111 modprobe $module $args ; eend $?
2115 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2122 config_915resolution(){
2123 if checkbootparam "915resolution" ; then
2124 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2125 if [ -x /usr/sbin/915resolution ]; then
2130 if [ -n "$OPTIONS" ]; then
2132 MODE="${OPTIONS%%,*}"
2134 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2136 XRESO="${OPTIONS%%,*}"
2138 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2140 YRESO="${OPTIONS%%,*}"
2145 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2146 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2155 if [ -z "$INSTALLED" ] ; then
2156 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2157 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2158 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2159 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2161 if ! [ -x /sbin/mdadm ] ; then
2162 eerror "mdadm not available, can not execute it." ; eend 1
2165 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2166 # find out whether we have a valid configuration file already
2167 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2168 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2169 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2170 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2172 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2175 if ! checkbootparam 'swraid' ; then
2177 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2180 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2185 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2187 *'No arrays found'*)
2188 ewarn "$line" ; eend 0
2191 einfo "$line" ; eend 0
2198 if [ -r /proc/mdstat ] ; then
2200 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2201 if [ -z "$MDSTAT" ] ; then
2202 ewarn "No active arrays found" ; eend 0
2207 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2208 einfo "active arrays: $line" ; eend 0
2214 fi # bootoption swraid
2216 fi # is /sbin/mdadm executable?
2217 fi # check for bootoptions
2218 fi # run only in live-cd mode
2222 # {{{ LVM (Logical Volumes)
2224 if [ -z "$INSTALLED" ] ; then
2225 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2226 if checkbootparam 'nolvm' ; then
2227 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2229 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2230 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2231 eerror "LVM not available, can not execute it." ; eend 1
2233 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2234 einfo "You seem to have logical volumes (LVM) on your system."
2236 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2238 if checkbootparam 'lvm' ; then
2239 einfo "Bootoption LVM found. Searching for logical volumes:"
2240 /etc/init.d/lvm2 start ; eend $?
2244 fi # check for lvm binary
2245 fi # check for bootoption nolvm
2246 fi # run only in live-cd mode
2250 # {{{ debnet: setup network based on an existing one found on a partition
2252 if checkbootparam "debnet" ; then
2253 iszsh && setopt shwordsplit
2254 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2255 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2258 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2260 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2261 for i in $DEVICES; do
2262 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2263 einfo "Scanning on $i"
2264 if [ -f /mnt/etc/network/interfaces ]; then
2265 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2273 if [ -n "$FOUND_DEBNET" ]; then
2274 einfo "Stopping network."
2275 pump -k 1>/dev/null 2>&1
2276 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2277 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2278 rm -rf /etc/network/run
2279 cp -a /mnt/etc/network /etc
2280 rm -rf /etc/network/run
2281 mkdir /etc/network/run
2282 umount /mnt ; eend $?
2283 einfo "Starting network."
2284 /etc/init.d/networking start ; eend $?
2286 eerror "/etc/network/interfaces not found." ; eend 1
2290 eerror "Error: /mnt already mounted." ; eend 1
2296 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2298 if grep -q ipw3945 /proc/modules ; then
2299 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2300 ewarn "Broken ipw3945 network interface found, reloading module."
2309 # {{{ disable console blanking
2311 if checkbootparam "noblank" ; then
2312 einfo "Bootoption noblank found. Disabling monitor blanking."
2313 setterm -blank 0 ; eend $?
2318 # {{{ grml2hd: automatic installation
2321 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2323 if checkbootparam "user" ; then
2325 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2326 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2329 if checkbootparam "filesystem" ; then
2331 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2332 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2335 if checkbootparam "partition" ; then
2337 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2338 # notice: the following checks whether the given partition is available, if not the skip
2339 # execution of grml2hd as it might result in data loss...
2340 if [ -r $PARTITION ] ; then
2341 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2343 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2347 if checkbootparam "mbr" ; then
2349 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2350 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2353 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2355 GRML2HD_NONINTERACTIVE='yes' grml2hd
2358 chmod 755 /usr/bin/grml2hd_noninteractive
2359 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2360 if [ -z "$GRML2HD_FAIL" ] ; then
2361 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2363 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2366 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2370 # {{{ debootstrap: automatic installation
2371 config_debootstrap(){
2373 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2375 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2377 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2379 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2384 if checkbootparam "target" ; then
2386 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2387 # notice: the following checks whether the given partition is available, if not the skip
2388 # execution of grml-debootstrap as it might result in data loss...
2389 if ! [ -r "$TARGET" ] ; then
2390 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2394 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2399 if checkbootparam "grub" ; then
2401 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2404 if checkbootparam "groot" ; then
2406 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2409 if checkbootparam "release" ; then
2411 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2414 if checkbootparam "mirror" ; then
2416 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2419 if checkbootparam "boot_append" ; then
2421 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2424 if checkbootparam "password" ; then
2426 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2429 # now check which options are available
2430 if [ -n "TARGET" ] ; then
2431 TARGETCMD="--target $TARGET"
2435 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2439 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2440 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2441 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2442 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2443 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2444 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2446 # and finally write script and execute it
2447 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2449 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2452 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2454 screen /usr/bin/grml-debootstrap_noninteractive
2455 einfo "Invoking a shell, just exit to continue booting..."
2458 fi # stringinstring "BOOT_IMAGE=debian2hd
2462 # {{{ Support customization
2464 if checkbootparam "distri"; then
2465 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2466 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2467 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2468 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2469 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2470 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2476 ### {{{ backwards compatible stuff
2477 config_environment(){
2478 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2481 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2485 ## END OF FILE #################################################################
2486 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3