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 # make sure we start X only if startx is used *before* a nostartx option
1363 # so it's possible to disable automatic X startup using nostart
1364 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1365 if [ -x "$(which X)" ] ; then
1366 if [ -z "$INSTALLED" ] ; then
1367 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1368 if [ -z "$WINDOWMANAGER" ] ; then
1369 einfo "No window manager specified. Using default one." && eend 0
1371 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1373 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1376 cat>|/etc/init.d/startx<<EOF
1380 sudo -u "${localuser}" /usr/bin/grml-x ${WINDOWMANAGER}
1382 chmod 755 /etc/init.d/startx
1386 cat>|/etc/init.d/startx<<EOF
1388 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1390 chmod 755 /etc/init.d/startx
1392 # adjust inittab for startx
1393 if grep -q '^6:' /etc/inittab ; then
1394 sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/startx ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>\&1 </dev/tty6|' /etc/inittab
1395 else # just append tty6 to inittab if no definition is present:
1396 echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/startx ; /usr/share/grml-scripts/run-welcome" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
1399 /sbin/telinit q ; eend $?
1401 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1402 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1404 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1408 eerror "We are not running in live mode - startx will not work, skipping it."
1409 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1412 eerror "/usr/bin/X is not present on this grml flavour."
1413 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1419 # {{{ configuration framework
1421 if checkbootparam 'extract' ; then
1422 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1423 EXTRACTOPTIONS="-- -x $EXTRACT"
1427 config_finddcsdir() {
1428 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1429 # on the command line, nothing is changed and the dcs files are
1430 # searched within the .iso, $dcs-dir is set to the root directory
1432 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1433 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1434 # set, $dcs-dir is set to the root directory within the .iso.
1435 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1436 # foo, even if a GRMLCFG partition is present.
1439 # autoconfig, see issue673
1440 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1441 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1442 if checkbootparam 'noautoconfig' ; then
1443 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1444 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1446 if [ -z "$INSTALLED" ] ; then
1447 if checkbootparam 'myconfig' ; then
1448 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1449 if [ -z "$DCSDEVICE" ]; then
1450 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1451 fi # [ -z "$DCSDEVICE" ]
1452 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1453 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1455 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1457 modprobe 9p 2>/dev/null || true
1458 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1459 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1460 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1461 DCSDEVICE="$GRMLCFG"
1462 MOUNTOPTIONS="ro,trans=virtio"
1467 if [ -n "$DCSDEVICE" ]; then
1468 DCSMP="/mnt/grmlcfg"
1473 # if not specified/present then assume default:
1474 if [ -z "$DCSDEVICE" ]; then
1475 DCSDIR="${LIVECD_PATH}"
1478 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1479 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1480 if [ -n "$DCSDIR" ]; then
1481 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1483 [ -d $DCSMP ] || mkdir $DCSMP
1484 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1485 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1486 if [[ $RC == 0 ]]; then
1487 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1489 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1498 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1499 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1500 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1501 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1507 if checkbootparam 'partconf' ; then
1508 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1509 if [ -n "$MOUNTDEVICE" ]; then
1510 [ -d /mnt/grml ] || mkdir /mnt/grml
1511 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1512 if [[ $RC == 0 ]]; then
1513 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1514 einfo "Copying files from $MOUNTDEVICE over grml system."
1515 for file in `cat /etc/grml/partconf` ; do
1516 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1517 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1520 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1521 fi # mount $MOUNTDEVICE
1522 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1524 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1525 fi # [ -n "$MOUNTDEVICE" ]
1530 # {{{ /cdrom/.*-options
1532 if checkbootparam 'debs' ; then
1533 iszsh && setopt localoptions shwordsplit
1534 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1535 if [ -z "$DEBS" ] ; then
1538 if ! echo $DEBS | grep -q '/'; then
1539 # backwards compatibility: if no path is given get debs from debs/
1542 einfo "Trying to install Debian package(s) ${DEBS}"
1543 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1544 dpkg -i $DEBS ; eend $?
1549 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1550 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1551 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1552 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1554 if ! echo $SCRIPTS | grep -q '/'; then
1555 # backwards compatibility: if no path is given get scripts from scripts/
1556 SCRIPTS="scripts/$SCRIPTS"
1558 if [ -n "$SCRIPTS" ]; then
1559 SCRIPTS="${DCSDIR}/$SCRIPTS"
1560 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1561 einfo "Trying to execute ${SCRIPTS}"
1564 elif [ -d "$SCRIPTS" ]; then
1565 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1566 run-parts --regex '.*' $SCRIPTS
1569 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1578 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1579 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1580 if [ -z "$CONFIG" ]; then
1581 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1583 if [ -n "$CONFIG" ]; then
1584 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1585 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1587 cp -a ${DCSDIR}/${CONFIG}/* /
1588 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1589 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1592 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1594 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1601 # {{{ confing_umount_dcsdir
1602 config_umount_dcsdir(){
1603 # umount $DCSMP if it was mounted by finddcsdir
1604 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1610 if checkbootparam 'mypath' ; then
1611 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1612 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1613 touch /etc/grml/my_path
1614 chmod 644 /etc/grml/my_path
1615 # make sure the directories exist:
1617 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1618 if ! [ -d "$i" ] ; then
1619 einfo "Creating directory $i"
1620 mkdir -p "$i" ; eend $?
1623 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1631 [ -n "$INSTALLED" ] && return 0
1633 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1634 checkbootparam 'raid=noautodetect' ; then
1635 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1637 [ -e /proc/mdstat ] || modprobe md_mod
1638 if ! [ -x /sbin/mdadm ] ; then
1639 eerror "mdadm not available, can not execute it." ; eend 1
1642 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1643 # find out whether we have a valid configuration file already
1644 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1645 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1646 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1647 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1649 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1652 if ! checkbootparam 'swraid' ; then
1655 einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1657 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1661 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1666 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1668 *'No arrays found'*)
1669 ewarn "$line" ; eend 0
1672 einfo "$line" ; eend 0
1679 if [ -r /proc/mdstat ] ; then
1681 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1682 if [ -z "$MDSTAT" ] ; then
1683 ewarn "No active arrays found" ; eend 0
1688 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1689 einfo "active arrays: $line" ; eend 0
1695 fi # bootoption swraid
1697 fi # is /sbin/mdadm executable?
1698 fi # check for bootoptions
1704 [ -n "$INSTALLED" ] && return 0
1706 if checkbootparam 'nodmraid' ; then
1707 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1711 if ! [ -x /sbin/dmraid ] ; then
1712 eerror "dmraid not available, can not execute it." ; eend 1
1717 # usage: dmraid_wrapper <dmraid_option>
1718 [ -n "$1" ] || return 1
1725 for line in $(dmraid $1 ; echo errcode:$?); do
1727 *'no block devices found'*)
1728 einfo "No block devices found" ; eend 0
1732 einfo "No active dmraid devices found" ; eend 0
1751 if checkbootparam 'dmraid' ; then
1752 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1753 if [ "$ACTION" = "off" ] ; then
1754 # Deactivates all active software RAID sets:
1755 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1758 # Activate all software RAID sets discovered:
1759 einfo "Activating present dmraid sets (as requested via dmraid):"
1766 # by default (no special bootoptions) discover all software RAID devices:
1767 einfo "Searching for any present dmraid sets:"
1772 # {{{ LVM (Logical Volumes)
1774 [ -n "$INSTALLED" ] && return 0
1776 if checkbootparam 'nolvm' ; then
1777 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1779 if ! [ -x /sbin/lvm ] ; then
1780 eerror "LVM not available, can not execute it." ; eend 1
1782 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1783 einfo "You seem to have logical volumes (LVM) on your system."
1786 einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart."
1788 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1791 if checkbootparam 'lvm' ; then
1792 einfo "Bootoption LVM found. Searching for logical volumes:"
1794 service_wrapper lvm2-lvmetad start ; eend $?
1796 service_wrapper lvm2 start ; eend $?
1801 fi # check for lvm binary
1802 fi # check for bootoption nolvm
1806 # {{{ debnet: setup network based on an existing one found on a partition
1808 if checkbootparam 'debnet' ; then
1809 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1815 # {{{ disable console blanking
1817 if checkbootparam 'noblank' ; then
1818 einfo "Bootoption noblank found. Disabling monitor blanking."
1819 setterm -blank 0 ; eend $?
1824 # {{{ debootstrap: automatic installation
1825 config_debootstrap(){
1827 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1829 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1831 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1833 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1838 if checkbootparam 'target' ; then
1840 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1841 # notice: the following checks whether the given partition is available, if not the skip
1842 # execution of grml-debootstrap as it might result in data loss...
1843 if ! [ -r "$TARGET" ] ; then
1844 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1848 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1853 if checkbootparam 'grub' ; then
1855 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1858 if checkbootparam 'groot' ; then
1860 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1863 if checkbootparam 'release' ; then
1865 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1868 if checkbootparam 'mirror' ; then
1870 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1873 if checkbootparam 'boot_append' ; then
1875 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1878 if checkbootparam 'password' ; then
1880 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1883 # now check which options are available
1884 if [ -n "TARGET" ] ; then
1885 TARGETCMD="--target $TARGET"
1889 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1893 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1894 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1895 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1896 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1897 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1898 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1900 # and finally write script and execute it
1901 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1903 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1906 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1908 screen /usr/bin/grml-debootstrap_noninteractive
1909 einfo "Invoking a shell, just exit to continue booting..."
1912 fi # checkbootparam "BOOT_IMAGE=debian2hd
1916 # {{{ virtualbox shared folders
1917 config_virtualbox_shared_folders() {
1918 if $VIRTUALBOX ; then
1919 einfo "VirtualBox detected, trying to set up Shared Folders."
1920 if ! modinfo vboxsf &>/dev/null ; then
1921 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1923 elif ! [ -x /usr/sbin/VBoxService ] ; then
1924 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1929 einfo "Loading vboxsf driver."
1930 lsmod | grep -q vboxsf || modprobe vboxsf
1933 einfo "Adjusting /dev/vboxguest."
1934 chown root:vboxsf /dev/vboxguest
1935 chmod 660 /dev/vboxguest
1940 einfo "Adding $fstabuser to group vboxsf."
1941 adduser grml vboxsf &>/dev/null
1944 einfo "Starting VBoxService."
1945 VBoxService >/dev/null
1948 local vbautomation='automation'
1949 if checkbootparam 'vbautomation'; then
1950 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1953 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1954 ewarn "No automount shared folder '$vbautomation' available"
1957 einfo "Found automount shared folder '$vbautomation'"
1960 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1961 [ -n "$distri" ] || distri='grml'
1963 local vbox_auto_sf="/media/sf_${vbautomation}"
1965 sleep 1 # ugly but necessary
1969 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1970 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1972 counter=$(( counter-1 ))
1977 if ! [ -d "${vbox_auto_sf}" ] ; then
1978 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1981 einfo "Found shared folders automation directory $vbox_auto_sf"
1985 if checkbootparam 'novbautomation' ; then
1986 einfo "Bootoption novbautomation found. Disabling automation script execution."
1989 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1990 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1993 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1994 "${vbox_auto_sf}/${distri}"
2008 # {{{ Support customization
2010 if checkbootparam 'distri'; then
2011 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
2012 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
2013 [ -n "$BOOTDEBUG" ] && einfo "Debug: bootoption distri found and file ${LIVECD_PATH}/desktop/${DISTRI} present" && eend 0
2014 # make sure the desktop.jpg file is not a symlink, so copying does not file then
2015 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
2016 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
2022 ## END OF FILE #################################################################
2023 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2