diff options
Diffstat (limited to 'usr.sbin/pc-sysinstall/backend/functions-unmount.sh')
-rwxr-xr-x | usr.sbin/pc-sysinstall/backend/functions-unmount.sh | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/usr.sbin/pc-sysinstall/backend/functions-unmount.sh b/usr.sbin/pc-sysinstall/backend/functions-unmount.sh new file mode 100755 index 0000000..a61a5e6 --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-unmount.sh @@ -0,0 +1,210 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iXsystems, Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# Functions which unmount all mounted disk filesystems + +# Unmount all mounted partitions under specified dir +umount_all_dir() +{ + _udir="$1" + _umntdirs=`mount | sort -r | grep "on $_udir" | cut -d ' ' -f 3` + for _ud in $_umntdirs + do + umount -f ${_ud} + done +} + +# Script that adds our gmirror devices for syncing +start_gmirror_sync() +{ + + cd ${MIRRORCFGDIR} + for DISK in `ls ${MIRRORCFGDIR}` + do + MIRRORDISK="`cat ${DISK} | cut -d ':' -f 1`" + MIRRORBAL="`cat ${DISK} | cut -d ':' -f 2`" + MIRRORNAME="`cat ${DISK} | cut -d ':' -f 3`" + + # Start the mirroring service + rc_nohalt "gmirror forget ${MIRRORNAME}" + rc_halt "gmirror insert ${MIRRORNAME} ${MIRRORDISK}" + + done + +}; + +# Unmounts all our mounted file-systems +unmount_all_filesystems() +{ + # Copy the logfile to disk before we unmount + cp ${LOGOUT} ${FSMNT}/root/pc-sysinstall.log + cd / + + # Start by unmounting any ZFS partitions + zfs_cleanup_unmount + + # Lets read our partition list, and unmount each + ################################################################## + for PART in `ls ${PARTDIR}` + do + PARTDEV=`echo $PART | sed 's|-|/|g'` + PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`" + PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`" + PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`" + PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d '#' -f 4`" + + if [ "${PARTENC}" = "ON" ] + then + EXT=".eli" + else + EXT="" + fi + + if [ "${PARTFS}" = "SWAP" ] + then + rc_nohalt "swapoff ${PARTDEV}${EXT}" + fi + + # Check if we've found "/", and unmount that last + if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ] + then + rc_halt "umount -f ${PARTDEV}${EXT}" + + # Re-check if we are missing a label for this device and create it again if so + if [ ! -e "/dev/label/${PARTLABEL}" ] + then + case ${PARTFS} in + UFS) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;; + UFS+S) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;; + UFS+SUJ) glabel label ${PARTLABEL} ${PARTDEV}${EXT} ;; + UFS+J) glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal ;; + *) ;; + esac + fi + fi + + # Check if we've found "/" and make sure the label exists + if [ "$PARTMNT" = "/" -a "${PARTFS}" != "ZFS" ] + then + if [ ! -e "/dev/label/${PARTLABEL}" ] + then + case ${PARTFS} in + UFS) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;; + UFS+S) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;; + UFS+SUJ) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}" ;; + UFS+J) ROOTRELABEL="glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal" ;; + *) ;; + esac + fi + fi + done + + # Last lets the /mnt partition + ######################################################### + rc_nohalt "umount -f ${FSMNT}" + + # If are using a ZFS on "/" set it to legacy + if [ ! -z "${FOUNDZFSROOT}" ] + then + rc_halt "zfs set mountpoint=legacy ${FOUNDZFSROOT}" + fi + + # If we need to relabel "/" do it now + if [ ! -z "${ROOTRELABEL}" ] + then + ${ROOTRELABEL} + fi + + # Unmount our CDMNT + rc_nohalt "umount -f ${CDMNT}" >/dev/null 2>/dev/null + + # Check if we need to run any gmirror syncing + ls ${MIRRORCFGDIR}/* >/dev/null 2>/dev/null + if [ $? -eq 0 ] + then + # Lets start syncing now + start_gmirror_sync + fi + +}; + +# Unmounts any filesystems after a failure +unmount_all_filesystems_failure() +{ + cd / + + # if we did a fresh install, start unmounting + if [ "${INSTALLMODE}" = "fresh" ] + then + + # Lets read our partition list, and unmount each + ################################################################## + if [ -d "${PARTDIR}" ] + then + for PART in `ls ${PARTDIR}` + do + PARTDEV=`echo $PART | sed 's|-|/|g'` + PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`" + PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`" + PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`" + + if [ "${PARTFS}" = "SWAP" ] + then + if [ "${PARTENC}" = "ON" ] + then + swapoff ${PARTDEV}.eli >/dev/null 2>/dev/null + else + swapoff ${PARTDEV} >/dev/null 2>/dev/null + fi + fi + + # Check if we've found "/" again, don't need to mount it twice + if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ] + then + umount -f ${PARTDEV} >/dev/null 2>/dev/null + umount -f ${FSMNT}${PARTMNT} >/dev/null 2>/dev/null + fi + done + + # Last lets the /mnt partition + ######################################################### + umount -f ${FSMNT} >/dev/null 2>/dev/null + + fi + else + # We are doing a upgrade, try unmounting any of these filesystems + chroot ${FSMNT} /sbin/umount -a >/dev/null 2>/dev/null + umount -f ${FSMNT}/usr >/dev/null 2>/dev/null + umount -f ${FSMNT}/dev >/dev/null 2>/dev/null + umount -f ${FSMNT} >/dev/null 2>/dev/null + sh ${TMPDIR}/.upgrade-unmount >/dev/null 2>/dev/null + fi + + # Unmount our CDMNT + umount ${CDMNT} >/dev/null 2>/dev/null + +}; |