summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/functions205
-rwxr-xr-xscripts/init-top/all_generic_ide4
-rwxr-xr-xscripts/init-top/blacklist25
-rw-r--r--scripts/local62
-rwxr-xr-xscripts/local-premount/resume29
-rw-r--r--scripts/nfs17
6 files changed, 247 insertions, 95 deletions
diff --git a/scripts/functions b/scripts/functions
index f715e68..419203a 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -42,6 +42,11 @@ panic()
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "QUIT"
fi
+
+ if command -v chvt >/dev/null 2>&1; then
+ chvt 1
+ fi
+
# Disallow console access
if [ -n "${panic}" ]; then
sleep ${panic}
@@ -49,8 +54,8 @@ panic()
fi
modprobe i8042
modprobe atkbd
- echo $@
- PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
+ echo "$@"
+ REASON="$@" PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
}
maybe_break()
@@ -74,7 +79,7 @@ set_initlist()
# only allow variable name chars
case ${si_x#${initdir}/} in
- *[![:alnum:]_]*)
+ *[![:alnum:]\._-]*)
[ "${verbose}" = "y" ] \
&& echo "$si_x ignored: not alphanumeric or '_' file"
continue
@@ -95,7 +100,14 @@ set_initlist()
continue
fi
- initlist="${initlist} ${si_x#${initdir}/}"
+ # skip bad syntax
+ if ! sh -n ${si_x} ; then
+ [ "${verbose}" = "y" ] \
+ && echo "$si_x ignored: bad syntax"
+ continue
+ fi
+
+ initlist="${initlist:-} ${si_x#${initdir}/}"
done
}
@@ -106,18 +118,17 @@ reduce_satisfied()
for rs_y in ${deplist}; do
# only allow variable name chars
case ${rs_y} in
- *[![:alnum:]_]*)
+ *[![:alnum:]\._-]*)
continue
;;
esac
# skip non executable scripts
- if [ ! -x ${initdir}/${rs_y} ]; then
- continue
- fi
+ [ ! -x ${initdir}/${rs_y} ] && continue
# skip directories
- if [ -d ${initdir}/${rs_y} ]; then
- continue
- fi
+ [ -d ${initdir}/${rs_y} ] && continue
+ # skip bad syntax
+ sh -n ${initdir}/${rs_y} || continue
+
tmpdeplist="${tmpdeplist} ${rs_y}"
done
deplist=${tmpdeplist}
@@ -186,28 +197,57 @@ reduce_prereqs()
done
}
+get_prereq_pairs()
+{
+ set_initlist
+ for gp_x in ${initlist:-}; do
+ echo ${gp_x} ${gp_x}
+ prereqs=$(${initdir}/${gp_x} prereqs)
+ for prereq in ${prereqs}; do
+ echo ${prereq} ${gp_x}
+ done
+ done
+}
+
call_scripts()
{
+ set -e
for cs_x in ${runlist}; do
+ [ -f ${initdir}/${cs_x} ] || continue
# mkinitramfs verbose output
if [ "${verbose}" = "y" ]; then
echo "Calling hook ${cs_x}"
fi
- ${initdir}/${cs_x}
- # allow boot scripts to modify exported boot paramaters
+ ${initdir}/${cs_x} && ec=$? || ec=$?
+ # allow hooks to abort build:
+ if [ "$ec" -ne 0 ]; then
+ echo "E: ${initdir}/${cs_x} failed with return $ec."
+ # only errexit on mkinitramfs
+ [ -n "${version}" ] && exit $ec
+ fi
+ # allow boot scripts to modify exported boot parameters
if [ -e /conf/param.conf ]; then
. /conf/param.conf
fi
done
+ set +e
}
run_scripts()
{
initdir=${1}
[ ! -d ${initdir} ] && return
- get_prereqs
- reduce_prereqs
- call_scripts
+
+ if [ -f ${initdir}/ORDER ]; then
+ . ${initdir}/ORDER
+ elif command -v tsort >/dev/null 2>&1; then
+ runlist=$(get_prereq_pairs | tsort)
+ call_scripts ${2:-}
+ else
+ get_prereqs
+ reduce_prereqs
+ call_scripts
+ fi
}
# Load custom modules first
@@ -256,47 +296,122 @@ parse_numeric() {
ROOT=/dev/root
}
+# Parameter: device node to check
+# Echos fstype to stdout
+# Return value: indicates if an fs could be recognized
+get_fstype ()
+{
+ local FS FSTYPE FSSIZE RET
+ FS="${1}"
+
+ # blkid has a more complete list of file systems,
+ # but fstype is more robust
+ eval $(fstype "${FS}" 2> /dev/null)
+ if [ "$FSTYPE" = "unknown" ] && command -v blkid >/dev/null 2>&1 ; then
+ FSTYPE=$(blkid -o value -s TYPE "${FS}")
+ elif [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then
+ FSTYPE=$(/lib/udev/vol_id -t "${FS}" 2> /dev/null)
+ fi
+ RET=$?
+
+ if [ -z "${FSTYPE}" ]; then
+ FSTYPE="unknown"
+ fi
+
+ echo "${FSTYPE}"
+ return ${RET}
+}
+
configure_networking()
{
+ if [ -n "${BOOTIF}" ]; then
+ # pxelinux sets BOOTIF to a value based on the mac address of the
+ # network card used to PXE boot, so use this value for DEVICE rather
+ # than a hard-coded device name from initramfs.conf. this facilitates
+ # network booting when machines may have multiple network cards.
+ # pxelinux sets BOOTIF to 01-$mac_address
+
+ # strip off the leading "01-", which isn't part of the mac
+ # address
+ temp_mac=${BOOTIF#*-}
+
+ # convert to typical mac address format by replacing "-" with ":"
+ bootif_mac=""
+ IFS='-'
+ for x in $temp_mac ; do
+ if [ -z "$bootif_mac" ]; then
+ bootif_mac="$x"
+ else
+ bootif_mac="$bootif_mac:$x"
+ fi
+ done
+ unset IFS
+
+ # look for devices with matching mac address, and set DEVICE to
+ # appropriate value if match is found.
+ for device in /sys/class/net/* ; do
+ if [ -f "$device/address" ]; then
+ current_mac=$(cat "$device/address")
+ if [ "$bootif_mac" = "$current_mac" ]; then
+ DEVICE=${device##*/}
+ break
+ fi
+ fi
+ done
+ fi
+
# networking already configured thus bail out
[ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0
# support ip options see linux sources
# Documentation/filesystems/nfsroot.txt
- case ${IPOPTS} in
- none|off)
- # Do nothing
- ;;
- ""|on|any)
- # Bring up device
- ipconfig -t 180 ${DEVICE}
- ;;
- dhcp|bootp|rarp|both)
- ipconfig -t 180 -c ${IPOPTS} -d ${DEVICE}
- ;;
- *)
- ipconfig -t 180 -d $IPOPTS
-
- # grab device entry from ip option
- NEW_DEVICE=${IPOPTS#*:*:*:*:*:*}
- if [ "${NEW_DEVICE}" != "${IPOPTS}" ]; then
- NEW_DEVICE=${NEW_DEVICE%:*}
- else
- # wrong parse, possibly only a partial string
- NEW_DEVICE=
- fi
- if [ -n "${NEW_DEVICE}" ]; then
- DEVICE="${NEW_DEVICE}"
- fi
- ;;
- esac
+ # Documentation/frv/booting.txt
+
+ for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do
+
+ # The NIC is to be configured if this file does not exist.
+ # Ip-Config tries to create this file and when it succeds
+ # creating the file, ipconfig is not run again.
+ for x in /tmp/net-"${DEVICE}".conf /tmp/net-*.conf ; do
+ [ -e "$x" ] && break 2
+ done
+
+ case ${IP} in
+ none|off)
+ # Do nothing
+ ;;
+ ""|on|any)
+ # Bring up device
+ ipconfig -t ${ROUNDTTT} "${DEVICE}"
+ ;;
+ dhcp|bootp|rarp|both)
+ ipconfig -t ${ROUNDTTT} -c ${IP} -d "${DEVICE}"
+ ;;
+ *)
+ ipconfig -t ${ROUNDTTT} -d $IP
+
+ # grab device entry from ip option
+ NEW_DEVICE=${IP#*:*:*:*:*:*}
+ if [ "${NEW_DEVICE}" != "${IP}" ]; then
+ NEW_DEVICE=${NEW_DEVICE%:*}
+ else
+ # wrong parse, possibly only a partial string
+ NEW_DEVICE=
+ fi
+ if [ -n "${NEW_DEVICE}" ]; then
+ DEVICE="${NEW_DEVICE}"
+ fi
+ ;;
+ esac
+ done
# source ipconfig output
if [ -n "${DEVICE}" ]; then
# source specific bootdevice
. /tmp/net-${DEVICE}.conf
else
- # source any interface as not exaclty specified
+ # source any interface...
+ # ipconfig should have quit after first response
. /tmp/net-*.conf
fi
}
@@ -304,6 +419,6 @@ configure_networking()
# Wait for queued kernel/udev events
wait_for_udev()
{
- [ -x "$(command -v udevadm)" ] || return 0
+ command -v udevadm >/dev/null 2>&1 || return 0
udevadm settle ${1:+--timeout=$1}
}
diff --git a/scripts/init-top/all_generic_ide b/scripts/init-top/all_generic_ide
index 3274ee8..e9539d8 100755
--- a/scripts/init-top/all_generic_ide
+++ b/scripts/init-top/all_generic_ide
@@ -16,11 +16,11 @@ esac
for x in $(cat /proc/cmdline); do
case ${x} in
all_generic_ide)
- modprobe ide-generic
+ modprobe ata_generic all_generic_ide=1
;;
all_generic_ide=*)
if [ ${x#all_generic_ide=} ]; then
- modprobe ide-generic
+ modprobe ata_generic all_generic_ide=1
fi
;;
esac
diff --git a/scripts/init-top/blacklist b/scripts/init-top/blacklist
new file mode 100755
index 0000000..2164906
--- /dev/null
+++ b/scripts/init-top/blacklist
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+PREREQ=""
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+# sanity check
+[ -z "${blacklist}" ] && exit 0
+
+# write blacklist to modprobe.d
+IFS=','
+for b in ${blacklist}; do
+ echo "blacklist $b" >> /etc/modprobe.d/initramfs.conf
+done
diff --git a/scripts/local b/scripts/local
index 85d62af..8cb279a 100644
--- a/scripts/local
+++ b/scripts/local
@@ -1,31 +1,6 @@
# Local filesystem mounting -*- shell-script -*-
-# Parameter: device node to check
-# Echos fstype to stdout
-# Return value: indicates if an fs could be recognized
-get_fstype ()
-{
- local FS FSTYPE FSSIZE RET
- FS="${1}"
-
- # vol_id has a more complete list of file systems,
- # but fstype is more robust
- eval $(fstype "${FS}" 2> /dev/null)
- if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then
- FSTYPE=$(/lib/udev/vol_id -t "${FS}" 2> /dev/null)
- fi
- RET=$?
-
- if [ -z "${FSTYPE}" ]; then
- FSTYPE="unknown"
- fi
-
- echo "${FSTYPE}"
- return ${RET}
-}
-
-# Parameter: Where to mount the filesystem
-mountroot ()
+pre_mountroot()
{
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
run_scripts /scripts/local-top
@@ -33,17 +8,27 @@ mountroot ()
wait_for_udev 10
+ # Load ubi with the correct MTD partition and return since fstype
+ # doesn't work with a char device like ubi.
+ if [ -n "$UBIMTD" ]; then
+ modprobe ubi mtd=$UBIMTD
+ return
+ fi
+
+ # Don't wait for a root device that doesn't have a corresponding
+ # device in /dev (ie, mtd0)
+ if [ "${ROOT#/dev}" = "${ROOT}" ]; then
+ return
+ fi
+
# If the root device hasn't shown up yet, give it a little while
# to deal with removable devices
if [ ! -e "${ROOT}" ] || ! $(get_fstype "${ROOT}" >/dev/null); then
log_begin_msg "Waiting for root file system"
- # Default delay is 180s
- if [ -z "${ROOTDELAY}" ]; then
- slumber=180
- else
- slumber=${ROOTDELAY}
- fi
+ # Default delay is 30s
+ slumber=${ROOTDELAY:-30}
+
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "TIMEOUT ${slumber}" || true
fi
@@ -69,7 +54,7 @@ mountroot ()
# We've given up, but we'll let the user fix matters if they can
while [ ! -e "${ROOT}" ]; do
# give hint about renamed root
- case "${ROOT}" in
+ case "${ROOT}" in
/dev/hd*)
suffix="${ROOT#/dev/hd}"
major="${suffix%[[:digit:]]}"
@@ -94,6 +79,11 @@ mountroot ()
echo " - Missing modules (cat /proc/modules; ls /dev)"
panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
done
+}
+
+mountroot()
+{
+ pre_mountroot
# Get the root filesystem type if not set
if [ -z "${ROOTFSTYPE}" ]; then
@@ -117,7 +107,11 @@ mountroot ()
# FIXME This has no error checking
# Mount root
- mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
+ if [ "${FSTYPE}" != "unknown" ]; then
+ mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
+ else
+ mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
+ fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
diff --git a/scripts/local-premount/resume b/scripts/local-premount/resume
index 6bf95e5..11acfc7 100755
--- a/scripts/local-premount/resume
+++ b/scripts/local-premount/resume
@@ -20,10 +20,33 @@ if [ -z "${resume}" ]; then
fi
case $resume in
- LABEL=*)
- resume="/dev/disk/by-label/${resume#LABEL=}"
+LABEL=*)
+ resume="${resume#LABEL=}"
+
+ # support any / in LABEL= path (escape to \x2f)
+ case "${resume}" in
+ */*)
+ if command -v sed >/dev/null 2>&1; then
+ resume="$(echo ${resume} | sed 's,/,\\x2f,g')"
+ else
+ if [ "${resume}" != "${resume#/}" ]; then
+ resume="\x2f${resume#/}"
+ fi
+ if [ "${resume}" != "${resume%/}" ]; then
+ resume="${resume%/}\x2f"
+ fi
+ IFS='/'
+ newresume=
+ for s in $resume; do
+ newresume="${newresume:+${newresume}\\x2f}${s}"
+ done
+ unset IFS
+ resume="${newresume}"
+ fi
+ esac
+ resume="/dev/disk/by-label/${resume}"
;;
- UUID=*)
+UUID=*)
resume="/dev/disk/by-uuid/${resume#UUID=}"
;;
esac
diff --git a/scripts/nfs b/scripts/nfs
index 435d2d0..6fa0c43 100644
--- a/scripts/nfs
+++ b/scripts/nfs
@@ -4,7 +4,7 @@
retry_nr=0
-# parse nfs bootargs and mount nfs
+# parse nfs bootargs and mount nfs
do_nfsmount()
{
@@ -62,21 +62,16 @@ mountroot()
wait_for_udev 10
# Default delay is around 180s
- # FIXME: add usplash_write info
- if [ -z "${ROOTDELAY}" ]; then
- delay=180
- else
- delay=${ROOTDELAY}
- fi
+ delay=${ROOTDELAY:-180}
- # loop until nfsmount succeds
+ # loop until nfsmount succeeds
+ do_nfsmount
while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
- [ ${retry_nr} -gt 0 ] && \
[ "$quiet" != "y" ] && log_begin_msg "Retrying nfs mount"
+ /bin/sleep 1
do_nfsmount
retry_nr=$(( ${retry_nr} + 1 ))
- [ ! -e ${rootmnt}${init} ] && /bin/sleep 1
- [ ${retry_nr} -gt 0 ] && [ "$quiet" != "y" ] && log_end_msg
+ [ "$quiet" != "y" ] && log_end_msg
done
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/nfs-bottom"