]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - usr.sbin/pc-sysinstall/backend/functions-newfs.sh
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.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 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=${ROOTSLICE} count=1"
72         rc_halt "dd if=/boot/zfsboot of=${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
81 setup_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     PARTDEV="`echo $PART | sed 's|-|/|g'`"
93     if [ ! -e "${PARTDEV}" ]
94     then
95       exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?"
96     fi 
97      
98     PARTFS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 1`"
99     PARTMNT="`cat ${PARTDIR}/${PART} | cut -d ':' -f 2`"
100     PARTENC="`cat ${PARTDIR}/${PART} | cut -d ':' -f 3`"
101     PARTLABEL="`cat ${PARTDIR}/${PART} | cut -d ':' -f 4`"
102     PARTGEOM="`cat ${PARTDIR}/${PART} | cut -d ':' -f 5`"
103     PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d ':' -f 6`"
104     PARTIMAGE="`cat ${PARTDIR}/${PART} | cut -d ':' -f 7`"
105
106     # Make sure journaling isn't enabled on this device
107     if [ -e "${PARTDEV}.journal" ]
108     then
109       rc_nohalt "gjournal stop -f ${PARTDEV}.journal"
110       rc_nohalt "gjournal clear ${PARTDEV}"
111     fi
112
113     # Setup encryption if necessary
114     if [ "${PARTENC}" = "ON" -a "${PARTFS}" != "SWAP" ]
115     then
116       echo_log "Creating geli provider for ${PARTDEV}"
117
118       if [ -e "${PARTDIR}-enc/${PART}-encpass" ] ; then
119         # Using a passphrase
120         rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1"
121         rc_halt "geli init -J ${PARTDIR}-enc/${PART}-encpass ${PARTDEV}"
122         rc_halt "geli attach -j ${PARTDIR}-enc/${PART}-encpass ${PARTDEV}"
123       else
124         # No Encryption password, use key file
125         rc_halt "dd if=/dev/random of=${GELIKEYDIR}/${PART}.key bs=64 count=1"
126         rc_halt "geli init -b -s 4096 -P -K ${GELIKEYDIR}/${PART}.key ${PARTDEV}"
127         rc_halt "geli attach -p -k ${GELIKEYDIR}/${PART}.key ${PARTDEV}"
128
129       fi
130
131       EXT=".eli"
132     else
133       # No Encryption
134       EXT=""
135     fi
136
137     case ${PARTFS} in
138       UFS)
139         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
140         sleep 2
141         rc_halt "newfs ${PARTXTRAOPTS} ${PARTDEV}${EXT}"
142         sleep 2
143         rc_halt "sync"
144         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
145         rc_halt "sync"
146
147         # Set flag that we've found a boot partition
148         if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
149                   HAVEBOOT="YES"
150         fi
151         sleep 2
152         ;;
153
154       UFS+S)
155         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
156         sleep 2
157         rc_halt "newfs ${PARTXTRAOPTS} -U ${PARTDEV}${EXT}"
158         sleep 2
159         rc_halt "sync"
160         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
161         rc_halt "sync"
162             # Set flag that we've found a boot partition
163             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
164           HAVEBOOT="YES"
165         fi
166         sleep 2
167         ;;
168
169       UFS+SUJ)
170         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
171         sleep 2
172         rc_halt "newfs ${PARTXTRAOPTS} -U ${PARTDEV}${EXT}"
173         sleep 2
174         rc_halt "sync"
175         rc_halt "tunefs -j enable ${PARTDEV}${EXT}"
176         sleep 2
177         rc_halt "sync"
178         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}"
179         rc_halt "sync"
180             # Set flag that we've found a boot partition
181             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
182           HAVEBOOT="YES"
183         fi
184         sleep 2
185         ;;
186
187
188       UFS+J)
189         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}"
190         sleep 2
191         rc_halt "newfs ${PARTDEV}${EXT}"
192         sleep 2
193         rc_halt "gjournal label -f ${PARTDEV}${EXT}"
194         sleep 2
195         rc_halt "newfs ${PARTXTRAOPTS} -O 2 -J ${PARTDEV}${EXT}.journal"
196         sleep 2
197         rc_halt "sync"
198         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}.journal"
199         rc_halt "sync"
200             # Set flag that we've found a boot partition
201             if [ "$PARTMNT" = "/boot" -o "${PARTMNT}" = "/" ] ; then
202           HAVEBOOT="YES"
203             fi
204         sleep 2
205         ;;
206
207       ZFS)
208         echo_log "NEWFS: ${PARTDEV} - ${PARTFS}" 
209         setup_zfs_filesystem "${PARTDEV}" "${PARTFS}" "${PARTMNT}" "${EXT}" "${PARTGEOM}" "${PARTXTRAOPTS}"
210         ;;
211
212       SWAP)
213         rc_halt "sync"
214         rc_halt "glabel label ${PARTLABEL} ${PARTDEV}${EXT}" 
215         rc_halt "sync"
216         sleep 2
217         ;;
218
219       IMAGE)
220         write_image "${PARTIMAGE}" "${PARTDEV}"
221         sleep 2
222         ;; 
223
224       *) exit_err "ERROR: Got unknown file-system type $PARTFS" ;;
225     esac
226
227   done
228 };