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 if [ -x /usr/bin/mokutil ] ; then
546 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
547 if [ -n "$secstate" ] ; then
548 einfo "SecureBoot is enabled" ; eend 0
550 ewarn "SecureBoot not detected" ; eend 0
553 if modprobe efivars &>/dev/null ; then
554 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
555 einfo "SecureBoot is enabled" ; eend 0
557 ewarn "SecureBoot not detected" ; eend 0
566 # don't touch the files if running from harddisk:
567 if [ -z "$INSTALLED" ]; then
568 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
569 if [ -n "$KTZ" ] ; then
570 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
572 ewarn "Warning: unknown timezone $KTZ"; eend 0
574 einfo "Setting timezone."
576 area=$(echo $KTZ | cut -d '/' -f1)
577 zone=$(echo $KTZ | cut -d '/' -f2)
578 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
579 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
581 echo $KTZ > /etc/timezone
583 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
590 # activate serial console {{{
592 if checkbootparam 'console'; then
597 einfo "Bootoption for serial console detected:"
601 line="${line#*[$ws]}"
603 while [ -n "$line" ]; do
607 local device="${this%%,*}"
608 local device="${device##*=}"
609 if echo $serial | grep -q ttyS ; then
610 local option="${serial##*,}"
611 # default (works for kvm & CO):
612 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
613 # ... unless overriden by command line:
615 115200*) speed=115200 ;;
616 57600*) speed=57600 ;;
617 38400*) speed=38400 ;;
618 19200*) speed=19200 ;;
625 einfo "Activating console login on device ${device} with speed ${speed}."
626 local number="${device#ttyS}"
627 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
634 this="${line%%[$ws]*}"
635 line="${line#*[$ws]}"
638 if [ -n "$telinitq" ]; then
648 if checkbootparam 'testcd' ; then
649 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
653 local FOUND_FILE=false
654 local logfile='/tmp/md5sum.log'
658 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
659 einfo "Checking files against $md5, this may take a while..."
664 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
665 if [ $pipestatus[1] -eq 0 ] ; then
671 if ! $FOUND_FILE ; then
672 eerror 'Error: Could not find md5sum file' ; eend 1
677 einfo "Everything looks OK" ; eend 0
679 eerror 'Checksum failed for theses files:' ; eend 1
680 egrep -v '(^md5sum:|OK$)' "${logfile}"
681 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
682 einfon "Hit return to continue, or press the power button to shut down system."
691 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
693 if checkbootparam 'blacklist' ; then
694 if [ -z "$INSTALLED" ]; then
695 einfo "Bootoption blacklist found."
696 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
697 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
698 if [ -n "$BLACK" ] ; then
699 for module in $(echo ${BLACK//,/ }) ; do
700 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
701 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
702 echo "blacklist $module" >> "$BLACKLIST_FILE"
703 echo "alias $module off" >> "$BLACKLIST_FILE"
704 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
707 eerror "No given module for blacklist found. Blacklisting will not work therefore."
710 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
712 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
722 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
726 if checkbootparam 'noacpi'; then
727 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
728 elif checkbootparam 'nogrmlacpi' ; then
729 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
730 elif [ ! -d /proc/acpi ] ; then
731 ewarn "ACPI: Kernel support not present." ; eend 0
733 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
736 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
738 basename="${basename%%.*}"
739 case "$basename" in *_acpi)
740 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
742 modprobe $basename >>$DEBUG 2>&1 && found="yes"
743 local BASE="$BASE $basename"
745 if [ -n "$found" ] ; then
746 einfo "$BASE" ; eend 0
748 ewarn "(none)" ; eend 1
750 if ! pgrep acpid >/dev/null ; then
751 einfo "Starting acpi daemon."
752 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
753 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
755 ewarn "acpi daemon already running."
765 if checkbootparam 'brltty' ; then
766 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
771 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
774 NOSWAP="yes" # we do not use swap by default!
775 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
777 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
780 # Scan for swap, config, homedir - but only in live-mode
781 if [ -z "$INSTALLED" ] ; then
782 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
785 HOMEDIR="$(getbootparam 'home')"
786 if [ -n "$partitions" ]; then
787 while read p m f relax; do
788 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
789 partoptions="users,exec"
791 # it's a swap partition?
794 if [ -n "$NOSWAP" ]; then
795 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
798 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
799 S1SUSP|S2SUSP|pmdisk|[zZ]*)
800 if [ -n "$ANYSWAP" ] ; then
801 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
802 swapon $p 2>>$DEBUG ; eend $?
804 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
808 if [[ "$p" == LABEL* ]] ; then
809 p=$(blkid -t $p | awk -F: '{print $1}')
811 if grep -q $p /proc/swaps ; then
812 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
814 if [ -b "$p" ] ; then
815 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
816 swapon $p 2>>$DEBUG ; eend $?
818 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
827 esac # it's a swap partition?
832 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
833 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
835 # *) NONEFOUND='1'; continue ;;
839 if [ -z "$NOSWAP" ] ; then
840 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
841 # Activate swapfile, if exists
842 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
844 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
845 mount -o remount,rw $m && MOUNTED=1
846 if swapon "$SWAPFILE" 2>>$DEBUG ; then
848 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
850 fnew="$SWAPFILE swap swap defaults 0 0"
851 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
852 GRML_SWP="$GRML_SWP $SWAPFILE"
855 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
858 # use a image as home
859 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
860 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
861 if [ -n "$HOMEDIR" ]; then
862 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
866 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
868 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
873 # Umount, if not in use
874 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
886 if checkbootparam 'nocpu'; then
887 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
891 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
893 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)
894 echo $CPU | sed 's/ \{1,\}/ /g'
897 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
900 # no cpufreq setup inside VirtualBox
901 if $VIRTUALBOX ; then
902 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
906 if ! [ -x /etc/init.d/loadcpufreq ] ; then
907 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
911 einfo "Trying to set up cpu frequency scaling:"
914 LOADCPUFREQ=$(mktemp)
915 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
916 if grep -q FATAL "$LOADCPUFREQ" ; then
922 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
923 eerror "$line" ; eend $RC
927 elif grep -q done "$LOADCPUFREQ" ; then
928 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
929 if [ -n "$MODULE" -a "$MODULE" != none ]; then
930 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
933 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
939 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
940 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
941 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
942 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
944 einfo "Setting ondemand governor"
946 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
947 echo ondemand > $file || RC=1
959 # {{{ autostart of ssh
961 if checkbootparam 'ssh' ; then
963 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
966 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
967 [ -z "$localuser" ] && eend 1
970 if [ -z "$PASSWD" ] ; then
971 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
975 if [ -n "$PASSWD" ] ; then
977 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
981 echo "$localuser:$PASSWD" | chpasswd $chpass_options
982 echo "root:$PASSWD" | chpasswd $chpass_options
985 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
989 einfo "Starting secure shell server in background for root and user $localuser"
990 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
991 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
999 # {{{ display hostkeys of SSH server
1000 config_display_ssh_fingerprints() {
1001 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
1002 return 0 # no SSH host keys present
1005 einfo "SSH key fingerprints:"
1006 for file in /etc/ssh/ssh_host_*_key ; do
1008 ssh-keygen -l -f $file
1014 # {{{ autostart of x11vnc
1016 if checkbootparam 'vnc' ; then
1019 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1020 einfo "Bootoption vnc found, trying to set password for user $localuser."
1022 if [ -z "$VNC_PASSWD" ] ; then
1023 if [ -x /usr/bin/apg ] ; then
1024 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1025 elif [ -x /usr/bin/gpw ] ; then
1026 VNC_PASSWD="$(gpw 1)"
1027 elif [ -x /usr/bin/pwgen ] ; then
1028 VNC_PASSWD="$(pwgen -1 8)"
1029 elif [ -x /usr/bin/hexdump ] ; then
1030 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1031 elif [ -n "$RANDOM" ] ; then
1032 VNC_PASSWD="${localuser}${RANDOM}"
1035 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1039 if [ -n "$VNC_PASSWD" ] ; then
1040 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1045 # finally check if we have a password we can use:
1046 if [ -n "$VNC_PASSWD" ] ; then
1048 VNCDIR="/home/${localuser}/.vnc"
1049 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1051 if [ ! -x /usr/bin/x11vnc ] ; then
1052 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1055 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1056 /bin/chown -R "$localuser": "$VNCDIR"
1059 if checkbootparam 'vnc_connect' ; then
1061 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1062 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1063 #store the options in a file
1064 VNCDIR="/home/${localuser}/.vnc"
1065 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1066 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1072 # {{{ set password for root and default user
1074 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1076 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1079 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1080 [ -z "$localuser" ] && eend 1
1083 if [ -z "$PASSWD" ] ; then
1084 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1088 if [ -n "$PASSWD" ] ; then
1090 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1094 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1095 echo "root:$PASSWD" | chpasswd $chpass_options
1098 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1104 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1106 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1108 if [ -z "$PASSWD" ] ; then
1109 eerror "No hashed password found, can not set password."
1115 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1116 [ -z "$localuser" ] && eend 1
1118 if [ -n "$PASSWD" ] ; then
1121 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1122 echo "root:$PASSWD" | chpasswd $chpass_options
1125 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1135 if ! [ -x /usr/bin/amixer ] ; then
1136 eerror "amixer binary not available. Can not set sound volumes therefore."
1139 if ! [ -r /proc/asound/cards ] ; then
1140 ewarn "No soundcard present, skipping mixer settings therefore."
1145 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1146 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1149 if checkbootparam 'vol' ; then
1150 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1151 if [ -z "$VOL" ] ; then
1152 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1160 if checkbootparam 'nosound' ; then
1161 einfo "Muting sound devices on request."
1162 ERROR=$(amixer -q set Master mute)
1164 if [ -n "$ERROR" ] ; then
1166 eerror "Problem muting sound devices: $ERROR"
1170 elif [ -z "$INSTALLED" ] ; then
1171 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1173 if checkbootparam 'micvol' ; then
1174 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1175 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1180 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1184 for CONTROL in ${=CONTROLS} ; do
1185 # such devices can not be controlled with amixer ... unmute
1186 [[ "$CONTROL" == *Console* ]] && continue
1188 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1189 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1190 amixer -c $card -q set "${CONTROL}" unmute
1192 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1193 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1197 if [ ${MICVOL} -ne 0 ] ; then
1198 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1199 amixer -c $card -q set "${CONTROL}" unmute
1201 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1202 amixer -c $card -q set "${CONTROL}" $MICVOL%
1208 fi # checkbootparam 'nosound'
1215 # {{{ syslog service
1217 if checkbootparam 'nosyslog'; then
1218 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1220 einfo "Starting rsyslog in background."
1221 service_wrapper rsyslog start >>$DEBUG &
1229 if checkbootparam 'nogpm'; then
1230 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1232 if ! [ -r /dev/input/mice ] ; then
1233 eerror "No mouse found - not starting GPM." ; eend 1
1235 einfo "Starting gpm in background."
1236 service_wrapper gpm start >>$DEBUG &
1237 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1246 if checkbootparam 'services' ; then
1247 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1248 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1249 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1250 for service in $(echo -e $SERVICELIST) ; do
1251 # support running (custom) init scripts in non-blocking mode
1252 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1253 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1254 einfo "Starting service ${service}."
1255 service_wrapper "${service}" start >>$DEBUG
1257 einfo "Starting service ${service} in background."
1258 service_wrapper "${service}" start >>$DEBUG &
1268 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1269 SOURCE=$(eval echo "$1")
1272 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1273 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1275 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1277 if checkbootparam 'getfile.retries' ; then
1278 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1283 while ! getconfig && [[ "$counter" != 0 ]] ; do
1284 echo -n "Sleeping for 1 second and trying to get config again... "
1285 counter=$(( counter-1 ))
1286 echo "$counter tries left" ; sleep 1
1288 if [ -s "$TARGET" ] ; then
1289 einfo "Downloading was successfull." ; eend 0
1290 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1291 md5sum ${TARGET} ; eend 0
1294 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1302 if checkbootparam 'netconfig' ; then
1303 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1304 CONFIGFILE='/tmp/netconfig.grml'
1306 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1307 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1314 # {{{ remote scripts
1315 config_netscript() {
1316 if checkbootparam 'netscript' ; then
1317 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1318 SCRIPTFILE='/tmp/netscript.grml'
1320 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1321 chmod +x ${SCRIPTFILE}
1322 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1331 if ! checkbootparam 'nostats' ; then
1332 BASE_URL="http://stats.grml.org/report/"
1335 HOST_ID=$(cat /proc/sys/kernel/random/boot_id)
1337 grep -q " lm " /proc/cpuinfo && HAS_64BIT="1" || HAS_64BIT="0"
1338 DATE_STRING=$(date +'h=%H&m=%M&s=%S')
1339 [ -e /etc/grml_version ] && VERSION=$(cat /etc/grml_version) || \
1340 VERSION=$(lsb_release -d | awk -F: '{gsub(/^[ \t]+/, "", $2); print $2}')
1342 PARAMS="$( echo "$CMDLINE" | sed -e 's/=[^ ]*/=x/g' | tr " " "\n"|sort|tr "\n" " " )"
1344 echo "$CMDLINE" | grep -q -e "fetch" -e "nfsroot" && BOOT="remote"
1345 [ -z "$BOOT" ] && BOOT="local"
1347 ADDITIONAL_PARAMS=""
1348 ( [ -n "$COLUMNS" ] && [ -n "$LINES" ] ) && \
1349 ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS&res=$((COLUMNS * 8))x$((LINES * 16))"
1351 URI='$BASE_URL?action=${ACTION_NAME}\&$DATE_STRING\&unique_id=${HOST_ID}\&support_64bit=$HAS_64BIT\&version=$VERSION\&bootup=$BOOT\¶ms=$PARAMS$ADDITIONAL_PARAMS'
1353 get_remote_file "$URI" "/dev/null" >/dev/null 2>&1 &!
1358 # {{{ start X window system via grml-x
1362 ewarn "The startx boot option isn't yet supported via systemd, sorry." ; eend 0
1366 # make sure we start X only if startx is used *before* a nostartx option
1367 # so it's possible to disable automatic X startup using nostart
1368 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1369 if [ -x "$(which X)" ] ; then
1370 if [ -z "$INSTALLED" ] ; then
1371 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1372 if [ -z "$WINDOWMANAGER" ] ; then
1373 einfo "No window manager specified. Using default one." && eend 0
1375 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1377 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1379 cat>|/etc/init.d/xstartup<<EOF
1381 su $localuser -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1383 chmod 755 /etc/init.d/xstartup
1385 # adjust inittab for xstartup
1386 if grep -q '^6:' /etc/inittab ; then
1387 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
1388 else # just append tty6 to inittab if no definition is present:
1389 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
1392 /sbin/telinit q ; eend $?
1394 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1395 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1397 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1401 eerror "We are not running in live mode - startx will not work, skipping it."
1402 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1405 eerror "/usr/bin/X is not present on this grml flavour."
1406 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1412 # {{{ configuration framework
1414 if checkbootparam 'extract' ; then
1415 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1416 EXTRACTOPTIONS="-- -x $EXTRACT"
1420 config_finddcsdir() {
1421 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1422 # on the command line, nothing is changed and the dcs files are
1423 # searched within the .iso, $dcs-dir is set to the root directory
1425 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1426 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1427 # set, $dcs-dir is set to the root directory within the .iso.
1428 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1429 # foo, even if a GRMLCFG partition is present.
1432 # autoconfig, see issue673
1433 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1434 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1435 if checkbootparam 'noautoconfig' ; then
1436 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1437 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1439 if [ -z "$INSTALLED" ] ; then
1440 if checkbootparam 'myconfig' ; then
1441 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1442 if [ -z "$DCSDEVICE" ]; then
1443 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1444 fi # [ -z "$DCSDEVICE" ]
1445 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1446 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1448 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1450 modprobe 9p 2>/dev/null || true
1451 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1452 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1453 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1454 DCSDEVICE="$GRMLCFG"
1455 MOUNTOPTIONS="ro,trans=virtio"
1460 if [ -n "$DCSDEVICE" ]; then
1461 DCSMP="/mnt/grmlcfg"
1466 # if not specified/present then assume default:
1467 if [ -z "$DCSDEVICE" ]; then
1468 DCSDIR="${LIVECD_PATH}"
1471 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1472 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1473 if [ -n "$DCSDIR" ]; then
1474 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1476 [ -d $DCSMP ] || mkdir $DCSMP
1477 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1478 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1479 if [[ $RC == 0 ]]; then
1480 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1482 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1491 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1492 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1493 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1494 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1500 if checkbootparam 'partconf' ; then
1501 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1502 if [ -n "$MOUNTDEVICE" ]; then
1503 [ -d /mnt/grml ] || mkdir /mnt/grml
1504 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1505 if [[ $RC == 0 ]]; then
1506 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1507 einfo "Copying files from $MOUNTDEVICE over grml system."
1508 for file in `cat /etc/grml/partconf` ; do
1509 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1510 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1513 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1514 fi # mount $MOUNTDEVICE
1515 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1517 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1518 fi # [ -n "$MOUNTDEVICE" ]
1523 # {{{ /cdrom/.*-options
1525 if checkbootparam 'debs' ; then
1526 iszsh && setopt localoptions shwordsplit
1527 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1528 if [ -z "$DEBS" ] ; then
1531 if ! echo $DEBS | grep -q '/'; then
1532 # backwards compatibility: if no path is given get debs from debs/
1535 einfo "Trying to install Debian package(s) ${DEBS}"
1536 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1537 dpkg -i $DEBS ; eend $?
1542 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1543 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1544 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1545 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1547 if ! echo $SCRIPTS | grep -q '/'; then
1548 # backwards compatibility: if no path is given get scripts from scripts/
1549 SCRIPTS="scripts/$SCRIPTS"
1551 if [ -n "$SCRIPTS" ]; then
1552 SCRIPTS="${DCSDIR}/$SCRIPTS"
1553 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1554 einfo "Trying to execute ${SCRIPTS}"
1557 elif [ -d "$SCRIPTS" ]; then
1558 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1559 run-parts --regex '.*' $SCRIPTS
1562 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1571 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1572 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1573 if [ -z "$CONFIG" ]; then
1574 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1576 if [ -n "$CONFIG" ]; then
1577 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1578 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1580 cp -a ${DCSDIR}/${CONFIG}/* /
1581 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1582 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1585 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1587 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1594 # {{{ confing_umount_dcsdir
1595 config_umount_dcsdir(){
1596 # umount $DCSMP if it was mounted by finddcsdir
1597 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1603 if checkbootparam 'mypath' ; then
1604 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1605 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1606 touch /etc/grml/my_path
1607 chmod 644 /etc/grml/my_path
1608 # make sure the directories exist:
1610 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1611 if ! [ -d "$i" ] ; then
1612 einfo "Creating directory $i"
1613 mkdir -p "$i" ; eend $?
1616 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1624 [ -n "$INSTALLED" ] && return 0
1626 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1627 checkbootparam 'raid=noautodetect' ; then
1628 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1630 [ -e /proc/mdstat ] || modprobe md_mod
1631 if ! [ -x /sbin/mdadm ] ; then
1632 eerror "mdadm not available, can not execute it." ; eend 1
1635 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1636 # find out whether we have a valid configuration file already
1637 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1638 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1639 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1640 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1642 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1645 if ! checkbootparam 'swraid' ; then
1648 einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1650 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1654 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1659 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1661 *'No arrays found'*)
1662 ewarn "$line" ; eend 0
1665 einfo "$line" ; eend 0
1672 if [ -r /proc/mdstat ] ; then
1674 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1675 if [ -z "$MDSTAT" ] ; then
1676 ewarn "No active arrays found" ; eend 0
1681 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1682 einfo "active arrays: $line" ; eend 0
1688 fi # bootoption swraid
1690 fi # is /sbin/mdadm executable?
1691 fi # check for bootoptions
1697 [ -n "$INSTALLED" ] && return 0
1699 if checkbootparam 'nodmraid' ; then
1700 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1704 if ! [ -x /sbin/dmraid ] ; then
1705 eerror "dmraid not available, can not execute it." ; eend 1
1710 # usage: dmraid_wrapper <dmraid_option>
1711 [ -n "$1" ] || return 1
1718 for line in $(dmraid $1 ; echo errcode:$?); do
1720 *'no block devices found'*)
1721 einfo "No block devices found" ; eend 0
1725 einfo "No active dmraid devices found" ; eend 0
1744 if checkbootparam 'dmraid' ; then
1745 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1746 if [ "$ACTION" = "off" ] ; then
1747 # Deactivates all active software RAID sets:
1748 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1751 # Activate all software RAID sets discovered:
1752 einfo "Activating present dmraid sets (as requested via dmraid):"
1759 # by default (no special bootoptions) discover all software RAID devices:
1760 einfo "Searching for any present dmraid sets:"
1765 # {{{ LVM (Logical Volumes)
1767 [ -n "$INSTALLED" ] && return 0
1769 if checkbootparam 'nolvm' ; then
1770 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1772 if ! [ -x /sbin/lvm ] ; then
1773 eerror "LVM not available, can not execute it." ; eend 1
1775 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1776 einfo "You seem to have logical volumes (LVM) on your system."
1779 einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart."
1781 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1784 if checkbootparam 'lvm' ; then
1785 einfo "Bootoption LVM found. Searching for logical volumes:"
1787 service_wrapper lvm2-lvmetad start ; eend $?
1789 service_wrapper lvm2 start ; eend $?
1794 fi # check for lvm binary
1795 fi # check for bootoption nolvm
1799 # {{{ debnet: setup network based on an existing one found on a partition
1801 if checkbootparam 'debnet' ; then
1802 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1808 # {{{ disable console blanking
1810 if checkbootparam 'noblank' ; then
1811 einfo "Bootoption noblank found. Disabling monitor blanking."
1812 setterm -blank 0 ; eend $?
1817 # {{{ debootstrap: automatic installation
1818 config_debootstrap(){
1820 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1822 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1824 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1826 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1831 if checkbootparam 'target' ; then
1833 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1834 # notice: the following checks whether the given partition is available, if not the skip
1835 # execution of grml-debootstrap as it might result in data loss...
1836 if ! [ -r "$TARGET" ] ; then
1837 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1841 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1846 if checkbootparam 'grub' ; then
1848 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1851 if checkbootparam 'groot' ; then
1853 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1856 if checkbootparam 'release' ; then
1858 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1861 if checkbootparam 'mirror' ; then
1863 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1866 if checkbootparam 'boot_append' ; then
1868 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1871 if checkbootparam 'password' ; then
1873 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1876 # now check which options are available
1877 if [ -n "TARGET" ] ; then
1878 TARGETCMD="--target $TARGET"
1882 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1886 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1887 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1888 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1889 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1890 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1891 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1893 # and finally write script and execute it
1894 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1896 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1899 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1901 screen /usr/bin/grml-debootstrap_noninteractive
1902 einfo "Invoking a shell, just exit to continue booting..."
1905 fi # checkbootparam "BOOT_IMAGE=debian2hd
1909 # {{{ virtualbox shared folders
1910 config_virtualbox_shared_folders() {
1911 if $VIRTUALBOX ; then
1912 einfo "VirtualBox detected, trying to set up Shared Folders."
1913 if ! modinfo vboxsf &>/dev/null ; then
1914 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1916 elif ! [ -x /usr/sbin/VBoxService ] ; then
1917 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1922 einfo "Loading vboxsf driver."
1923 lsmod | grep -q vboxsf || modprobe vboxsf
1926 einfo "Adjusting /dev/vboxguest."
1927 chown root:vboxsf /dev/vboxguest
1928 chmod 660 /dev/vboxguest
1933 einfo "Adding $fstabuser to group vboxsf."
1934 adduser grml vboxsf &>/dev/null
1937 einfo "Starting VBoxService."
1938 VBoxService >/dev/null
1941 local vbautomation='automation'
1942 if checkbootparam 'vbautomation'; then
1943 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1946 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1947 ewarn "No automount shared folder '$vbautomation' available"
1950 einfo "Found automount shared folder '$vbautomation'"
1953 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1954 [ -n "$distri" ] || distri='grml'
1956 local vbox_auto_sf="/media/sf_${vbautomation}"
1958 sleep 1 # ugly but necessary
1962 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1963 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1965 counter=$(( counter-1 ))
1970 if ! [ -d "${vbox_auto_sf}" ] ; then
1971 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1974 einfo "Found shared folders automation directory $vbox_auto_sf"
1978 if checkbootparam 'novbautomation' ; then
1979 einfo "Bootoption novbautomation found. Disabling automation script execution."
1982 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1983 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1986 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1987 "${vbox_auto_sf}/${distri}"
2001 # {{{ Support customization
2003 if checkbootparam 'distri'; then
2004 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2005 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2006 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2007 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2008 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2009 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2015 ## END OF FILE #################################################################
2016 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2