functions-unmount.sh revision 209552
1#!/bin/sh 2#- 3# Copyright (c) 2010 iXsystems, Inc. All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24# SUCH DAMAGE. 25# 26# $FreeBSD: head/usr.sbin/pc-sysinstall/backend/functions-unmount.sh 209552 2010-06-27 16:46:11Z imp $ 27 28# Functions which unmount all mounted disk filesystems 29 30# Unmount all mounted partitions under specified dir 31umount_all_dir() { 32 _udir="$1" 33 _umntdirs=`mount | sort -r | grep "on $_udir" | cut -d ' ' -f 3` 34 for _ud in $_umntdirs 35 do 36 umount -f ${_ud} 37 done 38} 39 40# Script that adds our gmirror devices for syncing 41start_gmirror_sync() 42{ 43 44 cd ${MIRRORCFGDIR} 45 for DISK in `ls *` 46 do 47 MIRRORDISK="`cat ${DISK} | cut -d ':' -f 1`" 48 MIRRORBAL="`cat ${DISK} | cut -d ':' -f 2`" 49 MIRRORNAME="`cat ${DISK} | cut -d ':' -f 3`" 50 51 # Start the mirroring service 52 rc_halt "gmirror insert ${MIRRORNAME} /dev/${MIRRORDISK}" 53 54 done 55 56}; 57 58# Unmounts all our mounted file-systems 59unmount_all_filesystems() 60{ 61 # Copy the logfile to disk before we unmount 62 cp ${LOGOUT} ${FSMNT}/root/pc-sysinstall.log 63 cd / 64 65 # Start by unmounting any ZFS partitions 66 zfs_cleanup_unmount 67 68 # Lets read our partition list, and unmount each 69 ################################################################## 70 for PART in `ls ${PARTDIR}` 71 do 72 73 PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`" 74 PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`" 75 PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`" 76 PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`" 77 78 if [ "${PARTENC}" = "ON" ] 79 then 80 EXT=".eli" 81 else 82 EXT="" 83 fi 84 85 #if [ "${PARTFS}" = "SWAP" ] 86 #then 87 # rc_nohalt "swapoff /dev/${PART}${EXT}" 88 #fi 89 90 # Check if we've found "/", and unmount that last 91 if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ] 92 then 93 rc_halt "umount -f /dev/${PART}${EXT}" 94 95 # Re-check if we are missing a label for this device and create it again if so 96 if [ ! -e "/dev/label/${PARTLABEL}" ] 97 then 98 case ${PARTFS} in 99 UFS) glabel label ${PARTLABEL} /dev/${PART}${EXT} ;; 100 UFS+S) glabel label ${PARTLABEL} /dev/${PART}${EXT} ;; 101 UFS+J) glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal ;; 102 *) ;; 103 esac 104 fi 105 fi 106 107 # Check if we've found "/" and make sure the label exists 108 if [ "$PARTMNT" = "/" -a "${PARTFS}" != "ZFS" ] 109 then 110 if [ ! -e "/dev/label/${PARTLABEL}" ] 111 then 112 case ${PARTFS} in 113 UFS) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}" ;; 114 UFS+S) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}" ;; 115 UFS+J) ROOTRELABEL="glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal" ;; 116 *) ;; 117 esac 118 fi 119 fi 120 done 121 122 # Last lets the /mnt partition 123 ######################################################### 124 rc_nohalt "umount -f ${FSMNT}" 125 126 # If are using a ZFS on "/" set it to legacy 127 if [ ! -z "${FOUNDZFSROOT}" ] 128 then 129 rc_halt "zfs set mountpoint=legacy ${FOUNDZFSROOT}" 130 fi 131 132 # If we need to relabel "/" do it now 133 if [ ! -z "${ROOTRELABEL}" ] 134 then 135 ${ROOTRELABEL} 136 fi 137 138 # Unmount our CDMNT 139 rc_nohalt "umount -f ${CDMNT}" >/dev/null 2>/dev/null 140 141 # Check if we need to run any gmirror syncing 142 ls ${MIRRORCFGDIR}/* >/dev/null 2>/dev/null 143 if [ "$?" = "0" ] 144 then 145 # Lets start syncing now 146 start_gmirror_sync 147 fi 148 149}; 150 151# Unmounts any filesystems after a failure 152unmount_all_filesystems_failure() 153{ 154 cd / 155 156 # if we did a fresh install, start unmounting 157 if [ "${INSTALLMODE}" = "fresh" ] 158 then 159 160 # Lets read our partition list, and unmount each 161 ################################################################## 162 if [ -d "${PARTDIR}" ] 163 then 164 for PART in `ls ${PARTDIR}` 165 do 166 167 PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`" 168 PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`" 169 PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`" 170 171 #if [ "${PARTFS}" = "SWAP" ] 172 #then 173 # if [ "${PARTENC}" = "ON" ] 174 # then 175 # rc_nohalt "swapoff /dev/${PART}.eli" 176 # else 177 # rc_nohalt "swapoff /dev/${PART}" 178 # fi 179 #fi 180 181 # Check if we've found "/" again, don't need to mount it twice 182 if [ "$PARTMNT" != "/" -a "${PARTMNT}" != "none" -a "${PARTFS}" != "ZFS" ] 183 then 184 rc_nohalt "umount -f /dev/${PART}" 185 rc_nohalt "umount -f ${FSMNT}${PARTMNT}" 186 fi 187 done 188 189 # Last lets the /mnt partition 190 ######################################################### 191 rc_nohalt "umount -f ${FSMNT}" 192 193 fi 194 else 195 # We are doing a upgrade, try unmounting any of these filesystems 196 chroot ${FSMNT} /sbin/umount -a >>${LOGOUT} >>${LOGOUT} 197 umount -f ${FSMNT}/usr >>${LOGOUT} 2>>${LOGOUT} 198 umount -f ${FSMNT}/dev >>${LOGOUT} 2>>${LOGOUT} 199 umount -f ${FSMNT} >>${LOGOUT} 2>>${LOGOUT} 200 rc_nohalt "sh ${TMPDIR}/.upgrade-unmount" 201 fi 202 203 # Unmount our CDMNT 204 rc_nohalt "umount ${CDMNT}" 205 206}; 207