if [ -r /etc/default/locale ] ; then
if grep -q "LANG=.*UTF" /etc/default/locale ; then
einfo "Setting up unicode environment."
- unicode_start 2>>$DEBUG ; eend $?
+ unicode_start >>$DEBUG 2>&1 ; eend $?
fi
fi
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
- CUR_CONSOLE=$(fgconsole)
-
+ NUM_CONSOLES=$(fgconsole --next-available 2>/dev/null)
+ if [ -n "$NUM_CONSOLES" ] ; then
+ NUM_CONSOLES=$(expr ${NUM_CONSOLES} - 1)
+ [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
+ fi
+ CUR_CONSOLE=$(fgconsole 2>/dev/null)
if [ -n "$CHARMAP" ] ; then
einfo "Running consolechars for ${CHARMAP}"
- for vc in `seq 0 ${NUM_CONSOLES}` ; do
+ RC=0
+ for vc in $(seq 0 ${NUM_CONSOLES}) ; do
consolechars --tty=/dev/tty${vc} -m ${CHARMAP} ; RC=$?
done
- [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
+ if [ -n "$CUR_CONSOLE" ] ; then
+ [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+ fi
eend $RC
fi
else
if [ -n "$CONSOLEFONT" ] ; then
einfo "Running consolechars using ${CONSOLEFONT}"
- for vc in `seq 0 ${NUM_CONSOLES}` ; do
+ RC=0
+ for vc in $(seq 0 ${NUM_CONSOLES}) ; do
consolechars --tty=/dev/tty${vc} -f $CONSOLEFONT ; RC=$?
done
- [ -n "$CUR_CONSOLE" ] && chvt $CUR_CONSOLE
- eend $?
+ if [ -n "$CUR_CONSOLE" ] ; then
+ [ "$CUR_CONSOLE" != "serial" ] && chvt $CUR_CONSOLE
+ fi
+ eend $RC
fi
fi
config_hostname(){
if checkbootparam 'hostname' ; then
HOSTNAME="$(getbootparam 'hostname' 2>>$DEBUG)"
+ if [ -z "$HOSTNAME" ] && [ -x /usr/bin/random-hostname ] ; then
+ einfo "Generating random hostname as no hostname was specified."
+ HOSTNAME="$(/usr/bin/random-hostname)"
+ eend $?
+ fi
einfo "Setting hostname to $HOSTNAME as requested."
grml-hostname $HOSTNAME >>$DEBUG ; RC=$?
[ "$RC" = "0" ] && hostname $HOSTNAME
# activate serial console {{{
config_console(){
if checkbootparam 'console'; then
- 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
+ local line
+ local ws
+ ws=' '
- einfo "Activating mgetty."
- sed -i 's/^#T0/T0/' /etc/inittab
- sed -i 's/^#T1/T1/' /etc/inittab
- /sbin/telinit q ; eend $?
- eoutdent
+ einfo "Bootoption for serial console detected:"
+
+ line="$CMDLINE x "
+ this=""
+ line="${line#*[$ws]}"
+ local telinitq=""
+ while [ -n "$line" ]; do
+ case "$this" in
+ console=*)
+ local serial="$this"
+ local device="${this%%,*}"
+ local device="${device##*=}"
+ if ! echo $serial | grep -q ttyS ; then
+ ewarn "Warning: console=ttyS... not specified as last console= option. Falling back to set up ttyS0/9600."
+ sed -i "/^#grmlserial#/iT0:23:respawn:/bin/bash -c \"/sbin/getty -L /dev/ttyS0 -l /usr/bin/zsh-login 9600 vt100 || sleep 30\"" /etc/inittab
+ eend 0
+ else
+ local option="${serial##*,}"
+ # default (works for kvm & CO):
+ local speed="115200,57600,38400,19200,9600,4800,2400,1200";
+ # ... unless overriden by command line:
+ case "$option" in
+ 115200*) speed=115200 ;;
+ 57600*) speed=57600 ;;
+ 38400*) speed=38400 ;;
+ 19200*) speed=19200 ;;
+ 9600*) speed=9600 ;;
+ 4800*) speed=4800 ;;
+ 2400*) speed=2400 ;;
+ 1200*) speed=1200 ;;
+ esac
+ fi
+ eindent
+ einfo "Activating console login on device ${device} with speed ${speed}."
+ local number="${device#ttyS}"
+ sed -i "/^#grmlserial#/iT$number:23:respawn:/bin/bash -c \"/sbin/getty -L $device -l /usr/bin/zsh-login $speed vt100 || sleep 30\"" /etc/inittab
+ eend $?
+ telinitq="1"
+ eoutdent
+ ;;
+ esac
+ this="${line%%[$ws]*}"
+ line="${line#*[$ws]}"
+ done
+
+ if [ -n "$telinitq" ]; then
+ /sbin/telinit q
+ fi
+ eend $?
fi
}
# }}}
}
# }}}
-# {{{ helper functions
-findfile(){
-FOUND=""
-# search all partitions for a file in the root directory
-for i in /mnt/[sh]d[a-z] /mnt/[sh]d[a-z][1-9] /mnt/[sh]d[a-z][1-9]?*; do
-# See if it's already mounted
- [ -f "$i/$1" ] && { echo "$i/$1"; return 0; }
- if [ -d "$i" ] && mount -r "$i" 2>>$DEBUG; then
- [ -f "$i/$1" ] && FOUND="$i/$1"
- umount -l "$i" 2>>$DEBUG
- [ -n "$FOUND" ] && { echo "$FOUND"; return 0; }
- fi
-done
-return 2
-}
-
-fstype(){
-case "$(file -s $1)" in
- *[Ff][Aa][Tt]*|*[Xx]86*) echo "vfat"; return 0;;
- *[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs"; return 0;;
- *[Xx][Ff][Ss]*) echo "xfs"; return 0;;
- *[Ee][Xx][Tt]3*) echo "ext3"; return 0;;
- *[Ee][Xx][Tt]2*) echo "ext2"; return 0;;
- *data*) echo "invalid"; return 0;;
- *) echo "auto"; return 0;;
-esac
-}
-
-# Try to mount this filesystem read-only, without or with encryption
-trymount(){
-# Check if already mounted
-case "$(cat /proc/mounts)" in *\ $2\ *) return 0;; esac
-# Apparently, mount-aes DOES autodetect AES loopback files.
-[ -b "$1" ] && { mount -t auto -o ro "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# We need to mount crypto-loop files with initial rw support
-[ -f "$1" ] && { mount -t auto -o loop,rw "$1" "$2" 2>>$DEBUG; RC="$?"; }
-# Mount succeeded?
-[ "$RC" = "0" ] && return 0
-echo ""
-einfo "Filesystem not autodetected, trying to mount $1 with AES256 encryption."
-a="y"
-while [ "$a" != "n" -a "$a" != "N" ]; do
-# We need to mount crypto-loop files with initial rw support
- mount -t auto -o loop,rw,encryption=AES256 "$1" "$2" && return 0
- echo -n "${RED}Mount failed, retry? [Y/n] ${NORMAL}"
- # Problem with ioctl() from getpasswd()?
- # read a
- read a
-done
-return 1
-}
-# }}}
-
# {{{ CPU-detection
config_cpu(){
if checkbootparam 'nocpu'; then
einfo "Loading modules ${MODULE}"
modprobe "$MODULE" >>$DEBUG || modprobe "$MODULE_FALLBACK" >>$DEBUG
RC=$?
- if [[ $RC == 0 ]]; then
+ if [[ "$RC" == 0 ]]; then
eend 0
else
SKIP_CPU_GOVERNOR=1
if [ -z "$SKIP_CPU_GOVERNOR" ] ; then
einfo "Loading cpufreq_ondemand, setting ondemand governor"
+ RC=0
if modprobe cpufreq_ondemand ; RC=$? ; then
for file in $(find /sys/devices/system/cpu/ -name scaling_governor 2>/dev/null) ; do
echo ondemand > $file
# {{{ Check for persistent homedir option and eventually mount /home from there, or use a loopback file.
config_homedir(){
if checkbootparam 'home' ; then
- 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 # -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 <<EOT
- $(cat /proc/mounts)
-EOT
- fi # if trymount ...
- fi # -n $MYHOMEDIR
-fi # checkbootparam home
+ ewarn "The \"home\" bootoption is deprecated, please use the persistency feature instead."; eend 1
+fi
}
# }}}
else
einfo "Window manager ${WHITE}${WINDOWMANAGER}${NORMAL} found as bootoption." && eend 0
fi
- einfo "Changing to runlevel 5 for starting grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
+ einfo "Setting up and invoking grml-x ${WINDOWMANAGER}. Just exit X windows system to get full featured consoles."
config_userfstab || fstabuser='grml'
cat>|/etc/init.d/xstartup<<EOF
#!/bin/sh
-# su - $fstabuser -c 'grml-x "$WINDOWMANAGER"'
-sudo -u $fstabuser -i /usr/bin/grml-x $WINDOWMANAGER >>$DEBUG
+su $fstabuser -c "/usr/bin/grml-x $WINDOWMANAGER"
EOF
chmod 755 /etc/init.d/xstartup
# 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
+ sed -i 's|^6:.*|6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>\&1 </dev/tty6|' /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
+ echo '6:2345:respawn:/bin/zsh --login -c "/etc/init.d/xstartup ; /usr/bin/zsh-login" >/dev/tty6 2>&1 < /dev/tty6' >> /etc/inittab
fi
/sbin/telinit q ; eend $?
# {{{ /cdrom/.*-options
config_debs(){
if checkbootparam 'debs' ; then
+ iszsh && setopt localoptions shwordsplit
DEBS="$(getbootparam 'debs' 2>>$DEBUG)"
if ! echo $DEBS | grep -q '/'; then
# backwards compatibility: if no path is given get debs from debs/
# {{{ debnet: setup network based on an existing one found on a partition
config_debnet(){
if checkbootparam 'debnet' ; then
- iszsh && setopt shwordsplit
+ iszsh && setopt localoptions shwordsplit
DEVICES="$(< /proc/partitions tail -n +3 | awk '{print "/dev/"$4}' | tr "\n" " ")"
DEVICES="$DEVICES $(ls /dev/mapper/*)"
FOUND_DEBNET=""