| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- # Local filesystem mounting -*- shell-script -*-
- local_top()
- {
- if [ "${local_top_used}" != "yes" ]; then
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
- run_scripts /scripts/local-top
- [ "$quiet" != "y" ] && log_end_msg
- fi
- local_top_used=yes
- }
- local_block()
- {
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-block"
- run_scripts /scripts/local-block "$@"
- [ "$quiet" != "y" ] && log_end_msg
- }
- local_premount()
- {
- if [ "${local_premount_used}" != "yes" ]; then
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
- run_scripts /scripts/local-premount
- [ "$quiet" != "y" ] && log_end_msg
- fi
- local_premount_used=yes
- }
- local_bottom()
- {
- if [ "${local_premount_used}" = "yes" ] || [ "${local_top_used}" = "yes" ]; then
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
- run_scripts /scripts/local-bottom
- [ "$quiet" != "y" ] && log_end_msg
- fi
- local_premount_used=no
- local_top_used=no
- }
- # $1=device ID to mount
- # $2=optionname (for root and etc)
- # Sets $DEV to the resolved device node
- local_device_setup()
- {
- local dev_id="$1"
- local name="$2"
- local real_dev
- # If wait-for-root understands this prefix, then use it to wait for
- # the device rather than settling the whole of udev.
- case "$dev_id" in
- UUID=*|LABEL=*|/dev/*)
- FSTYPE=$( wait-for-root "$dev_id" 10 )
- ;;
- *)
- wait_for_udev 10
- ;;
- esac
- # 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
- DEV="${dev_id}"
- return
- fi
- # Don't wait for a device that doesn't have a corresponding
- # device in /dev and isn't resolvable by blkid (e.g. mtd0)
- if [ "${dev_id#/dev}" = "${dev_id}" ] &&
- [ "${dev_id#*=}" = "${dev_id}" ]; then
- DEV="${dev_id}"
- return
- fi
- # If the root device hasn't shown up yet, give it a little while
- # to allow for asynchronous device discovery (e.g. USB). We
- # also need to keep invoking the local-block scripts in case
- # there are devices stacked on top of those.
- if ! real_dev=$(resolve_device "${dev_id}") ||
- ! get_fstype "${real_dev}" >/dev/null; then
- log_begin_msg "Waiting for ${name} file system"
- # Timeout is max(30, rootdelay) seconds (approximately)
- case $DPKG_ARCH in
- powerpc|ppc64|ppc64el)
- slumber=180
- ;;
- *)
- slumber=30
- ;;
- esac
- if [ ${ROOTDELAY:-0} -gt $slumber ]; then
- slumber=$ROOTDELAY
- fi
- while true; do
- sleep 1
- local_block "${dev_id}"
- if real_dev=$(resolve_device "${dev_id}") &&
- get_fstype "${real_dev}" >/dev/null; then
- wait_for_udev 10
- log_end_msg 0
- break
- fi
- slumber=$(( ${slumber} - 1 ))
- if [ ${slumber} -eq 0 ]; then
- log_end_msg 1 || true
- break
- fi
- done
- fi
- # We've given up, but we'll let the user fix matters if they can
- while ! real_dev=$(resolve_device "${dev_id}") ||
- ! get_fstype "${real_dev}" >/dev/null; do
- echo "Gave up waiting for ${name} device. Common problems:"
- echo " - Boot args (cat /proc/cmdline)"
- echo " - Check rootdelay= (did the system wait long enough?)"
- if [ "${name}" = root ]; then
- echo " - Check root= (did the system wait for the right device?)"
- fi
- echo " - Missing modules (cat /proc/modules; ls /dev)"
- panic "ALERT! ${dev_id} does not exist. Dropping to a shell!"
- done
- DEV="${real_dev}"
- }
- local_mount_root()
- {
- local_top
- local_device_setup "${ROOT}" root
- ROOT="${DEV}"
- # Get the root filesystem type if not set
- if [ -z "${ROOTFSTYPE}" ]; then
- FSTYPE=$(get_fstype "${ROOT}")
- else
- FSTYPE=${ROOTFSTYPE}
- fi
- local_premount
- if [ "${readonly}" = "y" ] && \
- [ -z "$LOOP" ]; then
- roflag=-r
- else
- roflag=-w
- fi
- # FIXME This has no error checking
- [ -n "${FSTYPE}" ] && modprobe ${FSTYPE}
- checkfs ${ROOT} root
- # 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
- }
- local_mount_fs()
- {
- read_fstab_entry "$1"
- local_device_setup "$MNT_FSNAME" "$1"
- MNT_FSNAME="${DEV}"
- local_premount
- if [ "${readonly}" = "y" ]; then
- roflag=-r
- else
- roflag=-w
- fi
- # FIXME This has no error checking
- modprobe "${MNT_TYPE}"
- if [ "$MNT_PASS" != 0 ]; then
- checkfs "$MNT_FSNAME" "$MNT_DIR"
- fi
- # FIXME This has no error checking
- # Mount filesystem
- mount ${roflag} -t "${MNT_TYPE}" -o "${MNT_OPTS}" "$MNT_FSNAME" "${rootmnt}${MNT_DIR}"
- }
- mountroot()
- {
- local_mount_root
- }
- mount_top()
- {
- # Note, also called directly in case it's overridden.
- local_top
- }
- mount_premount()
- {
- # Note, also called directly in case it's overridden.
- local_premount
- }
- mount_bottom()
- {
- # Note, also called directly in case it's overridden.
- local_bottom
- }
|