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 if checkbootparam 'log' || checkbootparam 'debug' ; then
207 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
209 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
211 einfo "Starting bootlogd." # known to be *very* unreliable :(
212 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
220 ### {{{ language configuration / localization
223 einfo "Activating language settings:"
226 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
227 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
229 # check for bootoption which overrides config from /etc/grml/autoconfig
230 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
231 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
233 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
234 if [ -z "$INSTALLED" ] ; then
235 [ -n "$LANGUAGE" ] || LANGUAGE='en'
238 if [ -x /usr/sbin/grml-setlang ] ; then
239 # if bootoption lang is used update /etc/default/locale accordingly
240 if [ -n "$BOOT_LANGUAGE" ] ; then
241 /usr/sbin/grml-setlang "$LANGUAGE"
242 # otherwise default to lang=en
244 /usr/sbin/grml-setlang "en"
249 if [ -z "$CONSOLEFONT" ] ; then
250 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
251 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
252 CONSOLEFONT='Uni3-Terminus16'
254 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
257 CONSOLEFONT='Lat15-Terminus16'
262 # export it now, so error messages get translated, too
263 [ -r /etc/default/locale ] && . /etc/default/locale
266 # configure keyboard layout, read in already set values first:
267 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
269 # now allow keyboard override by boot commandline for later use:
270 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
271 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
272 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
273 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
274 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
276 # modify /etc/sysconfig/keyboard only in live-cd mode:
277 if [ -z "$INSTALLED" ] ; then
279 local LANGUAGE="$BOOT_LANGUAGE"
280 . /etc/grml/language-functions
281 # allow setting xkeyboard explicitly different than console keyboard
282 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
283 if [ -n "$KXKEYBOARD" ]; then
284 XKEYBOARD="$KXKEYBOARD"
285 KDEKEYBOARD="$KXKEYBOARD"
286 elif [ -n "$KKEYBOARD" ]; then
287 XKEYBOARD="$KKEYBOARD"
288 KDEKEYBOARD="$KKEYBOARD"
291 # duplicate of previous code to make sure /etc/grml/language-functions
292 # does not overwrite our values....
293 # now allow keyboard override by boot commandline for later use:
294 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
295 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
296 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
297 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
298 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
300 # write keyboard related variables to file for later use
301 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
302 if ! [ -e /etc/sysconfig/keyboard ] ; then
303 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
304 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
305 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
306 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
310 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
312 # activate unicode console if running within utf8 environment
313 if [ -r /etc/default/locale ] ; then
314 if grep -q "LANG=.*UTF" /etc/default/locale ; then
315 einfo "Setting up unicode environment."
316 unicode_start >>$DEBUG 2>&1 ; eend $?
320 # Set default keyboard before interactive setup
321 if [ -n "$KEYTABLE" ] ; then
322 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
323 loadkeys -q $KEYTABLE &
327 # we have to set up all consoles, therefore loop it over all ttys:
328 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
329 if [ -n "$NUM_CONSOLES" ] ; then
330 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
331 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
333 CUR_CONSOLE=$(fgconsole 2>/dev/null)
335 if [ -x "$(which setfont)" ] ; then
337 elif [ -x "$(which consolechars)" ] ; then
338 use_consolechars=true
340 eerror "Neither setfont nor consolechars tool present, can not set font."
345 if [ -n "$CHARMAP" ] ; then
346 einfo "Setting font to ${CHARMAP}"
348 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
349 if $use_setfont ; then
350 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
351 elif $use_consolechars ; then
352 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
355 if [ -n "$CUR_CONSOLE" ] ; then
356 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
361 if checkbootparam 'noconsolefont' ; then
362 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
364 if [ -n "$CONSOLEFONT" ] ; then
365 einfo "Setting font to ${CONSOLEFONT}"
367 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
368 if $use_setfont ; then
369 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
370 elif $use_consolechars ; then
371 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
374 if [ -n "$CUR_CONSOLE" ] ; then
375 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
387 if ! checkbootparam 'hostname' ; then
391 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
392 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
393 einfo "Generating random hostname as no hostname was specified."
394 HOSTNAME="$(/usr/bin/random-hostname)"
398 einfo "Setting hostname to $HOSTNAME as requested."
399 grml-hostname $HOSTNAME >>$DEBUG
404 # fstabuser (needed when running from harddisk with username != grml {{{
406 # force load of build-in and local config
407 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
408 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
410 # 1st. try configured fstab user
411 if [ -n "$CONFIG_FSTAB_USER" ] ; then
412 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
415 # 2nd. use standard user id
416 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
418 # 3rd. use standard user name
419 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
421 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
422 [ -n "$fstabuser" ] || fstabuser='root'
426 # local_user (needed when running with username != grml {{{
429 # force load of build-in and local config
430 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
431 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
433 # 1st. try id of primary user
434 localuser=$(getent passwd 1000 | cut -d: -f1)
436 # 2nd. use name standard user
437 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
441 # {{{ Set clock (Local time is more often used than GMT, so it is default)
443 # don't touch the files if running from harddisk:
444 if [ -z "$INSTALLED" ]; then
445 # The default hardware clock timezone is stated as representing local time.
448 if [ -f /etc/default/rcS ] ; then
449 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
450 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
451 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
452 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
453 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
454 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
455 elif [ -f /etc/adjtime ] ; then
456 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
457 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
458 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
459 grep -q "^UTC$" /etc/adjtime && UTC="-u"
462 # hwclock uses the TZ variable
463 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
464 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
465 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
466 ewarn "Warning: unknown timezone $KTZ" ; eend 1
468 ewarn "Falling back to timezone $KTZ" ; eend 0
471 if ! [ -r /dev/rtc ] ; then
472 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
475 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
476 if [ -n "$ERROR" ] ; then
478 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
479 if [ -n "$ERROR" ] ; then
480 eerror "Problem running hwclock: $ERROR" ; eend 1
489 # {{{ print kernel info
491 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
492 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
494 einfo "Running Linux Kernel $KERNEL" ; eend 0
497 if [ -r /proc/cpuinfo ] ; then
498 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
500 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
505 if [ -d /proc/xen ] ; then
507 einfo 'Running kernel featuring support for Xen detected' ; eend 0
515 if [ -x /usr/bin/mokutil ] ; then
516 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
517 if [ -n "$secstate" ] ; then
518 einfo "SecureBoot is enabled" ; eend 0
520 einfo "SecureBoot not detected" ; eend 0
523 if modprobe efivars &>/dev/null ; then
524 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
525 einfo "SecureBoot is enabled" ; eend 0
527 einfo "SecureBoot not detected" ; eend 0
536 # don't touch the files if running from harddisk:
537 if [ -z "$INSTALLED" ]; then
538 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
539 if [ -n "$KTZ" ] ; then
540 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
542 ewarn "Warning: unknown timezone $KTZ"; eend 0
544 einfo "Setting timezone."
546 area=$(echo $KTZ | cut -d '/' -f1)
547 zone=$(echo $KTZ | cut -d '/' -f2)
548 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
549 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
551 echo $KTZ > /etc/timezone
553 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
560 # activate serial console {{{
562 if checkbootparam 'console'; then
563 # this hack is no longer necessary with systemd
572 einfo "Bootoption for serial console detected:"
576 line="${line#*[$ws]}"
578 while [ -n "$line" ]; do
582 local device="${this%%,*}"
583 local device="${device##*=}"
584 if echo $serial | grep -q ttyS ; then
585 local option="${serial##*,}"
586 # default (works for kvm & CO):
587 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
588 # ... unless overriden by command line:
590 115200*) speed=115200 ;;
591 57600*) speed=57600 ;;
592 38400*) speed=38400 ;;
593 19200*) speed=19200 ;;
600 einfo "Activating console login on device ${device} with speed ${speed}."
601 local number="${device#ttyS}"
602 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
609 this="${line%%[$ws]*}"
610 line="${line#*[$ws]}"
613 if [ -n "$telinitq" ]; then
623 if checkbootparam 'testcd' ; then
624 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
628 local FOUND_FILE=false
629 local logfile='/tmp/md5sum.log'
633 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
634 einfo "Checking files against $md5, this may take a while..."
639 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
640 if [ $pipestatus[1] -eq 0 ] ; then
646 if ! $FOUND_FILE ; then
647 eerror 'Error: Could not find md5sum file' ; eend 1
652 einfo "Everything looks OK" ; eend 0
654 eerror 'Checksum failed for theses files:' ; eend 1
655 egrep -v '(^md5sum:|OK$)' "${logfile}"
656 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
657 einfon "Hit return to continue, or press the power button to shut down system."
666 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
668 if checkbootparam 'blacklist' ; then
669 if [ -z "$INSTALLED" ]; then
670 einfo "Bootoption blacklist found."
671 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
672 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
673 if [ -n "$BLACK" ] ; then
674 for module in $(echo ${BLACK//,/ }) ; do
675 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
676 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
677 echo "blacklist $module" >> "$BLACKLIST_FILE"
678 echo "alias $module off" >> "$BLACKLIST_FILE"
679 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
682 eerror "No given module for blacklist found. Blacklisting will not work therefore."
685 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
687 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
697 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
701 if checkbootparam 'noacpi'; then
702 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
703 elif checkbootparam 'nogrmlacpi' ; then
704 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
705 elif [ ! -d /proc/acpi ] ; then
706 ewarn "ACPI: Kernel support not present." ; eend 0
708 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
711 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
713 basename="${basename%%.*}"
714 case "$basename" in *_acpi)
715 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
717 modprobe $basename >>$DEBUG 2>&1 && found="yes"
718 local BASE="$BASE $basename"
720 if [ -n "$found" ] ; then
721 einfo "$BASE" ; eend 0
723 ewarn "(none)" ; eend 1
725 if ! pgrep acpid >/dev/null ; then
726 einfo "Starting acpi daemon."
727 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
728 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
730 ewarn "acpi daemon already running."
740 if checkbootparam 'brltty' ; then
741 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
746 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
749 NOSWAP="yes" # we do not use swap by default!
750 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
752 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
755 # Scan for swap, config, homedir - but only in live-mode
756 if [ -z "$INSTALLED" ] ; then
757 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
760 HOMEDIR="$(getbootparam 'home')"
761 if [ -n "$partitions" ]; then
762 while read p m f relax; do
763 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
764 partoptions="users,exec"
766 # it's a swap partition?
769 if [ -n "$NOSWAP" ]; then
770 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
773 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
774 S1SUSP|S2SUSP|pmdisk|[zZ]*)
775 if [ -n "$ANYSWAP" ] ; then
776 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
777 swapon $p 2>>$DEBUG ; eend $?
779 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
783 if [[ "$p" == LABEL* ]] ; then
784 p=$(blkid -t $p | awk -F: '{print $1}')
786 if grep -q $p /proc/swaps ; then
787 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
789 if [ -b "$p" ] ; then
790 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
791 swapon $p 2>>$DEBUG ; eend $?
793 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
802 esac # it's a swap partition?
807 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
808 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
810 # *) NONEFOUND='1'; continue ;;
814 if [ -z "$NOSWAP" ] ; then
815 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
816 # Activate swapfile, if exists
817 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
819 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
820 mount -o remount,rw $m && MOUNTED=1
821 if swapon "$SWAPFILE" 2>>$DEBUG ; then
823 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
825 fnew="$SWAPFILE swap swap defaults 0 0"
826 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
827 GRML_SWP="$GRML_SWP $SWAPFILE"
830 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
833 # use a image as home
834 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
835 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
836 if [ -n "$HOMEDIR" ]; then
837 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
841 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
843 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
848 # Umount, if not in use
849 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
861 if checkbootparam 'nocpu'; then
862 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
866 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
868 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)
869 echo $CPU | sed 's/ \{1,\}/ /g'
872 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
875 # no cpufreq setup inside VirtualBox
876 if $VIRTUALBOX ; then
877 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
881 if ! [ -x /etc/init.d/loadcpufreq ] ; then
882 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
886 einfo "Trying to set up cpu frequency scaling:"
889 LOADCPUFREQ=$(mktemp)
890 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
891 if grep -q FATAL "$LOADCPUFREQ" ; then
896 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
897 eerror "$line" ; eend $RC
901 elif grep -q done "$LOADCPUFREQ" ; then
902 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
903 if [ -n "$MODULE" -a "$MODULE" != none ]; then
904 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
907 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
913 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
914 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
915 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
916 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
918 einfo "Setting ondemand governor"
920 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
921 echo ondemand > $file || RC=1
933 # {{{ autostart of ssh
935 if checkbootparam 'ssh' ; then
937 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
940 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
941 [ -z "$localuser" ] && eend 1
944 if [ -z "$PASSWD" ] ; then
945 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
949 if [ -n "$PASSWD" ] ; then
951 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
955 echo "$localuser:$PASSWD" | chpasswd $chpass_options
956 echo "root:$PASSWD" | chpasswd $chpass_options
959 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
963 einfo "Starting secure shell server in background for root and user $localuser"
964 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
965 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
973 # {{{ display hostkeys of SSH server
974 config_display_ssh_fingerprints() {
975 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
976 return 0 # no SSH host keys present
979 einfo "SSH key fingerprints:"
980 for file in /etc/ssh/ssh_host_*_key ; do
982 ssh-keygen -l -f $file
988 # {{{ autostart of x11vnc
990 if checkbootparam 'vnc' ; then
993 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
994 einfo "Bootoption vnc found, trying to set password for user $localuser."
996 if [ -z "$VNC_PASSWD" ] ; then
997 if [ -x /usr/bin/apg ] ; then
998 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
999 elif [ -x /usr/bin/gpw ] ; then
1000 VNC_PASSWD="$(gpw 1)"
1001 elif [ -x /usr/bin/pwgen ] ; then
1002 VNC_PASSWD="$(pwgen -1 8)"
1003 elif [ -x /usr/bin/hexdump ] ; then
1004 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1005 elif [ -n "$RANDOM" ] ; then
1006 VNC_PASSWD="${localuser}${RANDOM}"
1009 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1013 if [ -n "$VNC_PASSWD" ] ; then
1014 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1019 # finally check if we have a password we can use:
1020 if [ -n "$VNC_PASSWD" ] ; then
1022 VNCDIR="/home/${localuser}/.vnc"
1023 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1025 if [ ! -x /usr/bin/x11vnc ] ; then
1026 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1029 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1030 /bin/chown -R "$localuser": "$VNCDIR"
1033 if checkbootparam 'vnc_connect' ; then
1035 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1036 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1037 #store the options in a file
1038 VNCDIR="/home/${localuser}/.vnc"
1039 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1040 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1046 # {{{ set password for root and default user
1048 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1050 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1053 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1054 [ -z "$localuser" ] && eend 1
1057 if [ -z "$PASSWD" ] ; then
1058 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1062 if [ -n "$PASSWD" ] ; then
1064 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1068 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1069 echo "root:$PASSWD" | chpasswd $chpass_options
1072 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1078 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1080 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1082 if [ -z "$PASSWD" ] ; then
1083 eerror "No hashed password found, can not set password."
1089 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1090 [ -z "$localuser" ] && eend 1
1092 if [ -n "$PASSWD" ] ; then
1095 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1096 echo "root:$PASSWD" | chpasswd $chpass_options
1099 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1109 if ! [ -x /usr/bin/amixer ] ; then
1110 logger -t grml-autoconfig "amixer binary not available"
1114 if ! [ -r /proc/asound/cards ] ; then
1115 ewarn "No soundcard present, skipping mixer settings therefore."
1120 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1121 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1124 if checkbootparam 'vol' ; then
1125 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1126 if [ -z "$VOL" ] ; then
1127 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1135 if checkbootparam 'nosound' ; then
1136 einfo "Muting sound devices on request."
1137 ERROR=$(amixer -q set Master mute)
1139 if [ -n "$ERROR" ] ; then
1141 eerror "Problem muting sound devices: $ERROR"
1145 elif [ -z "$INSTALLED" ] ; then
1146 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1148 if checkbootparam 'micvol' ; then
1149 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1150 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1155 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1158 for CONTROL in ${=CONTROLS} ; do
1159 # such devices can not be controlled with amixer ... unmute
1160 [[ "$CONTROL" == *Console* ]] && continue
1162 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1163 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1164 amixer -c $card -q set "${CONTROL}" unmute
1166 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1167 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1171 if [ ${MICVOL} -ne 0 ] ; then
1172 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1173 amixer -c $card -q set "${CONTROL}" unmute
1175 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1176 amixer -c $card -q set "${CONTROL}" $MICVOL%
1182 fi # checkbootparam 'nosound'
1188 # {{{ syslog service
1190 if checkbootparam 'nosyslog'; then
1191 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1193 einfo "Starting rsyslog in background."
1194 service_wrapper rsyslog start >>$DEBUG &
1202 if checkbootparam 'nogpm'; then
1203 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1205 if ! [ -r /dev/input/mice ] ; then
1206 eerror "No mouse found - not starting GPM." ; eend 1
1208 einfo "Starting gpm in background."
1209 service_wrapper gpm start >>$DEBUG &
1210 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1219 if checkbootparam 'services' ; then
1220 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1221 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1222 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1223 for service in $(echo -e $SERVICELIST) ; do
1224 # support running (custom) init scripts in non-blocking mode
1225 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1226 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1227 einfo "Starting service ${service}."
1228 service_wrapper "${service}" start >>$DEBUG
1230 einfo "Starting service ${service} in background."
1231 service_wrapper "${service}" start >>$DEBUG &
1241 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1242 SOURCE=$(eval echo "$1")
1245 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1246 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1248 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1250 if checkbootparam 'getfile.retries' ; then
1251 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1256 while ! getconfig && [[ "$counter" != 0 ]] ; do
1257 echo -n "Sleeping for 1 second and trying to get config again... "
1258 counter=$(( counter-1 ))
1259 echo "$counter tries left" ; sleep 1
1261 if [ -s "$TARGET" ] ; then
1262 einfo "Downloading was successfull." ; eend 0
1263 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1264 md5sum ${TARGET} ; eend 0
1267 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1275 if checkbootparam 'netconfig' ; then
1276 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1277 CONFIGFILE='/tmp/netconfig.grml'
1279 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1280 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1287 # {{{ remote scripts
1288 config_netscript() {
1289 if checkbootparam 'netscript' ; then
1290 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1291 SCRIPTFILE='/tmp/netscript.grml'
1293 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1294 chmod +x ${SCRIPTFILE}
1295 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1302 # {{{ start X window system via grml-x
1306 # make sure we start X only if startx is used *before* a nostartx option
1307 # so it's possible to disable automatic X startup using nostart
1308 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1309 if [ -x "$(which X)" ] ; then
1310 if [ -z "$INSTALLED" ] ; then
1311 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1312 if [ -z "$WINDOWMANAGER" ] ; then
1313 einfo "No window manager specified. Using default one." && eend 0
1315 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1317 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1323 cat>|/etc/init.d/startx<<EOF
1325 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1327 chmod 755 /etc/init.d/startx
1329 # adjust inittab for startx
1330 if grep -q '^6:' /etc/inittab ; then
1331 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
1332 else # just append tty6 to inittab if no definition is present:
1333 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
1336 /sbin/telinit q ; eend $?
1338 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1339 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1341 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1345 eerror "We are not running in live mode - startx will not work, skipping it."
1346 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1349 eerror "/usr/bin/X is not present on this grml flavour."
1350 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1356 # {{{ configuration framework
1358 if checkbootparam 'extract' ; then
1359 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1360 EXTRACTOPTIONS="-- -x $EXTRACT"
1364 config_finddcsdir() {
1365 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1366 # on the command line, nothing is changed and the dcs files are
1367 # searched within the .iso, $dcs-dir is set to the root directory
1369 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1370 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1371 # set, $dcs-dir is set to the root directory within the .iso.
1372 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1373 # foo, even if a GRMLCFG partition is present.
1376 # autoconfig, see issue673
1377 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1378 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1379 if checkbootparam 'noautoconfig' ; then
1380 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1381 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1383 if [ -z "$INSTALLED" ] ; then
1384 if checkbootparam 'myconfig' ; then
1385 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1386 if [ -z "$DCSDEVICE" ]; then
1387 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1388 fi # [ -z "$DCSDEVICE" ]
1389 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1390 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1392 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1394 modprobe 9p 2>/dev/null || true
1395 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1396 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1397 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1398 DCSDEVICE="$GRMLCFG"
1399 MOUNTOPTIONS="ro,trans=virtio"
1404 if [ -n "$DCSDEVICE" ]; then
1405 DCSMP="/mnt/grmlcfg"
1410 # if not specified/present then assume default:
1411 if [ -z "$DCSDEVICE" ]; then
1412 DCSDIR="${LIVECD_PATH}"
1415 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1416 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1417 if [ -n "$DCSDIR" ]; then
1418 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1420 [ -d $DCSMP ] || mkdir $DCSMP
1421 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1422 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1423 if [[ $RC == 0 ]]; then
1424 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1426 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1435 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1436 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1437 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1438 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1444 if checkbootparam 'partconf' ; then
1445 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1446 if [ -n "$MOUNTDEVICE" ]; then
1447 [ -d /mnt/grml ] || mkdir /mnt/grml
1448 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1449 if [[ $RC == 0 ]]; then
1450 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1451 einfo "Copying files from $MOUNTDEVICE over grml system."
1452 for file in `cat /etc/grml/partconf` ; do
1453 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1454 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1457 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1458 fi # mount $MOUNTDEVICE
1459 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1461 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1462 fi # [ -n "$MOUNTDEVICE" ]
1467 # {{{ /cdrom/.*-options
1469 if checkbootparam 'debs' ; then
1470 iszsh && setopt localoptions shwordsplit
1471 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1472 if [ -z "$DEBS" ] ; then
1475 if ! echo $DEBS | grep -q '/'; then
1476 # backwards compatibility: if no path is given get debs from debs/
1479 einfo "Trying to install Debian package(s) ${DEBS}"
1480 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1481 dpkg -i $DEBS ; eend $?
1486 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1487 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1488 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1489 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1491 if ! echo $SCRIPTS | grep -q '/'; then
1492 # backwards compatibility: if no path is given get scripts from scripts/
1493 SCRIPTS="scripts/$SCRIPTS"
1495 if [ -n "$SCRIPTS" ]; then
1496 SCRIPTS="${DCSDIR}/$SCRIPTS"
1497 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1498 einfo "Trying to execute ${SCRIPTS}"
1501 elif [ -d "$SCRIPTS" ]; then
1502 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1503 run-parts --regex '.*' $SCRIPTS
1506 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1515 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1516 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1517 if [ -z "$CONFIG" ]; then
1518 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1520 if [ -n "$CONFIG" ]; then
1521 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1522 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1524 cp -a ${DCSDIR}/${CONFIG}/* /
1525 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1526 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1529 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1531 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1538 # {{{ confing_umount_dcsdir
1539 config_umount_dcsdir(){
1540 # umount $DCSMP if it was mounted by finddcsdir
1541 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1547 if checkbootparam 'mypath' ; then
1548 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1549 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1550 touch /etc/grml/my_path
1551 chmod 644 /etc/grml/my_path
1552 # make sure the directories exist:
1554 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1555 if ! [ -d "$i" ] ; then
1556 einfo "Creating directory $i"
1557 mkdir -p "$i" ; eend $?
1560 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1568 [ -n "$INSTALLED" ] && return 0
1570 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1571 checkbootparam 'raid=noautodetect' ; then
1572 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1574 [ -e /proc/mdstat ] || modprobe md_mod
1575 if ! [ -x /sbin/mdadm ] ; then
1576 eerror "mdadm not available, can not execute it." ; eend 1
1579 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1580 # find out whether we have a valid configuration file already
1581 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1582 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1583 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1584 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1586 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1589 if ! checkbootparam 'swraid' ; then
1592 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1594 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1598 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1602 for line in $(mdadm --assemble --scan 2>&1) ; do
1604 *'No arrays found'*)
1605 ewarn "$line" ; eend 0
1608 einfo "$line" ; eend 0
1615 if [ -r /proc/mdstat ] ; then
1617 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1618 if [ -z "$MDSTAT" ] ; then
1619 ewarn "No active arrays found" ; eend 0
1623 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1624 einfo "active arrays: $line" ; eend 0
1630 fi # bootoption swraid
1632 fi # is /sbin/mdadm executable?
1633 fi # check for bootoptions
1639 [ -n "$INSTALLED" ] && return 0
1641 if checkbootparam 'nodmraid' ; then
1642 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1646 if ! [ -x /sbin/dmraid ] ; then
1647 eerror "dmraid not available, can not execute it." ; eend 1
1652 # usage: dmraid_wrapper <dmraid_option>
1653 [ -n "$1" ] || return 1
1659 for line in $(dmraid $1 ; echo errcode:$?); do
1661 *'no block devices found'*)
1662 einfo "No block devices found" ; eend 0
1666 einfo "No active dmraid devices found" ; eend 0
1685 if checkbootparam 'dmraid' ; then
1686 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1687 if [ "$ACTION" = "off" ] ; then
1688 # Deactivates all active software RAID sets:
1689 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1692 # Activate all software RAID sets discovered:
1693 einfo "Activating present dmraid sets (as requested via dmraid):"
1700 # by default (no special bootoptions) discover all software RAID devices:
1701 einfo "Searching for any present dmraid sets:"
1706 # {{{ LVM (Logical Volumes)
1708 [ -n "$INSTALLED" ] && return 0
1710 if checkbootparam 'nolvm' ; then
1711 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1713 if ! [ -x /sbin/lvm ] ; then
1714 eerror "LVM not available, can not execute it." ; eend 1
1716 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1717 einfo "You seem to have logical volumes (LVM) on your system."
1720 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1722 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1725 if checkbootparam 'lvm' ; then
1726 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1728 service_wrapper lvm2-lvmetad start
1732 service_wrapper lvm2 start ; eend $?
1737 fi # check for lvm binary
1738 fi # check for bootoption nolvm
1742 # {{{ debnet: setup network based on an existing one found on a partition
1744 if checkbootparam 'debnet' ; then
1745 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1751 # {{{ disable console blanking
1753 if checkbootparam 'noblank' ; then
1754 einfo "Bootoption noblank found. Disabling monitor blanking."
1755 setterm -blank 0 ; eend $?
1760 # {{{ debootstrap: automatic installation
1761 config_debootstrap(){
1763 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1765 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1767 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1769 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1774 if checkbootparam 'target' ; then
1776 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1777 # notice: the following checks whether the given partition is available, if not the skip
1778 # execution of grml-debootstrap as it might result in data loss...
1779 if ! [ -r "$TARGET" ] ; then
1780 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1784 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1789 if checkbootparam 'grub' ; then
1791 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1794 if checkbootparam 'groot' ; then
1796 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1799 if checkbootparam 'release' ; then
1801 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1804 if checkbootparam 'mirror' ; then
1806 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1809 if checkbootparam 'boot_append' ; then
1811 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1814 if checkbootparam 'password' ; then
1816 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1819 # now check which options are available
1820 if [ -n "TARGET" ] ; then
1821 TARGETCMD="--target $TARGET"
1825 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1829 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1830 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1831 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1832 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1833 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1834 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1836 # and finally write script and execute it
1837 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1839 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1842 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1844 screen /usr/bin/grml-debootstrap_noninteractive
1845 einfo "Invoking a shell, just exit to continue booting..."
1848 fi # checkbootparam "BOOT_IMAGE=debian2hd
1852 # {{{ virtualbox shared folders
1853 config_virtualbox_shared_folders() {
1854 if $VIRTUALBOX ; then
1855 einfo "VirtualBox detected, trying to set up Shared Folders."
1856 if ! modinfo vboxsf &>/dev/null ; then
1857 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1859 elif ! [ -x /usr/sbin/VBoxService ] ; then
1860 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1865 einfo "Loading vboxsf driver."
1866 lsmod | grep -q vboxsf || modprobe vboxsf
1869 einfo "Adjusting /dev/vboxguest."
1870 chown root:vboxsf /dev/vboxguest
1871 chmod 660 /dev/vboxguest
1876 einfo "Adding $fstabuser to group vboxsf."
1877 adduser grml vboxsf &>/dev/null
1880 einfo "Starting VBoxService."
1881 VBoxService >/dev/null
1884 local vbautomation='automation'
1885 if checkbootparam 'vbautomation'; then
1886 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1889 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1890 ewarn "No automount shared folder '$vbautomation' available"
1893 einfo "Found automount shared folder '$vbautomation'"
1896 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1897 [ -n "$distri" ] || distri='grml'
1899 local vbox_auto_sf="/media/sf_${vbautomation}"
1901 sleep 1 # ugly but necessary
1905 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1906 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1908 counter=$(( counter-1 ))
1913 if ! [ -d "${vbox_auto_sf}" ] ; then
1914 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1917 einfo "Found shared folders automation directory $vbox_auto_sf"
1921 if checkbootparam 'novbautomation' ; then
1922 einfo "Bootoption novbautomation found. Disabling automation script execution."
1925 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1926 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1929 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1930 "${vbox_auto_sf}/${distri}"
1944 # {{{ Support customization
1946 if checkbootparam 'distri'; then
1947 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1948 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1949 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1950 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1951 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1957 ## END OF FILE #################################################################
1958 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2