132 lines
3.8 KiB
Bash
132 lines
3.8 KiB
Bash
# 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
|
|
|
|
while [ -z "${FSTYPE}" ]; do
|
|
FSTYPE=$(wait-for-root "${ROOT}" ${ROOTDELAY:-30})
|
|
|
|
# Run failure hooks, hoping one of them can fix up the system
|
|
# and we can restart the wait loop. If they all fail, abort
|
|
# and move on to the panic handler and shell.
|
|
if [ -z "${FSTYPE}" ] && ! try_failure_hooks; then
|
|
break
|
|
fi
|
|
done
|
|
|
|
# We've given up, but we'll let the user fix matters if they can
|
|
while [ -z "${FSTYPE}" -a ! -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
|
|
[ -n "${FSTYPE}" ] || FSTYPE=$(/sbin/blkid -s TYPE -o value "${ROOT}")
|
|
ROOTFSTYPE="${FSTYPE}"
|
|
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 ] && \
|
|
[ -z "$LOOP" ]; then
|
|
roflag=-r
|
|
else
|
|
roflag=-w
|
|
fi
|
|
|
|
# FIXME This has no error checking
|
|
[ -n "${FSTYPE}" ] && modprobe ${FSTYPE}
|
|
|
|
# FIXME This has no error checking
|
|
# Mount root
|
|
mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
|
|
mountroot_status="$?"
|
|
if [ "$LOOP" ]; then
|
|
if [ "$mountroot_status" != 0 ]; then
|
|
if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
|
|
panic "
|
|
Could not mount the partition ${ROOT}.
|
|
This could also happen if the file system is not clean because of an operating
|
|
system crash, an interrupted boot process, an improper shutdown, or unplugging
|
|
of a removable device without first unmounting or ejecting it. To fix this,
|
|
simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
|
|
gracefully shut down and reboot back into Windows. After this you should be
|
|
able to reboot again and resume the installation.
|
|
(filesystem = ${FSTYPE}, error code = $mountroot_status)
|
|
"
|
|
fi
|
|
fi
|
|
|
|
mkdir -p /host
|
|
mount -o move ${rootmnt} /host
|
|
|
|
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 /sbin/blkid ]; then
|
|
FSTYPE=$(/sbin/blkid -s TYPE -o value "/host/${LOOP#/}")
|
|
[ -z "$FSTYPE" ] && FSTYPE="unknown"
|
|
fi
|
|
|
|
if [ ${readonly} = y ]; then
|
|
roflag=-r
|
|
else
|
|
roflag=-w
|
|
fi
|
|
|
|
# FIXME This has no error checking
|
|
modprobe loop
|
|
modprobe ${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
|
|
fi
|
|
|
|
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
|
|
run_scripts /scripts/local-bottom
|
|
[ "$quiet" != "y" ] && log_end_msg
|
|
}
|