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"
1862 if checkbootparam noautoconfig || checkbootparam forensic ; then
1863 ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0
1865 if [ -z "$INSTALLED" ] ; then
1866 einfo "Searching for device(s) labeled with GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1868 [ -d /mnt/grml ] || mkdir /mnt/grml
1869 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1870 # We do need the following fix so floppy disk is available to blkid in any case :-/
1871 if [ -r /dev/fd0 ] ; then
1872 einfo "Floppy device detected. Trying to access floppy disk."
1873 # dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1
1874 if timeout 4 dd if=/dev/fd0 of=/dev/null bs=512 count=1 1>>$DEBUG 2>&1 ; then
1875 blkid /dev/fd0 1>>$DEBUG 2>&1
1878 DEVICE=$(blkid -t LABEL=GRMLCFG | head -1 | awk -F: '{print $1}')
1879 [ -n "$DEVICE" ] && mount -t auto -o ro $DEVICE /mnt/grml ; RC="$?"
1880 if [[ $RC == 0 ]]; then
1881 einfo "Mounting device $DEVICE labeled GRMLCFG succeeded." ; eend 0
1884 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
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 config.tbz on device with 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."
1899 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1901 ewarn "No devices with label GRMLCFG found." ; eend 0
1910 if checkbootparam "config" ; then
1911 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1912 [ -z "$CONFIG" ] && CONFIG='config.tbz'
1913 einfo "Bootoption config found. config is set to: $CONFIG"
1915 einfo "Trying to extract configuration file ${CONFIG}:"
1916 cd / && unp "${LIVECD_PATH}"/config/$CONFIG $EXTRACTOPTIONS ; eend $?
1920 if checkbootparam myconfig ; then
1921 MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1922 if [ -n "$MOUNTDEVICE" ]; then
1923 if checkbootparam file ; then
1924 FILENAME="$(getbootparam 'file' 2>>$DEBUG)"
1925 [ -n "$FILENAME" ] || FILENAME='config.tbz'
1927 [ -d /mnt/grml ] || mkdir /mnt/grml
1928 umount /mnt/grml 1>>$DEBUG 2>&1 # make sure it is not mounted
1929 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1930 if [[ $RC == 0 ]]; then
1931 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1934 CONFIG="$(/bin/ls -1d /mnt/grml/[Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1935 if [ -n "$CONFIG" ]; then
1936 einfo "Found file ${WHITE}${CONFIG}${NORMAL} - trying to extract it."
1938 unp $CONFIG $EXTRACTOPTIONS ; eend $?
1940 ewarn "Sorry, could not find file config.tbz on device with label GRMLCFG." ; eend 1
1944 SCRIPT="$(/bin/ls -1d /mnt/grml/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1945 if [ -n "$SCRIPT" ]; then
1946 einfo "Found script ${WHITE}${SCRIPT}${NORMAL} - trying to execute it."
1951 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1952 fi # mount $MOUNTDEVICE
1953 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1955 einfo "Sorry, no device for bootoption myconfig provided. Skipping." ; eend 1
1956 fi # [ -n "$MOUNTDEVICE" ]
1957 fi # checkbootparam myconfig
1959 if checkbootparam "partconf" ; then
1960 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1961 if [ -n "$MOUNTDEVICE" ]; then
1962 [ -d /mnt/grml ] || mkdir /mnt/grml
1963 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1964 if [[ $RC == 0 ]]; then
1965 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1966 einfo "Copying files from $MOUNTDEVICE over grml system."
1967 for file in `cat /etc/grml/partconf` ; do
1968 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1969 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1972 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1973 fi # mount $MOUNTDEVICE
1974 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1976 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1977 fi # [ -n "$MOUNTDEVICE" ]
1982 # {{{ /cdrom/.*-options
1984 if checkbootparam "debs" ; then
1985 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1986 einfo "Tring to install debian package(s) ${DEBS}"
1987 dpkg -i "${LIVECD_PATH}"/debs/$DEBS* ; eend $?
1992 if checkbootparam "scripts" ; then
1993 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1994 [ -z "$SCRIPTS" ] && SCRIPTS='grml.sh'
1995 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1996 sh -c "${LIVECD_PATH}"/scripts/$SCRIPTS ; eend $?
2003 if checkbootparam "mypath" ; then
2004 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
2005 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
2006 touch /etc/grml/my_path
2007 chmod 644 /etc/grml/my_path
2008 # make sure the directories exist:
2010 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
2011 if ! [ -d "$i" ] ; then
2012 einfo "Creating directory $i"
2013 mkdir -p "$i" ; eend $?
2016 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
2024 if checkbootparam "distcc" ; then
2025 OPTIONS="$(getbootparam distcc 2>>$DEBUG)"
2026 if [ -n "$OPTIONS" ]; then
2029 if [ -n "$OPTIONS" ]; then
2030 NET="${OPTIONS%%,*}"
2032 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2034 INTERFACE="${OPTIONS%%,*}"
2039 CONFIG=/etc/default/distcc
2040 sed -i "s#^STARTDISTCC=.*#STARTDISTCC=YES#" $CONFIG
2041 sed -i "s#^ALLOWEDNETS=.*#ALLOWEDNETS=$NET#" $CONFIG
2043 if [ -n "$INTERFACE" ] ; then
2044 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2047 while [ -z "$IP" ] && [[ "$counter" != 0 ]] ; do
2048 counter=$(( counter-1 ))
2049 ewarn "No ip address for $INTERFACE found. Sleeping for 3 seconds. $counter tries left."
2051 IP=$(LANG=C ifconfig $INTERFACE | gawk -F: /"inet addr"/'{print $2}' | gawk '{print $1}')
2055 if [ -n "$IP" ] ; then
2056 sed -i "s#^LISTENER=.*#LISTENER=$IP#" $CONFIG
2058 einfo "Bootoption distcc found. Preparing setup for distcc daemon."
2060 id distccd >/dev/null 2>&1 || \
2062 einfo "Creating distcc user" ; \
2063 adduser --quiet --system --ingroup nogroup --home / --no-create-home distccd ; eend $?
2066 einfo "Starting distcc for network ${NET}, listening on ${IP}."
2067 /etc/init.d/distcc start 1>/dev/null ; eend $?
2070 eerror "No ip address for $INTERFACE found. distcc can not be used without it." ; eend 1
2074 if checkbootparam "gcc"; then
2075 GCC="$(getbootparam gcc 2>>$DEBUG)"
2077 einfo "Pointing /usr/bin/gcc to /usr/bin/gcc-${GCC}."
2080 ln -s /usr/bin/gcc-${GCC} /usr/bin/gcc ; eend $?
2083 if checkbootparam "gpp"; then
2084 GPP="$(getbootparam gpp 2>>$DEBUG)"
2086 einfo "Pointing /usr/bin/g++ to /usr/bin/g++-${GPP}."
2087 if [ -x /usr/bin/g++-${GPP} ] ; then
2089 ln -s /usr/bin/g++-${GPP} /usr/bin/g++ ; eend $?
2091 einfo "Pointing /usr/bin/cpp to /usr/bin/cpp-${GPP}."
2092 if [ -x /usr/bin/cpp-${GPP} ] ; then
2094 ln -s /usr/bin/cpp-${GPP} /usr/bin/cpp ; eend $?
2103 # Notice: use it only on live-cd system, if running from harddisk please
2104 # add modules to /etc/modules and activate /etc/init.d/module-init-tools
2105 # in /etc/runlevel.conf
2107 MODULES_FILE=/etc/grml/modules
2108 if checkbootparam nomodules ; then
2109 ewarn "Skipping loading of modules defined in ${MODULES_FILE} as requested." ; eend 0
2110 elif [ -z "$INSTALLED" ]; then
2111 if [ -r $MODULES_FILE ] ; then
2112 einfo "Loading modules specified in ${MODULES_FILE}:"
2114 grep '^[^#]' $MODULES_FILE | \
2115 while read module args; do
2116 [ "$module" ] || continue
2118 modprobe $module $args ; eend $?
2122 ewarn "File $MODULES_FILE does not exist. Skipping loading of specific modules." ; eend 1
2129 config_915resolution(){
2130 if checkbootparam "915resolution" ; then
2131 OPTIONS="$(getbootparam 915resolution 2>>$DEBUG)"
2132 if [ -x /usr/sbin/915resolution ]; then
2137 if [ -n "$OPTIONS" ]; then
2139 MODE="${OPTIONS%%,*}"
2141 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2143 XRESO="${OPTIONS%%,*}"
2145 if [ -n "$R" -a "$R" != "$OPTIONS" ]; then
2147 YRESO="${OPTIONS%%,*}"
2152 einfo "Running 915resolution with options ${MODE} ${XRESO} ${YRESO}."
2153 [ -n "$MODE" ] && [ -n "$XRESO" ] && [ -n "$YRESO" ] && ( sh -c "$CMD $MODE $XRESO $YRESO" & )
2162 if [ -z "$INSTALLED" ] ; then
2163 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2164 if checkbootparam 'noraid' || checkbootparam 'noswraid' -o \
2165 checkbootparam 'forensic' || checkbootparam 'raid=noautodetect' ; then
2166 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
2168 if ! [ -x /sbin/mdadm ] ; then
2169 eerror "mdadm not available, can not execute it." ; eend 1
2172 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2173 # find out whether we have a valid configuration file already
2174 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
2175 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
2176 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
2177 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
2179 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
2182 if ! checkbootparam 'swraid' ; then
2184 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
2187 einfo "Bootoption swraid found. Searching for software RAID arrays:"
2192 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
2194 *'No arrays found'*)
2195 ewarn "$line" ; eend 0
2198 einfo "$line" ; eend 0
2205 if [ -r /proc/mdstat ] ; then
2207 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
2208 if [ -z "$MDSTAT" ] ; then
2209 ewarn "No active arrays found" ; eend 0
2214 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
2215 einfo "active arrays: $line" ; eend 0
2221 fi # bootoption swraid
2223 fi # is /sbin/mdadm executable?
2224 fi # check for bootoptions
2225 fi # run only in live-cd mode
2229 # {{{ LVM (Logical Volumes)
2231 if [ -z "$INSTALLED" ] ; then
2232 # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption
2233 if checkbootparam 'nolvm' ; then
2234 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
2236 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
2237 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
2238 eerror "LVM not available, can not execute it." ; eend 1
2240 if lvdisplay 2>&1 | grep -v 'No volume groups found' 1>/dev/null 2>&1 ; then
2241 einfo "You seem to have logical volumes (LVM) on your system."
2243 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
2245 if checkbootparam 'lvm' ; then
2246 einfo "Bootoption LVM found. Searching for logical volumes:"
2247 /etc/init.d/lvm2 start ; eend $?
2251 fi # check for lvm binary
2252 fi # check for bootoption nolvm
2253 fi # run only in live-cd mode
2257 # {{{ debnet: setup network based on an existing one found on a partition
2259 if checkbootparam "debnet" ; then
2260 iszsh && setopt shwordsplit
2261 DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
2262 DEVICES="$DEVICES $(ls /dev/mapper/*)"
2265 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
2267 if ! mount | grep '/mnt ' 1>/dev/null 2>&1 ; then
2268 for i in $DEVICES; do
2269 if mount -o ro -t auto "$i" /mnt >/dev/null 2>&1; then
2270 einfo "Scanning on $i"
2271 if [ -f /mnt/etc/network/interfaces ]; then
2272 einfo "/etc/network/interfaces found on ${i}" ; eend 0
2280 if [ -n "$FOUND_DEBNET" ]; then
2281 einfo "Stopping network."
2282 pump -k 1>/dev/null 2>&1
2283 /etc/init.d/networking stop 1>/dev/null 2>&1 ; eend $?
2284 einfo "Copying Debian network configuration from $FOUND_DEBNET to running system."
2285 rm -rf /etc/network/run
2286 cp -a /mnt/etc/network /etc
2287 rm -rf /etc/network/run
2288 mkdir /etc/network/run
2289 umount /mnt ; eend $?
2290 einfo "Starting network."
2291 /etc/init.d/networking start ; eend $?
2293 eerror "/etc/network/interfaces not found." ; eend 1
2297 eerror "Error: /mnt already mounted." ; eend 1
2303 # {{{ check for broken ipw3945 driver which causes problems (especially on hd install)
2305 if grep -q ipw3945 /proc/modules ; then
2306 if ! iwconfig 2>/dev/null| grep -qe 'IEEE 802' -qe 'unassociated' ; then
2307 ewarn "Broken ipw3945 network interface found, reloading module."
2316 # {{{ disable console blanking
2318 if checkbootparam "noblank" ; then
2319 einfo "Bootoption noblank found. Disabling monitor blanking."
2320 setterm -blank 0 ; eend $?
2325 # {{{ tohd= bootoption
2328 if checkbootparam "tohd" ; then
2329 local TARGET="$(getbootparam 'tohd' 2>>$DEBUG)"
2330 if [ -z "$TARGET" ] ; then
2331 eerror "Error: tohd specified without any partition, can not continue." ; eend 1
2332 eerror "Please use something like tohd=/dev/sda9." ; eend 1
2336 if ! [ -b "$TARGET" ] ; then
2337 eerror "Error: $TARGET is not a valid block device, sorry." ; eend 1
2341 if grep -q $TARGET /proc/mounts ; then
2342 eerror "$TARGET already mounted, skipping execution of tohd therefore."
2347 local MOUNTDIR=$(mktemp -d)
2349 if mount -o rw "$TARGET" "$MOUNTDIR" ; then
2350 einfo "Copyring live system to $TARGET - this might take a while"
2351 rsync -a --progress /live/image/live $MOUNTDIR
2355 einfo "Booting with \"grml bootfrom=$TARGET\" should work now." ; eend 0
2357 eerror "Error when trying to mount $TARGET, sorry."; eend 1
2366 # {{{ grml2hd: automatic installation
2369 if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then
2371 if checkbootparam "user" ; then
2373 NEWUSER="$(getbootparam 'user' 2>>$DEBUG)"
2374 sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2377 if checkbootparam "filesystem" ; then
2379 FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)"
2380 sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1
2383 if checkbootparam "partition" ; then
2385 PARTITION="$(getbootparam 'partition' 2>>$DEBUG)"
2386 # notice: the following checks whether the given partition is available, if not the skip
2387 # execution of grml2hd as it might result in data loss...
2388 if [ -r $PARTITION ] ; then
2389 sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2391 ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1
2395 if checkbootparam "mbr" ; then
2397 BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)"
2398 sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1
2401 cat>|/usr/bin/grml2hd_noninteractive<<EOF
2403 GRML2HD_NONINTERACTIVE='yes' grml2hd
2406 chmod 755 /usr/bin/grml2hd_noninteractive
2407 einfo "Bootoption grml2hd found. Running automatic installation via grml2hd using /etc/grml2hd/config." && eend 0
2408 if [ -z "$GRML2HD_FAIL" ] ; then
2409 screen /usr/bin/grml2hd_noninteractive ; einfo "Invoking a shell, just exit to continue booting..." ; /bin/zsh
2411 ewarn "There was an error adjusting /etc/grml2hd/config. Skipping execution of grml2hd for security reasons." ; eend 1
2414 fi # if stringinstring "BOOT_IMAGE=grml2hd ...
2418 # {{{ debootstrap: automatic installation
2419 config_debootstrap(){
2421 if stringinstring "BOOT_IMAGE=debian2hd " "$CMDLINE" ; then
2423 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
2425 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
2427 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
2432 if checkbootparam "target" ; then
2434 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
2435 # notice: the following checks whether the given partition is available, if not the skip
2436 # execution of grml-debootstrap as it might result in data loss...
2437 if ! [ -r "$TARGET" ] ; then
2438 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
2442 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
2447 if checkbootparam "grub" ; then
2449 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
2452 if checkbootparam "groot" ; then
2454 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
2457 if checkbootparam "release" ; then
2459 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
2462 if checkbootparam "mirror" ; then
2464 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
2467 if checkbootparam "boot_append" ; then
2469 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
2472 if checkbootparam "password" ; then
2474 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
2477 # now check which options are available
2478 if [ -n "TARGET" ] ; then
2479 TARGETCMD="--target $TARGET"
2483 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
2487 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
2488 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
2489 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
2490 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
2491 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
2492 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
2494 # and finally write script and execute it
2495 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
2497 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
2500 chmod 750 /usr/bin/grml-debootstrap_noninteractive
2502 screen /usr/bin/grml-debootstrap_noninteractive
2503 einfo "Invoking a shell, just exit to continue booting..."
2506 fi # stringinstring "BOOT_IMAGE=debian2hd
2510 # {{{ Support customization
2512 if checkbootparam "distri"; then
2513 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2514 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2515 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2516 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2517 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2518 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2524 ### {{{ backwards compatible stuff
2525 config_environment(){
2526 ewarn "config_environment is deprecated. Please set CONFIG_ENVIRONMENT in /etc/grml/autoconfig to 'no'." ; eend 0
2529 ewarn "config_keyboard is deprecated. Please set CONFIG_KEYBOARD in /etc/grml/autoconfig to 'no'." ; eend 0
2533 ## END OF FILE #################################################################
2534 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3