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
197 . /etc/grml/lsb-functions
198 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
200 . /etc/grml/lsb-functions
206 checkbootparam 'debug' && BOOTDEBUG="yes"
207 checkbootparam "BOOT_IMAGE=debug" && BOOTDEBUG="yes"
210 if [ -n "$BOOTDEBUG" ]; then
211 einfo "Starting intermediate shell stage $stage as requested by \"debug\" option."
212 if [ grep -q "debug=noscreen" "$CMDLINE" ] ; then
213 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
214 einfo "Just exit the shell to continue boot process..."
218 if [ -r /etc/grml/screenrc ] ; then
219 einfo "Starting GNU screen to be able to use a full featured shell environment."
220 einfo "Just exit the shells (and therefore screen) to continue boot process..."
221 /bin/zsh -c "screen -c /etc/grml/screenrc"
223 einfo "Notice that the shell does not provide job handling: ctrl-z, bg and fg won't work!"
224 einfo "Just exit the shell to continue boot process..."
236 if checkbootparam 'log' || checkbootparam 'debug' ; then
237 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
239 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
241 einfo "Starting bootlogd." # known to be *very* unreliable :(
242 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
250 ### {{{ language configuration / localization
253 einfo "Activating language settings:"
256 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
257 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
259 # check for bootoption which overrides config from /etc/grml/autoconfig
260 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
261 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
263 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
264 if [ -z "$INSTALLED" ] ; then
265 [ -n "$LANGUAGE" ] || LANGUAGE='en'
268 if [ -x /usr/sbin/grml-setlang ] ; then
269 # if bootoption lang is used update /etc/default/locale accordingly
270 if [ -n "$BOOT_LANGUAGE" ] ; then
271 /usr/sbin/grml-setlang "$LANGUAGE"
272 # otherwise default to lang=en
274 /usr/sbin/grml-setlang "en"
279 if [ -z "$CONSOLEFONT" ] ; then
280 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
281 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
282 CONSOLEFONT='Uni3-Terminus16'
284 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
287 CONSOLEFONT='Lat15-Terminus16'
292 # export it now, so error messages get translated, too
293 [ -r /etc/default/locale ] && . /etc/default/locale
296 # configure keyboard layout, read in already set values first:
297 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
299 # now allow keyboard override by boot commandline for later use:
300 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
301 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
302 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
303 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
304 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
306 # modify /etc/sysconfig/keyboard only in live-cd mode:
307 if [ -z "$INSTALLED" ] ; then
309 local LANGUAGE="$BOOT_LANGUAGE"
310 . /etc/grml/language-functions
311 # allow setting xkeyboard explicitly different than console keyboard
312 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
313 if [ -n "$KXKEYBOARD" ]; then
314 XKEYBOARD="$KXKEYBOARD"
315 KDEKEYBOARD="$KXKEYBOARD"
316 elif [ -n "$KKEYBOARD" ]; then
317 XKEYBOARD="$KKEYBOARD"
318 KDEKEYBOARD="$KKEYBOARD"
321 # duplicate of previous code to make sure /etc/grml/language-functions
322 # does not overwrite our values....
323 # now allow keyboard override by boot commandline for later use:
324 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
325 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
326 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
327 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
328 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
330 # write keyboard related variables to file for later use
331 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
332 if ! [ -e /etc/sysconfig/keyboard ] ; then
333 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
334 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
335 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
336 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
340 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
342 # activate unicode console if running within utf8 environment
343 if [ -r /etc/default/locale ] ; then
344 if grep -q "LANG=.*UTF" /etc/default/locale ; then
345 einfo "Setting up unicode environment."
346 unicode_start >>$DEBUG 2>&1 ; eend $?
350 # Set default keyboard before interactive setup
351 if [ -n "$KEYTABLE" ] ; then
352 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
353 loadkeys -q $KEYTABLE &
357 # we have to set up all consoles, therefore loop it over all ttys:
358 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
359 if [ -n "$NUM_CONSOLES" ] ; then
360 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
361 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
363 CUR_CONSOLE=$(fgconsole 2>/dev/null)
365 if [ -x "$(which setfont)" ] ; then
367 elif [ -x "$(which consolechars)" ] ; then
368 use_consolechars=true
370 eerror "Neither setfont nor consolechars tool present, can not set font."
375 if [ -n "$CHARMAP" ] ; then
376 einfo "Setting font to ${CHARMAP}"
378 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
379 if $use_setfont ; then
380 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
381 elif $use_consolechars ; then
382 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
385 if [ -n "$CUR_CONSOLE" ] ; then
386 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
391 if checkbootparam 'noconsolefont' ; then
392 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
394 if [ -n "$CONSOLEFONT" ] ; then
395 einfo "Setting font to ${CONSOLEFONT}"
397 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
398 if $use_setfont ; then
399 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
400 elif $use_consolechars ; then
401 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
404 if [ -n "$CUR_CONSOLE" ] ; then
405 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
417 if ! checkbootparam 'hostname' ; then
421 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
422 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
423 einfo "Generating random hostname as no hostname was specified."
424 HOSTNAME="$(/usr/bin/random-hostname)"
428 einfo "Setting hostname to $HOSTNAME as requested."
429 grml-hostname $HOSTNAME >>$DEBUG
434 # fstabuser (needed when running from harddisk with username != grml {{{
436 # force load of build-in and local config
437 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
438 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
440 # 1st. try configured fstab user
441 if [ -n "$CONFIG_FSTAB_USER" ] ; then
442 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
445 # 2nd. use standard user id
446 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
448 # 3rd. use standard user name
449 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
451 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
452 [ -n "$fstabuser" ] || fstabuser='root'
456 # local_user (needed when running with username != grml {{{
459 # force load of build-in and local config
460 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
461 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
463 # 1st. try id of primary user
464 localuser=$(getent passwd 1000 | cut -d: -f1)
466 # 2nd. use name standard user
467 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
471 # {{{ Set clock (Local time is more often used than GMT, so it is default)
473 # don't touch the files if running from harddisk:
474 if [ -z "$INSTALLED" ]; then
475 # The default hardware clock timezone is stated as representing local time.
478 if [ -f /etc/default/rcS ] ; then
479 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
480 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
481 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
482 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
483 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
484 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
485 elif [ -f /etc/adjtime ] ; then
486 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
487 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
488 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
489 grep -q "^UTC$" /etc/adjtime && UTC="-u"
492 # hwclock uses the TZ variable
493 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
494 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
495 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
496 ewarn "Warning: unknown timezone $KTZ" ; eend 1
498 ewarn "Falling back to timezone $KTZ" ; eend 0
501 if ! [ -r /dev/rtc ] ; then
502 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
505 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
506 if [ -n "$ERROR" ] ; then
508 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
509 if [ -n "$ERROR" ] ; then
510 eerror "Problem running hwclock: $ERROR" ; eend 1
519 # {{{ print kernel info
521 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
522 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
524 einfo "Running Linux Kernel $KERNEL" ; eend 0
527 if [ -r /proc/cpuinfo ] ; then
528 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
530 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
535 if [ -d /proc/xen ] ; then
537 einfo 'Running kernel featuring support for Xen detected' ; eend 0
545 # don't touch the files if running from harddisk:
546 if [ -z "$INSTALLED" ]; then
547 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
548 if [ -n "$KTZ" ] ; then
549 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
551 ewarn "Warning: unknown timezone $KTZ"; eend 0
553 einfo "Setting timezone."
555 area=$(echo $KTZ | cut -d '/' -f1)
556 zone=$(echo $KTZ | cut -d '/' -f2)
557 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
558 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
560 echo $KTZ > /etc/timezone
562 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
569 # activate serial console {{{
571 if checkbootparam 'console'; then
576 einfo "Bootoption for serial console detected:"
580 line="${line#*[$ws]}"
582 while [ -n "$line" ]; do
586 local device="${this%%,*}"
587 local device="${device##*=}"
588 if echo $serial | grep -q ttyS ; then
589 local option="${serial##*,}"
590 # default (works for kvm & CO):
591 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
592 # ... unless overriden by command line:
594 115200*) speed=115200 ;;
595 57600*) speed=57600 ;;
596 38400*) speed=38400 ;;
597 19200*) speed=19200 ;;
604 einfo "Activating console login on device ${device} with speed ${speed}."
605 local number="${device#ttyS}"
606 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
613 this="${line%%[$ws]*}"
614 line="${line#*[$ws]}"
617 if [ -n "$telinitq" ]; then
627 if checkbootparam 'testcd' ; then
628 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
632 local FOUND_FILE=false
633 local logfile='/tmp/md5sum.log'
637 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
638 einfo "Checking files against $md5, this may take a while..."
643 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
644 if [ $pipestatus[1] -eq 0 ] ; then
650 if ! $FOUND_FILE ; then
651 eerror 'Error: Could not find md5sum file' ; eend 1
656 einfo "Everything looks OK" ; eend 0
658 eerror 'Checksum failed for theses files:' ; eend 1
659 egrep -v '(^md5sum:|OK$)' "${logfile}"
660 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
661 einfon "Hit return to continue, or press the power button to shut down system."
670 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
672 if checkbootparam 'blacklist' ; then
673 if [ -z "$INSTALLED" ]; then
674 einfo "Bootoption blacklist found."
675 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
676 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
677 if [ -n "$BLACK" ] ; then
678 for module in $(echo ${BLACK//,/ }) ; do
679 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
680 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
681 echo "blacklist $module" >> "$BLACKLIST_FILE"
682 echo "alias $module off" >> "$BLACKLIST_FILE"
683 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
686 eerror "No given module for blacklist found. Blacklisting will not work therefore."
689 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
691 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
701 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
705 if checkbootparam 'noacpi'; then
706 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
707 elif checkbootparam 'nogrmlacpi' ; then
708 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
709 elif [ ! -d /proc/acpi ] ; then
710 ewarn "ACPI: Kernel support not present." ; eend 0
712 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
715 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
717 basename="${basename%%.*}"
718 case "$basename" in *_acpi)
719 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
721 modprobe $basename >>$DEBUG 2>&1 && found="yes"
722 local BASE="$BASE $basename"
724 if [ -n "$found" ] ; then
725 einfo "$BASE" ; eend 0
727 ewarn "(none)" ; eend 1
729 if ! pgrep acpid >/dev/null ; then
730 einfo "Starting acpi daemon."
731 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
732 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
734 ewarn "acpi daemon already running."
744 if checkbootparam 'brltty' ; then
745 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
750 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
753 NOSWAP="yes" # we do not use swap by default!
754 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
756 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
759 # Scan for swap, config, homedir - but only in live-mode
760 if [ -z "$INSTALLED" ] ; then
761 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
764 HOMEDIR="$(getbootparam 'home')"
765 if [ -n "$partitions" ]; then
766 while read p m f relax; do
767 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
768 partoptions="users,exec"
770 # it's a swap partition?
773 if [ -n "$NOSWAP" ]; then
774 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
777 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
778 S1SUSP|S2SUSP|pmdisk|[zZ]*)
779 if [ -n "$ANYSWAP" ] ; then
780 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
781 swapon $p 2>>$DEBUG ; eend $?
783 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
787 if [[ "$p" == LABEL* ]] ; then
788 p=$(blkid -t $p | awk -F: '{print $1}')
790 if grep -q $p /proc/swaps ; then
791 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
793 if [ -b "$p" ] ; then
794 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
795 swapon $p 2>>$DEBUG ; eend $?
797 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
806 esac # it's a swap partition?
811 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
812 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
814 # *) NONEFOUND='1'; continue ;;
818 if [ -z "$NOSWAP" ] ; then
819 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
820 # Activate swapfile, if exists
821 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
823 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
824 mount -o remount,rw $m && MOUNTED=1
825 if swapon "$SWAPFILE" 2>>$DEBUG ; then
827 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
829 fnew="$SWAPFILE swap swap defaults 0 0"
830 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
831 GRML_SWP="$GRML_SWP $SWAPFILE"
834 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
837 # use a image as home
838 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
839 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
840 if [ -n "$HOMEDIR" ]; then
841 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
845 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
847 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
852 # Umount, if not in use
853 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
865 if checkbootparam 'nocpu'; then
866 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
870 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
872 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)
873 echo $CPU | sed 's/ \{1,\}/ /g'
876 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
879 # no cpufreq setup inside VirtualBox
880 if $VIRTUALBOX ; then
881 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
885 if ! [ -x /etc/init.d/loadcpufreq ] ; then
886 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
890 einfo "Trying to set up cpu frequency scaling:"
893 LOADCPUFREQ=$(mktemp)
894 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
895 if grep -q FATAL "$LOADCPUFREQ" ; then
901 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
902 eerror "$line" ; eend $RC
906 elif grep -q done "$LOADCPUFREQ" ; then
907 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
908 if [ -n "$MODULE" -a "$MODULE" != none ]; then
909 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
912 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
918 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
919 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
920 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
921 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
923 einfo "Setting ondemand governor"
925 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
926 echo ondemand > $file || RC=1
938 # {{{ autostart of ssh
940 if checkbootparam 'ssh' ; then
942 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
945 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
946 [ -z "$localuser" ] && eend 1
949 if [ -z "$PASSWD" ] ; then
950 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
954 if [ -n "$PASSWD" ] ; then
956 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
960 echo "$localuser:$PASSWD" | chpasswd $chpass_options
961 echo "root:$PASSWD" | chpasswd $chpass_options
964 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
968 einfo "Starting secure shell server in background for root and user $localuser"
969 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
970 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
978 # {{{ display hostkeys of SSH server
979 config_display_ssh_fingerprints() {
980 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
981 return 0 # no SSH host keys present
984 einfo "SSH key fingerprints:"
985 for file in /etc/ssh/ssh_host_*_key ; do
987 ssh-keygen -l -f $file
993 # {{{ autostart of x11vnc
995 if checkbootparam 'vnc' ; then
998 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
999 einfo "Bootoption vnc found, trying to set password for user $localuser."
1001 if [ -z "$VNC_PASSWD" ] ; then
1002 if [ -x /usr/bin/apg ] ; then
1003 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1004 elif [ -x /usr/bin/gpw ] ; then
1005 VNC_PASSWD="$(gpw 1)"
1006 elif [ -x /usr/bin/pwgen ] ; then
1007 VNC_PASSWD="$(pwgen -1 8)"
1008 elif [ -x /usr/bin/hexdump ] ; then
1009 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1010 elif [ -n "$RANDOM" ] ; then
1011 VNC_PASSWD="${localuser}${RANDOM}"
1014 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1018 if [ -n "$VNC_PASSWD" ] ; then
1019 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1024 # finally check if we have a password we can use:
1025 if [ -n "$VNC_PASSWD" ] ; then
1027 VNCDIR="/home/${localuser}/.vnc"
1028 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1030 if [ ! -x /usr/bin/x11vnc ] ; then
1031 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1034 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1035 /bin/chown -R "$localuser": "$VNCDIR"
1038 if checkbootparam 'vnc_connect' ; then
1040 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1041 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1042 #store the options in a file
1043 VNCDIR="/home/${localuser}/.vnc"
1044 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1045 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1051 # {{{ set password for root and default user
1053 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1055 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1058 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1059 [ -z "$localuser" ] && eend 1
1062 if [ -z "$PASSWD" ] ; then
1063 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1067 if [ -n "$PASSWD" ] ; then
1069 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1073 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1074 echo "root:$PASSWD" | chpasswd $chpass_options
1077 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1083 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1085 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1087 if [ -z "$PASSWD" ] ; then
1088 eerror "No hashed password found, can not set password."
1094 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1095 [ -z "$localuser" ] && eend 1
1097 if [ -n "$PASSWD" ] ; then
1100 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1101 echo "root:$PASSWD" | chpasswd $chpass_options
1104 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1114 if ! [ -x /usr/bin/amixer ] ; then
1115 eerror "amixer binary not available. Can not set sound volumes therefore."
1118 if ! [ -r /proc/asound/cards ] ; then
1119 ewarn "No soundcard present, skipping mixer settings therefore."
1124 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1125 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1128 if checkbootparam 'vol' ; then
1129 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1130 if [ -z "$VOL" ] ; then
1131 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1139 if checkbootparam 'nosound' ; then
1140 einfo "Muting sound devices on request."
1141 ERROR=$(amixer -q set Master mute)
1143 if [ -n "$ERROR" ] ; then
1145 eerror "Problem muting sound devices: $ERROR"
1149 elif [ -z "$INSTALLED" ] ; then
1150 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1152 if checkbootparam 'micvol' ; then
1153 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1154 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1159 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1163 for CONTROL in ${=CONTROLS} ; do
1164 # such devices can not be controlled with amixer ... unmute
1165 [[ "$CONTROL" == *Console* ]] && continue
1167 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1168 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1169 amixer -c $card -q set "${CONTROL}" unmute
1171 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1172 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1176 if [ ${MICVOL} -ne 0 ] ; then
1177 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1178 amixer -c $card -q set "${CONTROL}" unmute
1180 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1181 amixer -c $card -q set "${CONTROL}" $MICVOL%
1187 fi # checkbootparam 'nosound'
1194 # {{{ syslog service
1196 if checkbootparam 'nosyslog'; then
1197 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1199 einfo "Starting rsyslog in background."
1200 service_wrapper rsyslog start >>$DEBUG &
1208 if checkbootparam 'nogpm'; then
1209 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1211 if ! [ -r /dev/input/mice ] ; then
1212 eerror "No mouse found - not starting GPM." ; eend 1
1214 einfo "Starting gpm in background."
1215 service_wrapper gpm start >>$DEBUG &
1216 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1225 if checkbootparam 'services' ; then
1226 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1227 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1228 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1229 for service in $(echo -e $SERVICELIST) ; do
1230 # support running (custom) init scripts in non-blocking mode
1231 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1232 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1233 einfo "Starting service ${service}."
1234 service_wrapper "${service}" start >>$DEBUG
1236 einfo "Starting service ${service} in background."
1237 service_wrapper "${service}" start >>$DEBUG &
1247 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1248 SOURCE=$(eval echo "$1")
1251 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1252 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1254 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1256 if checkbootparam 'getfile.retries' ; then
1257 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1262 while ! getconfig && [[ "$counter" != 0 ]] ; do
1263 echo -n "Sleeping for 1 second and trying to get config again... "
1264 counter=$(( counter-1 ))
1265 echo "$counter tries left" ; sleep 1
1267 if [ -s "$TARGET" ] ; then
1268 einfo "Downloading was successfull." ; eend 0
1269 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1270 md5sum ${TARGET} ; eend 0
1273 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1281 if checkbootparam 'netconfig' ; then
1282 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1283 CONFIGFILE='/tmp/netconfig.grml'
1285 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1286 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1293 # {{{ remote scripts
1294 config_netscript() {
1295 if checkbootparam 'netscript' ; then
1296 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1297 SCRIPTFILE='/tmp/netscript.grml'
1299 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1300 chmod +x ${SCRIPTFILE}
1301 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1310 if ! checkbootparam 'nostats' ; then
1311 BASE_URL="http://stats.grml.org/report/"
1314 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1316 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1317 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1318 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1319 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1321 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1323 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1324 [ -z "$BOOT" ] && BOOT="local"
1326 ADDITIONAL_PARAMS=""
1327 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1328 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1330 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1332 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1337 # {{{ start X window system via grml-x
1341 ewarn "The startx boot option isn't yet supported via systemd, sorry." ; eend 0
1345 # make sure we start X only if startx is used *before* a nostartx option
1346 # so it's possible to disable automatic X startup using nostart
1347 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1348 if [ -x "$(which X)" ] ; then
1349 if [ -z "$INSTALLED" ] ; then
1350 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1351 if [ -z "$WINDOWMANAGER" ] ; then
1352 einfo "No window manager specified. Using default one." && eend 0
1354 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1356 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1358 cat>|/etc/init.d/xstartup<<EOF
1360 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1362 chmod 755 /etc/init.d/xstartup
1364 # adjust inittab for xstartup
1365 if grep -q '^6:' /etc/inittab ; then
1366 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
1367 else # just append tty6 to inittab if no definition is present:
1368 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
1371 /sbin/telinit q ; eend $?
1373 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1374 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1376 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1380 eerror "We are not running in live mode - startx will not work, skipping it."
1381 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1384 eerror "/usr/bin/X is not present on this grml flavour."
1385 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1391 # {{{ configuration framework
1393 if checkbootparam 'extract' ; then
1394 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1395 EXTRACTOPTIONS="-- -x $EXTRACT"
1399 config_finddcsdir() {
1400 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1401 # on the command line, nothing is changed and the dcs files are
1402 # searched within the .iso, $dcs-dir is set to the root directory
1404 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1405 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1406 # set, $dcs-dir is set to the root directory within the .iso.
1407 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1408 # foo, even if a GRMLCFG partition is present.
1411 # autoconfig, see issue673
1412 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1413 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1414 if checkbootparam 'noautoconfig' ; then
1415 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1416 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1418 if [ -z "$INSTALLED" ] ; then
1419 if checkbootparam 'myconfig' ; then
1420 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1421 if [ -z "$DCSDEVICE" ]; then
1422 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1423 fi # [ -z "$DCSDEVICE" ]
1424 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1425 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1427 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1429 modprobe 9p 2>/dev/null || true
1430 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1431 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1432 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1433 DCSDEVICE="$GRMLCFG"
1434 MOUNTOPTIONS="ro,trans=virtio"
1439 if [ -n "$DCSDEVICE" ]; then
1440 DCSMP="/mnt/grmlcfg"
1445 # if not specified/present then assume default:
1446 if [ -z "$DCSDEVICE" ]; then
1447 DCSDIR="${LIVECD_PATH}"
1450 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1451 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1452 if [ -n "$DCSDIR" ]; then
1453 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1455 [ -d $DCSMP ] || mkdir $DCSMP
1456 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1457 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1458 if [[ $RC == 0 ]]; then
1459 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1461 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1470 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1471 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1472 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1473 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1479 if checkbootparam 'partconf' ; then
1480 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1481 if [ -n "$MOUNTDEVICE" ]; then
1482 [ -d /mnt/grml ] || mkdir /mnt/grml
1483 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1484 if [[ $RC == 0 ]]; then
1485 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1486 einfo "Copying files from $MOUNTDEVICE over grml system."
1487 for file in `cat /etc/grml/partconf` ; do
1488 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1489 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1492 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1493 fi # mount $MOUNTDEVICE
1494 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1496 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1497 fi # [ -n "$MOUNTDEVICE" ]
1502 # {{{ /cdrom/.*-options
1504 if checkbootparam 'debs' ; then
1505 iszsh && setopt localoptions shwordsplit
1506 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1507 if [ -z "$DEBS" ] ; then
1510 if ! echo $DEBS | grep -q '/'; then
1511 # backwards compatibility: if no path is given get debs from debs/
1514 einfo "Trying to install Debian package(s) ${DEBS}"
1515 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1516 dpkg -i $DEBS ; eend $?
1521 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1522 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1523 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1524 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1526 if ! echo $SCRIPTS | grep -q '/'; then
1527 # backwards compatibility: if no path is given get scripts from scripts/
1528 SCRIPTS="scripts/$SCRIPTS"
1530 if [ -n "$SCRIPTS" ]; then
1531 SCRIPTS="${DCSDIR}/$SCRIPTS"
1532 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1533 einfo "Trying to execute ${SCRIPTS}"
1536 elif [ -d "$SCRIPTS" ]; then
1537 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1538 run-parts --regex '.*' $SCRIPTS
1541 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1550 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1551 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1552 if [ -z "$CONFIG" ]; then
1553 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1555 if [ -n "$CONFIG" ]; then
1556 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1557 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1559 cp -a ${DCSDIR}/${CONFIG}/* /
1560 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1561 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1564 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1566 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1573 # {{{ confing_umount_dcsdir
1574 config_umount_dcsdir(){
1575 # umount $DCSMP if it was mounted by finddcsdir
1576 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1582 if checkbootparam 'mypath' ; then
1583 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1584 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1585 touch /etc/grml/my_path
1586 chmod 644 /etc/grml/my_path
1587 # make sure the directories exist:
1589 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1590 if ! [ -d "$i" ] ; then
1591 einfo "Creating directory $i"
1592 mkdir -p "$i" ; eend $?
1595 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1603 [ -n "$INSTALLED" ] && return 0
1605 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1606 checkbootparam 'raid=noautodetect' ; then
1607 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1609 [ -e /proc/mdstat ] || modprobe md_mod
1610 if ! [ -x /sbin/mdadm ] ; then
1611 eerror "mdadm not available, can not execute it." ; eend 1
1614 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1615 # find out whether we have a valid configuration file already
1616 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1617 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1618 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1619 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1621 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1624 if ! checkbootparam 'swraid' ; then
1626 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1629 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1634 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1636 *'No arrays found'*)
1637 ewarn "$line" ; eend 0
1640 einfo "$line" ; eend 0
1647 if [ -r /proc/mdstat ] ; then
1649 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1650 if [ -z "$MDSTAT" ] ; then
1651 ewarn "No active arrays found" ; eend 0
1656 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1657 einfo "active arrays: $line" ; eend 0
1663 fi # bootoption swraid
1665 fi # is /sbin/mdadm executable?
1666 fi # check for bootoptions
1672 [ -n "$INSTALLED" ] && return 0
1674 if checkbootparam 'nodmraid' ; then
1675 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1679 if ! [ -x /sbin/dmraid ] ; then
1680 eerror "dmraid not available, can not execute it." ; eend 1
1685 # usage: dmraid_wrapper <dmraid_option>
1686 [ -n "$1" ] || return 1
1693 for line in $(dmraid $1 ; echo errcode:$?); do
1695 *'no block devices found'*)
1696 einfo "No block devices found" ; eend 0
1700 einfo "No active dmraid devices found" ; eend 0
1719 if checkbootparam 'dmraid' ; then
1720 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1721 if [ "$ACTION" = "off" ] ; then
1722 # Deactivates all active software RAID sets:
1723 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1726 # Activate all software RAID sets discovered:
1727 einfo "Activating present dmraid sets (as requested via dmraid):"
1734 # by default (no special bootoptions) discover all software RAID devices:
1735 einfo "Searching for any present dmraid sets:"
1740 # {{{ LVM (Logical Volumes)
1742 [ -n "$INSTALLED" ] && return 0
1744 if checkbootparam 'nolvm' ; then
1745 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1747 if ! [ -x /sbin/lvm ] ; then
1748 eerror "LVM not available, can not execute it." ; eend 1
1750 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1751 einfo "You seem to have logical volumes (LVM) on your system."
1753 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1755 if checkbootparam 'lvm' ; then
1756 einfo "Bootoption LVM found. Searching for logical volumes:"
1757 service_wrapper lvm2 start ; eend $?
1761 fi # check for lvm binary
1762 fi # check for bootoption nolvm
1766 # {{{ debnet: setup network based on an existing one found on a partition
1768 if checkbootparam 'debnet' ; then
1769 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1775 # {{{ disable console blanking
1777 if checkbootparam 'noblank' ; then
1778 einfo "Bootoption noblank found. Disabling monitor blanking."
1779 setterm -blank 0 ; eend $?
1784 # {{{ debootstrap: automatic installation
1785 config_debootstrap(){
1787 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1789 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1791 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1793 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1798 if checkbootparam 'target' ; then
1800 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1801 # notice: the following checks whether the given partition is available, if not the skip
1802 # execution of grml-debootstrap as it might result in data loss...
1803 if ! [ -r "$TARGET" ] ; then
1804 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1808 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1813 if checkbootparam 'grub' ; then
1815 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1818 if checkbootparam 'groot' ; then
1820 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1823 if checkbootparam 'release' ; then
1825 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1828 if checkbootparam 'mirror' ; then
1830 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1833 if checkbootparam 'boot_append' ; then
1835 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1838 if checkbootparam 'password' ; then
1840 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1843 # now check which options are available
1844 if [ -n "TARGET" ] ; then
1845 TARGETCMD="--target $TARGET"
1849 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1853 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1854 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1855 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1856 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1857 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1858 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1860 # and finally write script and execute it
1861 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1863 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1866 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1868 screen /usr/bin/grml-debootstrap_noninteractive
1869 einfo "Invoking a shell, just exit to continue booting..."
1872 fi # checkbootparam "BOOT_IMAGE=debian2hd
1876 # {{{ virtualbox shared folders
1877 config_virtualbox_shared_folders() {
1878 if $VIRTUALBOX ; then
1879 einfo "VirtualBox detected, trying to set up Shared Folders."
1880 if ! modinfo vboxsf &>/dev/null ; then
1881 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1883 elif ! [ -x /usr/sbin/VBoxService ] ; then
1884 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1889 einfo "Loading vboxsf driver."
1890 lsmod | grep -q vboxsf || modprobe vboxsf
1893 einfo "Adjusting /dev/vboxguest."
1894 chown root:vboxsf /dev/vboxguest
1895 chmod 660 /dev/vboxguest
1900 einfo "Adding $fstabuser to group vboxsf."
1901 adduser grml vboxsf &>/dev/null
1904 einfo "Starting VBoxService."
1905 VBoxService >/dev/null
1908 local vbautomation='automation'
1909 if checkbootparam 'vbautomation'; then
1910 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1913 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1914 ewarn "No automount shared folder '$vbautomation' available"
1917 einfo "Found automount shared folder '$vbautomation'"
1920 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1921 [ -n "$distri" ] || distri='grml'
1923 local vbox_auto_sf="/media/sf_${vbautomation}"
1925 sleep 1 # ugly but necessary
1929 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1930 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1932 counter=$(( counter-1 ))
1937 if ! [ -d "${vbox_auto_sf}" ] ; then
1938 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1941 einfo "Found shared folders automation directory $vbox_auto_sf"
1945 if checkbootparam 'novbautomation' ; then
1946 einfo "Bootoption novbautomation found. Disabling automation script execution."
1949 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1950 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1953 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1954 "${vbox_auto_sf}/${distri}"
1968 # {{{ Support customization
1970 if checkbootparam 'distri'; then
1971 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1972 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1973 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1974 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1975 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1976 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1982 ## END OF FILE #################################################################
1983 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2