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> [background]" >&2
43 systemctl "$action" "$service"
45 if [ "${background:-}" = "background" ] ; then
46 /etc/init.d/"$service" "$action" &
48 /etc/init.d/"$service" "$action"
55 if [ -n "$ZSH_VERSION" ] ; then
61 # avoid 'no matches found: ...'
62 iszsh && setopt no_nomatch # || echo "Warning: not running under zsh!"
65 # {{{ Read in boot parameters
66 if [ -z "$CMDLINE" ]; then
67 # if CMDLINE was set from the outside, we're debugging.
68 # otherwise, take CMDLINE from Kernel and config files.
69 CMDLINE="$(cat /proc/cmdline)"
70 [ -d ${LIVECD_PATH}/bootparams/ ] && CMDLINE="$CMDLINE $(cat ${LIVECD_PATH}/bootparams/* | tr '\n' ' ')"
71 modprobe 9p 2>/dev/null || true
72 if grep -q 9p /proc/filesystems ; then
74 if grep -q "$TAG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
75 MOUNTDIR="$(mktemp -d)"
76 mount -t 9p -o trans=virtio,ro "$TAG" "$MOUNTDIR"
77 CMDLINE="$CMDLINE $(cat "$MOUNTDIR"/* 2>/dev/null | tr '\n' ' ')"
85 ### {{{ Utility Functions
87 # Get a bootoption's parameter: read boot command line and either
88 # echo last parameter's argument or return false.
96 result="${line##*[$ws]$1=}"
97 result="${result%%[$ws]*}"
105 # Check boot commandline for specified option
107 [ -n "$1" ] || ( echo "Error: missing argument to checkbootparam()" ; return 1 )
113 *[${ws}]"$1"=*|*[${ws}]"$1"[${ws}]*)
120 # Check if currently using a framebuffer
122 [ -e /dev/fb0 ] && return 0 || return 1
125 # Check wheter a configuration variable (like $CONFIG_TOHD) is
129 [yY][eE][sS]) return 0 ;; # it's set to 'yes'
130 [tT][rR][uU][eE]) return 0 ;; # it's set to 'true'
131 *) return 1 ;; # default
135 # Are we using grml-small?
137 grep -q small /etc/grml_version 2>>$DEBUG && return 0 || return 1
140 # if no password is set return a random password
142 [ -n "$PASSWD" ] && return 0
144 if [ -x /usr/bin/apg ] ; then
145 PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
146 elif [ -x /usr/bin/gpw ] ; then
148 elif [ -x /usr/bin/pwgen ] ; then
149 PASSWD="$(pwgen -1 8)"
150 elif [ -x /usr/bin/hexdump ] ; then
151 PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
152 elif [ -n "$RANDOM" ] ; then
153 PASSWD="grml${RANDOM}"
156 eerror "Empty passphrase and neither apg, gpw, pwgen, hexdump nor \$RANDOM available. Skipping."
164 # {{{ filesystems (proc, pts, sys) and fixes
166 [ -f /proc/version ] || mount -t proc /proc /proc 2>/dev/null
170 grep -q "/dev/pts" /proc/mounts || mount -t devpts /dev/pts /dev/pts 2>/dev/null
174 [ -d /sys/devices ] || mount -t sysfs /sys /sys 2>/dev/null
178 # {{{ Check if we are running in live mode or from HD
180 [ -e /etc/grml_cd ] || INSTALLED="yes"
183 # {{{ provide information about virtual environments
184 VIRTUAL=false # assume physical system by default
189 if vmware-detect &>/dev/null; then
190 VIRTUAL=true; VMWARE=true; VIRTUAL_ENV='VMware'
193 if virt-what 2>/dev/null | grep -q 'kvm' || \
194 [ "$(imvirt 2>/dev/null)" = "KVM" ] ; then
195 VIRTUAL=true; KVM=true; VIRTUAL_ENV='KVM'
198 if virt-what 2>/dev/null | grep -q 'virtualbox' || \
199 [ "$(imvirt 2>/dev/null)" = "VirtualBox" ] ; then
200 VIRTUAL=true; VIRTUALBOX=true; VIRTUAL_ENV='VirtualBox'
204 # {{{ source lsb-functions , color handling
205 if checkbootparam 'nocolor'; then
206 . /etc/grml/lsb-functions
207 einfo "Disabling colors in bootsequence as requested on commandline." ; eend 0
209 . /etc/grml/lsb-functions
215 if checkbootparam 'log' || checkbootparam 'debug' ; then
216 export DEBUG="/tmp/grml.log.`date +%Y%m%d`"
218 einfo "Bootparameter log found. Log files: ${DEBUG} and /var/log/boot"
220 einfo "Starting bootlogd." # known to be *very* unreliable :(
221 bootlogd -r -c >>$DEBUG 2>&1 ; eend $?
229 ### {{{ language configuration / localization
232 einfo "Activating language settings:"
235 # people can specify $LANGUAGE and $CONSOLEFONT in a config file
236 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
238 # check for bootoption which overrides config from /etc/grml/autoconfig
239 BOOT_LANGUAGE="$(getbootparam 'lang' 2>>$DEBUG)"
240 [ -n "$BOOT_LANGUAGE" ] && LANGUAGE="$BOOT_LANGUAGE"
242 # set default to 'en' in live-cd mode iff $LANGUAGE is not set yet
243 if [ -z "$INSTALLED" ] ; then
244 [ -n "$LANGUAGE" ] || LANGUAGE='en'
247 if [ -x /usr/sbin/grml-setlang ] ; then
248 # if bootoption lang is used update /etc/default/locale accordingly
249 if [ -n "$BOOT_LANGUAGE" ] ; then
250 /usr/sbin/grml-setlang "$LANGUAGE"
251 # otherwise default to lang=en
253 /usr/sbin/grml-setlang "en"
258 if [ -z "$CONSOLEFONT" ] ; then
259 if ! checkbootparam 'nodefaultfont' >>$DEBUG 2>&1 ; then
260 if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then
261 CONSOLEFONT='Uni3-Terminus16'
263 ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1
266 CONSOLEFONT='Lat15-Terminus16'
271 # export it now, so error messages get translated, too
272 [ -r /etc/default/locale ] && . /etc/default/locale
275 # configure keyboard layout, read in already set values first:
276 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
278 # now allow keyboard override by boot commandline for later use:
279 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
280 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
281 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
282 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
283 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
285 # modify /etc/sysconfig/keyboard only in live-cd mode:
286 if [ -z "$INSTALLED" ] ; then
288 local LANGUAGE="$BOOT_LANGUAGE"
289 . /etc/grml/language-functions
290 # allow setting xkeyboard explicitly different than console keyboard
291 KXKEYBOARD="$(getbootparam 'xkeyboard' 2>>$DEBUG)"
292 if [ -n "$KXKEYBOARD" ]; then
293 XKEYBOARD="$KXKEYBOARD"
294 KDEKEYBOARD="$KXKEYBOARD"
295 elif [ -n "$KKEYBOARD" ]; then
296 XKEYBOARD="$KKEYBOARD"
297 KDEKEYBOARD="$KKEYBOARD"
300 # duplicate of previous code to make sure /etc/grml/language-functions
301 # does not overwrite our values....
302 # now allow keyboard override by boot commandline for later use:
303 KKEYBOARD="$(getbootparam 'keyboard' 2>>$DEBUG)"
304 [ -n "$KKEYBOARD" ] && KEYTABLE="$KKEYBOARD"
305 # notce: de/at is a bad choice, so take de-latin1-nodeadkeys instead:
306 [[ "$KKEYBOARD" == 'de' ]] && KEYTABLE=de-latin1-nodeadkeys
307 [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys
309 # write keyboard related variables to file for later use
310 [ -d /etc/sysconfig ] || mkdir /etc/sysconfig
311 if ! [ -e /etc/sysconfig/keyboard ] ; then
312 echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard
313 echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard
314 echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard
315 echo "KDEKEYBOARDS=\"$KDEKEYBOARDS\"" >> /etc/sysconfig/keyboard
319 [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard
321 # activate unicode console if running within utf8 environment
322 if [ -r /etc/default/locale ] ; then
323 if grep -q "LANG=.*UTF" /etc/default/locale ; then
324 einfo "Setting up unicode environment."
325 unicode_start >>$DEBUG 2>&1 ; eend $?
329 # Set default keyboard before interactive setup
330 if [ -n "$KEYTABLE" ] ; then
331 einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background"
332 loadkeys -q $KEYTABLE &
336 # we have to set up all consoles, therefore loop it over all ttys:
337 NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
338 if [ -n "$NUM_CONSOLES" ] ; then
339 NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
340 [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
342 CUR_CONSOLE=$(fgconsole 2>/dev/null)
344 if [ -x "$(which setfont)" ] ; then
346 elif [ -x "$(which consolechars)" ] ; then
347 use_consolechars=true
349 eerror "Neither setfont nor consolechars tool present, can not set font."
354 if [ -n "$CHARMAP" ] ; then
355 einfo "Setting font to ${CHARMAP}"
357 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
358 if $use_setfont ; then
359 setfont -C /dev/tty${vc} $CHARMAP ; RC=$?
360 elif $use_consolechars ; then
361 consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
364 if [ -n "$CUR_CONSOLE" ] ; then
365 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
370 if checkbootparam 'noconsolefont' ; then
371 ewarn "Skipping setting console font as requested on boot commandline." ; eend 0
373 if [ -n "$CONSOLEFONT" ] ; then
374 einfo "Setting font to ${CONSOLEFONT}"
376 for vc in $(seq 0 ${NUM_CONSOLES}) ; do
377 if $use_setfont ; then
378 setfont -C /dev/tty${vc} ${CONSOLEFONT} ; RC=$?
379 elif $use_consolechars ; then
380 consolechars --tty=/dev/tty${vc} -f ${CONSOLEFONT} ; RC=$?
383 if [ -n "$CUR_CONSOLE" ] ; then
384 [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
396 if ! checkbootparam 'hostname' ; then
400 HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
401 if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
402 einfo "Generating random hostname as no hostname was specified."
403 HOSTNAME="$(/usr/bin/random-hostname)"
407 einfo "Setting hostname to $HOSTNAME as requested."
408 grml-hostname $HOSTNAME >>$DEBUG
413 # fstabuser (needed when running from harddisk with username != grml {{{
415 # force load of build-in and local config
416 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
417 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
419 # 1st. try configured fstab user
420 if [ -n "$CONFIG_FSTAB_USER" ] ; then
421 fstabuser=$(getent passwd $CONFIG_FSTAB_USER | cut -d: -f1)
424 # 2nd. use standard user id
425 [ -n "$fstabuser" ] || fstabuser=$(getent passwd 1000 | cut -d: -f1)
427 # 3rd. use standard user name
428 [ -n "$fstabuser" ] || fstabuser=$(getent passwd grml | cut -d: -f1)
430 # if not yet set fall back to 'root' user, avoid bad /etc/fstab
431 [ -n "$fstabuser" ] || fstabuser='root'
435 # local_user (needed when running with username != grml {{{
438 # force load of build-in and local config
439 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig
440 [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig.local
442 # 1st. try id of primary user
443 localuser=$(getent passwd 1000 | cut -d: -f1)
445 # 2nd. use name standard user
446 [ -n "$localuser" ] || localuser=$(getent passwd grml | cut -d: -f1)
450 # {{{ Set clock (Local time is more often used than GMT, so it is default)
452 # don't touch the files if running from harddisk:
453 if [ -z "$INSTALLED" ]; then
454 # The default hardware clock timezone is stated as representing local time.
457 if [ -f /etc/default/rcS ] ; then
458 grep -q "^UTC=" /etc/default/rcS || echo "UTC=no" >> /etc/default/rcS
459 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
460 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=yes|" /etc/default/rcS
461 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s|^UTC=.*$|UTC=no|" /etc/default/rcS
462 grep -q -i "^UTC=yes" /etc/default/rcS && UTC="-u"
463 # recent initscripts package versions don't ship /etc/default/rcS anymore, instead rely on /etc/adjtime
464 elif [ -f /etc/adjtime ] ; then
465 checkbootparam 'utc' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
466 checkbootparam 'gmt' >>$DEBUG 2>&1 && sed -i "s/^LOCAL/UTC/" /etc/adjtime
467 checkbootparam 'localtime' >>$DEBUG 2>&1 && sed -i "s/^UTC$/LOCAL/" /etc/adjtime
468 grep -q "^UTC$" /etc/adjtime && UTC="-u"
471 # hwclock uses the TZ variable
472 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
473 [ -z "$KTZ" ] && [ -r /etc/timezone ] && KTZ=$(cat /etc/timezone)
474 if [ ! -f "/usr/share/zoneinfo/$KTZ" ] ; then
475 ewarn "Warning: unknown timezone $KTZ" ; eend 1
477 ewarn "Falling back to timezone $KTZ" ; eend 0
480 if ! [ -r /dev/rtc ] ; then
481 ewarn "Warning: realtime clock not available, trying to execute hwclock anyway." ; eend 0
484 ERROR=$(TZ="$KTZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$?
485 if [ -n "$ERROR" ] ; then
487 ERROR=$(TZ="$KTZ" hwclock $UTC -s --directisa 2>&1 | head -1)
488 if [ -n "$ERROR" ] ; then
489 eerror "Problem running hwclock: $ERROR" ; eend 1
498 # {{{ print kernel info
500 if $VIRTUAL && [ -n "$VIRTUAL_ENV" ] ; then
501 einfo "Running Linux Kernel $KERNEL inside $VIRTUAL_ENV" ; eend 0
503 einfo "Running Linux Kernel $KERNEL" ; eend 0
506 if [ -r /proc/cpuinfo ] ; then
507 if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then
509 einfo 'CPU(s) featuring virtualization technology detected' ; eend 0
514 if [ -d /proc/xen ] ; then
516 einfo 'Running kernel featuring support for Xen detected' ; eend 0
524 # systemd does this for us, but if we are not running under systemd then mokutil
525 # doesn't work as needed as it relies on /sys/firmware/efi/efivars (while
526 # /sys/firmware/efi/vars would exist)
529 mount -t efivarfs efivarfs /sys/firmware/efi/efivars
532 if [ -x /usr/bin/mokutil ] ; then
533 local secstate=$(mokutil --sb-state 2>/dev/null) # "SecureBoot enabled"
534 if [ -n "$secstate" ] ; then
535 einfo "SecureBoot is enabled" ; eend 0
537 einfo "SecureBoot not detected" ; eend 0
540 if modprobe efivars &>/dev/null ; then
541 if od -An -t u1 /sys/firmware/efi/vars/SecureBoot-*/data 2>/dev/null | grep -q 1 ; then
542 einfo "SecureBoot is enabled" ; eend 0
544 einfo "SecureBoot not detected" ; eend 0
553 # don't touch the files if running from harddisk:
554 if [ -z "$INSTALLED" ]; then
555 KTZ="$(getbootparam 'tz' 2>>$DEBUG)"
556 if [ -n "$KTZ" ] ; then
557 if [ ! -f "/usr/share/zoneinfo/$KTZ" ]
559 ewarn "Warning: unknown timezone $KTZ"; eend 0
561 einfo "Setting timezone."
563 area=$(echo $KTZ | cut -d '/' -f1)
564 zone=$(echo $KTZ | cut -d '/' -f2)
565 echo "tzdata tzdata/Areas select $area" | debconf-set-selections
566 echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
568 echo $KTZ > /etc/timezone
570 cp "/usr/share/zoneinfo/$KTZ" /etc/localtime ; eend $?
577 # activate serial console {{{
579 if checkbootparam 'console'; then
580 # this hack is no longer necessary with systemd
589 einfo "Bootoption for serial console detected:"
593 line="${line#*[$ws]}"
595 while [ -n "$line" ]; do
599 local device="${this%%,*}"
600 local device="${device##*=}"
601 if echo $serial | grep -q ttyS ; then
602 local option="${serial##*,}"
603 # default (works for kvm & CO):
604 local speed="115200,57600,38400,19200,9600,4800,2400,1200";
605 # ... unless overriden by command line:
607 115200*) speed=115200 ;;
608 57600*) speed=57600 ;;
609 38400*) speed=38400 ;;
610 19200*) speed=19200 ;;
617 einfo "Activating console login on device ${device} with speed ${speed}."
618 local number="${device#ttyS}"
619 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
626 this="${line%%[$ws]*}"
627 line="${line#*[$ws]}"
630 if [ -n "$telinitq" ]; then
640 if checkbootparam 'testcd' ; then
641 einfo "Checking CD data integrity as requested by '${WHITE}testcd${NORMAL}' boot option."
645 local FOUND_FILE=false
646 local logfile='/tmp/md5sum.log'
650 for md5 in $(find "${LIVECD_PATH}" -name md5sums) ; do
651 einfo "Checking files against $md5, this may take a while..."
656 md5sum -c $(basename "$md5") |& tee -a "${logfile}"
657 if [ $pipestatus[1] -eq 0 ] ; then
663 if ! $FOUND_FILE ; then
664 eerror 'Error: Could not find md5sum file' ; eend 1
669 einfo "Everything looks OK" ; eend 0
671 eerror 'Checksum failed for theses files:' ; eend 1
672 egrep -v '(^md5sum:|OK$)' "${logfile}"
673 eerror 'Data on the medium is possibly incomplete/damaged or RAM of your system is broken.' ; eend 1
674 einfon "Hit return to continue, or press the power button to shut down system."
683 # {{{ blacklist specific module [ used in /etc/init.d/udev ]
685 if checkbootparam 'blacklist' ; then
686 if [ -z "$INSTALLED" ]; then
687 einfo "Bootoption blacklist found."
688 BLACK="$(getbootparam 'blacklist' 2>>$DEBUG)"
689 BLACKLIST_FILE='/etc/modprobe.d/grml.conf'
690 if [ -n "$BLACK" ] ; then
691 for module in $(echo ${BLACK//,/ }) ; do
692 einfo "Blacklisting module ${module} via ${BLACKLIST_FILE}."
693 echo "# begin entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE"
694 echo "blacklist $module" >> "$BLACKLIST_FILE"
695 echo "alias $module off" >> "$BLACKLIST_FILE"
696 echo "# end entry generated by config_blacklist of grml-autoconfig" >> "$BLACKLIST_FILE" ; eend $?
699 eerror "No given module for blacklist found. Blacklisting will not work therefore."
702 ewarn "Backlisting via bootoption is not intended for use on harddisk installations." ; eend 1
704 einfo "Please blacklist the module(s) manually using the 'blacklist' script."
714 echo "systemd detected, no acpi(d) stuff needed." >>"$DEBUG"
718 if checkbootparam 'noacpi'; then
719 ewarn "ACPI: Not loading modules as requested by boot option \"noacpi\"." ; eend 0
720 elif checkbootparam 'nogrmlacpi' ; then
721 ewarn "ACPI: Not loading modules as requested by boot option \"nogrmlacpi\"." ; eend 0
722 elif [ ! -d /proc/acpi ] ; then
723 ewarn "ACPI: Kernel support not present." ; eend 0
725 einfo "ACPI: Loading modules (disable with boot option noacpi / nogrmlacpi): "
728 for a in /lib/modules/$KERNEL/kernel/drivers/acpi/*; do
730 basename="${basename%%.*}"
731 case "$basename" in *_acpi)
732 egrep -qi "${basename%%_acpi}" /proc/acpi/dsdt 2>>$DEBUG || continue ;;
734 modprobe $basename >>$DEBUG 2>&1 && found="yes"
735 local BASE="$BASE $basename"
737 if [ -n "$found" ] ; then
738 einfo "$BASE" ; eend 0
740 ewarn "(none)" ; eend 1
742 if ! pgrep acpid >/dev/null ; then
743 einfo "Starting acpi daemon."
744 service_wrapper acpid.socket start >>$DEBUG 2>&1 ; eend $?
745 service_wrapper acpid start >>$DEBUG 2>&1 ; eend $?
747 ewarn "acpi daemon already running."
757 if checkbootparam 'brltty' ; then
758 [ -x /lib/brltty/brltty.sh ] && /lib/brltty/brltty.sh
763 # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now
766 NOSWAP="yes" # we do not use swap by default!
767 if checkbootparam 'swap' || checkbootparam 'anyswap' ; then
769 checkbootparam 'anyswap' && export ANYSWAP='yes' || export ANYSWAP=""
772 # Scan for swap, config, homedir - but only in live-mode
773 if [ -z "$INSTALLED" ] ; then
774 [ -z "$NOSWAP" ] && einfo "Searching for swap partition(s) as requested."
777 HOMEDIR="$(getbootparam 'home')"
778 if [ -n "$partitions" ]; then
779 while read p m f relax; do
780 case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac
781 partoptions="users,exec"
783 # it's a swap partition?
786 if [ -n "$NOSWAP" ]; then
787 ewarn "Ignoring swap partition ${WHITE}$p${NORMAL}. (Force usage via boot option 'swap', or execute grml-swapon)"
790 case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in
791 S1SUSP|S2SUSP|pmdisk|[zZ]*)
792 if [ -n "$ANYSWAP" ] ; then
793 einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]."
794 swapon $p 2>>$DEBUG ; eend $?
796 ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)"
800 if [[ "$p" == LABEL* ]] ; then
801 p=$(blkid -t $p | awk -F: '{print $1}')
803 if grep -q $p /proc/swaps ; then
804 ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0
806 if [ -b "$p" ] ; then
807 einfo "Using swap partition ${WHITE}${p}${NORMAL}."
808 swapon $p 2>>$DEBUG ; eend $?
810 ewarn "$p is not a valid block device - not using it therefore." ; eend 0
819 esac # it's a swap partition?
824 vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;;
825 ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;;
827 # *) NONEFOUND='1'; continue ;;
831 if [ -z "$NOSWAP" ] ; then
832 mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue
833 # Activate swapfile, if exists
834 SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)"
836 if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then
837 mount -o remount,rw $m && MOUNTED=1
838 if swapon "$SWAPFILE" 2>>$DEBUG ; then
840 einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}."
842 fnew="$SWAPFILE swap swap defaults 0 0"
843 grep -q "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab
844 GRML_SWP="$GRML_SWP $SWAPFILE"
847 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
850 # use a image as home
851 IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)"
852 if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then
853 if [ -n "$HOMEDIR" ]; then
854 if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then
858 if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" </dev/console >/dev/console 2>&1; then
860 mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1
865 # Umount, if not in use
866 [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null
878 if checkbootparam 'nocpu'; then
879 ewarn "Skipping CPU detection as requested on boot commandline." ; eend 0
883 if [[ $(grep -c processor /proc/cpuinfo) -gt 1 ]] ; then
885 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)
886 echo $CPU | sed 's/ \{1,\}/ /g'
889 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
892 # no cpufreq setup inside VirtualBox
893 if $VIRTUALBOX ; then
894 einfo 'Virtual Box detected, skipping cpufreq setup.' ; eend 0
898 if ! [ -x /etc/init.d/loadcpufreq ] ; then
899 ewarn "loadcpufreq init script not available, ignoring cpu frequency scaling."
903 einfo "Trying to set up cpu frequency scaling:"
906 LOADCPUFREQ=$(mktemp)
907 /etc/init.d/loadcpufreq start >"$LOADCPUFREQ" 2>&1 ; RC=$?
908 if grep -q FATAL "$LOADCPUFREQ" ; then
913 for line in $(grep FATAL "$LOADCPUFREQ" | sed 's/.*FATAL: //; s/ (.*)//') ; do
914 eerror "$line" ; eend $RC
918 elif grep -q done "$LOADCPUFREQ" ; then
919 MODULE=$(grep done "$LOADCPUFREQ" | sed 's/.*done (\(.*\))./\1/')
920 if [ -n "$MODULE" -a "$MODULE" != none ]; then
921 einfo "Loading cpufreq kernel module $MODULE" ; eend 0
924 ewarn "Could not find an appropriate kernel module for cpu frequency scaling." ; eend 1
930 if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
931 if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ] ; then
932 if ! grep -q ondemand /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ; then
933 einfo "Ondemand governor not available for CPU(s), not modifying governor configuration"
935 einfo "Setting ondemand governor"
937 for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
938 echo ondemand > $file || RC=1
950 # {{{ autostart of ssh
952 if checkbootparam 'ssh' ; then
954 PASSWD="$(getbootparam 'ssh' 2>>$DEBUG)"
957 einfo "Bootoption ssh found, trying to set password for root and user $localuser"
958 [ -z "$localuser" ] && eend 1
961 if [ -z "$PASSWD" ] ; then
962 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
966 if [ -n "$PASSWD" ] ; then
968 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
972 echo "$localuser:$PASSWD" | chpasswd $chpass_options
973 echo "root:$PASSWD" | chpasswd $chpass_options
976 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
980 einfo "Starting secure shell server in background for root and user $localuser"
981 service_wrapper rmnologin start >>$DEBUG 2>>$DEBUG
982 service_wrapper ssh start background >>$DEBUG 2>>$DEBUG
990 # {{{ display hostkeys of SSH server
991 config_display_ssh_fingerprints() {
992 if ! ls /etc/ssh/ssh_host_\*_key >/dev/null 2>&1 ; then
993 return 0 # no SSH host keys present
996 einfo "SSH key fingerprints:"
997 for file in /etc/ssh/ssh_host_*_key ; do
999 ssh-keygen -l -f $file
1005 # {{{ autostart of x11vnc
1007 if checkbootparam 'vnc' ; then
1010 VNC_PASSWD="$(getbootparam 'vnc' 2>>$DEBUG)"
1011 einfo "Bootoption vnc found, trying to set password for user $localuser."
1013 if [ -z "$VNC_PASSWD" ] ; then
1014 if [ -x /usr/bin/apg ] ; then
1015 VNC_PASSWD="$(apg -M NL -a 0 -m 8 -x 12 -n 1)"
1016 elif [ -x /usr/bin/gpw ] ; then
1017 VNC_PASSWD="$(gpw 1)"
1018 elif [ -x /usr/bin/pwgen ] ; then
1019 VNC_PASSWD="$(pwgen -1 8)"
1020 elif [ -x /usr/bin/hexdump ] ; then
1021 VNC_PASSWD="$(dd if=/dev/urandom bs=14 count=1 2>/dev/null | hexdump | awk '{print $3 $4}')"
1022 elif [ -n "$RANDOM" ] ; then
1023 VNC_PASSWD="${localuser}${RANDOM}"
1026 eerror "Empty passphrase and neither pwgen nor hexdump nor \$RANDOM found. Skipping."
1030 if [ -n "$VNC_PASSWD" ] ; then
1031 ewarn "No given password for vnc found. Using random password: $VNC_PASSWD" ; eend 0
1036 # finally check if we have a password we can use:
1037 if [ -n "$VNC_PASSWD" ] ; then
1039 VNCDIR="/home/${localuser}/.vnc"
1040 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1042 if [ ! -x /usr/bin/x11vnc ] ; then
1043 eerror "Error: x11vnc not found - can not set up vnc. Please make sure to install the x11vnc package."
1046 /usr/bin/x11vnc -storepasswd "$VNC_PASSWD" "$VNCDIR"/passwd ; eend $?
1047 /bin/chown -R "$localuser": "$VNCDIR"
1050 if checkbootparam 'vnc_connect' ; then
1052 VNC_CONNECT="$(getbootparam 'vnc_connect' 2>>$DEBUG)"
1053 einfo "Bootoption vnc_connect found, will start vnc with connect to $VNC_CONNECT."
1054 #store the options in a file
1055 VNCDIR="/home/${localuser}/.vnc"
1056 [ -d "$VNCDIR" ] || mkdir "$VNCDIR"
1057 echo " --connect $VNC_CONNECT " >> $VNCDIR/options
1063 # {{{ set password for root and default user
1065 if checkbootparam 'passwd' >>$DEBUG 2>&1; then
1067 PASSWD="$(getbootparam 'passwd' 2>>$DEBUG)"
1070 einfo "Bootoption passwd found, trying to set password for root and user $localuser"
1071 [ -z "$localuser" ] && eend 1
1074 if [ -z "$PASSWD" ] ; then
1075 set_passwd && ewarn "No given password for found. Using random password: $PASSWD" && eend 0
1079 if [ -n "$PASSWD" ] ; then
1081 if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
1085 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1086 echo "root:$PASSWD" | chpasswd $chpass_options
1089 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1095 if checkbootparam 'encpasswd' >>$DEBUG 2>&1; then
1097 PASSWD="$(getbootparam 'encpasswd' 2>>$DEBUG)"
1099 if [ -z "$PASSWD" ] ; then
1100 eerror "No hashed password found, can not set password."
1106 einfo "Bootoption encpasswd found, trying to set hashed password for root and user $localuser"
1107 [ -z "$localuser" ] && eend 1
1109 if [ -n "$PASSWD" ] ; then
1112 echo "$localuser:$PASSWD" | chpasswd $chpass_options
1113 echo "root:$PASSWD" | chpasswd $chpass_options
1116 ewarn "Warning: please change the password for root and user $localuser as soon as possible!"
1126 if ! [ -x /usr/bin/amixer ] ; then
1127 logger -t grml-autoconfig "amixer binary not available"
1131 if ! [ -r /proc/asound/cards ] ; then
1132 ewarn "No soundcard present, skipping mixer settings therefore."
1137 for card in $(cat /proc/asound/cards| grep -e '^\s*[0-9]' | awk '{print $1}') ; do
1138 einfo "Configuring soundcard \"$(awk -F\[ '/^ *'$card' \[/{ FS=" "; $0=$2; print $1}' < /proc/asound/cards)\""
1141 if checkbootparam 'vol' ; then
1142 VOL="$(getbootparam 'vol' 2>>$DEBUG)"
1143 if [ -z "$VOL" ] ; then
1144 eerror "Bootoption vol found but no volume level/parameter given. Using defaults (75%)."
1152 if checkbootparam 'nosound' ; then
1153 einfo "Muting sound devices on request."
1154 ERROR=$(amixer -q set Master mute)
1156 if [ -n "$ERROR" ] ; then
1158 eerror "Problem muting sound devices: $ERROR"
1162 elif [ -z "$INSTALLED" ] ; then
1163 einfo "Setting mixer volumes to level ${WHITE}${VOL}${NORMAL}."
1165 if checkbootparam 'micvol' ; then
1166 MICVOL="$(getbootparam 'micvol' 2>>$DEBUG)"
1167 einfo "Setting microphone to ${WHITE}${MICVOL}${NORMAL}."
1172 CONTROLS=$(amixer -c $card scontrols | awk -F"Simple mixer control " '{print $2}')
1175 for CONTROL in ${=CONTROLS} ; do
1176 # such devices can not be controlled with amixer ... unmute
1177 [[ "$CONTROL" == *Console* ]] && continue
1179 if ! echo "${CONTROL}" | grep -q -i "mic" ; then
1180 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*pswitch' ; then
1181 amixer -c $card -q set "${CONTROL}" unmute
1183 if amixer -c $card sget "${CONTROL}" | grep -q -P 'Capabilities:.*(pvolume| volume)' ; then
1184 amixer -c $card -q set "${CONTROL}" "${VOL}"%
1188 if [ ${MICVOL} -ne 0 ] ; then
1189 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cswitch' ; then
1190 amixer -c $card -q set "${CONTROL}" unmute
1192 if amixer -c $card sget "${CONTROL}" | grep -q 'Capabilities:.*cvolume' ; then
1193 amixer -c $card -q set "${CONTROL}" $MICVOL%
1199 fi # checkbootparam 'nosound'
1205 # {{{ syslog service
1207 if checkbootparam 'nosyslog'; then
1208 ewarn "Not starting syslog daemon as requested on boot commandline." ; eend 0
1210 einfo "Starting rsyslog in background."
1211 service_wrapper rsyslog start >>$DEBUG
1219 if checkbootparam 'nogpm'; then
1220 ewarn "Not starting GPM as requested on boot commandline." ; eend 0
1222 if ! [ -r /dev/input/mice ] ; then
1223 eerror "No mouse found - not starting GPM." ; eend 1
1225 einfo "Starting gpm in background."
1226 service_wrapper gpm start background >>$DEBUG
1235 if checkbootparam 'services' ; then
1236 SERVICE="$(getbootparam 'services' 2>>$DEBUG)"
1237 SERVICELIST=$(echo "$SERVICE" | sed 's/,/\\n/g')
1238 SERVICENL=$(echo "$SERVICE" | sed 's/,/ /g')
1239 for service in $(echo -e $SERVICELIST) ; do
1240 # support running (custom) init scripts in non-blocking mode
1241 # if they contain the keyword "DO_NO_RUN_IN_BACKGROUND".
1242 if grep -q 'DO_NO_RUN_IN_BACKGROUND' "/etc/init.d/${service}" 2>>$DEBUG ; then
1243 einfo "Starting service ${service}."
1244 service_wrapper "${service}" start >>$DEBUG
1246 einfo "Starting service ${service} in background."
1247 service_wrapper "${service}" start background >>$DEBUG
1257 [ "$#" -eq 2 ] || ( echo "Error: wrong parameter for get_remote_file()" ; return 1 )
1258 SOURCE=$(eval echo "$1")
1261 wget --timeout=10 --dns-timeout=10 --connect-timeout=10 --tries=1 \
1262 --read-timeout=10 ${SOURCE} -O ${TARGET} && return 0 || return 1
1264 einfo "Trying to get ${WHITE}${TARGET}${NORMAL}"
1266 if checkbootparam 'getfile.retries' ; then
1267 local counter="$(getbootparam 'getfile.retries' 2>>$DEBUG)"
1272 while ! getconfig && [[ "$counter" != 0 ]] ; do
1273 echo -n "Sleeping for 1 second and trying to get config again... "
1274 counter=$(( counter-1 ))
1275 echo "$counter tries left" ; sleep 1
1277 if [ -s "$TARGET" ] ; then
1278 einfo "Downloading was successfull." ; eend 0
1279 einfo "md5sum of ${WHITE}${TARGET}${NORMAL}: "
1280 md5sum ${TARGET} ; eend 0
1283 einfo "Sorry, could not fetch ${SOURCE}" ; eend 1
1291 if checkbootparam 'netconfig' ; then
1292 CONFIG="$(getbootparam 'netconfig' 2>>$DEBUG)"
1293 CONFIGFILE='/tmp/netconfig.grml'
1295 if get_remote_file ${CONFIG} ${CONFIGFILE} ; then
1296 cd / && einfo "Unpacking ${WHITE}${CONFIGFILE}${NORMAL}:" && /usr/bin/unp $CONFIGFILE $EXTRACTOPTIONS ; eend $?
1303 # {{{ remote scripts
1304 config_netscript() {
1305 if checkbootparam 'netscript' ; then
1306 CONFIG="$(getbootparam 'netscript' 2>>$DEBUG)"
1307 SCRIPTFILE='/tmp/netscript.grml'
1309 if get_remote_file ${CONFIG} ${SCRIPTFILE} ; then
1310 chmod +x ${SCRIPTFILE}
1311 einfo "Running ${WHITE}${SCRIPTFILE}${NORMAL}:" && NETSCRIPT=${CONFIG} ${SCRIPTFILE} ; eend $?
1318 # {{{ start X window system via grml-x
1322 # make sure we start X only if startx is used *before* a nostartx option
1323 # so it's possible to disable automatic X startup using nostart
1324 if checkbootparam 'startx' && ! echo "$CMDLINE" | grep -q 'startx.*nostartx' ; then
1325 if [ -x "$(which X)" ] ; then
1326 if [ -z "$INSTALLED" ] ; then
1327 WINDOWMANAGER="$(getbootparam 'startx' 2>>$DEBUG)"
1328 if [ -z "$WINDOWMANAGER" ] ; then
1329 einfo "No window manager specified. Using default one." && eend 0
1331 einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
1333 einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
1336 if [ -n "$WINDOWMANAGER" ] ; then
1337 mkdir -p /var/run/grml-x/
1338 echo "$WINDOWMANAGER" > /var/run/grml-x/window-manager
1343 cat>|/etc/init.d/startx<<EOF
1345 su "${localuser}" -c "/usr/bin/grml-x ${WINDOWMANAGER}"
1347 chmod 755 /etc/init.d/startx
1349 # adjust inittab for startx
1350 if grep -q '^6:' /etc/inittab ; then
1351 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
1352 else # just append tty6 to inittab if no definition is present:
1353 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
1356 /sbin/telinit q ; eend $?
1358 if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then
1359 sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config
1361 echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config
1365 eerror "We are not running in live mode - startx will not work, skipping it."
1366 eerror " -> Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1
1369 eerror "/usr/bin/X is not present on this grml flavour."
1370 eerror " -> Boot parameter startx does not work therefore." ; eend 1
1376 # {{{ configuration framework
1378 if checkbootparam 'extract' ; then
1379 EXTRACT="$(getbootparam 'extract' 2>>$DEBUG)"
1380 EXTRACTOPTIONS="-- -x $EXTRACT"
1384 config_finddcsdir() {
1385 # - If no GRMLCFG partition is found and noautoconfig is _not_ given
1386 # on the command line, nothing is changed and the dcs files are
1387 # searched within the .iso, $dcs-dir is set to the root directory
1389 # - If a GRMLCFG partition is found, $dcs-dir is set to the root of
1390 # the GRMLCFG partition unless noautoconfig is set. If noautoconfig is
1391 # set, $dcs-dir is set to the root directory within the .iso.
1392 # - If myconfig=foo is set on the command line, $dcs-dir is set to
1393 # foo, even if a GRMLCFG partition is present.
1396 # autoconfig, see issue673
1397 GRMLCFG="$(getbootparam 'autoconfig' 2>>$DEBUG)"
1398 [ -n "$GRMLCFG" ] || GRMLCFG="GRMLCFG"
1399 if checkbootparam 'noautoconfig' ; then
1400 DCSDIR="${LIVECD_PATH}" # set default so it works for "scripts" boot option as expected
1401 ewarn "Skipping running automount of device(s) labeled $GRMLCFG as requested." ; eend 0
1403 if [ -z "$INSTALLED" ] ; then
1404 if checkbootparam 'myconfig' ; then
1405 DCSDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)"
1406 if [ -z "$DCSDEVICE" ]; then
1407 eerror "Error: No device for bootoption myconfig provided." ; eend 1
1408 fi # [ -z "$DCSDEVICE" ]
1409 elif checkvalue $CONFIG_MYCONFIG; then # checkbootparam myconfig
1410 einfo "Searching for device(s) labeled with $GRMLCFG. (Disable this via boot option: noautoconfig)" ; eend 0
1412 DCSDEVICE=$(blkid -t LABEL=$GRMLCFG | head -1 | awk -F: '{print $1}')
1414 modprobe 9p 2>/dev/null || true
1415 if [ -z "$DCSDEVICE" ] && grep -q 9p /proc/filesystems ; then
1416 if grep -q "$GRMLCFG" /sys/bus/virtio/devices/*/mount_tag 2>/dev/null ; then
1417 einfo "Found 9p-virtio fs with mount_tag $GRMLCFG"
1418 DCSDEVICE="$GRMLCFG"
1419 MOUNTOPTIONS="ro,trans=virtio"
1424 if [ -n "$DCSDEVICE" ]; then
1425 DCSMP="/mnt/grmlcfg"
1430 # if not specified/present then assume default:
1431 if [ -z "$DCSDEVICE" ]; then
1432 DCSDIR="${LIVECD_PATH}"
1435 einfo "debs, config, scripts are read from $DCSDEVICE." ; eend 0
1436 DCSDIR="$(< /proc/mounts awk -v DCSDEV=$DCSDEVICE '{if ($1 == DCSDEV) { print $2 }}')"
1437 if [ -n "$DCSDIR" ]; then
1438 ewarn "$DCSDEVICE already mounted on $DCSDIR"; eend 0
1440 [ -d $DCSMP ] || mkdir $DCSMP
1441 umount $DCSMP >>$DEBUG 2>&1 # make sure it is not mounted
1442 mount -o ${MOUNTOPTIONS:-ro} -t ${DCSFS:-auto} $DCSDEVICE $DCSMP ; RC="$?"
1443 if [[ $RC == 0 ]]; then
1444 einfo "Successfully mounted $DCSDEVICE to $DCSMP (readonly)." ; eend 0
1446 eerror "Error: mounting $DCSDEVICE to $DCSMP (readonly) failed." ; eend 1
1455 if [ -n "$DCSDIR" -a "$DCSDIR" != "${LIVECD_PATH}" ] ; then
1456 einfo "Debs, config, scripts (if present) will be read from $DCSDIR." ; eend 0
1457 elif checkbootparam 'debs' || checkbootparam 'config' || checkbootparam 'scripts'; then
1458 einfo "Debs, config, scripts will be read from the live image directly." ; eend 0
1464 if checkbootparam 'partconf' ; then
1465 MOUNTDEVICE="$(getbootparam 'partconf' 2>>$DEBUG)"
1466 if [ -n "$MOUNTDEVICE" ]; then
1467 [ -d /mnt/grml ] || mkdir /mnt/grml
1468 mount -o ro -t auto $MOUNTDEVICE /mnt/grml ; RC="$?"
1469 if [[ $RC == 0 ]]; then
1470 einfo "Successfully mounted $MOUNTDEVICE to /mnt/grml (readonly)." ; eend 0
1471 einfo "Copying files from $MOUNTDEVICE over grml system."
1472 for file in `cat /etc/grml/partconf` ; do
1473 [ -d /mnt/grml/$file ] && cp -a /mnt/grml/${file}* ${file} && echo "copied: $file"
1474 [ -f /mnt/grml/$file ] && cp -a /mnt/grml/${file} ${file} && echo "copied: $file"
1477 einfo "Could not mount $MOUNTDEVICE to /mnt/grml - sorry." ; eend 1
1478 fi # mount $MOUNTDEVICE
1479 grep -q '/mnt/grml' /proc/mounts && umount /mnt/grml
1481 einfo "Sorry, no device for bootoption partconf provided. Skipping." ; eend 1
1482 fi # [ -n "$MOUNTDEVICE" ]
1487 # {{{ /cdrom/.*-options
1489 if checkbootparam 'debs' ; then
1490 iszsh && setopt localoptions shwordsplit
1491 DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
1492 if [ -z "$DEBS" ] ; then
1495 if ! echo $DEBS | grep -q '/'; then
1496 # backwards compatibility: if no path is given get debs from debs/
1499 einfo "Trying to install Debian package(s) ${DEBS}"
1500 DEBS="$(eval echo ${DCSDIR}/$DEBS)"
1501 dpkg -i $DEBS ; eend $?
1506 if checkbootparam 'scripts' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1507 SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)"
1508 if [ -d ${DCSDIR}/scripts ] && [ -z "$SCRIPTS" ]; then
1509 SCRIPTS="$(cd ${DCSDIR}/scripts; /bin/ls -1d [Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)"
1511 if ! echo $SCRIPTS | grep -q '/'; then
1512 # backwards compatibility: if no path is given get scripts from scripts/
1513 SCRIPTS="scripts/$SCRIPTS"
1515 if [ -n "$SCRIPTS" ]; then
1516 SCRIPTS="${DCSDIR}/$SCRIPTS"
1517 if [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1518 einfo "Trying to execute ${SCRIPTS}"
1521 elif [ -d "$SCRIPTS" ]; then
1522 einfo "Bootparameter scripts found. Trying to execute from directory ${SCRIPTS}:"
1523 run-parts --regex '.*' $SCRIPTS
1526 einfo "Bootparameter scripts found. Trying to execute ${SCRIPTS}:"
1535 if checkbootparam 'config' || [ "$DCSMP" = "/mnt/grmlcfg" ]; then
1536 CONFIG="$(getbootparam 'config' 2>>$DEBUG)"
1537 if [ -z "$CONFIG" ]; then
1538 CONFIG="$(cd ${DCSDIR}; ls -1d [Cc][Oo][Nn][Ff][Ii][Gg].[Tt][Bb][Zz] 2>>$DEBUG)"
1540 if [ -n "$CONFIG" ]; then
1541 if [ -d "${DCSDIR}/${CONFIG}" ] ; then
1542 einfo "Taking configuration from directory ${DCSDIR}/${CONFIG}"
1544 cp -a ${DCSDIR}/${CONFIG}/* /
1545 elif [ -f "${DCSDIR}/${CONFIG}" ]; then
1546 einfo "Extracting configuration from file ${DCSDIR}/${CONFIG}"
1549 unp ${DCSDIR}/${CONFIG} $EXTRACTOPTIONS ; eend $?
1551 ewarn "Sorry, could not find configuration file or directory ${DCSDIR}/${FILENAME}." ; eend 1
1558 # {{{ confing_umount_dcsdir
1559 config_umount_dcsdir(){
1560 # umount $DCSMP if it was mounted by finddcsdir
1561 grep -q "$DCSMP" /proc/mounts && umount "$DCSMP"
1567 if checkbootparam 'mypath' ; then
1568 MY_PATH="$(getbootparam 'mypath' 2>>$DEBUG)"
1569 einfo "Bootparameter mypath found, adding ${MY_PATH} to /etc/grml/my_path"
1570 touch /etc/grml/my_path
1571 chmod 644 /etc/grml/my_path
1572 # make sure the directories exist:
1574 for i in $(echo $MY_PATH | sed 's/:/\n/g') ; do
1575 if ! [ -d "$i" ] ; then
1576 einfo "Creating directory $i"
1577 mkdir -p "$i" ; eend $?
1580 grep -q "${MY_PATH}" /etc/grml/my_path || echo "${MY_PATH}" >> /etc/grml/my_path ; eend $?
1588 [ -n "$INSTALLED" ] && return 0
1590 if checkbootparam 'noraid' || checkbootparam 'noswraid' || \
1591 checkbootparam 'raid=noautodetect' ; then
1592 ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0
1594 [ -e /proc/mdstat ] || modprobe md_mod
1595 if ! [ -x /sbin/mdadm ] ; then
1596 eerror "mdadm not available, can not execute it." ; eend 1
1599 # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1600 # find out whether we have a valid configuration file already
1601 if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then
1602 einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm."
1603 [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old
1604 MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $?
1606 ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0
1609 if ! checkbootparam 'swraid' ; then
1612 einfo "Just run 'mdadm --assemble --scan' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1614 einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart."
1618 einfo "Bootoption swraid found. Searching for software RAID arrays:"
1622 for line in $(mdadm --assemble --scan 2>&1) ; do
1624 *'No arrays found'*)
1625 ewarn "$line" ; eend 0
1628 einfo "$line" ; eend 0
1635 if [ -r /proc/mdstat ] ; then
1637 MDSTAT=$(grep '^md[0-9]' /proc/mdstat)
1638 if [ -z "$MDSTAT" ] ; then
1639 ewarn "No active arrays found" ; eend 0
1643 for line in $(grep '^md[0-9]' /proc/mdstat) ; do
1644 einfo "active arrays: $line" ; eend 0
1650 fi # bootoption swraid
1652 fi # is /sbin/mdadm executable?
1653 fi # check for bootoptions
1659 [ -n "$INSTALLED" ] && return 0
1661 if checkbootparam 'nodmraid' ; then
1662 ewarn "Skipping dmraid code as requested on boot commandline." ; eend 0
1666 if ! [ -x /sbin/dmraid ] ; then
1667 eerror "dmraid not available, can not execute it." ; eend 1
1672 # usage: dmraid_wrapper <dmraid_option>
1673 [ -n "$1" ] || return 1
1679 for line in $(dmraid $1 ; echo errcode:$?); do
1681 *'no block devices found'*)
1682 einfo "No block devices found" ; eend 0
1686 einfo "No active dmraid devices found" ; eend 0
1705 if checkbootparam 'dmraid' ; then
1706 local ACTION="$(getbootparam 'dmraid' 2>>$DEBUG)"
1707 if [ "$ACTION" = "off" ] ; then
1708 # Deactivates all active software RAID sets:
1709 einfo "Deactivating present dmraid sets (as requested via dmraid=off):"
1712 # Activate all software RAID sets discovered:
1713 einfo "Activating present dmraid sets (as requested via dmraid):"
1720 # by default (no special bootoptions) discover all software RAID devices:
1721 einfo "Searching for any present dmraid sets:"
1726 # {{{ LVM (Logical Volumes)
1728 [ -n "$INSTALLED" ] && return 0
1730 if checkbootparam 'nolvm' ; then
1731 ewarn "Skipping LVM code as requested on boot commandline." ; eend 0
1733 if ! [ -x /sbin/lvm ] ; then
1734 eerror "LVM not available, can not execute it." ; eend 1
1736 if lvdisplay 2>&1 | grep -v 'No volume groups found' >/dev/null 2>&1 ; then
1737 einfo "You seem to have logical volumes (LVM) on your system."
1740 einfo "Just run 'Start lvm2-pvscan@name' to activate LV or VG 'name' or boot using 'lvm' as bootoption for autostart."
1742 einfo "Just run 'Start lvm2' to activate them or boot using 'lvm' as bootoption for autostart."
1745 if checkbootparam 'lvm' ; then
1746 einfo "Bootoption LVM found. Searching for logical volumes and enabling them:"
1748 service_wrapper lvm2-lvmetad start
1752 service_wrapper lvm2 start ; eend $?
1757 fi # check for lvm binary
1758 fi # check for bootoption nolvm
1762 # {{{ debnet: setup network based on an existing one found on a partition
1764 if checkbootparam 'debnet' ; then
1765 einfo "Bootoption 'debnet' found. Searching for Debian network configuration: "
1771 # {{{ disable console blanking
1773 if checkbootparam 'noblank' ; then
1774 einfo "Bootoption noblank found. Disabling monitor blanking."
1775 setterm -blank 0 ; eend $?
1780 # {{{ debootstrap: automatic installation
1781 config_debootstrap(){
1783 if checkbootparam "BOOT_IMAGE=debian2hd" || checkbootparam "debian2hd" ; then
1785 einfo "Bootoption debian2hd found. Setting up environment for automatic installation via grml-debootstrap." ; eend 0
1787 if ! [ -x /usr/sbin/grml-debootstrap ] ; then
1789 eerror "Bootoption debian2hd found, but grml-debootstrap is not available." ; eend 1
1794 if checkbootparam 'target' ; then
1796 TARGET="$(getbootparam 'target' 2>>$DEBUG)"
1797 # notice: the following checks whether the given partition is available, if not the skip
1798 # execution of grml-debootstrap as it might result in data loss...
1799 if ! [ -r "$TARGET" ] ; then
1800 eerror "Target $TARGET does not exist. Skipping execution of grml-debootstrap therefore." ; eend 1
1804 eerror "No bootoption named target found, can not continue execution of grml-debootstrap." ; eend 1
1809 if checkbootparam 'grub' ; then
1811 GRUB="$(getbootparam 'grub' 2>>$DEBUG)"
1814 if checkbootparam 'groot' ; then
1816 GROOT="$(getbootparam 'groot' 2>>$DEBUG)"
1819 if checkbootparam 'release' ; then
1821 RELEASE="$(getbootparam 'release' 2>>$DEBUG)"
1824 if checkbootparam 'mirror' ; then
1826 MIRROR="$(getbootparam 'mirror' 2>>$DEBUG)"
1829 if checkbootparam 'boot_append' ; then
1831 BOOT_APPEND="$(getbootparam 'boot_append' 2>>$DEBUG)"
1834 if checkbootparam 'password' ; then
1836 PASSWORD="$(getbootparam 'password' 2>>$DEBUG)"
1839 # now check which options are available
1840 if [ -n "TARGET" ] ; then
1841 TARGETCMD="--target $TARGET"
1845 eerror "Target not set via bootoption. Skipping execution of grml-debootstrap therefore."; eend 1
1849 [ -n "$GRUB" ] && GRUBCMD="--grub $GRUB" || GRUBCMD=''
1850 [ -n "$GROOT" ] && GROOTCMD="--groot $GROOT" || GROOTCMD=''
1851 [ -n "$RELEASE" ] && RELEASECMD="--release $RELEASE" || RELEASECMD=''
1852 [ -n "$MIRROR" ] && MIRRORCMD="--mirror $MIRROR" || MIRRORCMD=''
1853 [ -n "$PASSWORD" ] && PASSWORDCMD="--password $PASSWORD" || PASSWORDCMD=''
1854 [ -n "$BOOT_APPEND" ] && BOOT_APPEND="--boot_append $BOOT_APPEND" || BOOT_APPEND=''
1856 # and finally write script and execute it
1857 cat>|/usr/bin/grml-debootstrap_noninteractive<<EOF
1859 AUTOINSTALL='yes' grml-debootstrap $TARGETCMD $GRUBCMD $GROOTCMD $RELEASECMD $MIRRORCMD $PASSWORDCMD $BOOT_APPEND
1862 chmod 750 /usr/bin/grml-debootstrap_noninteractive
1864 screen /usr/bin/grml-debootstrap_noninteractive
1865 einfo "Invoking a shell, just exit to continue booting..."
1868 fi # checkbootparam "BOOT_IMAGE=debian2hd
1872 # {{{ virtualbox shared folders
1873 config_virtualbox_shared_folders() {
1874 if $VIRTUALBOX ; then
1875 einfo "VirtualBox detected, trying to set up Shared Folders."
1876 if ! modinfo vboxsf &>/dev/null ; then
1877 ewarn "vboxsf driver not present, not setting up VirtualBox Shared Folders."
1879 elif ! [ -x /usr/sbin/VBoxService ] ; then
1880 ewarn "virtualbox-guest-utils not installed, not setting up VirtualBox Shared Folders."
1885 einfo "Loading vboxsf driver."
1886 lsmod | grep -q vboxsf || modprobe vboxsf
1889 einfo "Adjusting /dev/vboxguest."
1890 chown root:vboxsf /dev/vboxguest
1891 chmod 660 /dev/vboxguest
1896 einfo "Adding $fstabuser to group vboxsf."
1897 adduser grml vboxsf &>/dev/null
1900 einfo "Starting VBoxService."
1901 VBoxService >/dev/null
1904 local vbautomation='automation'
1905 if checkbootparam 'vbautomation'; then
1906 vbautomation="$(getbootparam 'vbautomation' 2>>$DEBUG)"
1909 if ! VBoxControl sharedfolder list | egrep -q "^[0-9]+ - ${vbautomation}$" ; then
1910 ewarn "No automount shared folder '$vbautomation' available"
1913 einfo "Found automount shared folder '$vbautomation'"
1916 local distri="$(getbootparam 'distri' 2>>$DEBUG)"
1917 [ -n "$distri" ] || distri='grml'
1919 local vbox_auto_sf="/media/sf_${vbautomation}"
1921 sleep 1 # ugly but necessary
1925 while ! [ -d "${vbox_auto_sf}" ] && [[ "$counter" != 0 ]]; do
1926 einfo "Waiting another second to retry access to ${vbox_auto_sf}"
1928 counter=$(( counter-1 ))
1933 if ! [ -d "${vbox_auto_sf}" ] ; then
1934 eerror "Giving up trying to access folder ${vbox_auto_sf} which doesn't seem to exist"
1937 einfo "Found shared folders automation directory $vbox_auto_sf"
1941 if checkbootparam 'novbautomation' ; then
1942 einfo "Bootoption novbautomation found. Disabling automation script execution."
1945 if ! [ -x "${vbox_auto_sf}/${distri}" ] ; then
1946 ewarn "Couldn't find an automation script named ${vbox_auto_sf}/${distri}"
1949 einfo "Executing '${vbox_auto_sf}/${distri}' now:"
1950 "${vbox_auto_sf}/${distri}"
1964 # {{{ Support customization
1966 if checkbootparam 'distri'; then
1967 DISTRI="$(getbootparam 'distri' 2>>$DEBUG)"
1968 if [ -r "${LIVECD_PATH}"/desktop/"$DISTRI".jpg ] ; then
1969 # make sure the desktop.jpg file is not a symlink, so copying does not file then
1970 [ -L /usr/share/grml/desktop.jpg ] && rm /usr/share/grml/desktop.jpg
1971 cp "${LIVECD_PATH}"/desktop/"$DISTRI".jpg /usr/share/grml/desktop.jpg
1977 ## END OF FILE #################################################################
1978 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=2