2 # Filename: autoconfig.functions
3 # Purpose: basic system configuration and hardware setup for grml system
4 # Authors: grml-team (grml.org), (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"
16 # old linuxrc version:
17 [ -d /cdrom ] && export LIVECD_PATH=/cdrom
18 # initramfs layout until around December 2012:
19 [ -d /live/image ] && export LIVECD_PATH=/live/image
20 # initramfs layout since around December 2012:
21 [ -d /lib/live/mount/medium ] && export LIVECD_PATH=/lib/live/mount/medium
23 # Ignore these signals in non-interactive mode: INT, TERM, SEGV
24 [ -z "$PS1" ] && trap "" 2 3 11
28 if [ -n "$ZSH_VERSION" ] ; then
34 # avoid 'no matches found: ...'
35 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
38 # {{{ Read in boot parameters
39 if [ -z "$CMDLINE" ]; then
40 # if CMDLINE was set from the outside, we're debugging.
41 # otherwise, take CMDLINE from Kernel and config files.
42 CMDLINE="$(cat /proc/cmdline)"
43 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
44 modprobe 9p 2>/dev/null || true
45 if grep -q 9p /proc/filesystems ; then
47 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
48 MOUNTDIR="$(mktemp -d)"
49 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
50 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
58 ### {{{ Utility Functions
60 # Get a bootoption's parameter: read boot command line and either
61 # echo last parameter's argument or return false.
69 result="${line##*[$ws]$1=}"
70 result="${result%%[$ws]*}"
78 # Check boot commandline for specified option
80 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
86 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
93 # Check if currently using a framebuffer
95 [ -e /dev/fb0 ] && return 0 || return 1
98 # Check wheter a configuration variable (like $CONFIG_TOHD) is
102 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
103 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
104 *) return 1 ;; # default
108 # Are we using grml-small?
110 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
113 # if no password is set return a random password
115 [ -n "$PASSWD" ] && return 0
117 if [ -x /usr/bin/apg ] ; then
118 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
119 elif [ -x /usr/bin/gpw ] ; then
121 elif [ -x /usr/bin/pwgen ] ; then
122 PASSWD="$(pwgen -1 8)"
123 elif [ -x /usr/bin/hexdump ] ; then
124 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
125 elif [ -n "$RANDOM" ] ; then
126 PASSWD="grml${RANDOM}"
129 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
137 # {{{ filesystems (proc, pts, sys) and fixes
139 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
143 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
147 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
151 # {{{ Check if we are running in live mode or from HD
153 [ -e /etc/grml_cd ] || INSTALLED="yes"
156 # {{{ provide information about virtual environments
157 VIRTUAL=false # assume physical system by default
162 if vmware-detect &>/dev/null; then
163 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
164 elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
165 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
166 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
167 elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
168 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
169 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
173 # {{{ source lsb-functions , color handling
174 if checkbootparam 'nocolor'; then
176 . /etc/grml/lsb-functions
177 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
179 . /etc/grml/lsb-functions
186 checkbootparam 'debug' && BOOTDEBUG="yes"
187 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
190 if [ -n "$BOOTDEBUG" ]; then
191 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
192 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
193 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
194 einfo "Just exit the shell to continue boot process..."
198 if [ -r /etc/grml/screenrc ] ; then
199 einfo "Starting GNU screen to be able to use a full featured shell environment."
200 einfo "Just exit the shells (and therefore screen) to continue boot process..."
201 /bin/zsh -c "screen -c /etc/grml/screenrc"
203 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
204 einfo "Just exit the shell to continue boot process..."
216 if checkbootparam 'log' || checkbootparam 'debug' ; then
217 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
219 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
221 einfo "Starting bootlogd." # known to be *very* unreliable :(
222 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
230 ### {{{ language configuration / localization
233 einfo "Activating language settings:"
236 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
237 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
239 # check for bootoption which overrides config from /etc/grml/autoconfig
240 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
241 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
243 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
244 if [ -z "$INSTALLED" ] ; then
245 [ -n "$LANGUAGE" ] || LANGUAGE='en'
248 if [ -x /usr/sbin/grml-setlang ] ; then
249 # if bootoption lang is used update /etc/default/locale accordingly
250 if [ -n "$BOOT_LANGUAGE" ] ; then
251 /usr/sbin/grml-setlang "$LANGUAGE"
252 # otherwise default to lang=en
254 /usr/sbin/grml-setlang "en"
259 if [ -z "$CONSOLEFONT" ] ; then
260 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
261 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
262 CONSOLEFONT='Uni3-Terminus16'
264 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
267 CONSOLEFONT='Lat15-Terminus16'
272 # export it now, so error messages get translated, too
273 [ -r /etc/default/locale ] && . /etc/default/locale
276 # configure keyboard layout, read in already set values first:
277 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
279 # now allow keyboard override by boot commandline for later use:
280 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
281 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
282 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
283 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
284 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
286 # modify /etc/sysconfig/keyboard only in live-cd mode:
287 if [ -z "$INSTALLED" ] ; then
289 local LANGUAGE="$BOOT_LANGUAGE"
290 . /etc/grml/language-functions
291 # allow setting xkeyboard explicitly different than console keyboard
292 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
293 if [ -n "$KXKEYBOARD" ]; then
294 XKEYBOARD="$KXKEYBOARD"
295 KDEKEYBOARD="$KXKEYBOARD"
296 elif [ -n "$KKEYBOARD" ]; then
297 XKEYBOARD="$KKEYBOARD"
298 KDEKEYBOARD="$KKEYBOARD"
301 # duplicate of previous code to make sure /etc/grml/language-functions
302 # does not overwrite our values....
303 # now allow keyboard override by boot commandline for later use:
304 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
305 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
306 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
307 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
308 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
310 # write keyboard related variables to file for later use
311 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
312 if ! [ -e /etc/sysconfig/keyboard ] ; then
313 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
314 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
315 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
316 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
320 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
322 # activate unicode console if running within utf8 environment
323 if [ -r /etc/default/locale ] ; then
324 if grep -q "LANG=.*UTF" /etc/default/locale ; then
325 einfo "Setting up unicode environment."
326 unicode_start >>$DEBUG 2>&1 ; eend $?
330 # Set default keyboard before interactive setup
331 if [ -n "$KEYTABLE" ] ; then
332 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
333 loadkeys -q $KEYTABLE &
337 # we have to set up all consoles, therefore loop it over all ttys:
338 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
339 if [ -n "$NUM_CONSOLES" ] ; then
340 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
341 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
343 CUR_CONSOLE=$(fgconsole 2>/dev/null)
345 if [ -x "$(which setfont)" ] ; then
347 elif [ -x "$(which consolechars)" ] ; then
348 use_consolechars=true
350 eerror "Neither setfont nor consolechars tool present, can not set font."
355 if [ -n "$CHARMAP" ] ; then
356 einfo "Setting font to ${CHARMAP}"
358 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
359 if $use_setfont ; then
360 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
361 elif $use_consolechars ; then
362 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
365 if [ -n "$CUR_CONSOLE" ] ; then
366 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
371 if checkbootparam 'noconsolefont' ; then
372 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
374 if [ -n "$CONSOLEFONT" ] ; then
375 einfo "Setting font to ${CONSOLEFONT}"
377 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
378 if $use_setfont ; then
379 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
380 elif $use_consolechars ; then
381 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
384 if [ -n "$CUR_CONSOLE" ] ; then
385 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
397 if ! checkbootparam 'hostname' ; then
401 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
402 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
403 einfo "Generating random hostname as no hostname was specified."
404 HOSTNAME="$(/usr/bin/random-hostname)"
408 einfo "Setting hostname to $HOSTNAME as requested."
409 grml-hostname $HOSTNAME >>$DEBUG
414 # fstabuser (needed when running from harddisk with username != grml {{{
416 # force load of build-in and local config
417 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
418 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
420 # 1st. try configured fstab user
421 if [ -n "$CONFIG_FSTAB_USER" ] ; then
422 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
425 # 2nd. use standard user id
426 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
428 # 3rd. use standard user name
429 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
431 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
432 [ -n "$fstabuser" ] || fstabuser='root'
436 # local_user (needed when running with username != grml {{{
439 # force load of build-in and local config
440 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
441 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
443 # 1st. try id of primary user
444 localuser=$(getent passwd 1000 | cut -d: -f1)
446 # 2nd. use name standard user
447 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
451 # {{{ Set clock (Local time is more often used than GMT, so it is default)
453 # don't touch the files if running from harddisk:
454 if [ -z "$INSTALLED" ]; then
455 # The default hardware clock timezone is stated as representing local time.
457 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
458 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
459 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
460 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
461 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
462 # hwclock uses the TZ variable
463 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
464 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
465 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
466 ewarn "Warning: unknown timezone $KTZ" ; eend 1
468 ewarn "Falling back to timezone $KTZ" ; eend 0
471 if ! [ -r /dev/rtc ] ; then
472 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
475 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
476 if [ -n "$ERROR" ] ; then
478 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
479 if [ -n "$ERROR" ] ; then
480 eerror "Problem running hwclock: $ERROR" ; eend 1
489 # {{{ print kernel info
491 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
492 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
494 einfo "Running Linux Kernel $KERNEL" ; eend 0
497 if [ -r /proc/cpuinfo ] ; then
498 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
500 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
505 if [ -d /proc/xen ] ; then
507 einfo 'Running kernel featuring support for Xen detected' ; eend 0
515 # don't touch the files if running from harddisk:
516 if [ -z "$INSTALLED" ]; then
517 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
518 if [ -n "$KTZ" ] ; then
519 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
521 ewarn "Warning: unknown timezone $KTZ"; eend 0
523 einfo "Setting timezone."
525 area=$(echo $KTZ | cut -d '/' -f1)
526 zone=$(echo $KTZ | cut -d '/' -f2)
527 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
528 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
530 echo $KTZ > /etc/timezone
532 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
539 # activate serial console {{{
541 if checkbootparam 'console'; then
546 einfo "Bootoption for serial console detected:"
550 line="${line#*[$ws]}"
552 while [ -n "$line" ]; do
556 local device="${this%%,*}"
557 local device="${device##*=}"
558 if echo $serial | grep -q ttyS ; then
559 local option="${serial##*,}"
560 # default (works for kvm & CO):
561 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
562 # ... unless overriden by command line:
564 115200*) speed=115200 ;;
565 57600*) speed=57600 ;;
566 38400*) speed=38400 ;;
567 19200*) speed=19200 ;;
574 einfo "Activating console login on device ${device} with speed ${speed}."
575 local number="${device#ttyS}"
576 sed -i "/^T$number:/d;/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/share/grml-scripts/run-welcome $speed vt100 || sleep 30\"" /etc/inittab
583 this="${line%%[$ws]*}"
584 line="${line#*[$ws]}"
587 if [ -n "$telinitq" ]; then
597 if checkbootparam 'testcd' ; then
598 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
602 local FOUND_FILE=false
603 local logfile='/tmp/md5sum.log'
607 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
608 einfo "Checking files against $md5, this may take a while..."
613 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
614 if [ $pipestatus[1] -eq 0 ] ; then
620 if ! $FOUND_FILE ; then
621 eerror 'Error: Could not find md5sum file' ; eend 1
626 einfo "Everything looks OK" ; eend 0
628 eerror 'Checksum failed for theses files:' ; eend 1
629 egrep -v '(^md5sum:|OK$)' "${logfile}"
630 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
631 einfon "Hit return to continue, or press the power button to shut down system."
640 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
642 if checkbootparam 'blacklist' ; then
643 if [ -z "$INSTALLED" ]; then
644 einfo "Bootoption blacklist found."
645 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
646 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
647 if [ -n "$BLACK" ] ; then
648 for module in $(echo ${BLACK//,/ }) ; do
649 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
650 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
651 echo "blacklist $module" >> "$BLACKLIST_FILE"
652 echo "alias $module off" >> "$BLACKLIST_FILE"
653 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
656 eerror "No given module for blacklist found. Blacklisting will not work therefore."
659 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
661 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
670 if checkbootparam 'noacpi'; then
671 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
672 elif checkbootparam 'nogrmlacpi' ; then
673 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
674 elif [ ! -d /proc/acpi ] ; then
675 ewarn "ACPI: Kernel support not present." ; eend 0
677 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
680 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
682 basename="${basename%%.*}"
683 case "$basename" in *_acpi)
684 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
686 modprobe $basename >>$DEBUG 2>&1 && found="yes"
687 local BASE="$BASE $basename"
689 if [ -n "$found" ] ; then
690 einfo "$BASE" ; eend 0
692 ewarn "(none)" ; eend 1
694 if ! pgrep acpid >/dev/null ; then
695 einfo "Starting acpi daemon."
696 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
698 ewarn "acpi daemon already running."
708 if checkbootparam 'brltty' ; then
709 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
714 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
717 NOSWAP="yes" # we do not use swap by default!
718 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
720 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
723 # Scan for swap, config, homedir - but only in live-mode
724 if [ -z "$INSTALLED" ] ; then
725 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
728 HOMEDIR="$(getbootparam 'home')"
729 if [ -n "$partitions" ]; then
730 while read p m f relax; do
731 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
732 partoptions="users,exec"
734 # it's a swap partition?
737 if [ -n "$NOSWAP" ]; then
738 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
741 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
742 S1SUSP|S2SUSP|pmdisk|[zZ]*)
743 if [ -n "$ANYSWAP" ] ; then
744 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
745 swapon $p 2>>$DEBUG ; eend $?
747 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
751 if [[ "$p" == LABEL* ]] ; then
752 p=$(blkid -t $p | awk -F: '{print $1}')
754 if grep -q $p /proc/swaps ; then
755 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
757 if [ -b "$p" ] ; then
758 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
759 swapon $p 2>>$DEBUG ; eend $?
761 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
770 esac # it's a swap partition?
775 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
776 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
778 # *) NONEFOUND='1'; continue ;;
782 if [ -z "$NOSWAP" ] ; then
783 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
784 # Activate swapfile, if exists
785 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
787 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
788 mount -o remount,rw $m && MOUNTED=1
789 if swapon "$SWAPFILE" 2>>$DEBUG ; then
791 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
793 fnew="$SWAPFILE swap swap defaults 0 0"
794 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
795 GRML_SWP="$GRML_SWP $SWAPFILE"
798 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
801 # use a image as home
802 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
803 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
804 if [ -n "$HOMEDIR" ]; then
805 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
809 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
811 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
816 # Umount, if not in use
817 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
829 if checkbootparam 'nocpu'; then
830 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
834 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
836 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)
837 echo $CPU | sed 's/ \{1,\}/ /g'
840 einfo "Found 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
843 # no cpufreq setup inside VirtualBox
844 if $VIRTUALBOX ; then
845 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
849 if [ -x /etc/init.d/loadcpufreq ] ; then
850 einfo "Trying to set up cpu frequency scaling:"
853 LOADCPUFREQ=$(mktemp)
854 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
855 if grep -q FATAL "$LOADCPUFREQ" ; then
861 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
862 eerror "$line" ; eend $RC
866 elif grep -q done "$LOADCPUFREQ" ; then
867 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
868 if [ -n "$MODULE" -a "$MODULE" != none ]; then
869 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
872 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
878 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
879 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
880 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
881 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
883 einfo "Setting ondemand governor"
885 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
886 echo ondemand > $file || RC=1
898 # {{{ autostart of ssh
900 if checkbootparam 'ssh' ; then
902 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
905 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
906 [ -z "$localuser" ] && eend 1
909 if [ -z "$PASSWD" ] ; then
910 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
914 if [ -n "$PASSWD" ] ; then
916 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
920 echo "$localuser:$PASSWD" | chpasswd $chpass_options
921 echo "root:$PASSWD" | chpasswd $chpass_options
924 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
928 einfo "Starting secure shell server in background for root and user $localuser"
929 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
930 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
938 # {{{ display hostkeys of SSH server
939 config_display_ssh_fingerprints() {
940 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
941 return 0 # no SSH host keys present
944 einfo "SSH key fingerprints:"
945 for file in /etc/ssh/ssh_host_*_key ; do
947 ssh-keygen -l -f $file
953 # {{{ autostart of x11vnc
955 if checkbootparam 'vnc' ; then
958 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
959 einfo "Bootoption vnc found, trying to set password for user $localuser."
961 if [ -z "$VNC_PASSWD" ] ; then
962 if [ -x /usr/bin/apg ] ; then
963 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
964 elif [ -x /usr/bin/gpw ] ; then
965 VNC_PASSWD="$(gpw 1)"
966 elif [ -x /usr/bin/pwgen ] ; then
967 VNC_PASSWD="$(pwgen -1 8)"
968 elif [ -x /usr/bin/hexdump ] ; then
969 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
970 elif [ -n "$RANDOM" ] ; then
971 VNC_PASSWD="${localuser}${RANDOM}"
974 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
978 if [ -n "$VNC_PASSWD" ] ; then
979 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
984 # finally check if we have a password we can use:
985 if [ -n "$VNC_PASSWD" ] ; then
987 VNCDIR="/home/${localuser}/.vnc"
988 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
990 if [ ! -x /usr/bin/x11vnc ] ; then
991 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
994 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
995 /bin/chown -R "$localuser": "$VNCDIR"
998 if checkbootparam 'vnc_connect' ; then
1000 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1001 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1002 #store the options in a file
1003 VNCDIR="/home/${localuser}/.vnc"
1004 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1005 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1011 # {{{ set password for root and default user
1013 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1015 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1018 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1019 [ -z "$localuser" ] && eend 1
1022 if [ -z "$PASSWD" ] ; then
1023 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1027 if [ -n "$PASSWD" ] ; then
1029 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1033 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1034 echo "root:$PASSWD" | chpasswd $chpass_options
1037 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1043 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1045 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1047 if [ -z "$PASSWD" ] ; then
1048 eerror "No hashed password found, can not set password."
1054 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1055 [ -z "$localuser" ] && eend 1
1057 if [ -n "$PASSWD" ] ; then
1060 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1061 echo "root:$PASSWD" | chpasswd $chpass_options
1064 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1074 if ! [ -x /usr/bin/amixer ] ; then
1075 eerror "amixer binary not available. Can not set sound volumes therefore."
1078 if ! [ -r /proc/asound/cards ] ; then
1079 ewarn "No soundcard present, skipping mixer settings therefore."
1084 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1085 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1088 if checkbootparam 'vol' ; then
1089 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1090 if [ -z "$VOL" ] ; then
1091 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1099 if checkbootparam 'nosound' ; then
1100 einfo "Muting sound devices on request."
1101 ERROR=$(amixer -q set Master mute)
1103 if [ -n "$ERROR" ] ; then
1105 eerror "Problem muting sound devices: $ERROR"
1109 elif [ -z "$INSTALLED" ] ; then
1110 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1112 if checkbootparam 'micvol' ; then
1113 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1114 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1119 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1123 for CONTROL in ${=CONTROLS} ; do
1124 # such devices can not be controlled with amixer ... unmute
1125 [[ "$CONTROL" == *Console* ]] && continue
1127 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1128 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1129 amixer -c $card -q set "${CONTROL}" unmute
1131 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1132 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1136 if [ ${MICVOL} -ne 0 ] ; then
1137 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1138 amixer -c $card -q set "${CONTROL}" unmute
1140 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1141 amixer -c $card -q set "${CONTROL}" $MICVOL%
1147 fi # checkbootparam 'nosound'
1154 # {{{ syslog service
1156 if checkbootparam 'nosyslog'; then
1157 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1160 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1161 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1162 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1163 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1164 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1166 if [ -z "$SYSLOGD" ] ; then
1167 eerror "No syslog daemon found." ; eend 1
1169 einfo "Starting $SYSLOGD in background."
1170 /etc/init.d/$SYSLOGD start >>$DEBUG &
1179 if checkbootparam 'nogpm'; then
1180 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1182 if ! [ -r /dev/input/mice ] ; then
1183 eerror "No mouse found - not starting GPM." ; eend 1
1185 einfo "Starting gpm in background."
1186 /etc/init.d/gpm start >>$DEBUG &
1187 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1196 if checkbootparam 'services' ; then
1197 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1198 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1199 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1200 for service in $(echo -e $SERVICELIST) ; do
1201 # support running (custom) init scripts in non-blocking mode
1202 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1203 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1204 einfo "Starting service ${service}."
1205 /etc/init.d/${service} start >>$DEBUG
1207 einfo "Starting service ${service} in background."
1208 /etc/init.d/${service} start >>$DEBUG &
1218 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1219 SOURCE=$(eval echo "$1")
1222 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1223 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1225 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1227 if checkbootparam 'getfile.retries' ; then
1228 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1233 while ! getconfig && [[ "$counter" != 0 ]] ; do
1234 echo -n "Sleeping for 1 second and trying to get config again... "
1235 counter=$(( counter-1 ))
1236 echo "$counter tries left" ; sleep 1
1238 if [ -s "$TARGET" ] ; then
1239 einfo "Downloading was successfull." ; eend 0
1240 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1241 md5sum ${TARGET} ; eend 0
1244 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1252 if checkbootparam 'netconfig' ; then
1253 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1254 CONFIGFILE='/tmp/netconfig.grml'
1256 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1257 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1264 # {{{ remote scripts
1265 config_netscript() {
1266 if checkbootparam 'netscript' ; then
1267 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1268 SCRIPTFILE='/tmp/netscript.grml'
1270 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1271 chmod +x ${SCRIPTFILE}
1272 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1281 if ! checkbootparam 'nostats' ; then
1282 BASE_URL="http://stats.grml.org/report/"
1285 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1287 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1288 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1289 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1290 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1292 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1294 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1295 [ -z "$BOOT" ] && BOOT="local"
1297 ADDITIONAL_PARAMS=""
1298 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1299 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1301 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1303 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1308 # {{{ start X window system via grml-x
1310 # make sure we start X only if startx is used *before* a nostartx option
1311 # so it's possible to disable automatic X startup using nostart
1312 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1313 if [ -x "$(which X)" ] ; then
1314 if [ -z "$INSTALLED" ] ; then
1315 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1316 if [ -z "$WINDOWMANAGER" ] ; then
1317 einfo "No window manager specified. Using default one." && eend 0
1319 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1321 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1323 cat>|/etc/init.d/xstartup<<EOF
1325 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1327 chmod 755 /etc/init.d/xstartup
1329 # adjust inittab for xstartup
1330 if grep -q '^6:' /etc/inittab ; then
1331 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
1332 else # just append tty6 to inittab if no definition is present:
1333 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1336 /sbin/telinit q ; eend $?
1338 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1339 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1341 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1345 eerror "We are not running in live mode - startx will not work, skipping it."
1346 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1349 eerror "/usr/bin/X is not present on this grml flavour."
1350 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1356 # {{{ configuration framework
1358 if checkbootparam 'extract' ; then
1359 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1360 EXTRACTOPTIONS="-- -x $EXTRACT"
1364 config_finddcsdir() {
1365 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1366 # on the command line, nothing is changed and the dcs files are
1367 # searched within the .iso, $dcs-dir is set to the root directory
1369 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1370 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1371 # set, $dcs-dir is set to the root directory within the .iso.
1372 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1373 # foo, even if a GRMLCFG partition is present.
1376 # autoconfig, see issue673
1377 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1378 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1379 if checkbootparam 'noautoconfig' ; then
1380 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1381 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1383 if [ -z "$INSTALLED" ] ; then
1384 if checkbootparam 'myconfig' ; then
1385 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1386 if [ -z "$DCSDEVICE" ]; then
1387 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1388 fi # [ -z "$DCSDEVICE" ]
1389 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1390 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1392 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1394 modprobe 9p 2>/dev/null || true
1395 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1396 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1397 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1398 DCSDEVICE="$GRMLCFG"
1399 MOUNTOPTIONS="ro,trans=virtio"
1404 if [ -n "$DCSDEVICE" ]; then
1405 DCSMP="/mnt/grmlcfg"
1410 # if not specified/present then assume default:
1411 if [ -z "$DCSDEVICE" ]; then
1412 DCSDIR="${LIVECD_PATH}"
1415 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1416 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1417 if [ -n "$DCSDIR" ]; then
1418 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1420 [ -d $DCSMP ] || mkdir $DCSMP
1421 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1422 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1423 if [[ $RC == 0 ]]; then
1424 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1426 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1435 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1436 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1437 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1438 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1444 if checkbootparam 'partconf' ; then
1445 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1446 if [ -n "$MOUNTDEVICE" ]; then
1447 [ -d /mnt/grml ] || mkdir /mnt/grml
1448 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1449 if [[ $RC == 0 ]]; then
1450 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1451 einfo "Copying files from $MOUNTDEVICE over grml system."
1452 for file in `cat /etc/grml/partconf` ; do
1453 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1454 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1457 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1458 fi # mount $MOUNTDEVICE
1459 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1461 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1462 fi # [ -n "$MOUNTDEVICE" ]
1467 # {{{ /cdrom/.*-options
1469 if checkbootparam 'debs' ; then
1470 iszsh && setopt localoptions shwordsplit
1471 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1472 if [ -z "$DEBS" ] ; then
1475 if ! echo $DEBS | grep -q '/'; then
1476 # backwards compatibility: if no path is given get debs from debs/
1479 einfo "Trying to install Debian package(s) ${DEBS}"
1480 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1481 dpkg -i $DEBS ; eend $?
1486 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1487 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1488 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1489 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1491 if ! echo $SCRIPTS | grep -q '/'; then
1492 # backwards compatibility: if no path is given get scripts from scripts/
1493 SCRIPTS="scripts/$SCRIPTS"
1495 if [ -n "$SCRIPTS" ]; then
1496 SCRIPTS="${DCSDIR}/$SCRIPTS"
1497 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1498 einfo "Trying to execute ${SCRIPTS}"
1501 elif [ -d "$SCRIPTS" ]; then
1502 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1503 run-parts --regex '.*' $SCRIPTS
1506 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1515 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1516 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1517 if [ -z "$CONFIG" ]; then
1518 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1520 if [ -n "$CONFIG" ]; then
1521 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1522 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1524 cp -a ${DCSDIR}/${CONFIG}/* /
1525 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1526 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1529 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1531 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1538 # {{{ confing_umount_dcsdir
1539 config_umount_dcsdir(){
1540 # umount $DCSMP if it was mounted by finddcsdir
1541 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1547 if checkbootparam 'mypath' ; then
1548 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1549 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1550 touch /etc/grml/my_path
1551 chmod 644 /etc/grml/my_path
1552 # make sure the directories exist:
1554 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1555 if ! [ -d "$i" ] ; then
1556 einfo "Creating directory $i"
1557 mkdir -p "$i" ; eend $?
1560 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1568 [ -n "$INSTALLED" ] && return 0
1570 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1571 checkbootparam 'raid=noautodetect' ; then
1572 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1574 [ -e /proc/mdstat ] || modprobe md_mod
1575 if ! [ -x /sbin/mdadm ] ; then
1576 eerror "mdadm not available, can not execute it." ; eend 1
1579 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1580 # find out whether we have a valid configuration file already
1581 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1582 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1583 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1584 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1586 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1589 if ! checkbootparam 'swraid' ; then
1591 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1594 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1599 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1601 *'No arrays found'*)
1602 ewarn "$line" ; eend 0
1605 einfo "$line" ; eend 0
1612 if [ -r /proc/mdstat ] ; then
1614 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1615 if [ -z "$MDSTAT" ] ; then
1616 ewarn "No active arrays found" ; eend 0
1621 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1622 einfo "active arrays: $line" ; eend 0
1628 fi # bootoption swraid
1630 fi # is /sbin/mdadm executable?
1631 fi # check for bootoptions
1637 [ -n "$INSTALLED" ] && return 0
1639 if checkbootparam 'nodmraid' ; then
1640 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1644 if ! [ -x /sbin/dmraid ] ; then
1645 eerror "dmraid not available, can not execute it." ; eend 1
1650 # usage: dmraid_wrapper <dmraid_option>
1651 [ -n "$1" ] || return 1
1658 for line in $(dmraid $1 ; echo errcode:$?); do
1660 *'no block devices found'*)
1661 einfo "No block devices found" ; eend 0
1665 einfo "No active dmraid devices found" ; eend 0
1684 if checkbootparam 'dmraid' ; then
1685 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1686 if [ "$ACTION" = "off" ] ; then
1687 # Deactivates all active software RAID sets:
1688 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1691 # Activate all software RAID sets discovered:
1692 einfo "Activating present dmraid sets (as requested via dmraid):"
1699 # by default (no special bootoptions) discover all software RAID devices:
1700 einfo "Searching for any present dmraid sets:"
1705 # {{{ LVM (Logical Volumes)
1707 [ -n "$INSTALLED" ] && return 0
1709 if checkbootparam 'nolvm' ; then
1710 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1712 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
1713 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
1714 eerror "LVM not available, can not execute it." ; eend 1
1716 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1717 einfo "You seem to have logical volumes (LVM) on your system."
1719 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1721 if checkbootparam 'lvm' ; then
1722 einfo "Bootoption LVM found. Searching for logical volumes:"
1723 /etc/init.d/lvm2 start ; eend $?
1727 fi # check for lvm binary
1728 fi # check for bootoption nolvm
1732 # {{{ debnet: setup network based on an existing one found on a partition
1734 if checkbootparam 'debnet' ; then
1735 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1741 # {{{ disable console blanking
1743 if checkbootparam 'noblank' ; then
1744 einfo "Bootoption noblank found. Disabling monitor blanking."
1745 setterm -blank 0 ; eend $?
1750 # {{{ debootstrap: automatic installation
1751 config_debootstrap(){
1753 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1755 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1757 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1759 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1764 if checkbootparam 'target' ; then
1766 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1767 # notice: the following checks whether the given partition is available, if not the skip
1768 # execution of grml-debootstrap as it might result in data loss...
1769 if ! [ -r "$TARGET" ] ; then
1770 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1774 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1779 if checkbootparam 'grub' ; then
1781 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1784 if checkbootparam 'groot' ; then
1786 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1789 if checkbootparam 'release' ; then
1791 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1794 if checkbootparam 'mirror' ; then
1796 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1799 if checkbootparam 'boot_append' ; then
1801 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1804 if checkbootparam 'password' ; then
1806 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1809 # now check which options are available
1810 if [ -n "TARGET" ] ; then
1811 TARGETCMD="--target $TARGET"
1815 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1819 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1820 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1821 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1822 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1823 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1824 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1826 # and finally write script and execute it
1827 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1829 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1832 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1834 screen /usr/bin/grml-debootstrap_noninteractive
1835 einfo "Invoking a shell, just exit to continue booting..."
1838 fi # checkbootparam "BOOT_IMAGE=debian2hd
1842 # {{{ virtualbox shared folders
1843 config_virtualbox_shared_folders() {
1844 if $VIRTUALBOX ; then
1845 einfo "VirtualBox detected, trying to set up Shared Folders."
1846 if ! modinfo vboxsf &>/dev/null ; then
1847 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1849 elif ! [ -x /usr/sbin/VBoxService ] ; then
1850 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1855 einfo "Loading vboxsf driver."
1856 lsmod | grep -q vboxsf || modprobe vboxsf
1859 einfo "Adjusting /dev/vboxguest."
1860 chown root:vboxsf /dev/vboxguest
1861 chmod 660 /dev/vboxguest
1866 einfo "Adding $fstabuser to group vboxsf."
1867 adduser grml vboxsf &>/dev/null
1870 einfo "Starting VBoxService."
1871 VBoxService >/dev/null
1874 local vbautomation='automation'
1875 if checkbootparam 'vbautomation'; then
1876 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1879 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1880 ewarn "No automount shared folder '$vbautomation' available"
1883 einfo "Found automount shared folder '$vbautomation'"
1886 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1887 [ -n "$distri" ] || distri='grml'
1889 local vbox_auto_sf="/media/sf_${vbautomation}"
1891 sleep 1 # ugly but necessary
1895 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1896 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1898 counter=$(( counter-1 ))
1903 if ! [ -d "${vbox_auto_sf}" ] ; then
1904 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1907 einfo "Found shared folders automation directory $vbox_auto_sf"
1911 if checkbootparam 'novbautomation' ; then
1912 einfo "Bootoption novbautomation found. Disabling automation script execution."
1915 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1916 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1919 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1920 "${vbox_auto_sf}/${distri}"
1934 # {{{ Support customization
1936 if checkbootparam 'distri'; then
1937 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1938 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1939 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1940 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1941 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1942 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1948 ## END OF FILE #################################################################
1949 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2