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
897 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
898 eerror "$line" ; eend $RC
902 elif grep -q done "$LOADCPUFREQ" ; then
903 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
904 if [ -n "$MODULE" -a "$MODULE" != none ]; then
905 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
908 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
914 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
915 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
916 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
917 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
919 einfo "Setting ondemand governor"
921 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
922 echo ondemand > $file || RC=1
934 # {{{ autostart of ssh
936 if checkbootparam 'ssh' ; then
938 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
941 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
942 [ -z "$localuser" ] && eend 1
945 if [ -z "$PASSWD" ] ; then
946 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
950 if [ -n "$PASSWD" ] ; then
952 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
956 echo "$localuser:$PASSWD" | chpasswd $chpass_options
957 echo "root:$PASSWD" | chpasswd $chpass_options
960 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
964 einfo "Starting secure shell server in background for root and user $localuser"
965 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
966 service_wrapper ssh start >>$DEBUG 2>>$DEBUG &
974 # {{{ display hostkeys of SSH server
975 config_display_ssh_fingerprints() {
976 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
977 return 0 # no SSH host keys present
980 einfo "SSH key fingerprints:"
981 for file in /etc/ssh/ssh_host_*_key ; do
983 ssh-keygen -l -f $file
989 # {{{ autostart of x11vnc
991 if checkbootparam 'vnc' ; then
994 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
995 einfo "Bootoption vnc found, trying to set password for user $localuser."
997 if [ -z "$VNC_PASSWD" ] ; then
998 if [ -x /usr/bin/apg ] ; then
999 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1000 elif [ -x /usr/bin/gpw ] ; then
1001 VNC_PASSWD="$(gpw 1)"
1002 elif [ -x /usr/bin/pwgen ] ; then
1003 VNC_PASSWD="$(pwgen -1 8)"
1004 elif [ -x /usr/bin/hexdump ] ; then
1005 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1006 elif [ -n "$RANDOM" ] ; then
1007 VNC_PASSWD="${localuser}${RANDOM}"
1010 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1014 if [ -n "$VNC_PASSWD" ] ; then
1015 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1020 # finally check if we have a password we can use:
1021 if [ -n "$VNC_PASSWD" ] ; then
1023 VNCDIR="/home/${localuser}/.vnc"
1024 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1026 if [ ! -x /usr/bin/x11vnc ] ; then
1027 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1030 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1031 /bin/chown -R "$localuser": "$VNCDIR"
1034 if checkbootparam 'vnc_connect' ; then
1036 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1037 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1038 #store the options in a file
1039 VNCDIR="/home/${localuser}/.vnc"
1040 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1041 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1047 # {{{ set password for root and default user
1049 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1051 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1054 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1055 [ -z "$localuser" ] && eend 1
1058 if [ -z "$PASSWD" ] ; then
1059 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1063 if [ -n "$PASSWD" ] ; then
1065 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1069 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1070 echo "root:$PASSWD" | chpasswd $chpass_options
1073 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1079 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1081 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1083 if [ -z "$PASSWD" ] ; then
1084 eerror "No hashed password found, can not set password."
1090 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1091 [ -z "$localuser" ] && eend 1
1093 if [ -n "$PASSWD" ] ; then
1096 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1097 echo "root:$PASSWD" | chpasswd $chpass_options
1100 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1110 if ! [ -x /usr/bin/amixer ] ; then
1111 logger -t grml-autoconfig "amixer binary not available"
1115 if ! [ -r /proc/asound/cards ] ; then
1116 ewarn "No soundcard present, skipping mixer settings therefore."
1121 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1122 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1125 if checkbootparam 'vol' ; then
1126 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1127 if [ -z "$VOL" ] ; then
1128 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1136 if checkbootparam 'nosound' ; then
1137 einfo "Muting sound devices on request."
1138 ERROR=$(amixer -q set Master mute)
1140 if [ -n "$ERROR" ] ; then
1142 eerror "Problem muting sound devices: $ERROR"
1146 elif [ -z "$INSTALLED" ] ; then
1147 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1149 if checkbootparam 'micvol' ; then
1150 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1151 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1156 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1160 for CONTROL in ${=CONTROLS} ; do
1161 # such devices can not be controlled with amixer ... unmute
1162 [[ "$CONTROL" == *Console* ]] && continue
1164 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1165 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1166 amixer -c $card -q set "${CONTROL}" unmute
1168 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1169 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1173 if [ ${MICVOL} -ne 0 ] ; then
1174 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1175 amixer -c $card -q set "${CONTROL}" unmute
1177 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1178 amixer -c $card -q set "${CONTROL}" $MICVOL%
1184 fi # checkbootparam 'nosound'
1190 # {{{ syslog service
1192 if checkbootparam 'nosyslog'; then
1193 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1195 einfo "Starting rsyslog in background."
1196 service_wrapper rsyslog start >>$DEBUG &
1204 if checkbootparam 'nogpm'; then
1205 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1207 if ! [ -r /dev/input/mice ] ; then
1208 eerror "No mouse found - not starting GPM." ; eend 1
1210 einfo "Starting gpm in background."
1211 service_wrapper gpm start >>$DEBUG &
1212 # ( while [ ! -e /dev/psaux ]; do sleep 5; done; /etc/init.d/gpm start >>$DEBUG ) &
1221 if checkbootparam 'services' ; then
1222 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1223 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1224 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1225 for service in $(echo -e $SERVICELIST) ; do
1226 # support running (custom) init scripts in non-blocking mode
1227 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1228 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1229 einfo "Starting service ${service}."
1230 service_wrapper "${service}" start >>$DEBUG
1232 einfo "Starting service ${service} in background."
1233 service_wrapper "${service}" start >>$DEBUG &
1243 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1244 SOURCE=$(eval echo "$1")
1247 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1248 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1250 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1252 if checkbootparam 'getfile.retries' ; then
1253 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1258 while ! getconfig && [[ "$counter" != 0 ]] ; do
1259 echo -n "Sleeping for 1 second and trying to get config again... "
1260 counter=$(( counter-1 ))
1261 echo "$counter tries left" ; sleep 1
1263 if [ -s "$TARGET" ] ; then
1264 einfo "Downloading was successfull." ; eend 0
1265 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1266 md5sum ${TARGET} ; eend 0
1269 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1277 if checkbootparam 'netconfig' ; then
1278 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1279 CONFIGFILE='/tmp/netconfig.grml'
1281 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1282 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1289 # {{{ remote scripts
1290 config_netscript() {
1291 if checkbootparam 'netscript' ; then
1292 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1293 SCRIPTFILE='/tmp/netscript.grml'
1295 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1296 chmod +x ${SCRIPTFILE}
1297 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1304 # {{{ start X window system via grml-x
1308 # make sure we start X only if startx is used *before* a nostartx option
1309 # so it's possible to disable automatic X startup using nostart
1310 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1311 if [ -x "$(which X)" ] ; then
1312 if [ -z "$INSTALLED" ] ; then
1313 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1314 if [ -z "$WINDOWMANAGER" ] ; then
1315 einfo "No window manager specified. Using default one." && eend 0
1317 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1319 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1325 cat>|/etc/init.d/startx<<EOF
1327 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1329 chmod 755 /etc/init.d/startx
1331 # adjust inittab for startx
1332 if grep -q '^6:' /etc/inittab ; then
1333 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
1334 else # just append tty6 to inittab if no definition is present:
1335 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
1338 /sbin/telinit q ; eend $?
1340 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1341 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1343 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1347 eerror "We are not running in live mode - startx will not work, skipping it."
1348 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1351 eerror "/usr/bin/X is not present on this grml flavour."
1352 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1358 # {{{ configuration framework
1360 if checkbootparam 'extract' ; then
1361 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1362 EXTRACTOPTIONS="-- -x $EXTRACT"
1366 config_finddcsdir() {
1367 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1368 # on the command line, nothing is changed and the dcs files are
1369 # searched within the .iso, $dcs-dir is set to the root directory
1371 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1372 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1373 # set, $dcs-dir is set to the root directory within the .iso.
1374 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1375 # foo, even if a GRMLCFG partition is present.
1378 # autoconfig, see issue673
1379 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1380 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1381 if checkbootparam 'noautoconfig' ; then
1382 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1383 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1385 if [ -z "$INSTALLED" ] ; then
1386 if checkbootparam 'myconfig' ; then
1387 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1388 if [ -z "$DCSDEVICE" ]; then
1389 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1390 fi # [ -z "$DCSDEVICE" ]
1391 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1392 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1394 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1396 modprobe 9p 2>/dev/null || true
1397 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1398 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1399 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1400 DCSDEVICE="$GRMLCFG"
1401 MOUNTOPTIONS="ro,trans=virtio"
1406 if [ -n "$DCSDEVICE" ]; then
1407 DCSMP="/mnt/grmlcfg"
1412 # if not specified/present then assume default:
1413 if [ -z "$DCSDEVICE" ]; then
1414 DCSDIR="${LIVECD_PATH}"
1417 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1418 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1419 if [ -n "$DCSDIR" ]; then
1420 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1422 [ -d $DCSMP ] || mkdir $DCSMP
1423 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1424 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1425 if [[ $RC == 0 ]]; then
1426 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1428 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1437 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1438 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1439 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1440 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1446 if checkbootparam 'partconf' ; then
1447 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1448 if [ -n "$MOUNTDEVICE" ]; then
1449 [ -d /mnt/grml ] || mkdir /mnt/grml
1450 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1451 if [[ $RC == 0 ]]; then
1452 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1453 einfo "Copying files from $MOUNTDEVICE over grml system."
1454 for file in `cat /etc/grml/partconf` ; do
1455 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1456 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1459 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1460 fi # mount $MOUNTDEVICE
1461 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1463 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1464 fi # [ -n "$MOUNTDEVICE" ]
1469 # {{{ /cdrom/.*-options
1471 if checkbootparam 'debs' ; then
1472 iszsh && setopt localoptions shwordsplit
1473 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1474 if [ -z "$DEBS" ] ; then
1477 if ! echo $DEBS | grep -q '/'; then
1478 # backwards compatibility: if no path is given get debs from debs/
1481 einfo "Trying to install Debian package(s) ${DEBS}"
1482 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1483 dpkg -i $DEBS ; eend $?
1488 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1489 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1490 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1491 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1493 if ! echo $SCRIPTS | grep -q '/'; then
1494 # backwards compatibility: if no path is given get scripts from scripts/
1495 SCRIPTS="scripts/$SCRIPTS"
1497 if [ -n "$SCRIPTS" ]; then
1498 SCRIPTS="${DCSDIR}/$SCRIPTS"
1499 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1500 einfo "Trying to execute ${SCRIPTS}"
1503 elif [ -d "$SCRIPTS" ]; then
1504 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1505 run-parts --regex '.*' $SCRIPTS
1508 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1517 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1518 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1519 if [ -z "$CONFIG" ]; then
1520 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1522 if [ -n "$CONFIG" ]; then
1523 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1524 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1526 cp -a ${DCSDIR}/${CONFIG}/* /
1527 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1528 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1531 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1533 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1540 # {{{ confing_umount_dcsdir
1541 config_umount_dcsdir(){
1542 # umount $DCSMP if it was mounted by finddcsdir
1543 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1549 if checkbootparam 'mypath' ; then
1550 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1551 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1552 touch /etc/grml/my_path
1553 chmod 644 /etc/grml/my_path
1554 # make sure the directories exist:
1556 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1557 if ! [ -d "$i" ] ; then
1558 einfo "Creating directory $i"
1559 mkdir -p "$i" ; eend $?
1562 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1570 [ -n "$INSTALLED" ] && return 0
1572 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1573 checkbootparam 'raid=noautodetect' ; then
1574 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1576 [ -e /proc/mdstat ] || modprobe md_mod
1577 if ! [ -x /sbin/mdadm ] ; then
1578 eerror "mdadm not available, can not execute it." ; eend 1
1581 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1582 # find out whether we have a valid configuration file already
1583 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1584 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1585 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1586 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1588 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1591 if ! checkbootparam 'swraid' ; then
1594 einfo "Just run 'Start mdmonitor' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1596 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1600 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1605 for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do
1607 *'No arrays found'*)
1608 ewarn "$line" ; eend 0
1611 einfo "$line" ; eend 0
1618 if [ -r /proc/mdstat ] ; then
1620 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1621 if [ -z "$MDSTAT" ] ; then
1622 ewarn "No active arrays found" ; eend 0
1627 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1628 einfo "active arrays: $line" ; eend 0
1634 fi # bootoption swraid
1636 fi # is /sbin/mdadm executable?
1637 fi # check for bootoptions
1643 [ -n "$INSTALLED" ] && return 0
1645 if checkbootparam 'nodmraid' ; then
1646 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1650 if ! [ -x /sbin/dmraid ] ; then
1651 eerror "dmraid not available, can not execute it." ; eend 1
1656 # usage: dmraid_wrapper <dmraid_option>
1657 [ -n "$1" ] || return 1
1664 for line in $(dmraid $1 ; echo errcode:$?); do
1666 *'no block devices found'*)
1667 einfo "No block devices found" ; eend 0
1671 einfo "No active dmraid devices found" ; eend 0
1690 if checkbootparam 'dmraid' ; then
1691 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1692 if [ "$ACTION" = "off" ] ; then
1693 # Deactivates all active software RAID sets:
1694 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1697 # Activate all software RAID sets discovered:
1698 einfo "Activating present dmraid sets (as requested via dmraid):"
1705 # by default (no special bootoptions) discover all software RAID devices:
1706 einfo "Searching for any present dmraid sets:"
1711 # {{{ LVM (Logical Volumes)
1713 [ -n "$INSTALLED" ] && return 0
1715 if checkbootparam 'nolvm' ; then
1716 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1718 if ! [ -x /sbin/lvm ] ; then
1719 eerror "LVM not available, can not execute it." ; eend 1
1721 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1722 einfo "You seem to have logical volumes (LVM) on your system."
1725 einfo "Just run 'Start lvm2-lvmetad' to activate them or boot using 'lvm' as bootoption for autostart."
1727 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1730 if checkbootparam 'lvm' ; then
1731 einfo "Bootoption LVM found. Searching for logical volumes:"
1733 service_wrapper lvm2-lvmetad start ; eend $?
1735 service_wrapper lvm2 start ; eend $?
1740 fi # check for lvm binary
1741 fi # check for bootoption nolvm
1745 # {{{ debnet: setup network based on an existing one found on a partition
1747 if checkbootparam 'debnet' ; then
1748 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1754 # {{{ disable console blanking
1756 if checkbootparam 'noblank' ; then
1757 einfo "Bootoption noblank found. Disabling monitor blanking."
1758 setterm -blank 0 ; eend $?
1763 # {{{ debootstrap: automatic installation
1764 config_debootstrap(){
1766 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1768 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1770 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1772 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1777 if checkbootparam 'target' ; then
1779 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1780 # notice: the following checks whether the given partition is available, if not the skip
1781 # execution of grml-debootstrap as it might result in data loss...
1782 if ! [ -r "$TARGET" ] ; then
1783 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1787 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1792 if checkbootparam 'grub' ; then
1794 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1797 if checkbootparam 'groot' ; then
1799 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1802 if checkbootparam 'release' ; then
1804 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1807 if checkbootparam 'mirror' ; then
1809 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1812 if checkbootparam 'boot_append' ; then
1814 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1817 if checkbootparam 'password' ; then
1819 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1822 # now check which options are available
1823 if [ -n "TARGET" ] ; then
1824 TARGETCMD="--target $TARGET"
1828 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1832 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1833 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1834 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1835 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1836 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1837 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1839 # and finally write script and execute it
1840 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1842 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1845 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1847 screen /usr/bin/grml-debootstrap_noninteractive
1848 einfo "Invoking a shell, just exit to continue booting..."
1851 fi # checkbootparam "BOOT_IMAGE=debian2hd
1855 # {{{ virtualbox shared folders
1856 config_virtualbox_shared_folders() {
1857 if $VIRTUALBOX ; then
1858 einfo "VirtualBox detected, trying to set up Shared Folders."
1859 if ! modinfo vboxsf &>/dev/null ; then
1860 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1862 elif ! [ -x /usr/sbin/VBoxService ] ; then
1863 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1868 einfo "Loading vboxsf driver."
1869 lsmod | grep -q vboxsf || modprobe vboxsf
1872 einfo "Adjusting /dev/vboxguest."
1873 chown root:vboxsf /dev/vboxguest
1874 chmod 660 /dev/vboxguest
1879 einfo "Adding $fstabuser to group vboxsf."
1880 adduser grml vboxsf &>/dev/null
1883 einfo "Starting VBoxService."
1884 VBoxService >/dev/null
1887 local vbautomation='automation'
1888 if checkbootparam 'vbautomation'; then
1889 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1892 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1893 ewarn "No automount shared folder '$vbautomation' available"
1896 einfo "Found automount shared folder '$vbautomation'"
1899 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1900 [ -n "$distri" ] || distri='grml'
1902 local vbox_auto_sf="/media/sf_${vbautomation}"
1904 sleep 1 # ugly but necessary
1908 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1909 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1911 counter=$(( counter-1 ))
1916 if ! [ -d "${vbox_auto_sf}" ] ; then
1917 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1920 einfo "Found shared folders automation directory $vbox_auto_sf"
1924 if checkbootparam 'novbautomation' ; then
1925 einfo "Bootoption novbautomation found. Disabling automation script execution."
1928 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1929 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1932 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1933 "${vbox_auto_sf}/${distri}"
1947 # {{{ Support customization
1949 if checkbootparam 'distri'; then
1950 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1951 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1952 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1953 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1954 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1960 ## END OF FILE #################################################################
1961 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2