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."
700 if checkbootparam 'noacpi'; then
701 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
702 elif checkbootparam 'nogrmlacpi' ; then
703 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
704 elif [ ! -d /proc/acpi ] ; then
705 ewarn "ACPI: Kernel support not present." ; eend 0
707 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
710 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
712 basename="${basename%%.*}"
713 case "$basename" in *_acpi)
714 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
716 modprobe $basename >>$DEBUG 2>&1 && found="yes"
717 local BASE="$BASE $basename"
719 if [ -n "$found" ] ; then
720 einfo "$BASE" ; eend 0
722 ewarn "(none)" ; eend 1
724 if ! pgrep acpid >/dev/null ; then
725 einfo "Starting acpi daemon."
726 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
727 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
729 ewarn "acpi daemon already running."
739 if checkbootparam 'brltty' ; then
740 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
745 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
748 NOSWAP="yes" # we do not use swap by default!
749 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
751 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
754 # Scan for swap, config, homedir - but only in live-mode
755 if [ -z "$INSTALLED" ] ; then
756 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
759 HOMEDIR="$(getbootparam 'home')"
760 if [ -n "$partitions" ]; then
761 while read p m f relax; do
762 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
763 partoptions="users,exec"
765 # it's a swap partition?
768 if [ -n "$NOSWAP" ]; then
769 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
772 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
773 S1SUSP|S2SUSP|pmdisk|[zZ]*)
774 if [ -n "$ANYSWAP" ] ; then
775 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
776 swapon $p 2>>$DEBUG ; eend $?
778 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
782 if [[ "$p" == LABEL* ]] ; then
783 p=$(blkid -t $p | awk -F: '{print $1}')
785 if grep -q $p /proc/swaps ; then
786 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
788 if [ -b "$p" ] ; then
789 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
790 swapon $p 2>>$DEBUG ; eend $?
792 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
801 esac # it's a swap partition?
806 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
807 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
809 # *) NONEFOUND='1'; continue ;;
813 if [ -z "$NOSWAP" ] ; then
814 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
815 # Activate swapfile, if exists
816 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
818 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
819 mount -o remount,rw $m && MOUNTED=1
820 if swapon "$SWAPFILE" 2>>$DEBUG ; then
822 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
824 fnew="$SWAPFILE swap swap defaults 0 0"
825 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
826 GRML_SWP="$GRML_SWP $SWAPFILE"
829 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
832 # use a image as home
833 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
834 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
835 if [ -n "$HOMEDIR" ]; then
836 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
840 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
842 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
847 # Umount, if not in use
848 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
860 if checkbootparam 'nocpu'; then
861 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
865 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
867 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)
868 echo $CPU | sed 's/ \{1,\}/ /g'
871 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
874 # no cpufreq setup inside VirtualBox
875 if $VIRTUALBOX ; then
876 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
880 if ! [ -x /etc/init.d/loadcpufreq ] ; then
881 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
885 einfo "Trying to set up cpu frequency scaling:"
888 LOADCPUFREQ=$(mktemp)
889 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
890 if grep -q FATAL "$LOADCPUFREQ" ; then
896 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
897 eerror "$line" ; eend $RC
901 elif grep -q done "$LOADCPUFREQ" ; then
902 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
903 if [ -n "$MODULE" -a "$MODULE" != none ]; then
904 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
907 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
913 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
914 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
915 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
916 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
918 einfo "Setting ondemand governor"
920 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
921 echo ondemand > $file || RC=1
933 # {{{ autostart of ssh
935 if checkbootparam 'ssh' ; then
937 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
940 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
941 [ -z "$localuser" ] && eend 1
944 if [ -z "$PASSWD" ] ; then
945 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
949 if [ -n "$PASSWD" ] ; then
951 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
955 echo "$localuser:$PASSWD" | chpasswd $chpass_options
956 echo "root:$PASSWD" | chpasswd $chpass_options
959 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
963 einfo "Starting secure shell server in background for root and user $localuser"
964 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
965 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
973 # {{{ display hostkeys of SSH server
974 config_display_ssh_fingerprints() {
975 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
976 return 0 # no SSH host keys present
979 einfo "SSH key fingerprints:"
980 for file in /etc/ssh/ssh_host_*_key ; do
982 ssh-keygen -l -f $file
988 # {{{ autostart of x11vnc
990 if checkbootparam 'vnc' ; then
993 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
994 einfo "Bootoption vnc found, trying to set password for user $localuser."
996 if [ -z "$VNC_PASSWD" ] ; then
997 if [ -x /usr/bin/apg ] ; then
998 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
999 elif [ -x /usr/bin/gpw ] ; then
1000 VNC_PASSWD="$(gpw 1)"
1001 elif [ -x /usr/bin/pwgen ] ; then
1002 VNC_PASSWD="$(pwgen -1 8)"
1003 elif [ -x /usr/bin/hexdump ] ; then
1004 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1005 elif [ -n "$RANDOM" ] ; then
1006 VNC_PASSWD="${localuser}${RANDOM}"
1009 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1013 if [ -n "$VNC_PASSWD" ] ; then
1014 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1019 # finally check if we have a password we can use:
1020 if [ -n "$VNC_PASSWD" ] ; then
1022 VNCDIR="/home/${localuser}/.vnc"
1023 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1025 if [ ! -x /usr/bin/x11vnc ] ; then
1026 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1029 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1030 /bin/chown -R "$localuser": "$VNCDIR"
1033 if checkbootparam 'vnc_connect' ; then
1035 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1036 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1037 #store the options in a file
1038 VNCDIR="/home/${localuser}/.vnc"
1039 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1040 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1046 # {{{ set password for root and default user
1048 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1050 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1053 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1054 [ -z "$localuser" ] && eend 1
1057 if [ -z "$PASSWD" ] ; then
1058 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1062 if [ -n "$PASSWD" ] ; then
1064 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1068 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1069 echo "root:$PASSWD" | chpasswd $chpass_options
1072 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1078 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1080 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1082 if [ -z "$PASSWD" ] ; then
1083 eerror "No hashed password found, can not set password."
1089 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1090 [ -z "$localuser" ] && eend 1
1092 if [ -n "$PASSWD" ] ; then
1095 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1096 echo "root:$PASSWD" | chpasswd $chpass_options
1099 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1109 if ! [ -x /usr/bin/amixer ] ; then
1110 eerror "amixer binary not available. Can not set sound volumes therefore."
1113 if ! [ -r /proc/asound/cards ] ; then
1114 ewarn "No soundcard present, skipping mixer settings therefore."
1119 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1120 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1123 if checkbootparam 'vol' ; then
1124 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1125 if [ -z "$VOL" ] ; then
1126 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1134 if checkbootparam 'nosound' ; then
1135 einfo "Muting sound devices on request."
1136 ERROR=$(amixer -q set Master mute)
1138 if [ -n "$ERROR" ] ; then
1140 eerror "Problem muting sound devices: $ERROR"
1144 elif [ -z "$INSTALLED" ] ; then
1145 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1147 if checkbootparam 'micvol' ; then
1148 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1149 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1154 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1158 for CONTROL in ${=CONTROLS} ; do
1159 # such devices can not be controlled with amixer ... unmute
1160 [[ "$CONTROL" == *Console* ]] && continue
1162 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1163 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1164 amixer -c $card -q set "${CONTROL}" unmute
1166 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1167 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1171 if [ ${MICVOL} -ne 0 ] ; then
1172 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1173 amixer -c $card -q set "${CONTROL}" unmute
1175 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1176 amixer -c $card -q set "${CONTROL}" $MICVOL%
1182 fi # checkbootparam 'nosound'
1189 # {{{ syslog service
1191 if checkbootparam 'nosyslog'; then
1192 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1194 einfo "Starting rsyslog in background."
1195 service_wrapper rsyslog start >>$DEBUG &
1203 if checkbootparam 'nogpm'; then
1204 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1206 if ! [ -r /dev/input/mice ] ; then
1207 eerror "No mouse found - not starting GPM." ; eend 1
1209 einfo "Starting gpm in background."
1210 service_wrapper gpm start >>$DEBUG &
1211 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1220 if checkbootparam 'services' ; then
1221 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1222 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1223 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1224 for service in $(echo -e $SERVICELIST) ; do
1225 # support running (custom) init scripts in non-blocking mode
1226 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1227 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1228 einfo "Starting service ${service}."
1229 service_wrapper "${service}" start >>$DEBUG
1231 einfo "Starting service ${service} in background."
1232 service_wrapper "${service}" start >>$DEBUG &
1242 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1243 SOURCE=$(eval echo "$1")
1246 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1247 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1249 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1251 if checkbootparam 'getfile.retries' ; then
1252 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1257 while ! getconfig && [[ "$counter" != 0 ]] ; do
1258 echo -n "Sleeping for 1 second and trying to get config again... "
1259 counter=$(( counter-1 ))
1260 echo "$counter tries left" ; sleep 1
1262 if [ -s "$TARGET" ] ; then
1263 einfo "Downloading was successfull." ; eend 0
1264 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1265 md5sum ${TARGET} ; eend 0
1268 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1276 if checkbootparam 'netconfig' ; then
1277 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1278 CONFIGFILE='/tmp/netconfig.grml'
1280 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1281 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1288 # {{{ remote scripts
1289 config_netscript() {
1290 if checkbootparam 'netscript' ; then
1291 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1292 SCRIPTFILE='/tmp/netscript.grml'
1294 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1295 chmod +x ${SCRIPTFILE}
1296 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1305 if ! checkbootparam 'nostats' ; then
1306 BASE_URL="http://stats.grml.org/report/"
1309 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1311 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1312 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1313 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1314 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1316 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1318 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1319 [ -z "$BOOT" ] && BOOT="local"
1321 ADDITIONAL_PARAMS=""
1322 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1323 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1325 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1327 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1332 # {{{ start X window system via grml-x
1336 ewarn "The startx boot option isn't yet supported via systemd, sorry." ; eend 0
1340 # make sure we start X only if startx is used *before* a nostartx option
1341 # so it's possible to disable automatic X startup using nostart
1342 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1343 if [ -x "$(which X)" ] ; then
1344 if [ -z "$INSTALLED" ] ; then
1345 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1346 if [ -z "$WINDOWMANAGER" ] ; then
1347 einfo "No window manager specified. Using default one." && eend 0
1349 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1351 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1353 cat>|/etc/init.d/xstartup<<EOF
1355 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1357 chmod 755 /etc/init.d/xstartup
1359 # adjust inittab for xstartup
1360 if grep -q '^6:' /etc/inittab ; then
1361 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
1362 else # just append tty6 to inittab if no definition is present:
1363 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
1366 /sbin/telinit q ; eend $?
1368 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1369 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1371 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1375 eerror "We are not running in live mode - startx will not work, skipping it."
1376 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1379 eerror "/usr/bin/X is not present on this grml flavour."
1380 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1386 # {{{ configuration framework
1388 if checkbootparam 'extract' ; then
1389 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1390 EXTRACTOPTIONS="-- -x $EXTRACT"
1394 config_finddcsdir() {
1395 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1396 # on the command line, nothing is changed and the dcs files are
1397 # searched within the .iso, $dcs-dir is set to the root directory
1399 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1400 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1401 # set, $dcs-dir is set to the root directory within the .iso.
1402 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1403 # foo, even if a GRMLCFG partition is present.
1406 # autoconfig, see issue673
1407 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1408 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1409 if checkbootparam 'noautoconfig' ; then
1410 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1411 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1413 if [ -z "$INSTALLED" ] ; then
1414 if checkbootparam 'myconfig' ; then
1415 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1416 if [ -z "$DCSDEVICE" ]; then
1417 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1418 fi # [ -z "$DCSDEVICE" ]
1419 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1420 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1422 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1424 modprobe 9p 2>/dev/null || true
1425 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1426 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1427 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1428 DCSDEVICE="$GRMLCFG"
1429 MOUNTOPTIONS="ro,trans=virtio"
1434 if [ -n "$DCSDEVICE" ]; then
1435 DCSMP="/mnt/grmlcfg"
1440 # if not specified/present then assume default:
1441 if [ -z "$DCSDEVICE" ]; then
1442 DCSDIR="${LIVECD_PATH}"
1445 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1446 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1447 if [ -n "$DCSDIR" ]; then
1448 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1450 [ -d $DCSMP ] || mkdir $DCSMP
1451 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1452 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1453 if [[ $RC == 0 ]]; then
1454 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1456 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1465 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1466 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1467 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1468 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1474 if checkbootparam 'partconf' ; then
1475 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1476 if [ -n "$MOUNTDEVICE" ]; then
1477 [ -d /mnt/grml ] || mkdir /mnt/grml
1478 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1479 if [[ $RC == 0 ]]; then
1480 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1481 einfo "Copying files from $MOUNTDEVICE over grml system."
1482 for file in `cat /etc/grml/partconf` ; do
1483 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1484 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1487 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1488 fi # mount $MOUNTDEVICE
1489 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1491 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1492 fi # [ -n "$MOUNTDEVICE" ]
1497 # {{{ /cdrom/.*-options
1499 if checkbootparam 'debs' ; then
1500 iszsh && setopt localoptions shwordsplit
1501 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1502 if [ -z "$DEBS" ] ; then
1505 if ! echo $DEBS | grep -q '/'; then
1506 # backwards compatibility: if no path is given get debs from debs/
1509 einfo "Trying to install Debian package(s) ${DEBS}"
1510 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1511 dpkg -i $DEBS ; eend $?
1516 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1517 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1518 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1519 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1521 if ! echo $SCRIPTS | grep -q '/'; then
1522 # backwards compatibility: if no path is given get scripts from scripts/
1523 SCRIPTS="scripts/$SCRIPTS"
1525 if [ -n "$SCRIPTS" ]; then
1526 SCRIPTS="${DCSDIR}/$SCRIPTS"
1527 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1528 einfo "Trying to execute ${SCRIPTS}"
1531 elif [ -d "$SCRIPTS" ]; then
1532 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1533 run-parts --regex '.*' $SCRIPTS
1536 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1545 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1546 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1547 if [ -z "$CONFIG" ]; then
1548 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1550 if [ -n "$CONFIG" ]; then
1551 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1552 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1554 cp -a ${DCSDIR}/${CONFIG}/* /
1555 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1556 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1559 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1561 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1568 # {{{ confing_umount_dcsdir
1569 config_umount_dcsdir(){
1570 # umount $DCSMP if it was mounted by finddcsdir
1571 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1577 if checkbootparam 'mypath' ; then
1578 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1579 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1580 touch /etc/grml/my_path
1581 chmod 644 /etc/grml/my_path
1582 # make sure the directories exist:
1584 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1585 if ! [ -d "$i" ] ; then
1586 einfo "Creating directory $i"
1587 mkdir -p "$i" ; eend $?
1590 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1598 [ -n "$INSTALLED" ] && return 0
1600 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1601 checkbootparam 'raid=noautodetect' ; then
1602 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1604 [ -e /proc/mdstat ] || modprobe md_mod
1605 if ! [ -x /sbin/mdadm ] ; then
1606 eerror "mdadm not available, can not execute it." ; eend 1
1609 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1610 # find out whether we have a valid configuration file already
1611 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1612 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1613 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1614 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1616 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1619 if ! checkbootparam 'swraid' ; then
1621 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1624 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1629 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1631 *'No arrays found'*)
1632 ewarn "$line" ; eend 0
1635 einfo "$line" ; eend 0
1642 if [ -r /proc/mdstat ] ; then
1644 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1645 if [ -z "$MDSTAT" ] ; then
1646 ewarn "No active arrays found" ; eend 0
1651 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1652 einfo "active arrays: $line" ; eend 0
1658 fi # bootoption swraid
1660 fi # is /sbin/mdadm executable?
1661 fi # check for bootoptions
1667 [ -n "$INSTALLED" ] && return 0
1669 if checkbootparam 'nodmraid' ; then
1670 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1674 if ! [ -x /sbin/dmraid ] ; then
1675 eerror "dmraid not available, can not execute it." ; eend 1
1680 # usage: dmraid_wrapper <dmraid_option>
1681 [ -n "$1" ] || return 1
1688 for line in $(dmraid $1 ; echo errcode:$?); do
1690 *'no block devices found'*)
1691 einfo "No block devices found" ; eend 0
1695 einfo "No active dmraid devices found" ; eend 0
1714 if checkbootparam 'dmraid' ; then
1715 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1716 if [ "$ACTION" = "off" ] ; then
1717 # Deactivates all active software RAID sets:
1718 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1721 # Activate all software RAID sets discovered:
1722 einfo "Activating present dmraid sets (as requested via dmraid):"
1729 # by default (no special bootoptions) discover all software RAID devices:
1730 einfo "Searching for any present dmraid sets:"
1735 # {{{ LVM (Logical Volumes)
1737 [ -n "$INSTALLED" ] && return 0
1739 if checkbootparam 'nolvm' ; then
1740 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1742 if ! [ -x /sbin/lvm ] ; then
1743 eerror "LVM not available, can not execute it." ; eend 1
1745 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1746 einfo "You seem to have logical volumes (LVM) on your system."
1748 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1750 if checkbootparam 'lvm' ; then
1751 einfo "Bootoption LVM found. Searching for logical volumes:"
1752 service_wrapper lvm2 start ; eend $?
1756 fi # check for lvm binary
1757 fi # check for bootoption nolvm
1761 # {{{ debnet: setup network based on an existing one found on a partition
1763 if checkbootparam 'debnet' ; then
1764 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1770 # {{{ disable console blanking
1772 if checkbootparam 'noblank' ; then
1773 einfo "Bootoption noblank found. Disabling monitor blanking."
1774 setterm -blank 0 ; eend $?
1779 # {{{ debootstrap: automatic installation
1780 config_debootstrap(){
1782 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1784 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1786 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1788 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1793 if checkbootparam 'target' ; then
1795 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1796 # notice: the following checks whether the given partition is available, if not the skip
1797 # execution of grml-debootstrap as it might result in data loss...
1798 if ! [ -r "$TARGET" ] ; then
1799 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1803 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1808 if checkbootparam 'grub' ; then
1810 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1813 if checkbootparam 'groot' ; then
1815 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1818 if checkbootparam 'release' ; then
1820 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1823 if checkbootparam 'mirror' ; then
1825 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1828 if checkbootparam 'boot_append' ; then
1830 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1833 if checkbootparam 'password' ; then
1835 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1838 # now check which options are available
1839 if [ -n "TARGET" ] ; then
1840 TARGETCMD="--target $TARGET"
1844 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1848 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1849 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1850 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1851 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1852 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1853 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1855 # and finally write script and execute it
1856 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1858 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1861 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1863 screen /usr/bin/grml-debootstrap_noninteractive
1864 einfo "Invoking a shell, just exit to continue booting..."
1867 fi # checkbootparam "BOOT_IMAGE=debian2hd
1871 # {{{ virtualbox shared folders
1872 config_virtualbox_shared_folders() {
1873 if $VIRTUALBOX ; then
1874 einfo "VirtualBox detected, trying to set up Shared Folders."
1875 if ! modinfo vboxsf &>/dev/null ; then
1876 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1878 elif ! [ -x /usr/sbin/VBoxService ] ; then
1879 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1884 einfo "Loading vboxsf driver."
1885 lsmod | grep -q vboxsf || modprobe vboxsf
1888 einfo "Adjusting /dev/vboxguest."
1889 chown root:vboxsf /dev/vboxguest
1890 chmod 660 /dev/vboxguest
1895 einfo "Adding $fstabuser to group vboxsf."
1896 adduser grml vboxsf &>/dev/null
1899 einfo "Starting VBoxService."
1900 VBoxService >/dev/null
1903 local vbautomation='automation'
1904 if checkbootparam 'vbautomation'; then
1905 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1908 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1909 ewarn "No automount shared folder '$vbautomation' available"
1912 einfo "Found automount shared folder '$vbautomation'"
1915 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1916 [ -n "$distri" ] || distri='grml'
1918 local vbox_auto_sf="/media/sf_${vbautomation}"
1920 sleep 1 # ugly but necessary
1924 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1925 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1927 counter=$(( counter-1 ))
1932 if ! [ -d "${vbox_auto_sf}" ] ; then
1933 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1936 einfo "Found shared folders automation directory $vbox_auto_sf"
1940 if checkbootparam 'novbautomation' ; then
1941 einfo "Bootoption novbautomation found. Disabling automation script execution."
1944 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1945 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1948 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1949 "${vbox_auto_sf}/${distri}"
1963 # {{{ Support customization
1965 if checkbootparam 'distri'; then
1966 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1967 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1968 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
1969 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1970 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1971 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1977 ## END OF FILE #################################################################
1978 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2