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
363 # The default hardware clock timezone is stated as representing local time.
365 checkbootparam utc >>$DEBUG 2>&1 && UTC="-u"
366 checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u"
367 # hwclock uses the TZ variable
368 KTZ="$(getbootparam tz 2>>$DEBUG)"
369 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
370 [ -z "$KTZ" ] && KTZ=Europe/Vienna
372 if ! [ -r /dev/rtc ] ; then
373 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
376 ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
377 if [ -n "$ERROR" ] ; then
379 ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1)
380 if [ -n "$ERROR" ] ; then
381 eerror "Problem running hwclock: $ERROR" ; eend 1
390 # {{{ print kernel info
392 vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}"
393 [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel
394 einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0
395 if [ -r /proc/cpuinfo ] ; then
396 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
398 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
402 if [ -d /proc/xen ] ; then
404 einfo 'Running kernel featuring support for Xen detected' ; eend 0
410 # {{{ vmware specific stuff
412 if checkbootparam novmware ; then
413 ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0
415 if [ -z "$INSTALLED" ] ; then
416 if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then
417 if ! checkbootparam qemu ; then
418 if [ -r /etc/X11/xorg.conf.vmware ] ; then
419 einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf"
420 cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $?
423 elif [ -r /proc/acpi/battery/BAT0/info -a -r /etc/X11/xorg.conf.virtualbox ] ; then
424 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
425 einfo 'Virtual Box: Copying /etc/X11/xorg.conf.virtualbox to /etc/X11/xorg.conf'
426 cp /etc/X11/xorg.conf.virtualbox /etc/X11/xorg.conf ; eend $?
434 # {{{ qemu specific stuff
436 if checkbootparam qemu ; then
437 if [ -r /etc/X11/xorg.conf.example ] ; then
438 einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf"
439 cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $?
445 # {{{ ld.so.cache + depmod
447 if [ -n "$INSTALLED" ]; then
448 if ! [ -r /etc/grml.first.boot ] ; then
449 einfo "Running from HD for the first time, regenerate ld.so.cache and modules.dep:"
451 # Regenerate ld.so.cache and module dependencies on HD
452 einfo "Running ldconfig" ; ldconfig ; eend $?
453 einfo "Running depmod" ; depmod -a ; eend $?
454 touch /etc/grml.first.boot
464 # don't touch the files if running from harddisk:
465 if [ -z "$INSTALLED" ]; then
466 KTZ="$(getbootparam tz 2>>$DEBUG)"
467 if [ -n "$KTZ" ] ; then
468 einfo "Setting timezone."
469 [ -f "/usr/share/zoneinfo/$KTZ" ] && TZ="$KTZ"
471 cp "/usr/share/zoneinfo/$TZ" /etc/localtime ; eend $?
477 # small computer / nearly no ram {{{
480 RAM=$(/usr/bin/gawk '/MemTotal/{print $2}' /proc/meminfo)
481 # MEM=$(/usr/bin/gawk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{print m}' /proc/meminfo)
484 if checkbootparam "small"; then
485 einfo "Information: ${RAM} kB of RAM available." ; eend 0
486 einfo "Bootoption small detected. Activating small system."
487 if [ -r /etc/inittab.small ] ; then
488 mv /etc/inittab /etc/inittab.normal
489 mv /etc/inittab.small /etc/inittab
491 sed -i 's/^9/#&/' /etc/inittab
492 sed -i 's/^10/#&/' /etc/inittab
493 sed -i 's/^11/#&/' /etc/inittab
494 sed -i 's/^12/#&/' /etc/inittab
496 /sbin/telinit q ; eend $?
498 if checkgrmlsmall ; then
499 if [[ $RAM -lt 25000 ]] ; then
500 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
501 ewarn "At least 32MB of RAM should be available for grml-small." ; eend 1
502 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
503 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
506 einfo "Information: ${RAM} kB of RAM available." ; eend 0
509 if [[ $RAM -lt 58000 ]] ; then
510 ewarn "Information: ${RAM} kB of RAM available." ; eend 1
511 ewarn "At least 64MB of RAM should be available for grml." ; eend 1
512 ewarn "Use the bootoption small to save some more MB of memory usage." ; eend 0
513 ewarn "Dropping you into a rescue shell. To continue booting exit the shell." ; eend 0
516 einfo "Information: ${RAM} kB of RAM available." ; eend 0
524 # skip startup of w3m {{{
526 if checkbootparam "fast"; then
527 ewarn "Bootoption fast detected. Skipping startup of w3m."
528 sed -i 's#^1:.*#1:12345:respawn:/usr/bin/openvt -f -c 1 -w -- /bin/zsh#' /etc/inittab
529 /sbin/telinit q ; eend $?
534 # activate serial console {{{
536 if checkbootparam "console"; then
537 einfo "Bootoption (for serial) console detected."
539 if [ -r /etc/mgetty/mgetty.config ] ; then
540 MODE=$(getbootparam console | awk -F, '{print $2}')
542 [ -n "$MODE" ] || MODE=9600 # default mode
543 einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps"
544 sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $?
547 einfo "Activating mgetty."
548 sed -i 's/^#T0/T0/' /etc/inittab
549 sed -i 's/^#T1/T1/' /etc/inittab
550 /sbin/telinit q ; eend $?
556 # For burning on IDE-CD-Roms, k3b (and others) check for special permissions {{{
559 for DEVICE in /proc/ide/hd?; do
560 [ "$(cat $DEVICE/media 2>/dev/null)" = "cdrom" ] && CDROMS="$CDROMS /dev/${DEVICE##*/}"
562 [ -n "$CDROMS" ] && { chown root.cdrom $CDROMS; chmod 666 $CDROMS; } 2>/dev/null
566 # {{{ Bring up loopback interface now
568 if [ -z "$INSTALLED" ] ; then
569 if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then
570 grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo
578 # firewire devices {{{
579 # the raw1394 driver does not yet export info into SYSFS,
580 # so let's create raw1394 device manually
581 # http://www.michael-prokop.at/blog/index.php?p=352
582 config_firewire_dev(){
583 if checkbootparam "nofirewiredev" ; then
584 ewarn "Skipping creating some firewire devices as requested on boot commandline." ; eend 0
586 #if [ "${KERNEL%-*}" == "2.6.11" ] ; then
587 einfo "Creating some firewire devices (fix kernel 2.6-bug)."
588 # cd /dev && MAKEDEV video1394 raw1394
589 [ -r /dev/raw1394 ] || mknod /dev/raw1394 c 171 0
590 [ -r /dev/video1394 ] || mknod -m 666 /dev/video1394 c 171 16
591 # mknod -m 666 /dev/dv1394 c 171 32 # for NTSC
592 [ -r /dev/dv1394 ] || mknod -m 666 /dev/dv1394 c 171 34 # for PAL
593 chown -R root:video /dev/raw1394 /dev/video1394 /dev/dv1394
594 chmod -R 664 /dev/raw1394 /dev/video1394 /dev/dv1394 ; eend $?
600 # {{{ copy passwd-lockfile to ramdisk (fix unionfs-behaviour)
601 # otherwise we will get: passwd: Authentication token lock busy
603 if [ -z "$INSTALLED" ] ; then
611 if [ -n "$TESTCD" ]; then
612 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
613 einfo "Reading files and checking against GRML/md5sums, this may take a while..."
616 if [ -n "${LIVECD_PATH}"/GRML ] ; then
617 ( cd "${LIVECD_PATH}"/GRML ; rm -f /tmp/md5sum.log ; md5sum -c md5sums 2>&1 | tee /tmp/md5sum.log ; RC=$? )
619 echo "${RED} *** Error: Could not find md5sum file. ***"
622 if [ "$RC" = "0" ]; then
623 einfo "Everything looks OK" ; eend 0
625 eerror 'Checksum failed for theses files:' ; eend 1
626 egrep -v '(^md5sum:|OK$)' /tmp/md5sum.log
627 eerror 'Data on the grml medium is possibly incomplete/damaged or...'
628 eerror '... RAM of your computer is broken.' ; eend 1
629 einfon "Hit return to continue, or press the reset button to quit."
638 # {{{ hardware detection via discover
640 if checkbootparam "nodisc" ; then
641 ewarn "Skipping hardware detection via discover as requested on boot commandline." ; eend 0
643 if [ -x /sbin/discover ] ; then
644 einfo "Discovering hardware. Trying to load the following modules in background:"
646 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)"
648 /sbin/discover-modprobe -v 1>>$DEBUG 2>&1 &
651 eerror "Application discover not available. Information: udev should handle hardware recognition." ; eend 0
657 # {{{ hardware detection via hwinfo
659 if checkbootparam hwinfo >>$DEBUG 2>&1; then
660 einfo "Discovering hardware via hwinfo:"
661 MODULES=$(su grml hwinfo | grep "Cmd: \"modprobe" | awk '{print $5}' | sed 's/"//')
662 echo -n " Loading modules: "
663 for i in `echo $MODULES` ; do echo -n $i && modprobe $i ; done
669 # {{{ disable hotplug agents on request
670 config_hotplug_agent(){
671 if checkbootparam "noagent" ; then
672 AGENT="$(getbootparam 'noagent' 2>>$DEBUG)"
673 AGENTLIST=$(echo "$AGENT" | sed 's/,/\\n/g')
674 AGENTNL=$(echo "$AGENT" | sed 's/,/ /g')
675 einfo "Disabling hotplug-agent(s) $AGENTNL"
676 for agent in $(echo -e $AGENTLIST) ; do
677 mv /etc/hotplug/${agent}.rc /etc/hotplug/${agent}.norc
679 [ "$?" == "0" ] ; eend $?
684 # {{{ blacklist of hotplug-modules
685 config_hotplug_blacklist(){
686 if checkbootparam "black" ; then
687 BLACK="$(getbootparam 'black' 2>>$DEBUG)"
688 BLACKLIST=$(echo "$BLACK" | sed 's/,/\\n/g')
689 BLACKNL=$(echo "$BLACK" | sed 's/,/ /g')
690 einfo "Blacklisting $BLACKNL via /etc/hotplug/blacklist.d/hotplug-light"
691 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist.d/hotplug-light
692 echo -e "$BLACKLIST" >> /etc/hotplug/blacklist
700 if checkbootparam "nohotplug" ; then
701 ewarn "Skipping running hotplug as requested on boot commandline." ; eend 0
703 if [ -r /etc/init.d/hotplug ] ; then
704 einfo "Starting hotplug system in background."
705 /etc/init.d/hotplug start 1>>$DEBUG 2>>$DEBUG &
707 elif [ -r /etc/init.d/hotplug-light ] ; then
708 einfo "Starting hotplug-light system in background."
709 /etc/init.d/hotplug-light start 1>>$DEBUG 2>>$DEBUG &
712 ewarn "No hotplug system found. Should be handled by udev. Skipping execution." ; eend 0
718 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
720 if checkbootparam "blacklist" ; then
721 if [ -z "$INSTALLED" ]; then
722 einfo "Bootoption blacklist found."
723 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
724 if [ -n "$BLACK" ] ; then
725 for module in $(echo ${BLACK//,/ }) ; do
726 einfo "Blacklisting module ${module} via /etc/modprobe.d/grml."
727 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml
728 echo "blacklist $module" >> /etc/modprobe.d/grml
729 echo "alias $module off" >> /etc/modprobe.d/grml
730 echo "# end entry generated by config_blacklist of grml-autoconfig" >> /etc/modprobe.d/grml ; eend $?
733 eerror "No given module for blacklist found. Blacklisting will not work therefore."
736 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
738 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
747 if [ -d /proc/acpi ]; then
748 if checkbootparam "noacpi"; then
749 ewarn "Skipping ACPI Bios detection as requested via noacpi on boot commandline." ; eend 0
750 elif checkbootparam "nogrmlacpi" ; then
751 ewarn "Skipping ACPI Bios detection as requested via nogrmlacpi on boot commandline." ; eend 0
753 einfo "ACPI Bios found, activating modules (disable via bootoption noacpi / nogrmlacpi): "
756 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
758 basename="${basename%%.*}"
759 case "$basename" in *_acpi)
760 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
762 modprobe $basename >>$DEBUG 2>&1 && found="yes"
763 local BASE="$BASE $basename"
765 if [ -n "$found" ] ; then
766 einfo "$BASE" ; eend 0
768 ewarn "(none)" ; eend 1
770 if ! ps x | grep -q /usr/sbin/acpid ; then
771 if ! [ -r /var/run/dbus/pid ] ; then
772 einfo "Starting acpi daemon."
773 /etc/init.d/acpid start 1>>$DEBUG 2>&1 ; eend $?
775 eerror "acpid error: it seems you are running d-bus/hal, but acpid needs to be started before d-bus."
776 eerror "Solution: please activate acpid via /etc/runlevel.conf"
780 ewarn "acpi daemon already running."
787 if checkbootparam "noapm"; then
788 ewarn "Skipping APM Bios detection as requested on boot commandline." ; eend 0
790 modprobe apm power_off=1 >>$DEBUG 2>&1
791 if [ "$?" = "0" ] ; then
792 if [ -x /etc/init.d/apmd ] ;then
793 einfo "APM Bios found, enabling power management functions."
794 /etc/init.d/apmd start ; eend $?
797 eerror "Loading apm module failed." ; eend 1
804 # {{{ PCMCIA Check/Setup
805 # This needs to be done before other modules are being loaded (by hwsetup)
807 if checkbootparam "nopcmcia"; then
808 ewarn "Skipping PCMCIA detection as requested on boot commandline." ; eend 0
810 if /usr/sbin/laptop-detect ; then
811 einfo "Detected Laptop - checking for PCMCIA." && eend 0
812 modprobe pcmcia_core >>$DEBUG 2>&1
813 # Try Cardbus or normal PCMCIA socket drivers
814 modprobe yenta_socket >>$DEBUG 2>&1 || modprobe i82365 >>$DEBUG 2>&1 || modprobe pd6729 >>$DEBUG 2>&1 || modprobe tcic >>$DEBUG 2>&1
815 if [ "$?" = "0" ]; then
816 modprobe ds >>$DEBUG 2>&1
817 if [ -d /proc/bus/pccard ] ; then
818 if [ -x /sbin/cardmgr ] ; then
819 einfo "PCMCIA found, starting cardmgr."
820 cardmgr >>$DEBUG 2>&1 && sleep 6 && eend 0
822 eerror "No cardmgr found. Make sure package pcmciautils is installed, it should handle it instead." ; eend 1
831 # {{{ run software synthesizer via speakup
833 if checkbootparam swspeak ; then
834 einfo "Bootoption swspeak found."
836 if [ ! -d /proc/speakup/ ] && ! grep -q speakup_soft /proc/modules ; then
837 ewarn "Kernel does not support software speakup - trying to load kernel module:" ; eend 0
839 einfo "Loading speakup_soft"
840 if modprobe speakup_soft ; then
843 flitewrapper "Fatal error setting up software speakup"
850 if [ -d /proc/speakup/ ] || grep -q speakup_soft /proc/modules ; then
851 einfo "Kernel supports speakup." ; eend 0
853 einfo "Just run swspeak if you want to use software synthesizer via speakup."
854 flitewrapper "Finished activating software speakup. Just run swspeak when booting finished."
857 eerror "Kernel does not seem to support speakup. Skipping swspeak." ; eend 1
858 flitewrapper "Kernel does not seem to support speakup. Sorry."
864 # {{{ support hardware synthesizer via speakup
866 if checkbootparam hwspeak ; then
867 einfo "Bootoption hwspeak found."
869 if [ ! -d /proc/speakup/ ] && ! grep -q speakup /proc/modules ; then
870 ewarn" Kernel does not support hardware speakup - trying to load kernel modules:" ; eend 0
872 for module in $(find "/lib/modules/${KERNEL}/extra/speakup/" -name \*.ko | \
873 sed 's#.*speakup/##g ; s#.ko$##g' | \
874 grep -ve speakup_soft -ve speakup_dummy | sort -u) ; do
875 einfo "Trying to load $module"
882 if [ -d /proc/speakup/ ] || grep -q speakup /proc/modules ; then
883 einfo "Kernel should support speakup now." ; eend 0
884 flitewrapper "Kernel should support speakup now."
886 eerror "Kernel or hardware do not seem to support speakup. Skipping hwspeak." ; eend 1
887 flitewrapper "Kernel or hardware do not seem to support speakup. Sorry."
893 # {{{ Check for blind option or brltty
896 checkbootparam "blind" && BLIND="yes"
897 BRLTTY="$(getbootparam brltty 2>>$DEBUG)"
899 if [ -n "$BLIND" -o -n "$BRLTTY" ]; then
900 if [ -x /sbin/brltty ]; then
901 # Blind option detected, start brltty now.
902 # modprobe serial_core parport_serial generic_serial && echo "done"
907 if [ -n "$BRLTTY" ]; then
909 BRLTYPE="${BRLTTY%%,*}"
911 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
913 BRLDEV="${BRLTTY%%,*}"
915 if [ -n "$R" -a "$R" != "$BRLTTY" ]; then
917 BRLTEXT="${BRLTTY%%,*}"
922 [ -n "$BRLTYPE" ] && CMD="$CMD -b $BRLTYPE"
923 [ -n "$BRLDEV" ] && CMD="$CMD -d $BRLDEV"
924 [ -n "$BRLTEXT" ] && CMD="$CMD -t $BRLTEXT"
925 einfo "Starting braille-display manager."
928 sleep 2 && BLINDSOUND="yes"
935 # {{{ Interactive configuration
936 config_interactive(){
937 ewarn "config_interactive is deprecated nowadays."
938 ewarn "Please set CONFIG_INTERACTIVE='no' in /etc/grml/autoconfig" ; eend 0
944 if checkbootparam forceagp ; then
945 # Probe for AGP. Hope this can fail safely
946 stringinfile "AGP" "/proc/pci" 2>>$DEBUG && { modprobe agpgart || modprobe agpgart agp_try_unsupported=1; } >>$DEBUG 2>&1 && einfo "AGP bridge detected." ; eend 0
952 config_automounter(){
953 if checkbootparam automounter ; then
954 RUNLEVEL="$(runlevel)"
956 [ -x /etc/init.d/autofs ] && [ "$RUNLEVEL" != "N 1" ] && [ "$RUNLEVEL" != "N S" ] && AUTOMOUNTER="yes"
961 if [ -n "$AUTOMOUNTER" ]; then
962 [ -d "/mnt/$d" -a ! -L "/mnt/$d" ] && rmdir /mnt/$d
963 [ -d "/mnt/auto/$d" ] || mkdir -p "/mnt/auto/$d"
964 [ -L "/mnt/$d" ] || ln -s "/mnt/auto/$d" "/mnt/$d"
965 anew="$d -fstype=auto,$2 :$i"
966 stringinfile "$anew" "/etc/auto.mnt" || echo "$anew" >> /etc/auto.mnt
967 AUTOMOUNTS="$AUTOMOUNTS $d"
968 new="$1 /mnt/auto/$d auto users,noauto,exec,$2 0 0"
970 [ -d /mnt/$d ] && mkdir -p /mnt/$d
971 new="$1 /mnt/$d auto users,noauto,exec,$2 0 0"
973 stringinfile "$new" "/etc/fstab" || echo "$new" >> /etc/fstab
976 AUTOMOUNTS="floppy cdrom"
977 # Add new devices to /etc/fstab and /etc/auto.mnt
978 for i in /dev/cdrom?*; do
980 addautomount "$i" "ro"
985 if [ -n "$AUTOMOUNTER" ]; then
986 # Check for floppy dir, reinstall with automounter
987 [ -d /mnt/floppy -a ! -L /mnt/floppy ] && rmdir /mnt/floppy
988 [ -d /mnt/auto/floppy ] || mkdir -p /mnt/auto/floppy
989 [ -L /mnt/floppy ] || ln -s /mnt/auto/floppy /mnt/floppy
990 [ -d /mnt/cdrom -a ! -L /mnt/cdrom ] && rmdir /mnt/cdrom
991 [ -d /mnt/auto/cdrom ] || mkdir -p /mnt/auto/cdrom
992 [ -L /mnt/cdrom ] || ln -s /mnt/auto/cdrom /mnt/cdrom
994 # Replace paths from bootfloppy
995 sed 's|/mnt/cdrom|/mnt/auto/cdrom|g;s|/mnt/floppy|/mnt/auto/floppy|g' /etc/fstab > /etc/fstab.new
996 mv -f /etc/fstab.new /etc/fstab
997 # Start automounter now
998 einfo "Starting automounter for ${AUTOMOUNTS}."
999 /etc/init.d/autofs start >>$DEBUG ; eend $?
1004 # {{{ Collect partitions from /proc/partitions first for enabling DMA
1008 while read major minor blocks partition relax; do
1009 partition="${partition##*/}"
1010 [ -z "$partition" -o ! -e "/dev/$partition" ] && continue
1011 case "$partition" in
1012 hd?) IDEDISKS="$IDEDISKS $partition";; # IDE Harddisk, entire disk
1013 sd?) ;; # SCSI Harddisk, entire disk
1014 # [hs]d*) partitions="$partitions /dev/$partition";; # IDE or SCSI disk partition
1015 [hs]d*|ub*) partitions="$partitions /dev/$partition";; # IDE, USB or SCSI disk partition
1018 $(awk 'BEGIN{old="__start"}{if($0==old){exit}else{old=$0;if($4&&$4!="name"){print $0}}}' /proc/partitions)
1021 check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only file system"
1024 # {{{ Enable DMA for all IDE drives now if not disabled
1025 # Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems
1027 if checkbootparam "nodma"; then
1028 ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0
1030 for d in $(cd /proc/ide 2>>$DEBUG && echo hd[a-z]); do
1031 if test -d /proc/ide/$d; then
1032 if egrep -q 'using_dma[ \t]+0' /proc/ide/$d/settings 2>>$DEBUG; then
1033 MODEL="$(cat /proc/ide/$d/model 2>>$DEBUG)"
1034 test -z "$MODEL" && MODEL="[GENERIC IDE DEVICE]"
1035 einfo "Enabling DMA acceleration for: ${WHITE}$d ${YELLOW}[${MODEL}]${NORMAL}"
1036 echo "using_dma:1" >/proc/ide/$d/settings
1045 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
1048 NOSWAP="yes" # we do not use swap by default!
1049 if checkbootparam "swap" || checkbootparam "anyswap" ; then
1051 checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP=""
1054 if checkbootparam "nofstab" || checkbootparam "forensic" ; then
1055 ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0
1057 einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)"
1058 iszsh && setopt nonomatch
1059 if [ -x /usr/sbin/rebuildfstab ] ; then
1060 config_userfstab || fstabuser=grml
1061 /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $?
1063 ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1
1065 fi # checkbootparam nofstab/forensic
1067 # Scan for swap, config, homedir - but only in live-mode
1068 if [ -z "$INSTALLED" ] ; then
1069 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
1072 HOMEDIR="$(getbootparam home)"
1073 if [ -n "$partitions" ]; then
1074 while read p m f relax; do
1075 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
1076 partoptions="users,exec"
1078 # it's a swap partition?
1081 if [ -n "$NOSWAP" ]; then
1082 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
1085 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
1086 S1SUSP|S2SUSP|pmdisk|[zZ]*)
1087 if [ -n "$ANYSWAP" ] ; then
1088 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
1089 swapon $p 2>>$DEBUG ; eend $?
1091 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
1095 if [[ "$p" == LABEL* ]] ; then
1096 p=$(blkid -t $p | awk -F: '{print $1}')
1098 if grep -q $p /proc/swaps ; then
1099 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
1101 if [ -b "$p" ] ; then
1102 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
1103 swapon $p 2>>$DEBUG ; eend $?
1105 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
1114 esac # it's a swap partition?
1119 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
1120 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
1122 # *) NONEFOUND='1'; continue ;;
1126 if [ -z "$NOSWAP" ] ; then
1127 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
1128 # Activate swapfile, if exists
1129 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
1131 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
1132 mount -o remount,rw $m && MOUNTED=1
1133 if swapon "$SWAPFILE" 2>>$DEBUG ; then
1135 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
1137 fnew="$SWAPFILE swap swap defaults 0 0"
1138 stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
1139 GRML_SWP="$GRML_SWP $SWAPFILE"
1142 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1145 # use a image as home
1146 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
1147 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
1148 if [ -n "$HOMEDIR" ]; then
1149 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
1153 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
1155 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
1160 # Umount, if not in use
1161 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
1173 if [ -n "$MOUSE_DEVICE" ] ; then
1174 einfo "Detecting mouse: ${MOUSE_FULLNAME} at ${MOUSE_DEVICE}" ; eend $?
1179 # {{{ IPv6 configuration
1180 # Load IPv6 kernel module and print IP adresses
1182 if checkbootparam "ipv6"; then
1183 einfo "Enabling IPv6 as requested on boot commandline (sleeping for 2 seconds)"
1185 # we probably need some time until stateless autoconfiguration has happened
1187 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1188 for DEVICE in `echo "$NETDEVICES"`; do
1191 ADDRESSES="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{print $3}')"
1192 COUNT="$(ifconfig $DEVICE | awk '/.*inet6 addr:.*/{ sum += 1};END {print sum }')"
1194 for ADDR in `echo "$ADDRESSES"` ; do
1197 if [ "$COUNT" -eq "0" ] ; then
1198 einfo "(none)" ; eend 1
1208 # {{{ Fat-Client-Version: DHCP Broadcast for IP address
1210 if checkbootparam "nodhcp"; then
1211 ewarn "Skipping DHCP broadcast/network detection as requested on boot commandline." ; eend 0
1213 NETDEVICES="$(awk -F: '/eth.:|tr.:|wlan.:/{print $1}' /proc/net/dev 2>>$DEBUG)"
1214 rm -rf /etc/network/status ; mkdir -p /etc/network/status
1215 for DEVICE in `echo "$NETDEVICES"` ; do
1216 einfo "Network device ${WHITE}${DEVICE}${NORMAL} detected, DHCP broadcasting for IP. (Backgrounding)"
1218 ifconfig $DEVICE up >>$DEBUG 2>&1
1219 ( pump -i $DEVICE >>$DEBUG 2>&1 && echo finished_running_pump > /etc/network/status/$DEVICE ) &
1224 if [ -n "$INSTALLED" ] ; then
1225 ewarn 'If you want to disable automatic DHCP requests set CONFIG_DHCP=no in /etc/grml/autoconfig.'
1232 # {{{ helper functions
1235 # search all partitions for a file in the root directory
1236 for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
1237 # See if it's already mounted
1238 [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
1239 if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
1240 [ -f "$i/$1" ] && FOUND="$i/$1"
1241 umount -l "$i" 2>>$DEBUG
1242 [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
1249 case "$(file -s $1)" in
1250 *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
1251 *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
1252 *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
1253 *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
1254 *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
1255 *data*) echo "invalid"; return 0;;
1256 *) echo "auto"; return 0;;
1260 # Try to mount this filesystem read-only, without or with encryption
1262 # Check if already mounted
1263 case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
1264 # Apparently, mount-aes DOES autodetect AES loopback files.
1265 [ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
1266 # We need to mount crypto-loop files with initial rw support
1267 [ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
1269 [ "$RC" = "0" ] && return 0
1271 einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
1273 while [ "$a" != "n" -a "$a" != "N" ]; do
1274 # We need to mount crypto-loop files with initial rw support
1275 mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
1276 echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
1277 # Problem with ioctl() from getpasswd()?
1287 if checkbootparam "nocpu"; then
1288 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
1290 # check module dependencies
1292 if ! [ -e /lib/modules/${KERNEL}/kernel/arch/x86/kernel/cpu/cpufreq ] ; then
1293 if [ -e /lib64 ] ; then
1294 [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1
1296 [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1
1301 if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then
1302 einfo "Detecting CPU:"
1303 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)
1304 echo $CPU | sed 's/ \{1,\}/ /g'
1307 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
1310 # Disclaimer: sorry for the tons of if/then/else... but this makes sure we use:
1311 # * it only if we have the according kernel modules available
1312 # * cpufreq only on laptops (check via /usr/sbin/laptop-detect) and not inside Virtual Box
1313 # * current version of /etc/init.d/loadcpufreq from Debian (to stay in sync)
1314 # -> parse output of the initscript and output it according to our look'n'feel
1315 # * our own cpufreq-detect.sh if /etc/init.d/loadcpufreq isn't present
1316 if ! cpufreq_check ; then
1317 ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1
1319 if /usr/sbin/laptop-detect 1>/dev/null 2>&1 ; then
1320 # Virtual Box supports ACPI and laptop-detect returns with '0', so check for it:
1321 if [ -r /proc/acpi/battery/BAT0/info ] ; then
1322 if grep -q 'OEM info: innotek' /proc/acpi/battery/BAT0/info ; then
1323 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
1327 einfo "Detected Laptop - trying to use cpu frequency scaling:"
1329 if [ -x /etc/init.d/loadcpufreq ] ; then
1330 SKIP_CPU_GOVERNOR=''
1331 LOADCPUFREQ=$(mktemp)
1332 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
1333 if grep -q FATAL "$LOADCPUFREQ" ; then
1339 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
1340 eerror "$line" ; eend $RC
1344 elif grep -q done "$LOADCPUFREQ" ; then
1345 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
1346 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1347 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
1349 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
1353 elif [ -r /usr/bin/cpufreq-detect.sh ] ; then
1354 . /usr/bin/cpufreq-detect.sh
1355 if [ -n "$MODULE" -a "$MODULE" != none ]; then
1356 einfo "Loading modules ${MODULE}"
1357 modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG
1359 if [[ $RC == 0 ]]; then
1366 ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1
1370 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
1371 einfo "Loading cpufreq_ondemand, setting ondemand governor"
1372 if modprobe cpufreq_ondemand ; RC=$? ; then
1373 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
1374 echo ondemand > $file
1384 fi # checkbootparam nocpu
1388 # {{{ autostart of ssh
1390 if checkbootparam ssh ; then
1392 SSH_PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
1393 einfo "Bootoption ssh found, trying to set password for user grml."
1395 if [ -z "$SSH_PASSWD" ] ; then
1396 if [ -x /usr/bin/apg ] ; then
1397 SSH_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1398 elif [ -x /usr/bin/gpw ] ; then
1399 SSH_PASSWD="$(gpw 1)"
1400 elif [ -x /usr/bin/pwgen ] ; then
1401 SSH_PASSWD="$(pwgen -1 8)"
1402 elif [ -x /usr/bin/hexdump ] ; then
1403 SSH_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1404 elif [ -n "$RANDOM" ] ; then
1405 SSH_PASSWD="grml${RANDOM}"
1408 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1412 if [ -n "$SSH_PASSWD" ] ; then
1413 ewarn "No given password for ssh found. Using random password: $SSH_PASSWD" ; eend 0
1418 # finally check if we have a password we can use:
1419 if [ -n "$SSH_PASSWD" ] ; then
1420 echo "grml:$SSH_PASSWD" | chpasswd -m
1423 einfo 'Starting secure shell server in background.'
1424 /etc/init.d/rmnologin start 1>>$DEBUG 2>>$DEBUG
1425 /etc/init.d/ssh start 1>>$DEBUG 2>>$DEBUG &
1429 ewarn 'Warning: please change the password for user grml as soon as possible!'
1435 # {{{ set password for user grml
1437 if checkbootparam passwd >>$DEBUG 2>&1; then
1438 einfo "Bootoption passwd found."
1439 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1440 if [ -n "$PASSWD" ] ; then
1441 echo "grml:$PASSWD" | chpasswd -m ; eend $?
1443 eerror "No given password for ssh found. Autostart of SSH will not work." ; eend 1
1446 ewarn "Warning: please change the password for user grml set via bootparameter as soon as possible!"
1452 # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
1454 if checkbootparam home ; then
1455 HOMEDIR="$(getbootparam home)"
1459 if [ -n "$HOMEDIR" ]; then
1460 einfo "Bootoption home detected." && eend 0
1463 MYHOMEDEVICE="${HOMEDIR##/dev/}"
1464 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1465 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1466 MYHOMEDIR="/mnt/${HOMEDIR##/dev/}"
1469 MYHOMEDEVICE="${HOMEDIR##/mnt/}"
1470 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1471 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1472 MYHOMEDIR="$HOMEDIR"
1474 [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd])
1475 MYHOMEDIR="$(findfile grml.img)"
1476 MYHOMEDEVICE="${MYHOMEDIR##/mnt/}"
1477 MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}"
1478 MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}"
1481 eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1
1482 eerror "Option ignored." ; eend 1
1487 if [ -n "$MYHOMEDIR" ]; then
1488 if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then
1489 [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img"
1490 while read device mountpoint fs relax; do
1491 case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1494 umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1
1498 # Note: This currently won't work with encrypted partitions
1499 umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"
1500 if [ ! -f "$MYHOMEDIR" ]; then
1501 ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)."
1502 ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img."
1507 if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then
1508 einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}."
1509 if [ -f "$MYHOMEDIR" ]; then
1510 # It's a loopback file, mount it over the /home/grml directory
1511 trymount "$MYHOMEDIR" /home/grml
1513 [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)"
1517 ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)"
1521 [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 )
1523 fi # mount -o remount,rw,...
1526 esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*)
1530 fi # if trymount ...
1532 fi # checkbootparam home
1536 # {{{ Check for scripts on CD-ROM
1537 config_cdrom_scripts(){
1538 if checkbootparam "script"; then
1539 for script in "${LIVECD_PATH}"/scripts/* ; do
1540 einfo " grml script found on CD, executing ${WHITE}${script}${NORMAL}."
1549 if ! [ -x /usr/bin/aumix ] ; then
1550 eerror "aumix binary not available. Can not set sound volumes therefore." ; eend 1
1553 if ! [ -r /proc/asound/cards ] ; then
1554 ewarn "No soundcard present, skipping mixer settings therefore." ; eend 0
1558 if checkbootparam vol ; then
1559 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1560 if [ -z "$VOL" ] ; then
1561 eerror "Bootoption vol found but no volume level/parameter given. Using defaults." ; eend 1
1568 if checkbootparam nosound ; then
1569 einfo "Muting sound devices on request."
1570 # some IBM notebooks require the following stuff:
1571 if [ -x /usr/bin/amixer ] ; then
1572 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1573 amixer set Front unmute 1>/dev/null
1574 amixer set Front 0% 1>/dev/null
1577 ERROR=$(aumix -w 0 -v 0 -p 0 -m 0 2>&1) ; RC=$?
1578 if [ -n "$ERROR" ] ; then
1580 eerror "Problem muting sound devices: $ERROR"
1584 elif [ -z "$INSTALLED" ]; then
1585 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1586 # some IBM notebooks require the following stuff:
1587 if [ -x /usr/bin/amixer ] ; then
1588 if amixer get Front 1>/dev/null 2>>$DEBUG ; then
1589 amixer set Front unmute 1>/dev/null
1590 amixer set Front ${VOL}% 1>/dev/null
1593 # by default assume '0' as volume for microphone:
1594 if checkbootparam micvol ; then
1595 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1600 # finally set the volumes:
1601 ERROR=$(aumix -w $VOL -v $VOL -p $VOL -m $MICVOL 2>&1) ; RC=$?
1602 if [ -n "$ERROR" ] ; then
1604 eerror "Problem setting mixer volumes: $ERROR (no soundcard?)"
1614 # {{{ modem detection
1616 if checkbootparam "nomodem"; then
1617 ewarn "Skipping check for AC97 modem controller as requested on boot commandline." ; eend 0
1619 if [ -x /etc/init.d/sl-modem-daemon ] ; then
1620 if lspci | grep Intel | grep -q "AC'97 Modem Controller" ; then
1621 einfo "AC97 modem controller detected. Start it running 'Start sl-modem-daemon'."
1629 # {{{ keyboard add-ons
1630 config_setkeycodes(){
1631 if checkbootparam "setkeycodes" ; then
1632 einfo "Setting keycodes as requested via bootparameter 'setkeycodes'."
1633 # MS MM keyboard add-on
1635 setkeycodes e001 126 &>/dev/null
1636 setkeycodes e059 127 &>/dev/null
1638 setkeycodes e03b 59 &>/dev/null
1639 setkeycodes e008 60 &>/dev/null
1640 setkeycodes e007 61 &>/dev/null
1641 setkeycodes e03e 62 &>/dev/null
1642 setkeycodes e03f 63 &>/dev/null
1643 setkeycodes e040 64 &>/dev/null
1644 setkeycodes e041 65 &>/dev/null
1645 setkeycodes e042 66 &>/dev/null
1646 setkeycodes e043 67 &>/dev/null
1647 setkeycodes e023 68 &>/dev/null
1648 setkeycodes e057 87 &>/dev/null
1649 setkeycodes e058 88 &>/dev/null
1651 setkeycodes e00a 89 e008 90 &>/dev/null
1658 config_wondershaper(){
1659 if checkbootparam "wondershaper" ; then
1660 WONDER="$(getbootparam wondershaper 2>>$DEBUG)"
1665 if [ -n "$WONDER" ]; then
1667 DEVICE="${WONDER%%,*}"
1669 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1671 DOWNSTREAM="${WONDER%%,*}"
1673 if [ -n "$R" -a "$R" != "$WONDER" ]; then
1675 UPSTREAM="${WONDER%%,*}"
1680 [ -n "$DEVICE" ] && CMD="$CMD $DEVICE"
1681 [ -n "$DOWNSTREAM" ] && CMD="$CMD $DOWNSTREAM"
1682 [ -n "$UPSTREAM" ] && CMD="$CMD $UPSTREAM"
1683 einfo "Starting wondershaper (${CMD}) in background."
1684 ( sh -c $CMD & ) && eend 0
1691 if checkbootparam "nosyslog"; then
1692 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1695 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1696 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1697 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1698 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1699 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1701 if [ -z "$SYSLOGD" ] ; then
1702 eerror "No syslog daemon found." ; eend 1
1704 einfo "Starting $SYSLOGD in background."
1705 /etc/init.d/$SYSLOGD start 1>>$DEBUG &
1714 if checkbootparam "nogpm"; then
1715 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1717 if ! [ -r /dev/input/mice ] ; then
1718 eerror "No mouse found - not starting GPM." ; eend 1
1720 einfo "Starting gpm in background."
1721 /etc/init.d/gpm start 1>>$DEBUG &
1722 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start 1>>$DEBUG ) &
1731 if checkbootparam "services" ; then
1732 SERVICE="$(getbootparam services 2>>$DEBUG)"
1733 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1734 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1735 einfo "Starting service(s) ${SERVICENL} in background."
1736 for service in $(echo -e $SERVICELIST) ; do
1737 /etc/init.d/${service} start 1>>$DEBUG &
1739 [ "$?" == "0" ] ; eend $?
1746 if checkbootparam netconfig ; then
1747 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1748 CONFIGFILE='/tmp/netconfig.grml'
1751 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 \
1752 --read-timeout=10 $CONFIG -O $CONFIGFILE && return 0 || return 1
1754 einfo "Trying to get ${WHITE}${CONFIG}${NORMAL}"
1756 while ! getconfig && [[ "$counter" != 0 ]] ; do
1757 echo -n "Sleeping for 5 seconds and trying to get config again... "
1758 counter=$(( counter-1 ))
1759 echo "$counter tries left" ; sleep 1
1761 if [ -r "$CONFIGFILE" ] ; then
1762 einfo "Downloading was successfull." ; eend 0
1763 einfo "md5sum of ${WHITE}${CONFIG}${NORMAL}: "
1764 md5sum $CONFIGFILE ; eend 0
1765 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1767 einfo "Sorry, could not fetch $CONFIG" ; eend 1
1774 config_blindsound(){
1775 if checkbootparam "blind" ; then
1777 flitewrapper "welcome to the gremel system"
1784 if checkbootparam welcome ; then
1785 flitewrapper "welcome to the gremel system"
1790 # {{{ fix/workaround for unionfs
1792 if [ -z "$INSTALLED" ]; then
1793 touch /var/cache/apt/*cache.bin
1798 # {{{ create all /mnt-directories
1800 ewarn "create_mnt_dirs is deprecated as grml-rebuildfstab does all we need."
1801 ewarn "Please set CONFIG_CREATE_MNT_DIRS='no' in /etc/grml/autoconfig" ; eend 0
1805 # {{{ start X window system via grml-x
1807 if checkbootparam startx ; then
1808 if [ -x /usr/X11R6/bin/X ] ; then
1809 if [ -z "$INSTALLED" ] ; then
1810 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1811 if [ -z "$WINDOWMANAGER" ] ; then
1812 einfo "No window manager specified. Taking ${WHITE}wm-ng${NORMAL} as default." && eend 0
1813 WINDOWMANAGER="wm-ng"
1815 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1817 einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1818 config_userfstab || fstabuser='grml'
1819 cat>|/etc/init.d/xstartup<<EOF
1821 # su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
1822 sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER 1>>$DEBUG
1824 chmod 755 /etc/init.d/xstartup
1826 # adjust inittab for xstartup
1827 if grep -q '^6:' /etc/inittab ; then
1828 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab
1829 else # just append tty6 to inittab if no definition is present:
1830 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab
1833 /sbin/telinit q ; eend $?
1835 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1836 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1838 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1842 eerror "We are not running from CD - startx will not work, skipping it.
1843 Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1846 eerror "/usr/X11R6/bin/X is not present on this grml flavour.
1847 Boot parameter startx does not work therefore." ; eend 1
1853 # {{{ configuration framework
1855 if checkbootparam extract ; then
1856 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1857 EXTRACTOPTIONS="-- -x $EXTRACT"
1865 if [ ! -b "$MOUNTDEVICE" ] ; then
1870 [ -d /mnt/grml ] || mkdir /mnt/grml
1871 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1872 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1873 if [[ $RC == 0 ]]; then
1874 einfo "Successfully mounted $MOUNTDEVICE $MESSAGE to /mnt/grml (readonly)." ; eend 0
1877 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1878 if checkbootparam config ; then
1879 FILENAME="$(getbootparam 'config' 2>>$DEBUG)"
1880 if [ -e /mnt/grml/${FILENAME} ] ; then
1881 einfo "Using /mnt/grml/$FILENAME instead of config.tbz"
1882 CONFIG="/mnt/grml/$FILENAME"
1885 if [ -n "$CONFIG" ]; then
1886 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1888 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1890 ewarn "Sorry, could not find file $FILENAME on device $MOUNTDEVICE $MESSAGE label GRMLCFG." ; eend 1
1894 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1895 if [ -n "$SCRIPT" ]; then
1896 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1901 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1902 fi # mount $MOUNTDEVICE
1903 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1908 if checkbootparam noautoconfig || checkbootparam forensic ; then
1909 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1911 if [ -z "$INSTALLED" ] ; then
1912 einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1914 # We do need the following fix so floppy disk is available to blkid in any case :-/
1915 if [ -r /dev/fd0 ] ; then
1916 einfo "Floppy device detected. Trying to access floppy disk."
1917 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1918 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1919 blkid /dev/fd0 1>>$DEBUG 2>&1
1922 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1923 config_unpack "$DEVICE" "labeled GRMCFG"
1930 if checkbootparam "config" ; then
1931 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1932 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1933 einfo "Bootoption config found. config is set to: $CONFIG"
1935 einfo "Trying to extract configuration file ${CONFIG}:"
1936 cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1940 if checkbootparam myconfig ; then
1941 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1942 if [ -n "$MOUNTDEVICE" ]; then
1943 config_unpack "$MOUNTDEVICE"
1945 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1946 fi # [ -n "$MOUNTDEVICE" ]
1947 fi # checkbootparam myconfig
1949 if checkbootparam "partconf" ; then
1950 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1951 if [ -n "$MOUNTDEVICE" ]; then
1952 [ -d /mnt/grml ] || mkdir /mnt/grml
1953 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1954 if [[ $RC == 0 ]]; then
1955 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1956 einfo "Copying files from $MOUNTDEVICE over grml system."
1957 for file in `cat /etc/grml/partconf` ; do
1958 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1959 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1962 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1963 fi # mount $MOUNTDEVICE
1964 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1966 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1967 fi # [ -n "$MOUNTDEVICE" ]
1972 # {{{ /cdrom/.*-options
1974 if checkbootparam "debs" ; then
1975 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1976 einfo "Tring to install debian package(s) ${DEBS}"
1977 dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
1982 if checkbootparam "scripts" ; then
1983 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1984 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1985 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1986 sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
1993 if checkbootparam "mypath" ; then
1994 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1995 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1996 touch /etc/grml/my_path
1997 chmod 644 /etc/grml/my_path
1998 # make sure the directories exist:
2000 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2001 if ! [ -d "$i" ] ; then
2002 einfo "Creating directory $i"
2003 mkdir -p "$i" ; eend $?
2006 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2014 if checkbootparam "distcc" ; then
2015 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2016 if [ -n "$OPTIONS" ]; then
2019 if [ -n "$OPTIONS" ]; then
2020 NET="${OPTIONS%%,*}"
2022 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2024 INTERFACE="${OPTIONS%%,*}"
2029 CONFIG=/etc/default/distcc
2030 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
2031 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2033 if [ -n "$INTERFACE" ] ; then
2034 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2037 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2038 counter=$(( counter-1 ))
2039 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2041 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2045 if [ -n "$IP" ] ; then
2046 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
2048 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2050 id distccd >/dev/null 2>&1 || \
2052 einfo "Creating distcc user" ; \
2053 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2056 einfo "Starting distcc for network ${NET}, listening on ${IP}."
2057 /etc/init.d/distcc start 1>/dev/null ; eend $?
2060 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2064 if checkbootparam "gcc"; then
2065 GCC="$(getbootparam gcc 2>>$DEBUG)"
2067 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2070 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2073 if checkbootparam "gpp"; then
2074 GPP="$(getbootparam gpp 2>>$DEBUG)"
2076 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2077 if [ -x /usr/bin/g++-${GPP} ] ; then
2079 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2081 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2082 if [ -x /usr/bin/cpp-${GPP} ] ; then
2084 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2093 # Notice: use it only on live-cd system, if running from harddisk please
2094 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2095 # in /etc/runlevel.conf
2097 MODULES_FILE=/etc/grml/modules
2098 if checkbootparam nomodules ; then
2099 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2100 elif [ -z "$INSTALLED" ]; then
2101 if [ -r $MODULES_FILE ] ; then
2102 einfo "Loading modules specified in ${MODULES_FILE}:"
2104 grep '^[^#]' $MODULES_FILE | \
2105 while read module args; do
2106 [ "$module" ] || continue
2108 modprobe $module $args ; eend $?
2112 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2119 config_915resolution(){
2120 if checkbootparam "915resolution" ; then
2121 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2122 if [ -x /usr/sbin/915resolution ]; then
2127 if [ -n "$OPTIONS" ]; then
2129 MODE="${OPTIONS%%,*}"
2131 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2133 XRESO="${OPTIONS%%,*}"
2135 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2137 YRESO="${OPTIONS%%,*}"
2142 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2143 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2152 if [ -z "$INSTALLED" ] ; then
2153 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2154 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2155 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2156 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2158 if ! [ -x /sbin/mdadm ] ; then
2159 eerror "mdadm not available, can not execute it." ; eend 1
2162 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2163 # find out whether we have a valid configuration file already
2164 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2165 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2166 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2167 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2169 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2172 if ! checkbootparam 'swraid' ; then
2174 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2177 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2182 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2184 *'No arrays found'*)
2185 ewarn "$line" ; eend 0
2188 einfo "$line" ; eend 0
2195 if [ -r /proc/mdstat ] ; then
2197 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2198 if [ -z "$MDSTAT" ] ; then
2199 ewarn "No active arrays found" ; eend 0
2204 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2205 einfo "active arrays: $line" ; eend 0
2211 fi # bootoption swraid
2213 fi # is /sbin/mdadm executable?
2214 fi # check for bootoptions
2215 fi # run only in live-cd mode
2219 # {{{ LVM (Logical Volumes)
2221 if [ -z "$INSTALLED" ] ; then
2222 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2223 if checkbootparam 'nolvm' ; then
2224 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2226 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2227 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2228 eerror "LVM not available, can not execute it." ; eend 1
2230 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2231 einfo "You seem to have logical volumes (LVM) on your system."
2233 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2235 if checkbootparam 'lvm' ; then
2236 einfo "Bootoption LVM found. Searching for logical volumes:"
2237 /etc/init.d/lvm2 start ; eend $?
2241 fi # check for lvm binary
2242 fi # check for bootoption nolvm
2243 fi # run only in live-cd mode
2247 # {{{ debnet: setup network based on an existing one found on a partition
2249 if checkbootparam "debnet" ; then
2250 iszsh && setopt shwordsplit
2251 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2252 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2255 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2257 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2258 for i in $DEVICES; do
2259 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2260 einfo "Scanning on $i"
2261 if [ -f /mnt/etc/network/interfaces ]; then
2262 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2270 if [ -n "$FOUND_DEBNET" ]; then
2271 einfo "Stopping network."
2272 pump -k 1>/dev/null 2>&1
2273 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2274 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2275 rm -rf /etc/network/run
2276 cp -a /mnt/etc/network /etc
2277 rm -rf /etc/network/run
2278 mkdir /etc/network/run
2279 umount /mnt ; eend $?
2280 einfo "Starting network."
2281 /etc/init.d/networking start ; eend $?
2283 eerror "/etc/network/interfaces not found." ; eend 1
2287 eerror "Error: /mnt already mounted." ; eend 1
2293 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2295 if grep -q ipw3945 /proc/modules ; then
2296 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2297 ewarn "Broken ipw3945 network interface found, reloading module."
2306 # {{{ disable console blanking
2308 if checkbootparam "noblank" ; then
2309 einfo "Bootoption noblank found. Disabling monitor blanking."
2310 setterm -blank 0 ; eend $?
2315 # {{{ tohd= bootoption
2318 if checkbootparam "tohd" ; then
2319 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2320 if [ -z "$TARGET" ] ; then
2321 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2322 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2326 if ! [ -b "$TARGET" ] ; then
2327 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2331 if grep -q $TARGET /proc/mounts ; then
2332 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2337 local MOUNTDIR=$(mktemp -d)
2339 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2340 einfo "Copyring live system to $TARGET - this might take a while"
2341 rsync -a --progress /live/image/live $MOUNTDIR
2345 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2347 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2356 # {{{ grml2hd: automatic installation
2359 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2361 if checkbootparam "user" ; then
2363 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2364 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2367 if checkbootparam "filesystem" ; then
2369 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2370 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2373 if checkbootparam "partition" ; then
2375 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2376 # notice: the following checks whether the given partition is available, if not the skip
2377 # execution of grml2hd as it might result in data loss...
2378 if [ -r $PARTITION ] ; then
2379 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2381 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2385 if checkbootparam "mbr" ; then
2387 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2388 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2391 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2393 GRML2HD_NONINTERACTIVE='yes' grml2hd
2396 chmod 755 /usr/bin/grml2hd_noninteractive
2397 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2398 if [ -z "$GRML2HD_FAIL" ] ; then
2399 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2401 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2404 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2408 # {{{ debootstrap: automatic installation
2409 config_debootstrap(){
2411 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2413 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2415 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2417 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2422 if checkbootparam "target" ; then
2424 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2425 # notice: the following checks whether the given partition is available, if not the skip
2426 # execution of grml-debootstrap as it might result in data loss...
2427 if ! [ -r "$TARGET" ] ; then
2428 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2432 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2437 if checkbootparam "grub" ; then
2439 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2442 if checkbootparam "groot" ; then
2444 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2447 if checkbootparam "release" ; then
2449 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2452 if checkbootparam "mirror" ; then
2454 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2457 if checkbootparam "boot_append" ; then
2459 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2462 if checkbootparam "password" ; then
2464 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2467 # now check which options are available
2468 if [ -n "TARGET" ] ; then
2469 TARGETCMD="--target $TARGET"
2473 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2477 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2478 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2479 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2480 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2481 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2482 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2484 # and finally write script and execute it
2485 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2487 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2490 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2492 screen /usr/bin/grml-debootstrap_noninteractive
2493 einfo "Invoking a shell, just exit to continue booting..."
2496 fi # stringinstring "BOOT_IMAGE=debian2hd
2500 # {{{ Support customization
2502 if checkbootparam "distri"; then
2503 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2504 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2505 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2506 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2507 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2508 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2514 ### {{{ backwards compatible stuff
2515 config_environment(){
2516 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2519 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2523 ## END OF FILE #################################################################
2524 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3