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.
458 if [ -f /etc/default/rcS ] ; then
459 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
460 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
461 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
462 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
463 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
464 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
465 elif [ -f /etc/adjtime ] ; then
466 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
467 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
468 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
469 grep -q "^UTC$" /etc/adjtime && UTC="-u"
472 # hwclock uses the TZ variable
473 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
474 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
475 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
476 ewarn "Warning: unknown timezone $KTZ" ; eend 1
478 ewarn "Falling back to timezone $KTZ" ; eend 0
481 if ! [ -r /dev/rtc ] ; then
482 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
485 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
486 if [ -n "$ERROR" ] ; then
488 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
489 if [ -n "$ERROR" ] ; then
490 eerror "Problem running hwclock: $ERROR" ; eend 1
499 # {{{ print kernel info
501 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
502 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
504 einfo "Running Linux Kernel $KERNEL" ; eend 0
507 if [ -r /proc/cpuinfo ] ; then
508 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
510 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
515 if [ -d /proc/xen ] ; then
517 einfo 'Running kernel featuring support for Xen detected' ; eend 0
525 # don't touch the files if running from harddisk:
526 if [ -z "$INSTALLED" ]; then
527 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
528 if [ -n "$KTZ" ] ; then
529 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
531 ewarn "Warning: unknown timezone $KTZ"; eend 0
533 einfo "Setting timezone."
535 area=$(echo $KTZ | cut -d '/' -f1)
536 zone=$(echo $KTZ | cut -d '/' -f2)
537 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
538 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
540 echo $KTZ > /etc/timezone
542 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
549 # activate serial console {{{
551 if checkbootparam 'console'; then
556 einfo "Bootoption for serial console detected:"
560 line="${line#*[$ws]}"
562 while [ -n "$line" ]; do
566 local device="${this%%,*}"
567 local device="${device##*=}"
568 if echo $serial | grep -q ttyS ; then
569 local option="${serial##*,}"
570 # default (works for kvm & CO):
571 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
572 # ... unless overriden by command line:
574 115200*) speed=115200 ;;
575 57600*) speed=57600 ;;
576 38400*) speed=38400 ;;
577 19200*) speed=19200 ;;
584 einfo "Activating console login on device ${device} with speed ${speed}."
585 local number="${device#ttyS}"
586 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
593 this="${line%%[$ws]*}"
594 line="${line#*[$ws]}"
597 if [ -n "$telinitq" ]; then
607 if checkbootparam 'testcd' ; then
608 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
612 local FOUND_FILE=false
613 local logfile='/tmp/md5sum.log'
617 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
618 einfo "Checking files against $md5, this may take a while..."
623 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
624 if [ $pipestatus[1] -eq 0 ] ; then
630 if ! $FOUND_FILE ; then
631 eerror 'Error: Could not find md5sum file' ; eend 1
636 einfo "Everything looks OK" ; eend 0
638 eerror 'Checksum failed for theses files:' ; eend 1
639 egrep -v '(^md5sum:|OK$)' "${logfile}"
640 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
641 einfon "Hit return to continue, or press the power button to shut down system."
650 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
652 if checkbootparam 'blacklist' ; then
653 if [ -z "$INSTALLED" ]; then
654 einfo "Bootoption blacklist found."
655 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
656 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
657 if [ -n "$BLACK" ] ; then
658 for module in $(echo ${BLACK//,/ }) ; do
659 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
660 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
661 echo "blacklist $module" >> "$BLACKLIST_FILE"
662 echo "alias $module off" >> "$BLACKLIST_FILE"
663 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
666 eerror "No given module for blacklist found. Blacklisting will not work therefore."
669 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
671 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
680 if checkbootparam 'noacpi'; then
681 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
682 elif checkbootparam 'nogrmlacpi' ; then
683 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
684 elif [ ! -d /proc/acpi ] ; then
685 ewarn "ACPI: Kernel support not present." ; eend 0
687 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
690 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
692 basename="${basename%%.*}"
693 case "$basename" in *_acpi)
694 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
696 modprobe $basename >>$DEBUG 2>&1 && found="yes"
697 local BASE="$BASE $basename"
699 if [ -n "$found" ] ; then
700 einfo "$BASE" ; eend 0
702 ewarn "(none)" ; eend 1
704 if ! pgrep acpid >/dev/null ; then
705 einfo "Starting acpi daemon."
706 /etc/init.d/acpid start >>$DEBUG 2>&1 ; eend $?
708 ewarn "acpi daemon already running."
718 if checkbootparam 'brltty' ; then
719 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
724 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
727 NOSWAP="yes" # we do not use swap by default!
728 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
730 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
733 # Scan for swap, config, homedir - but only in live-mode
734 if [ -z "$INSTALLED" ] ; then
735 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
738 HOMEDIR="$(getbootparam 'home')"
739 if [ -n "$partitions" ]; then
740 while read p m f relax; do
741 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
742 partoptions="users,exec"
744 # it's a swap partition?
747 if [ -n "$NOSWAP" ]; then
748 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
751 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
752 S1SUSP|S2SUSP|pmdisk|[zZ]*)
753 if [ -n "$ANYSWAP" ] ; then
754 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
755 swapon $p 2>>$DEBUG ; eend $?
757 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
761 if [[ "$p" == LABEL* ]] ; then
762 p=$(blkid -t $p | awk -F: '{print $1}')
764 if grep -q $p /proc/swaps ; then
765 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
767 if [ -b "$p" ] ; then
768 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
769 swapon $p 2>>$DEBUG ; eend $?
771 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
780 esac # it's a swap partition?
785 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
786 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
788 # *) NONEFOUND='1'; continue ;;
792 if [ -z "$NOSWAP" ] ; then
793 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
794 # Activate swapfile, if exists
795 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
797 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
798 mount -o remount,rw $m && MOUNTED=1
799 if swapon "$SWAPFILE" 2>>$DEBUG ; then
801 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
803 fnew="$SWAPFILE swap swap defaults 0 0"
804 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
805 GRML_SWP="$GRML_SWP $SWAPFILE"
808 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
811 # use a image as home
812 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
813 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
814 if [ -n "$HOMEDIR" ]; then
815 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
819 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
821 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
826 # Umount, if not in use
827 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
839 if checkbootparam 'nocpu'; then
840 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
844 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
846 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)
847 echo $CPU | sed 's/ \{1,\}/ /g'
850 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
853 # no cpufreq setup inside VirtualBox
854 if $VIRTUALBOX ; then
855 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
859 if [ -x /etc/init.d/loadcpufreq ] ; then
860 einfo "Trying to set up cpu frequency scaling:"
863 LOADCPUFREQ=$(mktemp)
864 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
865 if grep -q FATAL "$LOADCPUFREQ" ; then
871 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
872 eerror "$line" ; eend $RC
876 elif grep -q done "$LOADCPUFREQ" ; then
877 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
878 if [ -n "$MODULE" -a "$MODULE" != none ]; then
879 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
882 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
888 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
889 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
890 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
891 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
893 einfo "Setting ondemand governor"
895 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
896 echo ondemand > $file || RC=1
908 # {{{ autostart of ssh
910 if checkbootparam 'ssh' ; then
912 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
915 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
916 [ -z "$localuser" ] && eend 1
919 if [ -z "$PASSWD" ] ; then
920 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
924 if [ -n "$PASSWD" ] ; then
926 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
930 echo "$localuser:$PASSWD" | chpasswd $chpass_options
931 echo "root:$PASSWD" | chpasswd $chpass_options
934 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
938 einfo "Starting secure shell server in background for root and user $localuser"
939 /etc/init.d/rmnologin start >>$DEBUG 2>>$DEBUG
940 /etc/init.d/ssh start >>$DEBUG 2>>$DEBUG &
948 # {{{ display hostkeys of SSH server
949 config_display_ssh_fingerprints() {
950 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
951 return 0 # no SSH host keys present
954 einfo "SSH key fingerprints:"
955 for file in /etc/ssh/ssh_host_*_key ; do
957 ssh-keygen -l -f $file
963 # {{{ autostart of x11vnc
965 if checkbootparam 'vnc' ; then
968 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
969 einfo "Bootoption vnc found, trying to set password for user $localuser."
971 if [ -z "$VNC_PASSWD" ] ; then
972 if [ -x /usr/bin/apg ] ; then
973 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
974 elif [ -x /usr/bin/gpw ] ; then
975 VNC_PASSWD="$(gpw 1)"
976 elif [ -x /usr/bin/pwgen ] ; then
977 VNC_PASSWD="$(pwgen -1 8)"
978 elif [ -x /usr/bin/hexdump ] ; then
979 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
980 elif [ -n "$RANDOM" ] ; then
981 VNC_PASSWD="${localuser}${RANDOM}"
984 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
988 if [ -n "$VNC_PASSWD" ] ; then
989 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
994 # finally check if we have a password we can use:
995 if [ -n "$VNC_PASSWD" ] ; then
997 VNCDIR="/home/${localuser}/.vnc"
998 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1000 if [ ! -x /usr/bin/x11vnc ] ; then
1001 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1004 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1005 /bin/chown -R "$localuser": "$VNCDIR"
1008 if checkbootparam 'vnc_connect' ; then
1010 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1011 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1012 #store the options in a file
1013 VNCDIR="/home/${localuser}/.vnc"
1014 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1015 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1021 # {{{ set password for root and default user
1023 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1025 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1028 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1029 [ -z "$localuser" ] && eend 1
1032 if [ -z "$PASSWD" ] ; then
1033 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1037 if [ -n "$PASSWD" ] ; then
1039 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1043 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1044 echo "root:$PASSWD" | chpasswd $chpass_options
1047 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1053 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1055 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1057 if [ -z "$PASSWD" ] ; then
1058 eerror "No hashed password found, can not set password."
1064 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1065 [ -z "$localuser" ] && eend 1
1067 if [ -n "$PASSWD" ] ; then
1070 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1071 echo "root:$PASSWD" | chpasswd $chpass_options
1074 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1084 if ! [ -x /usr/bin/amixer ] ; then
1085 eerror "amixer binary not available. Can not set sound volumes therefore."
1088 if ! [ -r /proc/asound/cards ] ; then
1089 ewarn "No soundcard present, skipping mixer settings therefore."
1094 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1095 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1098 if checkbootparam 'vol' ; then
1099 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1100 if [ -z "$VOL" ] ; then
1101 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1109 if checkbootparam 'nosound' ; then
1110 einfo "Muting sound devices on request."
1111 ERROR=$(amixer -q set Master mute)
1113 if [ -n "$ERROR" ] ; then
1115 eerror "Problem muting sound devices: $ERROR"
1119 elif [ -z "$INSTALLED" ] ; then
1120 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1122 if checkbootparam 'micvol' ; then
1123 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1124 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1129 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1133 for CONTROL in ${=CONTROLS} ; do
1134 # such devices can not be controlled with amixer ... unmute
1135 [[ "$CONTROL" == *Console* ]] && continue
1137 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1138 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1139 amixer -c $card -q set "${CONTROL}" unmute
1141 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1142 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1146 if [ ${MICVOL} -ne 0 ] ; then
1147 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1148 amixer -c $card -q set "${CONTROL}" unmute
1150 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1151 amixer -c $card -q set "${CONTROL}" $MICVOL%
1157 fi # checkbootparam 'nosound'
1164 # {{{ syslog service
1166 if checkbootparam 'nosyslog'; then
1167 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1170 [ -x /etc/init.d/syslog-ng ] && SYSLOGD='syslog-ng'
1171 [ -x /etc/init.d/rsyslog ] && SYSLOGD='rsyslog'
1172 [ -x /etc/init.d/dsyslog ] && SYSLOGD='dsyslog'
1173 [ -x /etc/init.d/sysklogd ] && SYSLOGD='sysklogd'
1174 [ -x /etc/init.d/inetutils-syslogd ] && SYSLOGD='inetutils-syslogd'
1176 if [ -z "$SYSLOGD" ] ; then
1177 eerror "No syslog daemon found." ; eend 1
1179 einfo "Starting $SYSLOGD in background."
1180 /etc/init.d/$SYSLOGD start >>$DEBUG &
1189 if checkbootparam 'nogpm'; then
1190 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1192 if ! [ -r /dev/input/mice ] ; then
1193 eerror "No mouse found - not starting GPM." ; eend 1
1195 einfo "Starting gpm in background."
1196 /etc/init.d/gpm start >>$DEBUG &
1197 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1206 if checkbootparam 'services' ; then
1207 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1208 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1209 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1210 for service in $(echo -e $SERVICELIST) ; do
1211 # support running (custom) init scripts in non-blocking mode
1212 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1213 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1214 einfo "Starting service ${service}."
1215 /etc/init.d/${service} start >>$DEBUG
1217 einfo "Starting service ${service} in background."
1218 /etc/init.d/${service} start >>$DEBUG &
1228 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1229 SOURCE=$(eval echo "$1")
1232 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1233 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1235 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1237 if checkbootparam 'getfile.retries' ; then
1238 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1243 while ! getconfig && [[ "$counter" != 0 ]] ; do
1244 echo -n "Sleeping for 1 second and trying to get config again... "
1245 counter=$(( counter-1 ))
1246 echo "$counter tries left" ; sleep 1
1248 if [ -s "$TARGET" ] ; then
1249 einfo "Downloading was successfull." ; eend 0
1250 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1251 md5sum ${TARGET} ; eend 0
1254 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1262 if checkbootparam 'netconfig' ; then
1263 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1264 CONFIGFILE='/tmp/netconfig.grml'
1266 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1267 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1274 # {{{ remote scripts
1275 config_netscript() {
1276 if checkbootparam 'netscript' ; then
1277 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1278 SCRIPTFILE='/tmp/netscript.grml'
1280 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1281 chmod +x ${SCRIPTFILE}
1282 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1291 if ! checkbootparam 'nostats' ; then
1292 BASE_URL="http://stats.grml.org/report/"
1295 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1297 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1298 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1299 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1300 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1302 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1304 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1305 [ -z "$BOOT" ] && BOOT="local"
1307 ADDITIONAL_PARAMS=""
1308 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1309 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1311 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1313 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1318 # {{{ start X window system via grml-x
1320 # make sure we start X only if startx is used *before* a nostartx option
1321 # so it's possible to disable automatic X startup using nostart
1322 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1323 if [ -x "$(which X)" ] ; then
1324 if [ -z "$INSTALLED" ] ; then
1325 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1326 if [ -z "$WINDOWMANAGER" ] ; then
1327 einfo "No window manager specified. Using default one." && eend 0
1329 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1331 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1333 cat>|/etc/init.d/xstartup<<EOF
1335 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1337 chmod 755 /etc/init.d/xstartup
1339 # adjust inittab for xstartup
1340 if grep -q '^6:' /etc/inittab ; then
1341 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
1342 else # just append tty6 to inittab if no definition is present:
1343 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
1346 /sbin/telinit q ; eend $?
1348 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1349 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1351 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1355 eerror "We are not running in live mode - startx will not work, skipping it."
1356 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1359 eerror "/usr/bin/X is not present on this grml flavour."
1360 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1366 # {{{ configuration framework
1368 if checkbootparam 'extract' ; then
1369 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1370 EXTRACTOPTIONS="-- -x $EXTRACT"
1374 config_finddcsdir() {
1375 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1376 # on the command line, nothing is changed and the dcs files are
1377 # searched within the .iso, $dcs-dir is set to the root directory
1379 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1380 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1381 # set, $dcs-dir is set to the root directory within the .iso.
1382 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1383 # foo, even if a GRMLCFG partition is present.
1386 # autoconfig, see issue673
1387 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1388 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1389 if checkbootparam 'noautoconfig' ; then
1390 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1391 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1393 if [ -z "$INSTALLED" ] ; then
1394 if checkbootparam 'myconfig' ; then
1395 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1396 if [ -z "$DCSDEVICE" ]; then
1397 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1398 fi # [ -z "$DCSDEVICE" ]
1399 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1400 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1402 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1404 modprobe 9p 2>/dev/null || true
1405 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1406 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1407 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1408 DCSDEVICE="$GRMLCFG"
1409 MOUNTOPTIONS="ro,trans=virtio"
1414 if [ -n "$DCSDEVICE" ]; then
1415 DCSMP="/mnt/grmlcfg"
1420 # if not specified/present then assume default:
1421 if [ -z "$DCSDEVICE" ]; then
1422 DCSDIR="${LIVECD_PATH}"
1425 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1426 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1427 if [ -n "$DCSDIR" ]; then
1428 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1430 [ -d $DCSMP ] || mkdir $DCSMP
1431 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1432 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1433 if [[ $RC == 0 ]]; then
1434 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1436 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1445 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1446 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1447 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1448 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1454 if checkbootparam 'partconf' ; then
1455 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1456 if [ -n "$MOUNTDEVICE" ]; then
1457 [ -d /mnt/grml ] || mkdir /mnt/grml
1458 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1459 if [[ $RC == 0 ]]; then
1460 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1461 einfo "Copying files from $MOUNTDEVICE over grml system."
1462 for file in `cat /etc/grml/partconf` ; do
1463 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1464 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1467 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1468 fi # mount $MOUNTDEVICE
1469 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1471 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1472 fi # [ -n "$MOUNTDEVICE" ]
1477 # {{{ /cdrom/.*-options
1479 if checkbootparam 'debs' ; then
1480 iszsh && setopt localoptions shwordsplit
1481 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1482 if [ -z "$DEBS" ] ; then
1485 if ! echo $DEBS | grep -q '/'; then
1486 # backwards compatibility: if no path is given get debs from debs/
1489 einfo "Trying to install Debian package(s) ${DEBS}"
1490 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1491 dpkg -i $DEBS ; eend $?
1496 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1497 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1498 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1499 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1501 if ! echo $SCRIPTS | grep -q '/'; then
1502 # backwards compatibility: if no path is given get scripts from scripts/
1503 SCRIPTS="scripts/$SCRIPTS"
1505 if [ -n "$SCRIPTS" ]; then
1506 SCRIPTS="${DCSDIR}/$SCRIPTS"
1507 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1508 einfo "Trying to execute ${SCRIPTS}"
1511 elif [ -d "$SCRIPTS" ]; then
1512 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1513 run-parts --regex '.*' $SCRIPTS
1516 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1525 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1526 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1527 if [ -z "$CONFIG" ]; then
1528 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1530 if [ -n "$CONFIG" ]; then
1531 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1532 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1534 cp -a ${DCSDIR}/${CONFIG}/* /
1535 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1536 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1539 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1541 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1548 # {{{ confing_umount_dcsdir
1549 config_umount_dcsdir(){
1550 # umount $DCSMP if it was mounted by finddcsdir
1551 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1557 if checkbootparam 'mypath' ; then
1558 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1559 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1560 touch /etc/grml/my_path
1561 chmod 644 /etc/grml/my_path
1562 # make sure the directories exist:
1564 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1565 if ! [ -d "$i" ] ; then
1566 einfo "Creating directory $i"
1567 mkdir -p "$i" ; eend $?
1570 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1578 [ -n "$INSTALLED" ] && return 0
1580 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1581 checkbootparam 'raid=noautodetect' ; then
1582 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1584 [ -e /proc/mdstat ] || modprobe md_mod
1585 if ! [ -x /sbin/mdadm ] ; then
1586 eerror "mdadm not available, can not execute it." ; eend 1
1589 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1590 # find out whether we have a valid configuration file already
1591 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1592 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1593 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1594 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1596 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1599 if ! checkbootparam 'swraid' ; then
1601 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1604 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1609 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1611 *'No arrays found'*)
1612 ewarn "$line" ; eend 0
1615 einfo "$line" ; eend 0
1622 if [ -r /proc/mdstat ] ; then
1624 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1625 if [ -z "$MDSTAT" ] ; then
1626 ewarn "No active arrays found" ; eend 0
1631 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1632 einfo "active arrays: $line" ; eend 0
1638 fi # bootoption swraid
1640 fi # is /sbin/mdadm executable?
1641 fi # check for bootoptions
1647 [ -n "$INSTALLED" ] && return 0
1649 if checkbootparam 'nodmraid' ; then
1650 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1654 if ! [ -x /sbin/dmraid ] ; then
1655 eerror "dmraid not available, can not execute it." ; eend 1
1660 # usage: dmraid_wrapper <dmraid_option>
1661 [ -n "$1" ] || return 1
1668 for line in $(dmraid $1 ; echo errcode:$?); do
1670 *'no block devices found'*)
1671 einfo "No block devices found" ; eend 0
1675 einfo "No active dmraid devices found" ; eend 0
1694 if checkbootparam 'dmraid' ; then
1695 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1696 if [ "$ACTION" = "off" ] ; then
1697 # Deactivates all active software RAID sets:
1698 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1701 # Activate all software RAID sets discovered:
1702 einfo "Activating present dmraid sets (as requested via dmraid):"
1709 # by default (no special bootoptions) discover all software RAID devices:
1710 einfo "Searching for any present dmraid sets:"
1715 # {{{ LVM (Logical Volumes)
1717 [ -n "$INSTALLED" ] && return 0
1719 if checkbootparam 'nolvm' ; then
1720 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1722 # Debian etch provides /etc/init.d/lvm only, newer suites provide /etc/init.d/lvm2
1723 if ! [ -x /sbin/lvm -a -x /sbin/lvdisplay ] || ! [ -x /etc/init.d/lvm2 -o -x /etc/init.d/lvm ] ; then
1724 eerror "LVM not available, can not execute it." ; eend 1
1726 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1727 einfo "You seem to have logical volumes (LVM) on your system."
1729 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1731 if checkbootparam 'lvm' ; then
1732 einfo "Bootoption LVM found. Searching for logical volumes:"
1733 /etc/init.d/lvm2 start ; eend $?
1737 fi # check for lvm binary
1738 fi # check for bootoption nolvm
1742 # {{{ debnet: setup network based on an existing one found on a partition
1744 if checkbootparam 'debnet' ; then
1745 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1751 # {{{ disable console blanking
1753 if checkbootparam 'noblank' ; then
1754 einfo "Bootoption noblank found. Disabling monitor blanking."
1755 setterm -blank 0 ; eend $?
1760 # {{{ debootstrap: automatic installation
1761 config_debootstrap(){
1763 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1765 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1767 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1769 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1774 if checkbootparam 'target' ; then
1776 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1777 # notice: the following checks whether the given partition is available, if not the skip
1778 # execution of grml-debootstrap as it might result in data loss...
1779 if ! [ -r "$TARGET" ] ; then
1780 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1784 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1789 if checkbootparam 'grub' ; then
1791 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1794 if checkbootparam 'groot' ; then
1796 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1799 if checkbootparam 'release' ; then
1801 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1804 if checkbootparam 'mirror' ; then
1806 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1809 if checkbootparam 'boot_append' ; then
1811 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1814 if checkbootparam 'password' ; then
1816 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1819 # now check which options are available
1820 if [ -n "TARGET" ] ; then
1821 TARGETCMD="--target $TARGET"
1825 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1829 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1830 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1831 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1832 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1833 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1834 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1836 # and finally write script and execute it
1837 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1839 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1842 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1844 screen /usr/bin/grml-debootstrap_noninteractive
1845 einfo "Invoking a shell, just exit to continue booting..."
1848 fi # checkbootparam "BOOT_IMAGE=debian2hd
1852 # {{{ virtualbox shared folders
1853 config_virtualbox_shared_folders() {
1854 if $VIRTUALBOX ; then
1855 einfo "VirtualBox detected, trying to set up Shared Folders."
1856 if ! modinfo vboxsf &>/dev/null ; then
1857 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1859 elif ! [ -x /usr/sbin/VBoxService ] ; then
1860 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1865 einfo "Loading vboxsf driver."
1866 lsmod | grep -q vboxsf || modprobe vboxsf
1869 einfo "Adjusting /dev/vboxguest."
1870 chown root:vboxsf /dev/vboxguest
1871 chmod 660 /dev/vboxguest
1876 einfo "Adding $fstabuser to group vboxsf."
1877 adduser grml vboxsf &>/dev/null
1880 einfo "Starting VBoxService."
1881 VBoxService >/dev/null
1884 local vbautomation='automation'
1885 if checkbootparam 'vbautomation'; then
1886 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1889 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1890 ewarn "No automount shared folder '$vbautomation' available"
1893 einfo "Found automount shared folder '$vbautomation'"
1896 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1897 [ -n "$distri" ] || distri='grml'
1899 local vbox_auto_sf="/media/sf_${vbautomation}"
1901 sleep 1 # ugly but necessary
1905 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1906 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1908 counter=$(( counter-1 ))
1913 if ! [ -d "${vbox_auto_sf}" ] ; then
1914 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1917 einfo "Found shared folders automation directory $vbox_auto_sf"
1921 if checkbootparam 'novbautomation' ; then
1922 einfo "Bootoption novbautomation found. Disabling automation script execution."
1925 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1926 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1929 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1930 "${vbox_auto_sf}/${distri}"
1944 # {{{ Support customization
1946 if checkbootparam 'distri'; then
1947 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1948 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1949 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1950 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1951 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1952 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1958 ## END OF FILE #################################################################
1959 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2