summaryrefslogtreecommitdiff
path: root/scripts/local
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/local')
-rw-r--r--scripts/local125
1 files changed, 125 insertions, 0 deletions
diff --git a/scripts/local b/scripts/local
new file mode 100644
index 0000000..85d62af
--- /dev/null
+++ b/scripts/local
@@ -0,0 +1,125 @@
+# 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 ()
+{
+ [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
+ run_scripts /scripts/local-top
+ [ "$quiet" != "y" ] && log_end_msg
+
+ wait_for_udev 10
+
+ # 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
+ if [ -x /sbin/usplash_write ]; then
+ /sbin/usplash_write "TIMEOUT ${slumber}" || true
+ fi
+
+ slumber=$(( ${slumber} * 10 ))
+ while [ ! -e "${ROOT}" ] \
+ || ! $(get_fstype "${ROOT}" >/dev/null); do
+ /bin/sleep 0.1
+ slumber=$(( ${slumber} - 1 ))
+ [ ${slumber} -gt 0 ] || break
+ done
+
+ if [ ${slumber} -gt 0 ]; then
+ log_end_msg 0
+ else
+ log_end_msg 1 || true
+ fi
+ if [ -x /sbin/usplash_write ]; then
+ /sbin/usplash_write "TIMEOUT 15" || true
+ fi
+ fi
+
+ # 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
+ /dev/hd*)
+ suffix="${ROOT#/dev/hd}"
+ major="${suffix%[[:digit:]]}"
+ major="${major%[[:digit:]]}"
+ if [ -d "/sys/block/sd${major}" ]; then
+ echo "WARNING bootdevice may be renamed. Try root=/dev/sd${suffix}"
+ fi
+ ;;
+ /dev/sd*)
+ suffix="${ROOT#/dev/sd}"
+ major="${suffix%[[:digit:]]}"
+ major="${major%[[:digit:]]}"
+ if [ -d "/sys/block/hd${major}" ]; then
+ echo "WARNING bootdevice may be renamed. Try root=/dev/hd${suffix}"
+ fi
+ ;;
+ esac
+ echo "Gave up waiting for root device. Common problems:"
+ echo " - Boot args (cat /proc/cmdline)"
+ echo " - Check rootdelay= (did the system wait long enough?)"
+ echo " - Check root= (did the system wait for the right device?)"
+ echo " - Missing modules (cat /proc/modules; ls /dev)"
+ panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
+ done
+
+ # Get the root filesystem type if not set
+ if [ -z "${ROOTFSTYPE}" ]; then
+ FSTYPE=$(get_fstype "${ROOT}")
+ else
+ FSTYPE=${ROOTFSTYPE}
+ fi
+
+ [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
+ run_scripts /scripts/local-premount
+ [ "$quiet" != "y" ] && log_end_msg
+
+ if [ "${readonly}" = "y" ]; then
+ roflag=-r
+ else
+ roflag=-w
+ fi
+
+ # FIXME This has no error checking
+ modprobe ${FSTYPE}
+
+ # FIXME This has no error checking
+ # Mount root
+ mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
+
+ [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
+ run_scripts /scripts/local-bottom
+ [ "$quiet" != "y" ] && log_end_msg
+}