X-Git-Url: https://git.grml.org/?p=grml-autoconfig.git;a=blobdiff_plain;f=autoconfig.functions;h=6909dccd90dfc78db59e452b1126763a262effb8;hp=fa5dd55fa102b24c0012de69a2d388834aa942ab;hb=bf90667a39a960d73f66044f2da2a72e10ea48f0;hpb=53c9c6b67bbf9bfcec6b5d96e110fbeef703b1cc diff --git a/autoconfig.functions b/autoconfig.functions index fa5dd55..6909dcc 100755 --- a/autoconfig.functions +++ b/autoconfig.functions @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Klaus Knopper , (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Don Okt 12 13:00:04 CEST 2006 [mika] +# Latest change: Sam Mai 12 00:46:15 CEST 2007 [mika] ################################################################################ # {{{ path, variables, signals, umask, zsh @@ -89,6 +89,7 @@ mount_sys(){ # }}} # {{{ Read in boot parameters +[ -f /proc/version ] || mount_proc # make sure we can access /proc/cmdline when sourcing this file too CMDLINE="$(cat /proc/cmdline)" [ -d /cdrom/bootparams/ ] && CMDLINE="$CMDLINE $(cat /cdrom/bootparams/* | tr '\n' ' ')" # }}} @@ -196,7 +197,7 @@ config_language(){ # set default to 'en' in live-cd mode if $LANGUAGE is not yet set: if [ -z "$INSTALLED" ] ; then - [ -n "$LANGUAGE" ] || LANGUAGE='en' + [ -n "$LANGUAGE" ] || LANGUAGE='en-utf8' fi # if bootoption lang is used update /etc/default/locale, otherwise *not*! @@ -208,10 +209,11 @@ config_language(){ if [ -z "$CONSOLEFONT" ] ; then if ! checkbootparam "nodefaultfont" >>$DEBUG 2>&1 ; then # [ -n "$UTF8" ] && CONSOLEFONT='LatArCyrHeb-16' || CONSOLEFONT='Lat15-Terminus16' - if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then - CONSOLEFONT='Lat15-Terminus16' + # if [ -r /usr/share/consolefonts/Lat15-Terminus16.psf.gz ] ; then + if [ -r /usr/share/consolefonts/Uni3-Terminus16.psf.gz ] ; then + CONSOLEFONT='Uni3-Terminus16' else - ewarn "/usr/share/consolefonts/Lat15-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1 + ewarn "/usr/share/consolefonts/Uni3-Terminus16.psf.gz not available. Please upgrade package console-terminus." ; eend 1 fi fi fi @@ -259,6 +261,7 @@ config_language(){ [[ "$KKEYBOARD" == 'at' ]] && KEYTABLE=de-latin1-nodeadkeys # write keyboard related variables to file for later use + [ -d /etc/sysconfig ] || mkdir /etc/sysconfig echo "KEYTABLE=\"$KEYTABLE\"" > /etc/sysconfig/keyboard echo "XKEYBOARD=\"$XKEYBOARD\"" >> /etc/sysconfig/keyboard echo "KDEKEYBOARD=\"$KDEKEYBOARD\"" >> /etc/sysconfig/keyboard @@ -267,34 +270,43 @@ config_language(){ [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard - # Set default keyboard before interactive setup - if [ -n "$KEYTABLE" ] ; then - einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background" - loadkeys -q $KEYTABLE & - eend $? - fi - - if [ -n "$CONSOLEFONT" ] ; then - einfo "Running consolechars using ${CONSOLEFONT}" - consolechars -f $CONSOLEFONT || consolechars -d - eend $? + # activate unicode console if running within utf8 environment + if [ -r /etc/default/locale ] ; then + if grep -q "LANG=.*UTF" /etc/default/locale ; then + if checkgrmlsmall && [ -z "$INSTALLED" ] ; then + ewarn "Not runnning unicode_start: grml-small with reduced language support detected." ; eend 0 + else + einfo "Setting up unicode environment." + unicode_start 2>>$DEBUG ; eend $? + fi + fi + fi - if [ -n "$UTF8" ] ; then - einfo "Notice: run 'filterm - dynafont' in your shell to enable a unicode capable console." - fi - fi + # Set default keyboard before interactive setup + if [ -n "$KEYTABLE" ] ; then + einfo "Running loadkeys for ${WHITE}${KEYTABLE}${NORMAL} in background" + loadkeys -q $KEYTABLE & + eend $? + fi - # we have to set up all consoles, therefore loop it over all ttys: - if [ -n "$CHARMAP" ] ; then - einfo "Running consolechars for ${CHARMAP}" - NUM_CONSOLES=`fgconsole --next-available` - NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1` - [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6 - for vc in `seq 0 ${NUM_CONSOLES}` ; do - consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$? - done - eend ${RC} - fi + # we have to set up all consoles, therefore loop it over all ttys: + NUM_CONSOLES=`fgconsole --next-available` + NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1` + [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6 + if [ -n "$CHARMAP" ] ; then + einfo "Running consolechars for ${CHARMAP}" + for vc in `seq 0 ${NUM_CONSOLES}` ; do + consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$? + done + eend $RC + fi + if [ -n "$CONSOLEFONT" ] ; then + einfo "Running consolechars using ${CONSOLEFONT}" + for vc in `seq 0 ${NUM_CONSOLES}` ; do + consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT || consolechars --tty=/dev/tty${vc} -d + done + eend $? + fi eoutdent } @@ -315,7 +327,13 @@ config_hostname(){ # fstabuser (needed when running from harddisk with username != grml {{{ config_userfstab(){ - fstabuser=$(getent passwd 1000 | cut -d: -f1) + [ -r /etc/grml/autoconfig ] && . /etc/grml/autoconfig + if [ -n "$CONFIG_FSTAB_USER" ] ; then + fstabuser="$CONFIG_FSTAB_USER" + else + fstabuser=$(getent passwd 1000 | cut -d: -f1) + fi + # if not yet set fall back to default 'grml' user [ -n "$fstabuser" ] || fstabuser='grml' } # }}} @@ -324,58 +342,80 @@ config_userfstab(){ config_time(){ # don't touch the files if running from harddisk: if [ -z "$INSTALLED" ]; then - UTC="" - checkbootparam utc >>$DEBUG 2>&1 && UTC="-u" - checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u" - # hwclock uses the TZ variable - export TZ - hwclock $UTC -s + UTC="" + checkbootparam utc >>$DEBUG 2>&1 && UTC="-u" + checkbootparam gmt >>$DEBUG 2>&1 && UTC="-u" + # hwclock uses the TZ variable + [ -r /etc/timezone ] && TZ=$(cat /etc/timezone) + [ -n "$TZ" ] || TZ=Europe/Vienna + + if ! [ -r /dev/rtc ] ; then + ewarn "Realtime clock not available, skipping execution of hwclock therefore." ; eend 0 + else + ERROR=$(TZ="$TZ" hwclock $UTC -s 2>&1 | head -1) ; RC=$? + if [ -n "$ERROR" ] ; then + eindent + ERROR=$(TZ="$TZ" hwclock $UTC -s --directisa 2>&1 | head -1) + if [ -n "$ERROR" ] ; then + eerror "Problem running hwclock: $ERROR" ; eend 1 + fi + eoutdent + fi + fi fi } # }}} # {{{ print kernel info config_kernel(){ - vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMWare${NORMAL}" + vmware-detect &>/dev/null && VMWARE="inside ${WHITE}VMware/Qemu${NORMAL}" + [ -d /proc/xen ] && VMWARE='' # vmware-detect returns '0' when running with a Xen-enabled kernel einfo "Running Linux Kernel $KERNEL $VMWARE" ; eend 0 + if [ -r /proc/cpuinfo ] ; then + if egrep -q '^flags.*(vmx|svm)' /proc/cpuinfo ; then + eindent + einfo 'CPU(s) featuring virtualization technology detected' ; eend 0 + eoutdent + fi + fi + if [ -d /proc/xen ] ; then + eindent + einfo 'Running kernel featuring support for Xen detected' ; eend 0 + eoutdent + fi } # }}} # {{{ vmware specific stuff config_vmware(){ if checkbootparam novmware ; then - ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0 + ewarn "Skipping running vmware specific stuff as requested on boot commandline." ; eend 0 else - if [ -z "$INSTALLED" ]; then - if vmware-detect ; then - if [ -r /etc/X11/xorg.conf.vmware ] ; then - einfo "Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf" - cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $? - fi - fi - fi + if [ -z "$INSTALLED" ] ; then + if vmware-detect || stringinstring "BOOT_IMAGE=vmware " "$CMDLINE" ; then + if ! checkbootparam qemu ; then + if [ -r /etc/X11/xorg.conf.vmware ] ; then + einfo "VMware: Copying /etc/X11/xorg.conf.vmware to /etc/X11/xorg.conf" + cp /etc/X11/xorg.conf.vmware /etc/X11/xorg.conf ; eend $? + fi + fi + fi + fi fi } # }}} -# {{{ installed on hd? -config_checkfs(){ -if [ -n "$INSTALLED" ]; then - einfo "Running from HD, checking filesystems." -# We are running from HD, so a file system check is recommended - [ -f /etc/init.d/checkroot.sh ] && /etc/init.d/checkroot.sh - [ -f /etc/init.d/checkfs.sh ] && /etc/init.d/checkfs.sh - eend 0 +# {{{ qemu specific stuff +config_qemu(){ +if checkbootparam qemu ; then + if [ -r /etc/X11/xorg.conf.example ] ; then + einfo "Qemu: Copying /etc/X11/xorg.conf.example to /etc/X11/xorg.conf" + cp /etc/X11/xorg.conf.example /etc/X11/xorg.conf ; eend $? + fi fi } # }}} -# {{{ / must be read-write in any case, starting from here -config_remount_root(){ - mount -o remount,rw / 2>>$DEBUG -} -# }}} - # {{{ ld.so.cache + depmod config_ld_mod(){ if [ -n "$INSTALLED" ]; then @@ -473,10 +513,21 @@ fi # activate serial console {{{ config_console(){ if checkbootparam "console"; then - einfo "Bootoption (for serial) console detected. Activating mgetty." + einfo "Bootoption (for serial) console detected." + eindent + if [ -r /etc/mgetty/mgetty.config ] ; then + MODE=$(getbootparam console | awk -F, '{print $2}') + MODE=${MODE%%n*} + [ -n "$MODE" ] || MODE=9600 # default mode + einfo "Setting speed in /etc/mgetty/mgetty.config to $MODE bps" + sed -i "s/speed [0-9]*/speed $MODE/" /etc/mgetty/mgetty.config ; eend $? + fi + + einfo "Activating mgetty." sed -i 's/^#T0/T0/' /etc/inittab sed -i 's/^#T1/T1/' /etc/inittab - /sbin/telinit q ; eend $? + /sbin/telinit q ; eend $? + eoutdent fi } # }}} @@ -494,7 +545,11 @@ done # {{{ Bring up loopback interface now config_local_net(){ if [ -z "$INSTALLED" ] ; then - grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo + if grep -q 'iface lo inet loopback' /etc/network/interfaces 2>/dev/null ; then + grep -q lo=lo /etc/network/run/ifstate 2>/dev/null || ifup lo + else + ifconfig lo up + fi fi } # }}} @@ -632,7 +687,7 @@ fi } # }}} -# {{{ blacklist specific module +# {{{ blacklist specific module [ used in /etc/init.d/udev ] config_blacklist(){ if checkbootparam "blacklist" ; then if [ -z "$INSTALLED" ]; then @@ -915,7 +970,7 @@ check_partitions 1>/dev/null 2>&1 # avoid output "check_partitions:3: read-only # }}} # {{{ Enable DMA for all IDE drives now if not disabled -# Notice: Already done by linuxrc, maybe not on hd-installations +# Notice: Already done by linuxrc, but make sure it's done also on harddisk-installed systems config_dma(){ if checkbootparam "nodma"; then ewarn "Skipping DMA accelleration as requested on boot commandline." ; eend 0 @@ -937,114 +992,127 @@ fi # {{{ Start creating /etc/fstab with HD partitions and USB SCSI devices now config_fstab(){ -NOSWAP="" -checkbootparam "noswap" && NOSWAP="yes" -if checkbootparam "nofstab"; then + +NOSWAP="yes" # we do not use swap by default! +if checkbootparam "swap" -o checkbootparam "anyswap" ; then + NOSWAP='' + checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP="" +fi + +if checkbootparam "nofstab" -o checkbootparam "forensic" ; then ewarn "Skipping /etc/fstab creation as requested on boot commandline." ; eend 0 else - checkbootparam "anyswap" && export ANYSWAP='yes' || export ANYSWAP="" einfo "Scanning for harddisk partitions and creating /etc/fstab. (Disable this via boot option: nofstab)" iszsh && setopt nonomatch if [ -x /usr/sbin/rebuildfstab ] ; then - config_userfstab || fstabuser=grml - /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $? + config_userfstab || fstabuser=grml + /usr/sbin/rebuildfstab -r -u $fstabuser -g $fstabuser ; eend $? else - ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1 + ewarn "Command rebuildfstab not found. Install package grml-rebuildfstab." ; eend 1 fi - if [ -e /var/run/rebuildfstab.pid ]; then - # Another instance of rebuildfstab, probably from hotplug, is still running, so just wait. - sleep 8 - fi -fi -# Scan for swap, config, homedir -if [ -z "$NOSWAP" -o -z "$INSTALLED" ]; then - einfo "Checking for swap partition(s)." -fi -GRML_IMG="" -GRML_SWP="" -HOMEDIR="$(getbootparam home)" -if [ -n "$partitions" ]; then - while read p m f relax; do - case "$p" in *fd0*|*proc*|*sys*|*\#*) continue;; esac - partoptions="users,exec" - fnew="" - case "$f" in swap) - eindent - if [ -n "$NOSWAP" ]; then - ewarn "Ignoring swap partition ${WHITE}$p${NORMAL} as requested." ; eend 0 - else - case "$(dd if=$p bs=1 count=6 skip=4086 2>/dev/null)" in - S1SUSP|S2SUSP|pmdisk|[zZ]*) - if [ -n "$ANYSWAP" ] ; then - einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]." - swapon $p 2>>$DEBUG ; eend $? - else - ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)" - fi - ;; - *) - if [[ "$p" == LABEL* ]] ; then - p=$(blkid -t $p | awk -F: '{print $1}') - fi - if grep -q $p /proc/swaps ; then - ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0 - else - einfo "Using swap partition ${WHITE}${p}${NORMAL}." - swapon $p 2>>$DEBUG ; eend $? - fi - ;; - esac - fi - eoutdent - continue - ;; - esac -# Create mountdir if not already present, but don't try to create stuff like /proc/bus/usb -# Notice: grml-rebuildfstab >= 0.3-1 handles this now -# case "$m" in *none*|*proc*|*sys*|'') continue ;; esac -# [ -d "$m" ] || mkdir -p "$m" -# WARNING: NTFS RW mounts are only safe since Kernel 2.6.11 - [ "$f" = "ntfs" -a "${KERNEL%.*}" != "2.6" ] && continue - MOUNTOPTS="ro" - case "$f" in - vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;; - ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;; - *) continue ;; - # *) NONEFOUND='1'; continue ;; - esac - mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG || continue - # Activate swapfile, if exists - SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)" - if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then - mount -o remount,rw $m - if swapon "$SWAPFILE" 2>>$DEBUG ; then - einfo "Using GRML swapfile ${SWAPFILE}." - fnew="$SWAPFILE swap swap defaults 0 0" - stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab - GRML_SWP="$GRML_SWP $SWAPFILE" - eend 0 - fi - mount -o remount,ro $m 2>>$DEBUG - fi - IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)" - if [ -z "$INSTALLED" -a -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then - if [ -n "$HOMEDIR" ]; then - if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then - continue - fi - fi - if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" /dev/console 2>&1; then - GRML_IMG="$IMAGE" - mount -o remount,ro $m 2>>$DEBUG - fi - fi - eend 0 - # Umount, if not in use - umount -r $m 2>/dev/null - done </dev/null)" in + S1SUSP|S2SUSP|pmdisk|[zZ]*) + if [ -n "$ANYSWAP" ] ; then + einfo "Using swap partition ${WHITE}${p}${NORMAL} [bootoption anyswap found]." + swapon $p 2>>$DEBUG ; eend $? + else + ewarn "Suspend signature on ${WHITE}${p}${NORMAL} found, not using as swap. (Force usage via boot option: anyswap)" + fi + ;; + *) + if [[ "$p" == LABEL* ]] ; then + p=$(blkid -t $p | awk -F: '{print $1}') + fi + if grep -q $p /proc/swaps ; then + ewarn "Not using swap partition ${WHITE}${p}${NORMAL} as it is already in use." ; eend 0 + else + if [ -b "$p" ] ; then + einfo "Using swap partition ${WHITE}${p}${NORMAL}." + swapon $p 2>>$DEBUG ; eend $? + else + ewarn "$p is not a valid block device - not using it therefore." ; eend 0 + fi + fi + ;; + esac # dd-check + fi # -n "$NOSWAP + eoutdent + continue + ;; + esac # it's a swap partition? + + # mount read-only + MOUNTOPTS="ro" + case "$f" in + vfat|msdos|ntfs) MOUNTOPTS="$MOUNTOPTS,uid=${fstabuser},gid=${fstabuser}" ;; + ext2|ext3|reiserfs|jfs|reiser4|xfs) MOUNTOPTS="$MOUNTOPTS,noatime" ;; + *) continue ;; + # *) NONEFOUND='1'; continue ;; + esac + + # use a swapfile + if [ -z "$NOSWAP" ] ; then + mount -o "$MOUNTOPTS" -t $f $p $m 2>>$DEBUG && MOUNTED=1 || continue + # Activate swapfile, if exists + SWAPFILE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ss][Ww][Pp] 2>/dev/null)" + fi + if [ -z "$NOSWAP" -a -n "$SWAPFILE" -a -f "$SWAPFILE" ]; then + mount -o remount,rw $m && MOUNTED=1 + if swapon "$SWAPFILE" 2>>$DEBUG ; then + eindent + einfo "Using GRML swapfile ${WHITE}${SWAPFILE}${NORMAL}." + eoutdent + fnew="$SWAPFILE swap swap defaults 0 0" + stringinfile "$fnew" "/etc/fstab" || echo "$fnew" >> /etc/fstab + GRML_SWP="$GRML_SWP $SWAPFILE" + eend 0 + fi + mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1 + fi + + # use a image as home + IMAGE="$(/bin/ls -1d $m/[Gg][Rr][Mm][Ll].[Ii][Mm][Gg] 2>/dev/null)" + if [ -z "$GRML_IMG" -a -n "$IMAGE" -a -f "$IMAGE" ]; then + if [ -n "$HOMEDIR" ]; then + if [ "$HOMEDIR" != "scan" -a "$HOMEDIR" != "$IMAGE" -a "$HOMEDIR" != "${IMAGE%/*.*}" ]; then + continue + fi + fi + if type -a grml-image >/dev/null 2>&1 && grml-image "$IMAGE" /dev/console 2>&1; then + GRML_IMG="$IMAGE" + mount -o remount,ro $m 2>>$DEBUG && MOUNTED=1 + fi + fi + eend 0 + + # Umount, if not in use + [ -n "$MOUNTED" ] && umount -r $m 2>/dev/null + + done <>$DEBUG` " ; eend 0 - if /usr/sbin/laptop-detect ; then - einfo "Detected Laptop - trying to use cpu frequency scaling:" -# loadcpumod() { -# for module in /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq/*.ko /lib/modules/${KERNEL}/kernel/drivers/cpufreq/*.ko ; do -# # modprobe ${${${${(f)"$(_call_program modules ${(M)words[1]##*/}modprobe -l | grep cpufreq 2>>$DEBUG)"}:#}##*/}%.*} -# modprobe `basename ${module%%\.ko}` 1>>$DEBUG 2>&1 -# done -# } -# CPU=$(grep 'model name' /proc/cpuinfo | cut -b14- | head -1) -# eindent -# if [[ $CPU = *Intel* ]] ; then -# einfo "Detected CPU is of type Intel - loading modules and starting cpudyn." -# local DETECTED=1 -# loadcpumod -# /etc/init.d/cpudyn start 1>>$DEBUG ; eend $? -# fi -# if [[ $CPU = *AMD* ]] ; then -# einfo "Detected CPU is of type AMD - loading modules and starting powernowd." -# local DETECTED=1 -# loadcpumod -# /etc/init.d/powernowd start 1>>$DEBUG ; eend $? -# fi - - eindent - if [ -r /usr/bin/cpufreq-detect.sh ] ; then - . /usr/bin/cpufreq-detect.sh - if [ -n "$MODULE" -a "$MODULE" != none ]; then - einfo "Loading module ${MODULE} and starting powernowd." - modprobe cpufreq_userspace 1>>$DEBUG - modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG - /etc/init.d/powernowd start 1>>$DEBUG ; eend $? - else - ewarn "Could not detect an appropriate CPU for use with powernowd - skipping." && eend 1 - fi - fi - eoutdent + # check module dependencies + cpufreq_check() { + if [ -e /lib64 ] ; then + [ -e /lib/modules/${KERNEL}/kernel/arch/x86_64/kernel/cpufreq ] || return 1 + else + [ -e /lib/modules/${KERNEL}/kernel/arch/i386/kernel/cpu/cpufreq -o ! -e /lib/modules/${KERNEL}/kernel/drivers/cpufreq ] || return 1 fi + } + + if [[ `grep -c processor /proc/cpuinfo` -gt 1 ]] ; then + einfo "Detecting CPU:" + 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) + echo $CPU | sed 's/ \{1,\}/ /g' + eend 0 + else + einfo "Detecting 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 fi -fi + + if ! cpufreq_check ; then + ewarn "Skipping cpufreq setup as module dependencies are not fulfilled." ; eend 1 + else + if /usr/sbin/laptop-detect ; then + einfo "Detected Laptop - trying to use cpu frequency scaling:" + if [ -r /usr/bin/cpufreq-detect.sh ] ; then + eindent + . /usr/bin/cpufreq-detect.sh + if [ -n "$MODULE" -a "$MODULE" != none ]; then + einfo "Loading modules ${MODULE} and cpufreq_ondemand, setting ondemand governor" + modprobe "$MODULE" 1>>$DEBUG || modprobe "$MODULE_FALLBACK" 1>>$DEBUG + if modprobe cpufreq_ondemand && RC=0 || RC=1 ; then + for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do + echo ondemand > $file + done + fi + eend $RC + else + ewarn "Could not detect an appropriate CPU for use with cpu frequency scaling - skipping." && eend 1 + fi + eoutdent + fi # cpufreq-detect + fi # laptop-detect + fi # cpufreq_check +fi # checkbootparam nocpu } # }}} @@ -1254,164 +1317,85 @@ fi # {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file. config_homedir(){ -HOMEDIR="$(getbootparam home)" -MYHOMEDEVICE="" -MYHOMEMOUNTPOINT="" -MYHOMEDIR="" -if [ -n "$HOMEDIR" ]; then - einfo "Bootoption home detected." && eend 0 - case "$HOMEDIR" in - /dev/*) - MYHOMEDEVICE="${HOMEDIR##/dev/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - MYHOMEDIR="/mnt/${HOMEDIR##/dev/}" - ;; - /mnt/*) - MYHOMEDEVICE="${HOMEDIR##/mnt/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - MYHOMEDIR="$HOMEDIR" - ;; - [Aa][Uu][Tt][Oo]|[Ss][Cc][Aa][Nn]|[Ff][Ii][Nn][Dd]) - MYHOMEDIR="$(findfile grml.img)" - MYHOMEDEVICE="${MYHOMEDIR##/mnt/}" - MYHOMEDEVICE="/dev/${MYHOMEDEVICE%%/*}" - MYHOMEMOUNTPOINT="/mnt/${MYHOMEDEVICE##/dev/}" - ;; - *) - eerror "Invalid home= option '$HOMEDIR' specified (must start with /dev/ or /mnt/ or 'scan')." ; eend 1 - eerror "Option ignored." ; eend 1 - ;; - esac -fi - -if [ -n "$MYHOMEDIR" ]; then - if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then - [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img" - while read device mountpoint fs relax; do - case "$mountpoint" in *$MYHOMEMOUNTPOINT*) - case "$fs" in *[Nn][Tt][Ff][Ss]*) - umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1 - break - ;; - *[Ff][Aa][Tt]*) - # Note: This currently won't work with encrypted partitions - umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT" - if [ ! -f "$MYHOMEDIR" ]; then - ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)." - ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img." - fi - ;; - esac - if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then - einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}." - if [ -f "$MYHOMEDIR" ]; then - # It's a loopback file, mount it over the /home/grml directory - trymount "$MYHOMEDIR" /home/grml - RC="$?" - [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)" - RC="$?" - else - # Do a --bind mount - ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)" - RC="$?" - fi - [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 ) - fi - break - ;; - esac - done < /proc/sys/kernel/printk - . "$MYCONFIG" "$MYCONFDIR" || true - echo "0" > /proc/sys/kernel/printk - fi - umount "$MYCONFMOUNTPOINT" 2>>$DEBUG - fi - fi - [ -n "$FOUND_CONFIG" ] || eerror "Not present." - eoutdent -fi -# }}} - -# {{{ Check for extra shellscript on CD-ROM (/cdrom/GRML/grml.sh) -MYCONFIG="$(/bin/ls -1d /cdrom/GRML/[Gg][Rr][Mm][Ll].[Ss][Hh] 2>>$DEBUG)" -if [ -n "$MYCONFIG" -a -f "$MYCONFIG" ]; then - echo "" - FOUND_CONFIG="yes" - einfo "grml script/configuration file found on CD, executing ${BLUE}${MYCONFIG}${NORMAL}:" - echo "6" > /proc/sys/kernel/printk - . "$MYCONFIG" /cdrom/GRML || true - echo "0" > /proc/sys/kernel/printk -fi + esac + fi # -n $HOMEDIR + + if [ -n "$MYHOMEDIR" ]; then + if trymount "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT"; then + [ -f "$MYHOMEMOUNTPOINT/grml.img" ] && MYHOMEDIR="$MYHOMEMOUNTPOINT/grml.img" + while read device mountpoint fs relax; do + case "$mountpoint" in *$MYHOMEMOUNTPOINT*) + case "$fs" in + *[Nn][Tt][Ff][Ss]*) + umount "$MYHOMEMOUNTPOINT"; eerror "Error: will not mount NTFS filesystem on $MYHOMEDEVICE read/write!" ; eend 1 + break + ;; + *[Ff][Aa][Tt]*) + # Note: This currently won't work with encrypted partitions + umount "$MYHOMEMOUNTPOINT"; mount -t vfat -o rw,uid=grml,gid=grml,umask=002 "$MYHOMEDEVICE" "$MYHOMEMOUNTPOINT" + if [ ! -f "$MYHOMEDIR" ]; then + ewarn "WARNING: FAT32 is not a good filesystem option for /home/grml (missing socket/symlink support)." + ewarn "WARNING: Better use an ext2 loopback file on this device, and boot with home=$MYHOMEDEVICE/grml.img." + fi + ;; + esac + + if mount -o remount,rw "$MYHOMEMOUNTPOINT"; then + einfo "Mounting ${WHITE}$MYHOMEDIR${NORMAL} as ${WHITE}/home/grml${NORMAL}." + if [ -f "$MYHOMEDIR" ]; then + # It's a loopback file, mount it over the /home/grml directory + trymount "$MYHOMEDIR" /home/grml + RC="$?" + [ "$RC" = "0" ] && ERROR="$(mount -o remount,rw /home/grml 2>&1)" + RC="$?" + else + # Do a --bind mount + ERROR="$(mount --bind "$MYHOMEDIR" /home/grml 2>&1)" + RC="$?" + fi # -f $MYHOMEDIR + + [ "$RC" = "0" ] && eend 0 || ( eerror "${ERROR}" ; eend 1 ) + + fi # mount -o remount,rw,... + break + ;; + esac # case "$mountpoint" in *$MYHOMEMOUNTPOINT*) + done <>$DEBUG EOF chmod 755 /etc/init.d/xstartup - sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config - sed -i 's#^6.*#6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"#' /etc/inittab + + # adjust inittab for xstartup + if grep -q '^6:' /etc/inittab ; then + sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"|' /etc/inittab + else # just append tty6 to inittab if no definition is present: + echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /bin/zsh"' >> /etc/inittab + fi + /sbin/telinit q ; eend $? + + if grep -q '^allowed_users=' /etc/X11/Xwrapper.config ; then + sed -i 's/^allowed_users=.*/allowed_users=anybody/' /etc/X11/Xwrapper.config + else + echo 'allowed_users=anybody' >> /etc/X11/Xwrapper.config + fi + else eerror "We are not running from CD - startx will not work, skipping it. Please use something like xdm, gdm or kdm for starting X on a harddisk system!" ; eend 1 @@ -1701,7 +1698,7 @@ fi } config_automount(){ -if checkbootparam noautoconfig ; then +if checkbootparam noautoconfig -o checkbootparam forensic ; then ewarn "Skipping running automount of device(s) labeled GRMLCFG as requested." ; eend 0 else if [ -z "$INSTALLED" ] ; then @@ -1748,6 +1745,17 @@ fi } config_myconfig(){ + +if checkbootparam "config" ; then + CONFIG="$(getbootparam 'config' 2>>$DEBUG)" + [ -z "$CONFIG" ] && CONFIG='config.tbz' + einfo "Bootoption config found. config is set to: $CONFIG" + eindent + einfo "Trying to extract configuration file ${CONFIG}:" + cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $? + eoutdent +fi + if checkbootparam myconfig ; then MOUNTDEVICE="$(getbootparam 'myconfig' 2>>$DEBUG)" if [ -n "$MOUNTDEVICE" ]; then @@ -1819,18 +1827,6 @@ if checkbootparam "debs" ; then fi } -config_config(){ -if checkbootparam "config" ; then - CONFIG="$(getbootparam 'config' 2>>$DEBUG)" - [ -z "$CONFIG" ] && CONFIG='config.tbz' - einfo "Bootoption config found. config is set to: $CONFIG" - eindent - einfo "Trying to extract configuration file ${CONFIG}:" - cd / && unp /cdrom/config/$CONFIG $EXTRACTOPTIONS ; eend $? - eoutdent -fi -} - config_scripts(){ if checkbootparam "scripts" ; then SCRIPTS="$(getbootparam 'scripts' 2>>$DEBUG)" @@ -1979,6 +1975,75 @@ fi } # }}} +# {{{ SW-RAID +config_swraid(){ + if [ -z "$INSTALLED" ] ; then + # notice: checkbootparam "forensic" is just for users who don't know how to really use the bootoption + if checkbootparam 'noraid' -o checkbootparam 'noswraid' -o \ + checkbootparam 'forensic' -o checkbootparam 'raid=noautodetect' ; then + ewarn "Skipping SW-RAID code as requested on boot commandline." ; eend 0 + else + if ! [ -x /sbin/mdadm ] ; then + eerror "mdadm not available, can not execute it." ; eend 1 + else + + # if ! egrep -qv '^(MAILADDR.*|#.*|)$' /etc/mdadm/mdadm.conf 2>>$DEBUG ; then + # find out whether we have a valid configuration file already + if ! grep -q ARRAY /etc/mdadm/mdadm.conf 2>>$DEBUG ; then + einfo "Creating /etc/mdadm/mdadm.conf for use with mdadm." + [ -r /etc/mdadm/mdadm.conf ] && mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.old + MDADM_MAILADDR__='root' /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf ; eend $? + else + ewarn "/etc/mdadm/mdadm.conf looks like a configured mdadm setup, will not touch it." ; eend 0 + fi + + if ! checkbootparam 'swraid' ; then + eindent + einfo "Just run 'Start mdadm-raid' to assemble md arrays or boot using 'swraid' as bootoption for autostart." + eoutdent + else + einfo "Bootoption swraid found. Searching for software RAID arrays:" + eindent + IFSOLD=${IFS:-} + IFS=' +' + for line in $(mdadm --assemble --scan --auto=yes --symlink=no 2>&1) ; do + case $line in + *'No arrays found'*) + ewarn "$line" ; eend 0 + ;; + *) + einfo "$line" ; eend 0 + ;; + esac + done + IFS=$IFSOLD + eoutdent + + if [ -r /proc/mdstat ] ; then + eindent + MDSTAT=$(grep '^md[0-9]' /proc/mdstat) + if [ -z "$MDSTAT" ] ; then + ewarn "No active arrays found" ; eend 0 + else + IFSOLD=${IFS:-} + IFS=' +' + for line in $(grep '^md[0-9]' /proc/mdstat) ; do + einfo "active arrays: $line" ; eend 0 + done + IFS=$IFSOLD + fi + eoutdent + fi # /proc/mdstat + fi # bootoption swraid + + fi # is /sbin/mdadm executable? + fi # check for bootoptions + fi # run only in live-cd mode +} +# }}} + # {{{ debnet: setup network based on an existing one found on a partition config_debnet(){ if checkbootparam "debnet" ; then @@ -2037,47 +2102,156 @@ fi # {{{ grml2hd: automatic installation config_grml2hd(){ +if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then + if checkbootparam "user" ; then - NEWUSER='' - NEWUSER="$(getbootparam 'user' 2>>$DEBUG)" - sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1 + NEWUSER='' + NEWUSER="$(getbootparam 'user' 2>>$DEBUG)" + sed -i "s/^NEWUSER=.*/NEWUSER=$NEWUSER/" /etc/grml2hd/config || export GRML2HD_FAIL=1 fi if checkbootparam "filesystem" ; then - FILESYSTEM='' - FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)" - sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1 + FILESYSTEM='' + FILESYSTEM="$(getbootparam 'filesystem' 2>>$DEBUG)" + sed -i "s/^FILESYSTEM=.*/FILESYSTEM=$FILESYSTEM/" /etc/grml2hd/config || export GRML2HD_FAIL=1 fi if checkbootparam "partition" ; then - PARTITION='' - PARTITION="$(getbootparam 'partition' 2>>$DEBUG)" - # notice: the following checks whether the given partition is available, if not the skip - # execution of grml2hd as it might result in data loss... - if [ -r $PARTITION ] ; then - sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 - else - ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1 - fi + PARTITION='' + PARTITION="$(getbootparam 'partition' 2>>$DEBUG)" + # notice: the following checks whether the given partition is available, if not the skip + # execution of grml2hd as it might result in data loss... + if [ -r $PARTITION ] ; then + sed -i "s#^PARTITION=.*#PARTITION=$PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 + else + ewarn "Partition $PARTITION does not exist. Skipping execution of grml2hd therefore." ; eend 1 + fi fi if checkbootparam "mbr" ; then - BOOT_PARTITION='' - BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)" - sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 + BOOT_PARTITION='' + BOOT_PARTITION="$(getbootparam 'mbr' 2>>$DEBUG)" + sed -i "s#^BOOT_PARTITION=.*#BOOT_PARTITION=$BOOT_PARTITION#" /etc/grml2hd/config || export GRML2HD_FAIL=1 fi -if stringinstring "BOOT_IMAGE=grml2hd " "$CMDLINE" ; then - cat>|/usr/bin/grml2hd_noninteractive<|/usr/bin/grml2hd_noninteractive<|/usr/bin/grml-debootstrap_noninteractive<