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='us'
210 # if bootoption lang is used update /etc/default/locale, otherwise *not*!
211 if [ -n "$BOOT_LANGUAGE" -a -x /usr/sbin/grml-setlang ] ; then
212 if checkgrmlsmall ; then
213 /usr/sbin/grml-setlang "POSIX"
215 /usr/sbin/grml-setlang "$LANGUAGE"
220 if [ -z "$CONSOLEFONT" ] ; then
221 if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then
222 # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16'
223 # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then
224 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
225 CONSOLEFONT='Uni3-Terminus16'
227 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
232 # export it now, so error messages get translated, too
233 if checkgrmlsmall ; then
234 export LANG='C' # grml-small does not provide any further locales
236 [ -r /etc/default/locale ] && . /etc/default/locale
240 # configure keyboard layout, read in already set values first:
241 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
243 # now allow keyboard override by boot commandline for later use:
244 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
245 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
246 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
247 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
248 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
250 # modify /etc/sysconfig/keyboard only in live-cd mode:
251 if [ -z "$INSTALLED" ] ; then
253 local LANGUAGE="$BOOT_LANGUAGE"
254 . /etc/grml/language-functions
255 # allow setting xkeyboard explicitly different than console keyboard
256 KXKEYBOARD="$(getbootparam xkeyboard 2>>$DEBUG)"
257 if [ -n "$KXKEYBOARD" ]; then
258 XKEYBOARD="$KXKEYBOARD"
259 KDEKEYBOARD="$KXKEYBOARD"
260 elif [ -n "$KKEYBOARD" ]; then
261 XKEYBOARD="$KKEYBOARD"
262 KDEKEYBOARD="$KKEYBOARD"
265 # duplicate of previous code to make sure /etc/grml/language-functions
266 # does not overwrite our values....
267 # now allow keyboard override by boot commandline for later use:
268 KKEYBOARD="$(getbootparam keyboard 2>>$DEBUG)"
269 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
270 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
271 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
272 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
274 # write keyboard related variables to file for later use
275 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
276 if ! [ -e /etc/sysconfig/keyboard ] ; then
277 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
278 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
279 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
280 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
284 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
286 # activate unicode console if running within utf8 environment
287 if [ -r /etc/default/locale ] ; then
288 if grep -q "LANG=.*UTF" /etc/default/locale ; then
289 einfo "Setting up unicode environment."
290 unicode_start 2>>$DEBUG ; eend $?
294 # Set default keyboard before interactive setup
295 if [ -n "$KEYTABLE" ] ; then
296 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
297 loadkeys -q $KEYTABLE &
301 # we have to set up all consoles, therefore loop it over all ttys:
302 NUM_CONSOLES=$(fgconsole --next-available)
303 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
304 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
305 CUR_CONSOLE=$(fgconsole)
307 if [ -n "$CHARMAP" ] ; then
308 einfo "Running consolechars for ${CHARMAP}"
309 for vc in `seq 0 ${NUM_CONSOLES}` ; do
310 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
312 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
316 if checkbootparam noconsolefont ; then
317 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
319 if [ -n "$CONSOLEFONT" ] ; then
320 einfo "Running consolechars using ${CONSOLEFONT}"
321 for vc in `seq 0 ${NUM_CONSOLES}` ; do
322 consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
324 [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
335 if checkbootparam hostname ; then
336 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
337 einfo "Setting hostname to $HOSTNAME as requested."
338 sed -i "s/^127.0.0.1.*localhost/127.0.0.1 $HOSTNAME localhost/" /etc/hosts
339 hostname $HOSTNAME ; eend $?
341 hostname --file /etc/hostname
346 # fstabuser (needed when running from harddisk with username != grml {{{
348 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
349 if [ -n "$CONFIG_FSTAB_USER" ] ; then
350 fstabuser="$CONFIG_FSTAB_USER"
352 fstabuser=$(getent passwd 1000 | cut -d: -f1)
354 # if not yet set fall back to default 'grml' user
355 [ -n "$fstabuser" ] || fstabuser='grml'
359 # {{{ Set clock (Local time is more often used than GMT, so it is default)
361 # don't touch the files if running from harddisk:
362 if [ -z "$INSTALLED" ]; then
364 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
365 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
366 # hwclock uses the TZ variable
367 [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
368 [ -n "$TZ" ] || TZ=Europe/Vienna
370 if ! [ -r /dev/rtc ] ; then
371 ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0
373 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
374 if [ -n "$ERROR" ] ; then
376 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
377 if [ -n "$ERROR" ] ; then
378 eerror "Problem running hwclock: $ERROR" ; eend 1
387 # {{{ print kernel info
389 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
390 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
391 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
392 if [ -r /proc/cpuinfo ] ; then
393 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
395 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
399 if [ -d /proc/xen ] ; then
401 einfo 'Running kernel featuring support for Xen detected' ; eend 0
407 # {{{ vmware specific stuff
409 if checkbootparam novmware ; then
410 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
412 if [ -z "$INSTALLED" ] ; then
413 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
414 if ! checkbootparam qemu ; then
415 if [ -r /etc/X11/xorg.conf.vmware ] ; then
416 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
417 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
420 elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
421 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
422 einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
423 cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
431 # {{{ qemu specific stuff
433 if checkbootparam qemu ; then
434 if [ -r /etc/X11/xorg.conf.example ] ; then
435 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
436 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
442 # {{{ ld.so.cache + depmod
444 if [ -n "$INSTALLED" ]; then
445 if ! [ -r /etc/grml.first.boot ] ; then
446 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
448 # Regenerate ld.so.cache and module dependencies on HD
449 einfo "Running ldconfig" ; ldconfig ; eend $?
450 einfo "Running depmod" ; depmod -a ; eend $?
451 touch /etc/grml.first.boot
461 # don't touch the files if running from harddisk:
462 if [ -z "$INSTALLED" ]; then
463 KTZ="$(getbootparam tz 2>>$DEBUG)"
464 if [ -n "$KTZ" ] ; then
465 einfo "Setting timezone."
466 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
468 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
474 # small computer / nearly no ram {{{
477 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
478 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
481 if checkbootparam "small"; then
482 einfo "Information: ${RAM} kB of RAM available." ; eend 0
483 einfo "Bootoption small detected. Activating small system."
484 if [ -r /etc/inittab.small ] ; then
485 mv /etc/inittab /etc/inittab.normal
486 mv /etc/inittab.small /etc/inittab
488 sed -i 's/^9/#&/' /etc/inittab
489 sed -i 's/^10/#&/' /etc/inittab
490 sed -i 's/^11/#&/' /etc/inittab
491 sed -i 's/^12/#&/' /etc/inittab
493 /sbin/telinit q ; eend $?
495 if checkgrmlsmall ; then
496 if [[ $RAM -lt 25000 ]] ; then
497 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
498 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
499 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
500 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
503 einfo "Information: ${RAM} kB of RAM available." ; eend 0
506 if [[ $RAM -lt 58000 ]] ; then
507 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
508 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
509 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
510 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
513 einfo "Information: ${RAM} kB of RAM available." ; eend 0
521 # skip startup of w3m {{{
523 if checkbootparam "fast"; then
524 ewarn "Bootoption fast detected. Skipping startup of w3m."
525 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
526 /sbin/telinit q ; eend $?
531 # activate serial console {{{
533 if checkbootparam "console"; then
534 einfo "Bootoption (for serial) console detected."
536 if [ -r /etc/mgetty/mgetty.config ] ; then
537 MODE=$(getbootparam console | awk -F, '{print $2}')
539 [ -n "$MODE" ] || MODE=9600 # default mode
540 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
541 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
544 einfo "Activating mgetty."
545 sed -i 's/^#T0/T0/' /etc/inittab
546 sed -i 's/^#T1/T1/' /etc/inittab
547 /sbin/telinit q ; eend $?
553 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
556 for DEVICE in /proc/ide/hd?; do
557 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
559 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
563 # {{{ Bring up loopback interface now
565 if [ -z "$INSTALLED" ] ; then
566 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
567 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
575 # firewire devices {{{
576 # the raw1394 driver does not yet export info into SYSFS,
577 # so let's create raw1394 device manually
578 # http://www.michael-prokop.at/blog/index.php?p=352
579 config_firewire_dev(){
580 if checkbootparam "nofirewiredev" ; then
581 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
583 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
584 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
585 # cd /dev && MAKEDEV video1394 raw1394
586 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
587 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
588 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
589 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
590 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
591 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
597 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
598 # otherwise we will get: passwd: Authentication token lock busy
600 if [ -z "$INSTALLED" ] ; then
608 if [ -n "$TESTCD" ]; then
609 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
610 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
613 if [ -n "${LIVECD_PATH}"/GRML ] ; then
614 ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
616 echo "${RED} *** Error: Could not find md5sum file. ***"
619 if [ "$RC" = "0" ]; then
620 einfo "Everything looks OK" ; eend 0
622 eerror 'Checksum failed for theses files:' ; eend 1
623 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
624 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
625 eerror '... RAM of your computer is broken.' ; eend 1
626 einfon "Hit return to continue, or press the reset button to quit."
635 # {{{ hardware detection via discover
637 if checkbootparam "nodisc" ; then
638 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
640 if [ -x /sbin/discover ] ; then
641 einfo "Discovering hardware. Trying to load the following modules in background:"
643 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)"
645 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
648 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
654 # {{{ hardware detection via hwinfo
656 if checkbootparam hwinfo >>$DEBUG 2>&1; then
657 einfo "Discovering hardware via hwinfo:"
658 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
659 echo -n " Loading modules: "
660 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
666 # {{{ disable hotplug agents on request
667 config_hotplug_agent(){
668 if checkbootparam "noagent" ; then
669 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
670 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
671 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
672 einfo "Disabling hotplug-agent(s) $AGENTNL"
673 for agent in $(echo -e $AGENTLIST) ; do
674 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
676 [ "$?" == "0" ] ; eend $?
681 # {{{ blacklist of hotplug-modules
682 config_hotplug_blacklist(){
683 if checkbootparam "black" ; then
684 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
685 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
686 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
687 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
688 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
689 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
697 if checkbootparam "nohotplug" ; then
698 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
700 if [ -r /etc/init.d/hotplug ] ; then
701 einfo "Starting hotplug system in background."
702 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
704 elif [ -r /etc/init.d/hotplug-light ] ; then
705 einfo "Starting hotplug-light system in background."
706 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
709 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
715 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
717 if checkbootparam "blacklist" ; then
718 if [ -z "$INSTALLED" ]; then
719 einfo "Bootoption blacklist found."
720 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
721 if [ -n "$BLACK" ] ; then
722 for module in $(echo ${BLACK//,/ }) ; do
723 einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
724 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
725 echo "blacklist $module" >> /etc/modprobe.d/grml
726 echo "alias $module off" >> /etc/modprobe.d/grml
727 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
730 eerror "No given module for blacklist found. Blacklisting will not work therefore."
733 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
735 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
744 if [ -d /proc/acpi ]; then
745 if checkbootparam "noacpi"; then
746 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
747 elif checkbootparam "nogrmlacpi" ; then
748 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
750 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
753 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
755 basename="${basename%%.*}"
756 case "$basename" in *_acpi)
757 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
759 modprobe $basename >>$DEBUG 2>&1 && found="yes"
760 local BASE="$BASE $basename"
762 if [ -n "$found" ] ; then
763 einfo "$BASE" ; eend 0
765 ewarn "(none)" ; eend 1
767 if ! ps x | grep -q /usr/sbin/acpid ; then
768 if ! [ -r /var/run/dbus/pid ] ; then
769 einfo "Starting acpi daemon."
770 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
772 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
773 eerror "Solution: please activate acpid via /etc/runlevel.conf"
777 ewarn "acpi daemon already running."
784 if checkbootparam "noapm"; then
785 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
787 modprobe apm power_off=1 >>$DEBUG 2>&1
788 if [ "$?" = "0" ] ; then
789 if [ -x /etc/init.d/apmd ] ;then
790 einfo "APM Bios found, enabling power management functions."
791 /etc/init.d/apmd start ; eend $?
794 eerror "Loading apm module failed." ; eend 1
801 # {{{ PCMCIA Check/Setup
802 # This needs to be done before other modules are being loaded (by hwsetup)
804 if checkbootparam "nopcmcia"; then
805 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
807 if /usr/sbin/laptop-detect ; then
808 einfo "Detected Laptop - checking for PCMCIA." && eend 0
809 modprobe pcmcia_core >>$DEBUG 2>&1
810 # Try Cardbus or normal PCMCIA socket drivers
811 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
812 if [ "$?" = "0" ]; then
813 modprobe ds >>$DEBUG 2>&1
814 if [ -d /proc/bus/pccard ] ; then
815 if [ -x /sbin/cardmgr ] ; then
816 einfo "PCMCIA found, starting cardmgr."
817 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
819 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
828 # {{{ run software synthesizer via speakup
830 if checkbootparam swspeak ; then
831 einfo "Bootoption swspeak found."
833 if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
834 ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
836 einfo "Loading speakup_soft"
837 if modprobe speakup_soft ; then
840 flitewrapper "Fatal error setting up software speakup"
847 if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
848 einfo "Kernel supports speakup." ; eend 0
850 einfo "Just run swspeak if you want to use software synthesizer via speakup."
851 flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
854 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
855 flitewrapper "Kernel does not seem to support speakup. Sorry."
861 # {{{ support hardware synthesizer via speakup
863 if checkbootparam hwspeak ; then
864 einfo "Bootoption hwspeak found."
866 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
867 ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
869 for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
870 sed 's#.*speakup/##g ; s#.ko$##g' | \
871 grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
872 einfo "Trying to load $module"
879 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
880 einfo "Kernel should support speakup now." ; eend 0
881 flitewrapper "Kernel should support speakup now."
883 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
884 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
890 # {{{ Check for blind option or brltty
893 checkbootparam "blind" && BLIND="yes"
894 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
896 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
897 if [ -x /sbin/brltty ]; then
898 # Blind option detected, start brltty now.
899 # modprobe serial_core parport_serial generic_serial && echo "done"
904 if [ -n "$BRLTTY" ]; then
906 BRLTYPE="${BRLTTY%%,*}"
908 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
910 BRLDEV="${BRLTTY%%,*}"
912 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
914 BRLTEXT="${BRLTTY%%,*}"
919 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
920 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
921 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
922 einfo "Starting braille-display manager."
925 sleep 2 && BLINDSOUND="yes"
932 # {{{ Interactive configuration
933 config_interactive(){
934 ewarn "config_interactive is deprecated nowadays."
935 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
941 if checkbootparam forceagp ; then
942 # Probe for AGP. Hope this can fail safely
943 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
949 config_automounter(){
950 if checkbootparam automounter ; then
951 RUNLEVEL="$(runlevel)"
953 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
958 if [ -n "$AUTOMOUNTER" ]; then
959 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
960 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
961 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
962 anew="$d -fstype=auto,$2 :$i"
963 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
964 AUTOMOUNTS="$AUTOMOUNTS $d"
965 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
967 [ -d /mnt/$d ] && mkdir -p /mnt/$d
968 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
970 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
973 AUTOMOUNTS="floppy cdrom"
974 # Add new devices to /etc/fstab and /etc/auto.mnt
975 for i in /dev/cdrom?*; do
977 addautomount "$i" "ro"
982 if [ -n "$AUTOMOUNTER" ]; then
983 # Check for floppy dir, reinstall with automounter
984 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
985 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
986 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
987 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
988 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
989 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
991 # Replace paths from bootfloppy
992 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
993 mv -f /etc/fstab.new /etc/fstab
994 # Start automounter now
995 einfo "Starting automounter for ${AUTOMOUNTS}."
996 /etc/init.d/autofs start >>$DEBUG ; eend $?
1001 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1005 while read major minor blocks partition relax; do
1006 partition="${partition##*/}"
1007 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1008 case "$partition" in
1009 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
1010 sd?) ;; # SCSI Harddisk, entire disk
1011 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
1012 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
1015 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1018 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1021 # {{{ Enable DMA for all IDE drives now if not disabled
1022 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1024 if checkbootparam "nodma"; then
1025 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1027 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1028 if test -d /proc/ide/$d; then
1029 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1030 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1031 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1032 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1033 echo "using_dma:1" >/proc/ide/$d/settings
1042 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1045 NOSWAP="yes" # we do not use swap by default!
1046 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1048 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1051 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1052 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1054 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1055 iszsh && setopt nonomatch
1056 if [ -x /usr/sbin/rebuildfstab ] ; then
1057 config_userfstab || fstabuser=grml
1058 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1060 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1062 fi # checkbootparam nofstab/forensic
1064 # Scan for swap, config, homedir - but only in live-mode
1065 if [ -z "$INSTALLED" ] ; then
1066 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1069 HOMEDIR="$(getbootparam home)"
1070 if [ -n "$partitions" ]; then
1071 while read p m f relax; do
1072 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1073 partoptions="users,exec"
1075 # it's a swap partition?
1078 if [ -n "$NOSWAP" ]; then
1079 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1082 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1083 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1084 if [ -n "$ANYSWAP" ] ; then
1085 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1086 swapon $p 2>>$DEBUG ; eend $?
1088 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1092 if [[ "$p" == LABEL* ]] ; then
1093 p=$(blkid -t $p | awk -F: '{print $1}')
1095 if grep -q $p /proc/swaps ; then
1096 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1098 if [ -b "$p" ] ; then
1099 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1100 swapon $p 2>>$DEBUG ; eend $?
1102 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1111 esac # it's a swap partition?
1116 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1117 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1119 # *) NONEFOUND='1'; continue ;;
1123 if [ -z "$NOSWAP" ] ; then
1124 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1125 # Activate swapfile, if exists
1126 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1128 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1129 mount -o remount,rw $m && MOUNTED=1
1130 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1132 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1134 fnew="$SWAPFILE swap swap defaults 0 0"
1135 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1136 GRML_SWP="$GRML_SWP $SWAPFILE"
1139 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1142 # use a image as home
1143 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1144 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1145 if [ -n "$HOMEDIR" ]; then
1146 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1150 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1152 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1157 # Umount, if not in use
1158 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1170 if [ -n "$MOUSE_DEVICE" ] ; then
1171 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1176 # {{{ IPv6 configuration
1177 # Load IPv6 kernel module and print IP adresses
1179 if checkbootparam "ipv6"; then
1180 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1182 # we probably need some time until stateless autoconfiguration has happened
1184 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1185 for DEVICE in `echo "$NETDEVICES"`; do
1188 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1189 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1191 for ADDR in `echo "$ADDRESSES"` ; do
1194 if [ "$COUNT" -eq "0" ] ; then
1195 einfo "(none)" ; eend 1
1205 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1207 if checkbootparam "nodhcp"; then
1208 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1210 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1211 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1212 for DEVICE in `echo "$NETDEVICES"` ; do
1213 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1215 ifconfig $DEVICE up >>$DEBUG 2>&1
1216 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1221 if [ -n "$INSTALLED" ] ; then
1222 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1229 # {{{ helper functions
1232 # search all partitions for a file in the root directory
1233 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1234 # See if it's already mounted
1235 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1236 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1237 [ -f "$i/$1" ] && FOUND="$i/$1"
1238 umount -l "$i" 2>>$DEBUG
1239 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1246 case "$(file -s $1)" in
1247 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1248 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1249 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1250 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1251 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1252 *data*) echo "invalid"; return 0;;
1253 *) echo "auto"; return 0;;
1257 # Try to mount this filesystem read-only, without or with encryption
1259 # Check if already mounted
1260 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1261 # Apparently, mount-aes DOES autodetect AES loopback files.
1262 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1263 # We need to mount crypto-loop files with initial rw support
1264 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1266 [ "$RC" = "0" ] && return 0
1268 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1270 while [ "$a" != "n" -a "$a" != "N" ]; do
1271 # We need to mount crypto-loop files with initial rw support
1272 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1273 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1274 # Problem with ioctl() from getpasswd()?
1284 if checkbootparam "nocpu"; then
1285 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1287 # check module dependencies
1289 if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1290 if [ -e /lib64 ] ; then
1291 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1293 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1298 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1299 einfo "Detecting CPU:"
1300 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)
1301 echo $CPU | sed 's/ \{1,\}/ /g'
1304 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
1307 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1308 # * it only if we have the according kernel modules available
1309 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1310 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1311 # -> parse output of the initscript and output it according to our look'n'feel
1312 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1313 if ! cpufreq_check ; then
1314 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1316 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1317 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1318 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1319 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1320 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1324 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1326 if [ -x /etc/init.d/loadcpufreq ] ; then
1327 SKIP_CPU_GOVERNOR=''
1328 LOADCPUFREQ=$(mktemp)
1329 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1330 if grep -q FATAL "$LOADCPUFREQ" ; then
1336 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1337 eerror "$line" ; eend $RC
1341 elif grep -q done "$LOADCPUFREQ" ; then
1342 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1343 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1344 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1346 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1350 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1351 . /usr/bin/cpufreq-detect.sh
1352 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1353 einfo "Loading modules ${MODULE}"
1354 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1356 if [[ $RC == 0 ]]; then
1363 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1367 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1368 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1369 if modprobe cpufreq_ondemand ; RC=$? ; then
1370 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1371 echo ondemand > $file
1381 fi # checkbootparam nocpu
1385 # {{{ autostart of ssh
1387 if checkbootparam ssh ; then
1389 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1390 einfo "Bootoption ssh found, trying to set password for user grml."
1392 if [ -z "$SSH_PASSWD" ] ; then
1393 if [ -x /usr/bin/apg ] ; then
1394 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1395 elif [ -x /usr/bin/gpw ] ; then
1396 SSH_PASSWD="$(gpw 1)"
1397 elif [ -x /usr/bin/pwgen ] ; then
1398 SSH_PASSWD="$(pwgen -1 8)"
1399 elif [ -x /usr/bin/hexdump ] ; then
1400 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1401 elif [ -n "$RANDOM" ] ; then
1402 SSH_PASSWD="grml${RANDOM}"
1405 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1409 if [ -n "$SSH_PASSWD" ] ; then
1410 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1415 # finally check if we have a password we can use:
1416 if [ -n "$SSH_PASSWD" ] ; then
1417 echo "grml:$SSH_PASSWD" | chpasswd -m
1420 einfo 'Starting secure shell server in background.'
1421 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1422 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1426 ewarn 'Warning: please change the password for user grml as soon as possible!'
1432 # {{{ set password for user grml
1434 if checkbootparam passwd >>$DEBUG 2>&1; then
1435 einfo "Bootoption passwd found."
1436 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1437 if [ -n "$PASSWD" ] ; then
1438 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1440 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1443 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1449 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1451 if checkbootparam home ; then
1452 HOMEDIR="$(getbootparam home)"
1456 if [ -n "$HOMEDIR" ]; then
1457 einfo "Bootoption home detected." && eend 0
1460 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1461 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1462 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1463 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1466 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1467 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1468 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1469 MYHOMEDIR="$HOMEDIR"
1471 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1472 MYHOMEDIR="$(findfile grml.img)"
1473 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1474 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1475 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1478 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1479 eerror "Option ignored." ; eend 1
1484 if [ -n "$MYHOMEDIR" ]; then
1485 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1486 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1487 while read device mountpoint fs relax; do
1488 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1491 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1495 # Note: This currently won't work with encrypted partitions
1496 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1497 if [ ! -f "$MYHOMEDIR" ]; then
1498 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1499 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1504 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1505 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1506 if [ -f "$MYHOMEDIR" ]; then
1507 # It's a loopback file, mount it over the /home/grml directory
1508 trymount "$MYHOMEDIR" /home/grml
1510 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1514 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1518 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1520 fi # mount -o remount,rw,...
1523 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1527 fi # if trymount ...
1529 fi # checkbootparam home
1533 # {{{ Check for scripts on CD-ROM
1534 config_cdrom_scripts(){
1535 if checkbootparam "script"; then
1536 for script in "${LIVECD_PATH}"/scripts/* ; do
1537 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1546 if ! [ -x /usr/bin/aumix ] ; then
1547 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1550 if ! [ -r /proc/asound/cards ] ; then
1551 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1555 if checkbootparam vol ; then
1556 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1557 if [ -z "$VOL" ] ; then
1558 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1565 if checkbootparam nosound ; then
1566 einfo "Muting sound devices on request."
1567 # some IBM notebooks require the following stuff:
1568 if [ -x /usr/bin/amixer ] ; then
1569 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1570 amixer set Front unmute 1>/dev/null
1571 amixer set Front 0% 1>/dev/null
1574 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1575 if [ -n "$ERROR" ] ; then
1577 eerror "Problem muting sound devices: $ERROR"
1581 elif [ -z "$INSTALLED" ]; then
1582 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1583 # some IBM notebooks require the following stuff:
1584 if [ -x /usr/bin/amixer ] ; then
1585 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1586 amixer set Front unmute 1>/dev/null
1587 amixer set Front ${VOL}% 1>/dev/null
1590 # by default assume '0' as volume for microphone:
1591 if checkbootparam micvol ; then
1592 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1597 # finally set the volumes:
1598 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1599 if [ -n "$ERROR" ] ; then
1601 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1611 # {{{ modem detection
1613 if checkbootparam "nomodem"; then
1614 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1616 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1617 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1618 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1626 # {{{ keyboard add-ons
1627 config_setkeycodes(){
1628 if checkbootparam "setkeycodes" ; then
1629 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1630 # MS MM keyboard add-on
1632 setkeycodes e001 126 &>/dev/null
1633 setkeycodes e059 127 &>/dev/null
1635 setkeycodes e03b 59 &>/dev/null
1636 setkeycodes e008 60 &>/dev/null
1637 setkeycodes e007 61 &>/dev/null
1638 setkeycodes e03e 62 &>/dev/null
1639 setkeycodes e03f 63 &>/dev/null
1640 setkeycodes e040 64 &>/dev/null
1641 setkeycodes e041 65 &>/dev/null
1642 setkeycodes e042 66 &>/dev/null
1643 setkeycodes e043 67 &>/dev/null
1644 setkeycodes e023 68 &>/dev/null
1645 setkeycodes e057 87 &>/dev/null
1646 setkeycodes e058 88 &>/dev/null
1648 setkeycodes e00a 89 e008 90 &>/dev/null
1655 config_wondershaper(){
1656 if checkbootparam "wondershaper" ; then
1657 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1662 if [ -n "$WONDER" ]; then
1664 DEVICE="${WONDER%%,*}"
1666 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1668 DOWNSTREAM="${WONDER%%,*}"
1670 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1672 UPSTREAM="${WONDER%%,*}"
1677 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1678 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1679 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1680 einfo "Starting wondershaper (${CMD}) in background."
1681 ( sh -c $CMD & ) && eend 0
1688 if checkbootparam "nosyslog"; then
1689 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1692 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1693 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1694 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1695 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1696 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1698 if [ -z "$SYSLOGD" ] ; then
1699 eerror "No syslog daemon found." ; eend 1
1701 einfo "Starting $SYSLOGD in background."
1702 /etc/init.d/$SYSLOGD start 1>>$DEBUG &
1711 if checkbootparam "nogpm"; then
1712 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1714 if ! [ -r /dev/input/mice ] ; then
1715 eerror "No mouse found - not starting GPM." ; eend 1
1717 einfo "Starting gpm in background."
1718 /etc/init.d/gpm start 1>>$DEBUG &
1719 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1728 if checkbootparam "services" ; then
1729 SERVICE="$(getbootparam services 2>>$DEBUG)"
1730 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1731 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1732 einfo "Starting service(s) ${SERVICENL} in background."
1733 for service in $(echo -e $SERVICELIST) ; do
1734 /etc/init.d/${service} start 1>>$DEBUG &
1736 [ "$?" == "0" ] ; eend $?
1743 if checkbootparam netconfig ; then
1744 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1745 CONFIGFILE='/tmp/netconfig.grml'
1748 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1749 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1751 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1753 while ! getconfig && [[ "$counter" != 0 ]] ; do
1754 echo -n "Sleeping for 5 seconds and trying to get config again... "
1755 counter=$(( counter-1 ))
1756 echo "$counter tries left" ; sleep 1
1758 if [ -r "$CONFIGFILE" ] ; then
1759 einfo "Downloading was successfull." ; eend 0
1760 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1761 md5sum $CONFIGFILE ; eend 0
1762 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1764 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1771 config_blindsound(){
1772 if checkbootparam "blind" ; then
1774 flitewrapper "welcome to the gremel system"
1781 if checkbootparam welcome ; then
1782 flitewrapper "welcome to the gremel system"
1787 # {{{ fix/workaround for unionfs
1789 if [ -z "$INSTALLED" ]; then
1790 touch /var/cache/apt/*cache.bin
1795 # {{{ create all /mnt-directories
1797 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1798 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1802 # {{{ start X window system via grml-x
1804 if checkbootparam startx ; then
1805 if [ -x /usr/X11R6/bin/X ] ; then
1806 if [ -z "$INSTALLED" ] ; then
1807 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1808 if [ -z "$WINDOWMANAGER" ] ; then
1809 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1810 WINDOWMANAGER="wm-ng"
1812 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1814 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1815 config_userfstab || fstabuser='grml'
1816 cat>|/etc/init.d/xstartup<<EOF
1818 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1819 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1821 chmod 755 /etc/init.d/xstartup
1823 # adjust inittab for xstartup
1824 if grep -q '^6:' /etc/inittab ; then
1825 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1826 else # just append tty6 to inittab if no definition is present:
1827 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1830 /sbin/telinit q ; eend $?
1832 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1833 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1835 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1839 eerror "We are not running from CD - startx will not work, skipping it.
1840 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1843 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1844 Boot parameter startx does not work therefore." ; eend 1
1850 # {{{ configuration framework
1852 if checkbootparam extract ; then
1853 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1854 EXTRACTOPTIONS="-- -x $EXTRACT"
1859 if checkbootparam noautoconfig || checkbootparam forensic ; then
1860 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1862 if [ -z "$INSTALLED" ] ; then
1863 einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1865 [ -d /mnt/grml ] || mkdir /mnt/grml
1866 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1867 # We do need the following fix so floppy disk is available to blkid in any case :-/
1868 if [ -r /dev/fd0 ] ; then
1869 einfo "Floppy device detected. Trying to access floppy disk."
1870 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1871 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1872 blkid /dev/fd0 1>>$DEBUG 2>&1
1875 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1876 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1877 if [[ $RC == 0 ]]; then
1878 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1881 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1882 if [ -n "$CONFIG" ]; then
1883 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1885 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1887 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1891 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1892 if [ -n "$SCRIPT" ]; then
1893 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1896 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1898 ewarn "No devices with label GRMLCFG found." ; eend 0
1907 if checkbootparam "config" ; then
1908 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1909 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1910 einfo "Bootoption config found. config is set to: $CONFIG"
1912 einfo "Trying to extract configuration file ${CONFIG}:"
1913 cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1917 if checkbootparam myconfig ; then
1918 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1919 if [ -n "$MOUNTDEVICE" ]; then
1920 if checkbootparam file ; then
1921 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1922 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1924 [ -d /mnt/grml ] || mkdir /mnt/grml
1925 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1926 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1927 if [[ $RC == 0 ]]; then
1928 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1931 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1932 if [ -n "$CONFIG" ]; then
1933 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1935 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1937 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1941 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1942 if [ -n "$SCRIPT" ]; then
1943 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1948 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1949 fi # mount $MOUNTDEVICE
1950 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1952 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1953 fi # [ -n "$MOUNTDEVICE" ]
1954 fi # checkbootparam myconfig
1956 if checkbootparam "partconf" ; then
1957 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1958 if [ -n "$MOUNTDEVICE" ]; then
1959 [ -d /mnt/grml ] || mkdir /mnt/grml
1960 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1961 if [[ $RC == 0 ]]; then
1962 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1963 einfo "Copying files from $MOUNTDEVICE over grml system."
1964 for file in `cat /etc/grml/partconf` ; do
1965 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1966 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1969 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1970 fi # mount $MOUNTDEVICE
1971 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1973 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1974 fi # [ -n "$MOUNTDEVICE" ]
1979 # {{{ /cdrom/.*-options
1981 if checkbootparam "debs" ; then
1982 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1983 einfo "Tring to install debian package(s) ${DEBS}"
1984 dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
1989 if checkbootparam "scripts" ; then
1990 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1991 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1992 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1993 sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
2000 if checkbootparam "mypath" ; then
2001 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2002 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2003 touch /etc/grml/my_path
2004 chmod 644 /etc/grml/my_path
2005 # make sure the directories exist:
2007 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2008 if ! [ -d "$i" ] ; then
2009 einfo "Creating directory $i"
2010 mkdir -p "$i" ; eend $?
2013 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2021 if checkbootparam "distcc" ; then
2022 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2023 if [ -n "$OPTIONS" ]; then
2026 if [ -n "$OPTIONS" ]; then
2027 NET="${OPTIONS%%,*}"
2029 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2031 INTERFACE="${OPTIONS%%,*}"
2036 CONFIG=/etc/default/distcc
2037 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
2038 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2040 if [ -n "$INTERFACE" ] ; then
2041 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2044 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2045 counter=$(( counter-1 ))
2046 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2048 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2052 if [ -n "$IP" ] ; then
2053 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
2055 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2057 id distccd >/dev/null 2>&1 || \
2059 einfo "Creating distcc user" ; \
2060 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2063 einfo "Starting distcc for network ${NET}, listening on ${IP}."
2064 /etc/init.d/distcc start 1>/dev/null ; eend $?
2067 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2071 if checkbootparam "gcc"; then
2072 GCC="$(getbootparam gcc 2>>$DEBUG)"
2074 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2077 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2080 if checkbootparam "gpp"; then
2081 GPP="$(getbootparam gpp 2>>$DEBUG)"
2083 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2084 if [ -x /usr/bin/g++-${GPP} ] ; then
2086 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2088 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2089 if [ -x /usr/bin/cpp-${GPP} ] ; then
2091 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2100 # Notice: use it only on live-cd system, if running from harddisk please
2101 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2102 # in /etc/runlevel.conf
2104 MODULES_FILE=/etc/grml/modules
2105 if checkbootparam nomodules ; then
2106 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2107 elif [ -z "$INSTALLED" ]; then
2108 if [ -r $MODULES_FILE ] ; then
2109 einfo "Loading modules specified in ${MODULES_FILE}:"
2111 grep '^[^#]' $MODULES_FILE | \
2112 while read module args; do
2113 [ "$module" ] || continue
2115 modprobe $module $args ; eend $?
2119 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2126 config_915resolution(){
2127 if checkbootparam "915resolution" ; then
2128 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2129 if [ -x /usr/sbin/915resolution ]; then
2134 if [ -n "$OPTIONS" ]; then
2136 MODE="${OPTIONS%%,*}"
2138 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2140 XRESO="${OPTIONS%%,*}"
2142 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2144 YRESO="${OPTIONS%%,*}"
2149 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2150 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2159 if [ -z "$INSTALLED" ] ; then
2160 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2161 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2162 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2163 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2165 if ! [ -x /sbin/mdadm ] ; then
2166 eerror "mdadm not available, can not execute it." ; eend 1
2169 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2170 # find out whether we have a valid configuration file already
2171 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2172 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2173 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2174 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2176 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2179 if ! checkbootparam 'swraid' ; then
2181 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2184 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2189 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2191 *'No arrays found'*)
2192 ewarn "$line" ; eend 0
2195 einfo "$line" ; eend 0
2202 if [ -r /proc/mdstat ] ; then
2204 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2205 if [ -z "$MDSTAT" ] ; then
2206 ewarn "No active arrays found" ; eend 0
2211 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2212 einfo "active arrays: $line" ; eend 0
2218 fi # bootoption swraid
2220 fi # is /sbin/mdadm executable?
2221 fi # check for bootoptions
2222 fi # run only in live-cd mode
2226 # {{{ LVM (Logical Volumes)
2228 if [ -z "$INSTALLED" ] ; then
2229 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2230 if checkbootparam 'nolvm' ; then
2231 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2233 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2234 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2235 eerror "LVM not available, can not execute it." ; eend 1
2237 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2238 einfo "You seem to have logical volumes (LVM) on your system."
2240 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2242 if checkbootparam 'lvm' ; then
2243 einfo "Bootoption LVM found. Searching for logical volumes:"
2244 /etc/init.d/lvm2 start ; eend $?
2248 fi # check for lvm binary
2249 fi # check for bootoption nolvm
2250 fi # run only in live-cd mode
2254 # {{{ debnet: setup network based on an existing one found on a partition
2256 if checkbootparam "debnet" ; then
2257 iszsh && setopt shwordsplit
2258 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2259 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2262 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2264 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2265 for i in $DEVICES; do
2266 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2267 einfo "Scanning on $i"
2268 if [ -f /mnt/etc/network/interfaces ]; then
2269 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2277 if [ -n "$FOUND_DEBNET" ]; then
2278 einfo "Stopping network."
2279 pump -k 1>/dev/null 2>&1
2280 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2281 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2282 rm -rf /etc/network/run
2283 cp -a /mnt/etc/network /etc
2284 rm -rf /etc/network/run
2285 mkdir /etc/network/run
2286 umount /mnt ; eend $?
2287 einfo "Starting network."
2288 /etc/init.d/networking start ; eend $?
2290 eerror "/etc/network/interfaces not found." ; eend 1
2294 eerror "Error: /mnt already mounted." ; eend 1
2300 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2302 if grep -q ipw3945 /proc/modules ; then
2303 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2304 ewarn "Broken ipw3945 network interface found, reloading module."
2313 # {{{ disable console blanking
2315 if checkbootparam "noblank" ; then
2316 einfo "Bootoption noblank found. Disabling monitor blanking."
2317 setterm -blank 0 ; eend $?
2322 # {{{ tohd= bootoption
2325 if checkbootparam "tohd" ; then
2326 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2327 if [ -z "$TARGET" ] ; then
2328 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2329 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2333 if ! [ -b "$TARGET" ] ; then
2334 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2338 if grep -q $TARGET /proc/mounts ; then
2339 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2344 local MOUNTDIR=$(mktemp -d)
2346 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2347 einfo "Copyring live system to $TARGET - this might take a while"
2348 rsync -a --progress /live/image/live $MOUNTDIR
2352 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2354 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2363 # {{{ grml2hd: automatic installation
2366 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2368 if checkbootparam "user" ; then
2370 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2371 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2374 if checkbootparam "filesystem" ; then
2376 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2377 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2380 if checkbootparam "partition" ; then
2382 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2383 # notice: the following checks whether the given partition is available, if not the skip
2384 # execution of grml2hd as it might result in data loss...
2385 if [ -r $PARTITION ] ; then
2386 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2388 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2392 if checkbootparam "mbr" ; then
2394 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2395 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2398 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2400 GRML2HD_NONINTERACTIVE='yes' grml2hd
2403 chmod 755 /usr/bin/grml2hd_noninteractive
2404 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2405 if [ -z "$GRML2HD_FAIL" ] ; then
2406 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2408 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2411 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2415 # {{{ debootstrap: automatic installation
2416 config_debootstrap(){
2418 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2420 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2422 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2424 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2429 if checkbootparam "target" ; then
2431 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2432 # notice: the following checks whether the given partition is available, if not the skip
2433 # execution of grml-debootstrap as it might result in data loss...
2434 if ! [ -r "$TARGET" ] ; then
2435 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2439 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2444 if checkbootparam "grub" ; then
2446 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2449 if checkbootparam "groot" ; then
2451 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2454 if checkbootparam "release" ; then
2456 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2459 if checkbootparam "mirror" ; then
2461 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2464 if checkbootparam "boot_append" ; then
2466 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2469 if checkbootparam "password" ; then
2471 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2474 # now check which options are available
2475 if [ -n "TARGET" ] ; then
2476 TARGETCMD="--target $TARGET"
2480 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2484 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2485 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2486 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2487 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2488 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2489 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2491 # and finally write script and execute it
2492 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2494 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2497 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2499 screen /usr/bin/grml-debootstrap_noninteractive
2500 einfo "Invoking a shell, just exit to continue booting..."
2503 fi # stringinstring "BOOT_IMAGE=debian2hd
2507 # {{{ Support customization
2509 if checkbootparam "distri"; then
2510 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2511 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2512 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2513 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2514 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2515 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2521 ### {{{ backwards compatible stuff
2522 config_environment(){
2523 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2526 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2530 ## END OF FILE #################################################################
2531 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3