functions-newfs.sh revision 211730
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-newfs.sh 211730 2010-08-24 06:11:46Z imp $ 27 28# Functions related to disk operations using newfs 29 30 31# Function which performs the ZFS magic 32setup_zfs_filesystem() 33{ 34 PART="$1" 35 PARTFS="$2" 36 PARTMNT="$3" 37 EXT="$4" 38 PARTGEOM="$5" 39 ZPOOLOPTS="$6" 40 ROOTSLICE="`echo ${PART} | rev | cut -b 2- | rev`" 41 ZPOOLNAME=$(get_zpool_name "${PART}") 42 43 # Sleep a few moments, let the disk catch its breath 44 sleep 5 45 sync 46 47 # Check if we have some custom zpool arguments and use them if so 48 if [ ! -z "${ZPOOLOPTS}" ] ; then 49 rc_halt "zpool create -m none -f ${ZPOOLNAME} ${ZPOOLOPTS}" 50 else 51 # No zpool options, create pool on single device 52 rc_halt "zpool create -m none -f ${ZPOOLNAME} ${PART}${EXT}" 53 fi 54 55 # Disable atime for this zfs partition, speed increase 56 rc_nohalt "zfs set atime=off ${ZPOOLNAME}" 57 58 # Check if we have multiple zfs mounts specified 59 for i in `echo ${PARTMNT} | sed 's|,| |g'` 60 do 61 # Check if we ended up with needing a zfs bootable partition 62 if [ "${i}" = "/" -o "${i}" = "/boot" ] 63 then 64 if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi 65 if [ "${PARTGEOM}" = "MBR" ] 66 then 67 # Lets stamp the proper ZFS boot loader 68 echo_log "Setting up ZFS boot loader support" 69 rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}" 70 rc_halt "zpool export ${ZPOOLNAME}" 71 rc_halt "dd if=/boot/zfsboot of=/dev/${ROOTSLICE} count=1" 72 rc_halt "dd if=/boot/zfsboot of=/dev/${PART}${EXT} skip=1 seek=1024" 73 rc_halt "zpool import ${ZPOOLNAME}" 74 fi 75 fi 76 done 77 78}; 79 80# Runs newfs on all the partiions which we've setup with bsdlabel 81setup_filesystems() 82{ 83 84 # Create the keydir 85 rm -rf ${GELIKEYDIR} >/dev/null 2>/dev/null 86 mkdir ${GELIKEYDIR} 87 88 # Lets go ahead and read through the saved partitions we created, and determine if we need to run 89 # newfs on any of them 90 for PART in `ls ${PARTDIR}` 91 do 92 if [ ! -e "/dev/${PART}" ] 93 then 94 exit_err "ERROR: The partition ${PART} does not exist. Failure in bsdlabel?" 95 fi 96 97 PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`" 98 PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`" 99 PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`" 100 PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`" 101 PARTGEOM="`cat ${PARTDIR}/${PART} | cut -d ':' -f 5`" 102 PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 6`" 103 104 # Make sure journaling isn't enabled on this device 105 if [ -e "/dev/${PART}.journal" ] 106 then 107 rc_nohalt "gjournal stop -f ${PART}.journal" 108 rc_nohalt "gjournal clear ${PART}" 109 fi 110 111 # Setup encryption if necessary 112 if [ "${PARTENC}" = "ON" -a "${PARTFS}" != "SWAP" ] 113 then 114 echo_log "Creating geli provider for ${PART}" 115 rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1" 116 rc_halt "geli init -b -s 4096 -P -K ${GELIKEYDIR}/${PART}.key /dev/${PART}" 117 rc_halt "geli attach -p -k ${GELIKEYDIR}/${PART}.key /dev/${PART}" 118 119 EXT=".eli" 120 else 121 # No Encryption 122 EXT="" 123 fi 124 125 case ${PARTFS} in 126 UFS) 127 echo_log "NEWFS: /dev/${PART} - ${PARTFS}" 128 sleep 2 129 rc_halt "newfs /dev/${PART}${EXT}" 130 sleep 2 131 rc_halt "sync" 132 rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}" 133 rc_halt "sync" 134 135 # Set flag that we've found a boot partition 136 if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then 137 HAVEBOOT="YES" 138 fi 139 sleep 2 140 ;; 141 142 UFS+S) 143 echo_log "NEWFS: /dev/${PART} - ${PARTFS}" 144 sleep 2 145 rc_halt "newfs -U /dev/${PART}${EXT}" 146 sleep 2 147 rc_halt "sync" 148 rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}" 149 rc_halt "sync" 150 # Set flag that we've found a boot partition 151 if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then 152 HAVEBOOT="YES" 153 fi 154 sleep 2 155 ;; 156 157 UFS+J) 158 echo_log "NEWFS: /dev/${PART} - ${PARTFS}" 159 sleep 2 160 rc_halt "newfs /dev/${PART}${EXT}" 161 sleep 2 162 rc_halt "gjournal label -f /dev/${PART}${EXT}" 163 sleep 2 164 rc_halt "newfs -O 2 -J /dev/${PART}${EXT}.journal" 165 sleep 2 166 rc_halt "sync" 167 rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}.journal" 168 rc_halt "sync" 169 # Set flag that we've found a boot partition 170 if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then 171 HAVEBOOT="YES" 172 fi 173 sleep 2 174 ;; 175 176 ZFS) 177 echo_log "NEWFS: /dev/${PART} - ${PARTFS}" 178 setup_zfs_filesystem "${PART}" "${PARTFS}" "${PARTMNT}" "${EXT}" "${PARTGEOM}" "${PARTXTRAOPTS}" 179 ;; 180 181 SWAP) 182 rc_halt "sync" 183 rc_halt "glabel label ${PARTLABEL} /dev/${PART}${EXT}" 184 rc_halt "sync" 185 sleep 2 186 ;; 187 188 *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;; 189 esac 190 191 done 192}; 193