# Local filesystem mounting -*- shell-script -*- # 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 # If the root device hasn't shown up yet, give it a little while # to deal with removable devices if [ ! -e "${ROOT}" ] || ! /lib/udev/vol_id "${ROOT}" >/dev/null 2>&1; 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}" ] || ! /lib/udev/vol_id "${ROOT}" >/dev/null 2>&1; 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 echo " Check root= bootarg cat /proc/cmdline" echo " or missing modules, devices: 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 eval $(fstype < ${ROOT}) else FSTYPE=${ROOTFSTYPE} fi if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then FSTYPE=$(/lib/udev/vol_id -t ${ROOT}) [ -z "$FSTYPE" ] && FSTYPE="unknown" fi [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount" run_scripts /scripts/local-premount [ "$quiet" != "y" ] && log_end_msg if [ ${readonly} = y ] && \ ([ -z "$LOOP" ] || [ "${FSTYPE#ntfs}" = "$FSTYPE" ]); then roflag=-r else roflag=-w fi # FIXME This has no error checking modprobe -Qb ${FSTYPE} if [ "$LOOP" ]; then mkdir -p /host if [ "${ROOTFLAGS}" ]; then mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS},sync,dirsync,commit=1 ${ROOT} /host else mount ${roflag} -t ${FSTYPE} -o sync,dirsync,commit=1 ${ROOT} /host fi while [ ! -e "/host/${LOOP#/}" ]; do panic "ALERT! /host/${LOOP#/} does not exist. Dropping to a shell!" done # Get the loop filesystem type if not set if [ -z "${LOOPFSTYPE}" ]; then eval $(fstype < "/host/${LOOP#/}") else FSTYPE="${LOOPFSTYPE}" fi if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then FSTYPE=$(/lib/udev/vol_id -t "/host/${LOOP#/}") [ -z "$FSTYPE" ] && FSTYPE="unknown" fi if [ ${readonly} = y ]; then roflag=-r else roflag=-w fi # FIXME This has no error checking modprobe -Qb loop modprobe -Qb ${FSTYPE} # FIXME This has no error checking mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "/host/${LOOP#/}" ${rootmnt} if [ -d ${rootmnt}/host ]; then mount -o move /host ${rootmnt}/host fi else # FIXME This has no error checking # Mount root mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt} fi [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom" run_scripts /scripts/local-bottom [ "$quiet" != "y" ] && log_end_msg }