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