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
26 if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
33 if [ "$#" -lt 2 ] ; then
34 echo "Usage: service_wrapper <service> <action>" >&2
42 systemctl "$action" "$service"
44 /etc/init.d/"$service" "$action"
50 if [ -n "$ZSH_VERSION" ] ; then
56 # avoid 'no matches found: ...'
57 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
60 # {{{ Read in boot parameters
61 if [ -z "$CMDLINE" ]; then
62 # if CMDLINE was set from the outside, we're debugging.
63 # otherwise, take CMDLINE from Kernel and config files.
64 CMDLINE="$(cat /proc/cmdline)"
65 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
66 modprobe 9p 2>/dev/null || true
67 if grep -q 9p /proc/filesystems ; then
69 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
70 MOUNTDIR="$(mktemp -d)"
71 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
72 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
80 ### {{{ Utility Functions
82 # Get a bootoption's parameter: read boot command line and either
83 # echo last parameter's argument or return false.
91 result="${line##*[$ws]$1=}"
92 result="${result%%[$ws]*}"
100 # Check boot commandline for specified option
102 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
108 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
115 # Check if currently using a framebuffer
117 [ -e /dev/fb0 ] && return 0 || return 1
120 # Check wheter a configuration variable (like $CONFIG_TOHD) is
124 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
125 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
126 *) return 1 ;; # default
130 # Are we using grml-small?
132 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
135 # if no password is set return a random password
137 [ -n "$PASSWD" ] && return 0
139 if [ -x /usr/bin/apg ] ; then
140 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
141 elif [ -x /usr/bin/gpw ] ; then
143 elif [ -x /usr/bin/pwgen ] ; then
144 PASSWD="$(pwgen -1 8)"
145 elif [ -x /usr/bin/hexdump ] ; then
146 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
147 elif [ -n "$RANDOM" ] ; then
148 PASSWD="grml${RANDOM}"
151 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
159 # {{{ filesystems (proc, pts, sys) and fixes
161 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
165 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
169 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
173 # {{{ Check if we are running in live mode or from HD
175 [ -e /etc/grml_cd ] || INSTALLED="yes"
178 # {{{ provide information about virtual environments
179 VIRTUAL=false # assume physical system by default
184 if vmware-detect &>/dev/null; then
185 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
186 elif [ "$(virt-what 2>/dev/null)" = "kvm" ] || \
187 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
188 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
189 elif [ "$(virt-what 2>/dev/null)" = "virtualbox" ] || \
190 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
191 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
195 # {{{ source lsb-functions , color handling
196 if checkbootparam 'nocolor'; then
198 . /etc/grml/lsb-functions
200 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
202 . /etc/grml/lsb-functions
209 checkbootparam 'debug' && BOOTDEBUG="yes"
210 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
213 if [ -n "$BOOTDEBUG" ]; then
214 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
215 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
216 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
217 einfo "Just exit the shell to continue boot process..."
221 if [ -r /etc/grml/screenrc ] ; then
222 einfo "Starting GNU screen to be able to use a full featured shell environment."
223 einfo "Just exit the shells (and therefore screen) to continue boot process..."
224 /bin/zsh -c "screen -c /etc/grml/screenrc"
226 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
227 einfo "Just exit the shell to continue boot process..."
239 if checkbootparam 'log' || checkbootparam 'debug' ; then
240 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
242 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
244 einfo "Starting bootlogd." # known to be *very* unreliable :(
245 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
253 ### {{{ language configuration / localization
256 einfo "Activating language settings:"
259 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
260 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
262 # check for bootoption which overrides config from /etc/grml/autoconfig
263 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
264 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
266 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
267 if [ -z "$INSTALLED" ] ; then
268 [ -n "$LANGUAGE" ] || LANGUAGE='en'
271 if [ -x /usr/sbin/grml-setlang ] ; then
272 # if bootoption lang is used update /etc/default/locale accordingly
273 if [ -n "$BOOT_LANGUAGE" ] ; then
274 /usr/sbin/grml-setlang "$LANGUAGE"
275 # otherwise default to lang=en
277 /usr/sbin/grml-setlang "en"
282 if [ -z "$CONSOLEFONT" ] ; then
283 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
284 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
285 CONSOLEFONT='Uni3-Terminus16'
287 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
290 CONSOLEFONT='Lat15-Terminus16'
295 # export it now, so error messages get translated, too
296 [ -r /etc/default/locale ] && . /etc/default/locale
299 # configure keyboard layout, read in already set values first:
300 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
302 # now allow keyboard override by boot commandline for later use:
303 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
304 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
305 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
306 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
307 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
309 # modify /etc/sysconfig/keyboard only in live-cd mode:
310 if [ -z "$INSTALLED" ] ; then
312 local LANGUAGE="$BOOT_LANGUAGE"
313 . /etc/grml/language-functions
314 # allow setting xkeyboard explicitly different than console keyboard
315 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
316 if [ -n "$KXKEYBOARD" ]; then
317 XKEYBOARD="$KXKEYBOARD"
318 KDEKEYBOARD="$KXKEYBOARD"
319 elif [ -n "$KKEYBOARD" ]; then
320 XKEYBOARD="$KKEYBOARD"
321 KDEKEYBOARD="$KKEYBOARD"
324 # duplicate of previous code to make sure /etc/grml/language-functions
325 # does not overwrite our values....
326 # now allow keyboard override by boot commandline for later use:
327 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
328 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
329 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
330 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
331 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
333 # write keyboard related variables to file for later use
334 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
335 if ! [ -e /etc/sysconfig/keyboard ] ; then
336 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
337 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
338 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
339 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
343 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
345 # activate unicode console if running within utf8 environment
346 if [ -r /etc/default/locale ] ; then
347 if grep -q "LANG=.*UTF" /etc/default/locale ; then
348 einfo "Setting up unicode environment."
349 unicode_start >>$DEBUG 2>&1 ; eend $?
353 # Set default keyboard before interactive setup
354 if [ -n "$KEYTABLE" ] ; then
355 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
356 loadkeys -q $KEYTABLE &
360 # we have to set up all consoles, therefore loop it over all ttys:
361 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
362 if [ -n "$NUM_CONSOLES" ] ; then
363 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
364 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
366 CUR_CONSOLE=$(fgconsole 2>/dev/null)
368 if [ -x "$(which setfont)" ] ; then
370 elif [ -x "$(which consolechars)" ] ; then
371 use_consolechars=true
373 eerror "Neither setfont nor consolechars tool present, can not set font."
378 if [ -n "$CHARMAP" ] ; then
379 einfo "Setting font to ${CHARMAP}"
381 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
382 if $use_setfont ; then
383 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
384 elif $use_consolechars ; then
385 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
388 if [ -n "$CUR_CONSOLE" ] ; then
389 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
394 if checkbootparam 'noconsolefont' ; then
395 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
397 if [ -n "$CONSOLEFONT" ] ; then
398 einfo "Setting font to ${CONSOLEFONT}"
400 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
401 if $use_setfont ; then
402 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
403 elif $use_consolechars ; then
404 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
407 if [ -n "$CUR_CONSOLE" ] ; then
408 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
420 if ! checkbootparam 'hostname' ; then
424 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
425 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
426 einfo "Generating random hostname as no hostname was specified."
427 HOSTNAME="$(/usr/bin/random-hostname)"
431 einfo "Setting hostname to $HOSTNAME as requested."
432 grml-hostname $HOSTNAME >>$DEBUG
437 # fstabuser (needed when running from harddisk 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 configured fstab user
444 if [ -n "$CONFIG_FSTAB_USER" ] ; then
445 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
448 # 2nd. use standard user id
449 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
451 # 3rd. use standard user name
452 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
454 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
455 [ -n "$fstabuser" ] || fstabuser='root'
459 # local_user (needed when running with username != grml {{{
462 # force load of build-in and local config
463 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
464 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
466 # 1st. try id of primary user
467 localuser=$(getent passwd 1000 | cut -d: -f1)
469 # 2nd. use name standard user
470 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
474 # {{{ Set clock (Local time is more often used than GMT, so it is default)
476 # don't touch the files if running from harddisk:
477 if [ -z "$INSTALLED" ]; then
478 # The default hardware clock timezone is stated as representing local time.
481 if [ -f /etc/default/rcS ] ; then
482 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
483 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
484 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
485 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
486 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
487 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
488 elif [ -f /etc/adjtime ] ; then
489 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
490 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
491 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
492 grep -q "^UTC$" /etc/adjtime && UTC="-u"
495 # hwclock uses the TZ variable
496 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
497 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
498 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
499 ewarn "Warning: unknown timezone $KTZ" ; eend 1
501 ewarn "Falling back to timezone $KTZ" ; eend 0
504 if ! [ -r /dev/rtc ] ; then
505 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
508 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
509 if [ -n "$ERROR" ] ; then
511 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
512 if [ -n "$ERROR" ] ; then
513 eerror "Problem running hwclock: $ERROR" ; eend 1
522 # {{{ print kernel info
524 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
525 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
527 einfo "Running Linux Kernel $KERNEL" ; eend 0
530 if [ -r /proc/cpuinfo ] ; then
531 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
533 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
538 if [ -d /proc/xen ] ; then
540 einfo 'Running kernel featuring support for Xen detected' ; eend 0
548 # don't touch the files if running from harddisk:
549 if [ -z "$INSTALLED" ]; then
550 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
551 if [ -n "$KTZ" ] ; then
552 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
554 ewarn "Warning: unknown timezone $KTZ"; eend 0
556 einfo "Setting timezone."
558 area=$(echo $KTZ | cut -d '/' -f1)
559 zone=$(echo $KTZ | cut -d '/' -f2)
560 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
561 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
563 echo $KTZ > /etc/timezone
565 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
572 # activate serial console {{{
574 if checkbootparam 'console'; then
579 einfo "Bootoption for serial console detected:"
583 line="${line#*[$ws]}"
585 while [ -n "$line" ]; do
589 local device="${this%%,*}"
590 local device="${device##*=}"
591 if echo $serial | grep -q ttyS ; then
592 local option="${serial##*,}"
593 # default (works for kvm & CO):
594 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
595 # ... unless overriden by command line:
597 115200*) speed=115200 ;;
598 57600*) speed=57600 ;;
599 38400*) speed=38400 ;;
600 19200*) speed=19200 ;;
607 einfo "Activating console login on device ${device} with speed ${speed}."
608 local number="${device#ttyS}"
609 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
616 this="${line%%[$ws]*}"
617 line="${line#*[$ws]}"
620 if [ -n "$telinitq" ]; then
630 if checkbootparam 'testcd' ; then
631 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
635 local FOUND_FILE=false
636 local logfile='/tmp/md5sum.log'
640 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
641 einfo "Checking files against $md5, this may take a while..."
646 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
647 if [ $pipestatus[1] -eq 0 ] ; then
653 if ! $FOUND_FILE ; then
654 eerror 'Error: Could not find md5sum file' ; eend 1
659 einfo "Everything looks OK" ; eend 0
661 eerror 'Checksum failed for theses files:' ; eend 1
662 egrep -v '(^md5sum:|OK$)' "${logfile}"
663 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
664 einfon "Hit return to continue, or press the power button to shut down system."
673 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
675 if checkbootparam 'blacklist' ; then
676 if [ -z "$INSTALLED" ]; then
677 einfo "Bootoption blacklist found."
678 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
679 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
680 if [ -n "$BLACK" ] ; then
681 for module in $(echo ${BLACK//,/ }) ; do
682 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
683 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
684 echo "blacklist $module" >> "$BLACKLIST_FILE"
685 echo "alias $module off" >> "$BLACKLIST_FILE"
686 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
689 eerror "No given module for blacklist found. Blacklisting will not work therefore."
692 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
694 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
703 if checkbootparam 'noacpi'; then
704 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
705 elif checkbootparam 'nogrmlacpi' ; then
706 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
707 elif [ ! -d /proc/acpi ] ; then
708 ewarn "ACPI: Kernel support not present." ; eend 0
710 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
713 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
715 basename="${basename%%.*}"
716 case "$basename" in *_acpi)
717 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
719 modprobe $basename >>$DEBUG 2>&1 && found="yes"
720 local BASE="$BASE $basename"
722 if [ -n "$found" ] ; then
723 einfo "$BASE" ; eend 0
725 ewarn "(none)" ; eend 1
727 if ! pgrep acpid >/dev/null ; then
728 einfo "Starting acpi daemon."
729 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
730 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
732 ewarn "acpi daemon already running."
742 if checkbootparam 'brltty' ; then
743 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
748 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
751 NOSWAP="yes" # we do not use swap by default!
752 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
754 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
757 # Scan for swap, config, homedir - but only in live-mode
758 if [ -z "$INSTALLED" ] ; then
759 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
762 HOMEDIR="$(getbootparam 'home')"
763 if [ -n "$partitions" ]; then
764 while read p m f relax; do
765 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
766 partoptions="users,exec"
768 # it's a swap partition?
771 if [ -n "$NOSWAP" ]; then
772 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
775 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
776 S1SUSP|S2SUSP|pmdisk|[zZ]*)
777 if [ -n "$ANYSWAP" ] ; then
778 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
779 swapon $p 2>>$DEBUG ; eend $?
781 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
785 if [[ "$p" == LABEL* ]] ; then
786 p=$(blkid -t $p | awk -F: '{print $1}')
788 if grep -q $p /proc/swaps ; then
789 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
791 if [ -b "$p" ] ; then
792 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
793 swapon $p 2>>$DEBUG ; eend $?
795 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
804 esac # it's a swap partition?
809 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
810 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
812 # *) NONEFOUND='1'; continue ;;
816 if [ -z "$NOSWAP" ] ; then
817 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
818 # Activate swapfile, if exists
819 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
821 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
822 mount -o remount,rw $m && MOUNTED=1
823 if swapon "$SWAPFILE" 2>>$DEBUG ; then
825 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
827 fnew="$SWAPFILE swap swap defaults 0 0"
828 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
829 GRML_SWP="$GRML_SWP $SWAPFILE"
832 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
835 # use a image as home
836 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
837 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
838 if [ -n "$HOMEDIR" ]; then
839 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
843 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
845 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
850 # Umount, if not in use
851 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
863 if checkbootparam 'nocpu'; then
864 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
868 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
870 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)
871 echo $CPU | sed 's/ \{1,\}/ /g'
874 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
877 # no cpufreq setup inside VirtualBox
878 if $VIRTUALBOX ; then
879 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
883 if ! [ -x /etc/init.d/loadcpufreq ] ; then
884 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
888 einfo "Trying to set up cpu frequency scaling:"
891 LOADCPUFREQ=$(mktemp)
892 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
893 if grep -q FATAL "$LOADCPUFREQ" ; then
899 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
900 eerror "$line" ; eend $RC
904 elif grep -q done "$LOADCPUFREQ" ; then
905 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
906 if [ -n "$MODULE" -a "$MODULE" != none ]; then
907 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
910 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
916 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
917 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
918 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
919 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
921 einfo "Setting ondemand governor"
923 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
924 echo ondemand > $file || RC=1
936 # {{{ autostart of ssh
938 if checkbootparam 'ssh' ; then
940 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
943 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
944 [ -z "$localuser" ] && eend 1
947 if [ -z "$PASSWD" ] ; then
948 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
952 if [ -n "$PASSWD" ] ; then
954 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
958 echo "$localuser:$PASSWD" | chpasswd $chpass_options
959 echo "root:$PASSWD" | chpasswd $chpass_options
962 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
966 einfo "Starting secure shell server in background for root and user $localuser"
967 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
968 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
976 # {{{ display hostkeys of SSH server
977 config_display_ssh_fingerprints() {
978 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
979 return 0 # no SSH host keys present
982 einfo "SSH key fingerprints:"
983 for file in /etc/ssh/ssh_host_*_key ; do
985 ssh-keygen -l -f $file
991 # {{{ autostart of x11vnc
993 if checkbootparam 'vnc' ; then
996 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
997 einfo "Bootoption vnc found, trying to set password for user $localuser."
999 if [ -z "$VNC_PASSWD" ] ; then
1000 if [ -x /usr/bin/apg ] ; then
1001 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1002 elif [ -x /usr/bin/gpw ] ; then
1003 VNC_PASSWD="$(gpw 1)"
1004 elif [ -x /usr/bin/pwgen ] ; then
1005 VNC_PASSWD="$(pwgen -1 8)"
1006 elif [ -x /usr/bin/hexdump ] ; then
1007 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1008 elif [ -n "$RANDOM" ] ; then
1009 VNC_PASSWD="${localuser}${RANDOM}"
1012 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1016 if [ -n "$VNC_PASSWD" ] ; then
1017 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1022 # finally check if we have a password we can use:
1023 if [ -n "$VNC_PASSWD" ] ; then
1025 VNCDIR="/home/${localuser}/.vnc"
1026 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1028 if [ ! -x /usr/bin/x11vnc ] ; then
1029 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1032 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1033 /bin/chown -R "$localuser": "$VNCDIR"
1036 if checkbootparam 'vnc_connect' ; then
1038 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1039 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1040 #store the options in a file
1041 VNCDIR="/home/${localuser}/.vnc"
1042 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1043 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1049 # {{{ set password for root and default user
1051 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1053 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1056 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1057 [ -z "$localuser" ] && eend 1
1060 if [ -z "$PASSWD" ] ; then
1061 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1065 if [ -n "$PASSWD" ] ; then
1067 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1071 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1072 echo "root:$PASSWD" | chpasswd $chpass_options
1075 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1081 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1083 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1085 if [ -z "$PASSWD" ] ; then
1086 eerror "No hashed password found, can not set password."
1092 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1093 [ -z "$localuser" ] && eend 1
1095 if [ -n "$PASSWD" ] ; then
1098 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1099 echo "root:$PASSWD" | chpasswd $chpass_options
1102 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1112 if ! [ -x /usr/bin/amixer ] ; then
1113 eerror "amixer binary not available. Can not set sound volumes therefore."
1116 if ! [ -r /proc/asound/cards ] ; then
1117 ewarn "No soundcard present, skipping mixer settings therefore."
1122 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1123 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1126 if checkbootparam 'vol' ; then
1127 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1128 if [ -z "$VOL" ] ; then
1129 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1137 if checkbootparam 'nosound' ; then
1138 einfo "Muting sound devices on request."
1139 ERROR=$(amixer -q set Master mute)
1141 if [ -n "$ERROR" ] ; then
1143 eerror "Problem muting sound devices: $ERROR"
1147 elif [ -z "$INSTALLED" ] ; then
1148 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1150 if checkbootparam 'micvol' ; then
1151 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1152 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1157 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1161 for CONTROL in ${=CONTROLS} ; do
1162 # such devices can not be controlled with amixer ... unmute
1163 [[ "$CONTROL" == *Console* ]] && continue
1165 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1166 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1167 amixer -c $card -q set "${CONTROL}" unmute
1169 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1170 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1174 if [ ${MICVOL} -ne 0 ] ; then
1175 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1176 amixer -c $card -q set "${CONTROL}" unmute
1178 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1179 amixer -c $card -q set "${CONTROL}" $MICVOL%
1185 fi # checkbootparam 'nosound'
1192 # {{{ syslog service
1194 if checkbootparam 'nosyslog'; then
1195 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1197 einfo "Starting rsyslog in background."
1198 service_wrapper rsyslog start >>$DEBUG &
1206 if checkbootparam 'nogpm'; then
1207 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1209 if ! [ -r /dev/input/mice ] ; then
1210 eerror "No mouse found - not starting GPM." ; eend 1
1212 einfo "Starting gpm in background."
1213 service_wrapper gpm start >>$DEBUG &
1214 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1223 if checkbootparam 'services' ; then
1224 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1225 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1226 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1227 for service in $(echo -e $SERVICELIST) ; do
1228 # support running (custom) init scripts in non-blocking mode
1229 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1230 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1231 einfo "Starting service ${service}."
1232 service_wrapper "${service}" start >>$DEBUG
1234 einfo "Starting service ${service} in background."
1235 service_wrapper "${service}" start >>$DEBUG &
1245 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1246 SOURCE=$(eval echo "$1")
1249 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1250 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1252 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1254 if checkbootparam 'getfile.retries' ; then
1255 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1260 while ! getconfig && [[ "$counter" != 0 ]] ; do
1261 echo -n "Sleeping for 1 second and trying to get config again... "
1262 counter=$(( counter-1 ))
1263 echo "$counter tries left" ; sleep 1
1265 if [ -s "$TARGET" ] ; then
1266 einfo "Downloading was successfull." ; eend 0
1267 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1268 md5sum ${TARGET} ; eend 0
1271 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1279 if checkbootparam 'netconfig' ; then
1280 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1281 CONFIGFILE='/tmp/netconfig.grml'
1283 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1284 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1291 # {{{ remote scripts
1292 config_netscript() {
1293 if checkbootparam 'netscript' ; then
1294 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1295 SCRIPTFILE='/tmp/netscript.grml'
1297 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1298 chmod +x ${SCRIPTFILE}
1299 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1308 if ! checkbootparam 'nostats' ; then
1309 BASE_URL="http://stats.grml.org/report/"
1312 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1314 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1315 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1316 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1317 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1319 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1321 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1322 [ -z "$BOOT" ] && BOOT="local"
1324 ADDITIONAL_PARAMS=""
1325 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1326 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1328 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1330 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1335 # {{{ start X window system via grml-x
1339 ewarn "The startx boot option isn't yet supported via systemd, sorry." ; eend 0
1343 # make sure we start X only if startx is used *before* a nostartx option
1344 # so it's possible to disable automatic X startup using nostart
1345 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1346 if [ -x "$(which X)" ] ; then
1347 if [ -z "$INSTALLED" ] ; then
1348 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1349 if [ -z "$WINDOWMANAGER" ] ; then
1350 einfo "No window manager specified. Using default one." && eend 0
1352 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1354 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1356 cat>|/etc/init.d/xstartup<<EOF
1358 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1360 chmod 755 /etc/init.d/xstartup
1362 # adjust inittab for xstartup
1363 if grep -q '^6:' /etc/inittab ; then
1364 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
1365 else # just append tty6 to inittab if no definition is present:
1366 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
1369 /sbin/telinit q ; eend $?
1371 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1372 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1374 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1378 eerror "We are not running in live mode - startx will not work, skipping it."
1379 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1382 eerror "/usr/bin/X is not present on this grml flavour."
1383 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1389 # {{{ configuration framework
1391 if checkbootparam 'extract' ; then
1392 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1393 EXTRACTOPTIONS="-- -x $EXTRACT"
1397 config_finddcsdir() {
1398 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1399 # on the command line, nothing is changed and the dcs files are
1400 # searched within the .iso, $dcs-dir is set to the root directory
1402 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1403 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1404 # set, $dcs-dir is set to the root directory within the .iso.
1405 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1406 # foo, even if a GRMLCFG partition is present.
1409 # autoconfig, see issue673
1410 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1411 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1412 if checkbootparam 'noautoconfig' ; then
1413 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1414 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1416 if [ -z "$INSTALLED" ] ; then
1417 if checkbootparam 'myconfig' ; then
1418 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1419 if [ -z "$DCSDEVICE" ]; then
1420 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1421 fi # [ -z "$DCSDEVICE" ]
1422 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1423 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1425 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1427 modprobe 9p 2>/dev/null || true
1428 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1429 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1430 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1431 DCSDEVICE="$GRMLCFG"
1432 MOUNTOPTIONS="ro,trans=virtio"
1437 if [ -n "$DCSDEVICE" ]; then
1438 DCSMP="/mnt/grmlcfg"
1443 # if not specified/present then assume default:
1444 if [ -z "$DCSDEVICE" ]; then
1445 DCSDIR="${LIVECD_PATH}"
1448 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1449 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1450 if [ -n "$DCSDIR" ]; then
1451 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1453 [ -d $DCSMP ] || mkdir $DCSMP
1454 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1455 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1456 if [[ $RC == 0 ]]; then
1457 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1459 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1468 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1469 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1470 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1471 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1477 if checkbootparam 'partconf' ; then
1478 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1479 if [ -n "$MOUNTDEVICE" ]; then
1480 [ -d /mnt/grml ] || mkdir /mnt/grml
1481 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1482 if [[ $RC == 0 ]]; then
1483 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1484 einfo "Copying files from $MOUNTDEVICE over grml system."
1485 for file in `cat /etc/grml/partconf` ; do
1486 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1487 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1490 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1491 fi # mount $MOUNTDEVICE
1492 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1494 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1495 fi # [ -n "$MOUNTDEVICE" ]
1500 # {{{ /cdrom/.*-options
1502 if checkbootparam 'debs' ; then
1503 iszsh && setopt localoptions shwordsplit
1504 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1505 if [ -z "$DEBS" ] ; then
1508 if ! echo $DEBS | grep -q '/'; then
1509 # backwards compatibility: if no path is given get debs from debs/
1512 einfo "Trying to install Debian package(s) ${DEBS}"
1513 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1514 dpkg -i $DEBS ; eend $?
1519 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1520 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1521 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1522 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1524 if ! echo $SCRIPTS | grep -q '/'; then
1525 # backwards compatibility: if no path is given get scripts from scripts/
1526 SCRIPTS="scripts/$SCRIPTS"
1528 if [ -n "$SCRIPTS" ]; then
1529 SCRIPTS="${DCSDIR}/$SCRIPTS"
1530 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1531 einfo "Trying to execute ${SCRIPTS}"
1534 elif [ -d "$SCRIPTS" ]; then
1535 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1536 run-parts --regex '.*' $SCRIPTS
1539 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1548 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1549 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1550 if [ -z "$CONFIG" ]; then
1551 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1553 if [ -n "$CONFIG" ]; then
1554 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1555 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1557 cp -a ${DCSDIR}/${CONFIG}/* /
1558 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1559 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1562 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1564 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1571 # {{{ confing_umount_dcsdir
1572 config_umount_dcsdir(){
1573 # umount $DCSMP if it was mounted by finddcsdir
1574 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1580 if checkbootparam 'mypath' ; then
1581 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1582 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1583 touch /etc/grml/my_path
1584 chmod 644 /etc/grml/my_path
1585 # make sure the directories exist:
1587 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1588 if ! [ -d "$i" ] ; then
1589 einfo "Creating directory $i"
1590 mkdir -p "$i" ; eend $?
1593 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1601 [ -n "$INSTALLED" ] && return 0
1603 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1604 checkbootparam 'raid=noautodetect' ; then
1605 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1607 [ -e /proc/mdstat ] || modprobe md_mod
1608 if ! [ -x /sbin/mdadm ] ; then
1609 eerror "mdadm not available, can not execute it." ; eend 1
1612 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1613 # find out whether we have a valid configuration file already
1614 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1615 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1616 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1617 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1619 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1622 if ! checkbootparam 'swraid' ; then
1624 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1627 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1632 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1634 *'No arrays found'*)
1635 ewarn "$line" ; eend 0
1638 einfo "$line" ; eend 0
1645 if [ -r /proc/mdstat ] ; then
1647 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1648 if [ -z "$MDSTAT" ] ; then
1649 ewarn "No active arrays found" ; eend 0
1654 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1655 einfo "active arrays: $line" ; eend 0
1661 fi # bootoption swraid
1663 fi # is /sbin/mdadm executable?
1664 fi # check for bootoptions
1670 [ -n "$INSTALLED" ] && return 0
1672 if checkbootparam 'nodmraid' ; then
1673 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1677 if ! [ -x /sbin/dmraid ] ; then
1678 eerror "dmraid not available, can not execute it." ; eend 1
1683 # usage: dmraid_wrapper <dmraid_option>
1684 [ -n "$1" ] || return 1
1691 for line in $(dmraid $1 ; echo errcode:$?); do
1693 *'no block devices found'*)
1694 einfo "No block devices found" ; eend 0
1698 einfo "No active dmraid devices found" ; eend 0
1717 if checkbootparam 'dmraid' ; then
1718 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1719 if [ "$ACTION" = "off" ] ; then
1720 # Deactivates all active software RAID sets:
1721 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1724 # Activate all software RAID sets discovered:
1725 einfo "Activating present dmraid sets (as requested via dmraid):"
1732 # by default (no special bootoptions) discover all software RAID devices:
1733 einfo "Searching for any present dmraid sets:"
1738 # {{{ LVM (Logical Volumes)
1740 [ -n "$INSTALLED" ] && return 0
1742 if checkbootparam 'nolvm' ; then
1743 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1745 if ! [ -x /sbin/lvm ] ; then
1746 eerror "LVM not available, can not execute it." ; eend 1
1748 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1749 einfo "You seem to have logical volumes (LVM) on your system."
1751 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1753 if checkbootparam 'lvm' ; then
1754 einfo "Bootoption LVM found. Searching for logical volumes:"
1755 service_wrapper lvm2 start ; eend $?
1759 fi # check for lvm binary
1760 fi # check for bootoption nolvm
1764 # {{{ debnet: setup network based on an existing one found on a partition
1766 if checkbootparam 'debnet' ; then
1767 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1773 # {{{ disable console blanking
1775 if checkbootparam 'noblank' ; then
1776 einfo "Bootoption noblank found. Disabling monitor blanking."
1777 setterm -blank 0 ; eend $?
1782 # {{{ debootstrap: automatic installation
1783 config_debootstrap(){
1785 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1787 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1789 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1791 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1796 if checkbootparam 'target' ; then
1798 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1799 # notice: the following checks whether the given partition is available, if not the skip
1800 # execution of grml-debootstrap as it might result in data loss...
1801 if ! [ -r "$TARGET" ] ; then
1802 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1806 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1811 if checkbootparam 'grub' ; then
1813 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1816 if checkbootparam 'groot' ; then
1818 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1821 if checkbootparam 'release' ; then
1823 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1826 if checkbootparam 'mirror' ; then
1828 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1831 if checkbootparam 'boot_append' ; then
1833 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1836 if checkbootparam 'password' ; then
1838 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1841 # now check which options are available
1842 if [ -n "TARGET" ] ; then
1843 TARGETCMD="--target $TARGET"
1847 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1851 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1852 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1853 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1854 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1855 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1856 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1858 # and finally write script and execute it
1859 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1861 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1864 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1866 screen /usr/bin/grml-debootstrap_noninteractive
1867 einfo "Invoking a shell, just exit to continue booting..."
1870 fi # checkbootparam "BOOT_IMAGE=debian2hd
1874 # {{{ virtualbox shared folders
1875 config_virtualbox_shared_folders() {
1876 if $VIRTUALBOX ; then
1877 einfo "VirtualBox detected, trying to set up Shared Folders."
1878 if ! modinfo vboxsf &>/dev/null ; then
1879 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1881 elif ! [ -x /usr/sbin/VBoxService ] ; then
1882 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1887 einfo "Loading vboxsf driver."
1888 lsmod | grep -q vboxsf || modprobe vboxsf
1891 einfo "Adjusting /dev/vboxguest."
1892 chown root:vboxsf /dev/vboxguest
1893 chmod 660 /dev/vboxguest
1898 einfo "Adding $fstabuser to group vboxsf."
1899 adduser grml vboxsf &>/dev/null
1902 einfo "Starting VBoxService."
1903 VBoxService >/dev/null
1906 local vbautomation='automation'
1907 if checkbootparam 'vbautomation'; then
1908 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1911 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1912 ewarn "No automount shared folder '$vbautomation' available"
1915 einfo "Found automount shared folder '$vbautomation'"
1918 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1919 [ -n "$distri" ] || distri='grml'
1921 local vbox_auto_sf="/media/sf_${vbautomation}"
1923 sleep 1 # ugly but necessary
1927 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1928 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1930 counter=$(( counter-1 ))
1935 if ! [ -d "${vbox_auto_sf}" ] ; then
1936 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1939 einfo "Found shared folders automation directory $vbox_auto_sf"
1943 if checkbootparam 'novbautomation' ; then
1944 einfo "Bootoption novbautomation found. Disabling automation script execution."
1947 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1948 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1951 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1952 "${vbox_auto_sf}/${distri}"
1966 # {{{ Support customization
1968 if checkbootparam 'distri'; then
1969 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1970 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1971 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1972 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1973 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1974 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1980 ## END OF FILE #################################################################
1981 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2