]> CyberLeo.Net >> Repos - FreeBSD/releng/9.1.git/blob - usr.sbin/pc-sysinstall/backend/functions-newfs.sh
Copy stable/9 to releng/9.1 as part of the 9.1-RELEASE release process.
[FreeBSD/releng/9.1.git] / usr.sbin / pc-sysinstall / backend / functions-newfs.sh
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$
27
28 # Functions related to disk operations using newfs
29
30
31 # Function which performs the ZFS magic
32 setup_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 multiple zfs mounts specified
48   for i in `echo ${PARTMNT} | sed 's|,| |g'`
49   do
50     # Check if we ended up with needing a zfs bootable partition
51     if [ "${i}" = "/" -o "${i}" = "/boot" ]
52     then
53       if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi
54       if [ "${PARTGEOM}" = "MBR" ] ; then
55         # Lets stamp the proper ZFS boot loader
56         echo_log "Setting up ZFS boot loader support" 
57         rc_halt "dd if=/boot/zfsboot of=${ROOTSLICE} count=1"
58         rc_halt "dd if=/boot/zfsboot of=${PART}${EXT} skip=1 seek=1024"
59       fi
60     fi
61   done 
62
63
64   # Check if we have some custom zpool arguments and use them if so
65   if [ ! -z "${ZPOOLOPTS}" ] ; then
66     rc_halt "zpool create -m none -f ${ZPOOLNAME} ${ZPOOLOPTS}"
67   else
68     # No zpool options, create pool on single device
69     rc_halt "zpool create -m none -f ${ZPOOLNAME} ${PART}${EXT}"
70   fi
71
72   # Disable atime for this zfs partition, speed increase
73   rc_nohalt "zfs set atime=off ${ZPOOLNAME}"
74
75   # Check if we need to set a bootable zpool
76   for i in `echo ${PARTMNT} | sed 's|,| |g'`
77   do
78     if [ "${i}" = "/" -o "${i}" = "/boot" ] ; then
79       if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi
80       echo_log "Stamping zpool as bootfs" 
81       rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}"
82     fi
83   done 
84
85 };
86
87 # Runs newfs on all the partiions which we've setup with bsdlabel
88 setup_filesystems()
89 {
90
91   # Create the keydir
92   rm -rf ${GELIKEYDIR} >/dev/null 2>/dev/null
93   mkdir ${GELIKEYDIR}
94
95   # Lets go ahead and read through the saved partitions we created, and determine if we need to run
96   # newfs on any of them
97   for PART in `ls ${PARTDIR}`
98   do
99     PARTDEV="`echo $PART | sed 's|-|/|g'`"
100     PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`"
101     PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`"
102     PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`"
103     PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d '#' -f 4`"
104     PARTGEOM="`cat ${PARTDIR}/${PART} | cut -d '#' -f 5`"
105     PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 6`"
106     PARTIMAGE="`cat ${PARTDIR}/${PART} | cut -d '#' -f 7`"
107
108     if [ ! -e "${PARTDEV}" ] ; then
109       exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?"
110     fi 
111
112     # Make sure journaling isn't enabled on this device
113     if [ -e "${PARTDEV}.journal" ]
114     then
115       rc_nohalt "gjournal stop -f ${PARTDEV}.journal"
116       rc_nohalt "gjournal clear ${PARTDEV}"
117     fi
118
119     # Setup encryption if necessary
120     if [ "${PARTENC}" = "ON" -a "${PARTFS}" != "SWAP" ]
121     then
122       echo_log "Creating geli provider for ${PARTDEV}"
123
124       if [ -e "${PARTDIR}-enc/${PART}-encpass" ] ; then
125         # Using a passphrase
126         rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1"
127         rc_halt "geli init -J ${PARTDIR}-enc/${PART}-encpass ${PARTDEV}"
128         rc_halt "geli attach -j ${PARTDIR}-enc/${PART}-encpass ${PARTDEV}"
129       else
130         # No Encryption password, use key file
131         rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1"
132         rc_halt "geli init -b -s 4096 -P -K ${GELIKEYDIR}/${PART}.key ${PARTDEV}"
133         rc_halt "geli attach -p -k ${GELIKEYDIR}/${PART}.key ${PARTDEV}"
134
135       fi
136
137       EXT=".eli"
138     else
139       # No Encryption
140       EXT=""
141     fi
142
143     case ${PARTFS} in
144       UFS)
145         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
146         sleep 2
147         rc_halt "newfs ${PARTXTRAOPTS} ${PARTDEV}${EXT}"
148         sleep 2
149         rc_halt "sync"
150         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
151         rc_halt "sync"
152
153         # Set flag that we've found a boot partition
154         if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
155                   HAVEBOOT="YES"
156         fi
157         sleep 2
158         ;;
159
160       UFS+S)
161         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
162         sleep 2
163         rc_halt "newfs ${PARTXTRAOPTS} -U ${PARTDEV}${EXT}"
164         sleep 2
165         rc_halt "sync"
166         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
167         rc_halt "sync"
168             # Set flag that we've found a boot partition
169             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
170           HAVEBOOT="YES"
171         fi
172         sleep 2
173         ;;
174
175       UFS+SUJ)
176         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
177         sleep 2
178         rc_halt "newfs ${PARTXTRAOPTS} -U ${PARTDEV}${EXT}"
179         sleep 2
180         rc_halt "sync"
181         rc_halt "tunefs -j enable ${PARTDEV}${EXT}"
182         sleep 2
183         rc_halt "sync"
184         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
185         rc_halt "sync"
186             # Set flag that we've found a boot partition
187             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
188           HAVEBOOT="YES"
189         fi
190         sleep 2
191         ;;
192
193
194       UFS+J)
195         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
196         sleep 2
197         rc_halt "newfs ${PARTDEV}${EXT}"
198         sleep 2
199         rc_halt "gjournal label -f ${PARTDEV}${EXT}"
200         sleep 2
201         rc_halt "newfs ${PARTXTRAOPTS} -O 2 -J ${PARTDEV}${EXT}.journal"
202         sleep 2
203         rc_halt "sync"
204         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal"
205         rc_halt "sync"
206             # Set flag that we've found a boot partition
207             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
208           HAVEBOOT="YES"
209             fi
210         sleep 2
211         ;;
212
213       ZFS)
214         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}" 
215         setup_zfs_filesystem "${PARTDEV}" "${PARTFS}" "${PARTMNT}" "${EXT}" "${PARTGEOM}" "${PARTXTRAOPTS}"
216         ;;
217
218       SWAP)
219         rc_halt "sync"
220         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}" 
221         rc_halt "sync"
222         sleep 2
223         ;;
224
225       IMAGE)
226         write_image "${PARTIMAGE}" "${PARTDEV}"
227         sleep 2
228         ;; 
229
230       *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;;
231     esac
232
233   done
234 };