3 # Copyright (c) 2010 iXsystems, Inc. All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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
28 # Functions related to disk operations using gpart
30 # See if device is a full disk or partition/slice
33 for _dsk in `sysctl -n kern.disks`
35 [ "$_dsk" = "${1}" ] && return 0
36 [ "/dev/$_dsk" = "${1}" ] && return 0
42 # Get a MBR partitions sysid
43 get_partition_sysid_mbr()
47 PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
48 fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
51 echo "$i" | grep -q "The data for partition" 2>/dev/null
52 if [ $? -eq 0 ] ; then
54 PART="`echo ${i} | cut -d ' ' -f 5`"
55 if [ "$PART" = "$PARTNUM" ] ; then
60 # In the partition section
61 if [ "$INPART" = "1" ] ; then
62 echo "$i" | grep -q "^sysid" 2>/dev/null
63 if [ $? -eq 0 ] ; then
64 SYSID="`echo ${i} | tr -s '\t' ' ' | cut -d ' ' -f 2`"
70 done < ${TMPDIR}/disk-${DISK}
71 rm ${TMPDIR}/disk-${DISK}
76 # Get the partitions MBR label
77 get_partition_label_mbr()
81 PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
82 fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
85 echo "$i" | grep -q "The data for partition" 2>/dev/null
86 if [ $? -eq 0 ] ; then
88 PART="`echo ${i} | cut -d ' ' -f 5`"
89 if [ "$PART" = "$PARTNUM" ] ; then
94 # In the partition section
95 if [ "$INPART" = "1" ] ; then
96 echo "$i" | grep -q "^sysid" 2>/dev/null
97 if [ $? -eq 0 ] ; then
98 LABEL="`echo ${i} | tr -s '\t' ' ' | cut -d ',' -f 2-10`"
104 done < ${TMPDIR}/disk-${DISK}
105 rm ${TMPDIR}/disk-${DISK}
107 export VAL="${LABEL}"
110 # Get a GPT partitions label
111 get_partition_label_gpt()
114 PARTNUM=`echo ${2} | sed "s|${DISK}p||g"`
116 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
119 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
120 if [ "${SLICE}" = "${PARTNUM}" ] ; then
121 LABEL="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4`"
124 done <${TMPDIR}/disk-${DISK}
125 rm ${TMPDIR}/disk-${DISK}
127 export VAL="${LABEL}"
130 # Get a partitions startblock
131 get_partition_startblock()
134 PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
136 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
139 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
140 if [ "$SLICE" = "${PARTNUM}" ] ; then
141 SB="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 1`"
144 done <${TMPDIR}/disk-${DISK}
145 rm ${TMPDIR}/disk-${DISK}
150 # Get a partitions blocksize
151 get_partition_blocksize()
154 PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
156 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
159 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
160 if [ "$SLICE" = "${PARTNUM}" ] ; then
161 BS="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 2`"
164 done <${TMPDIR}/disk-${DISK}
165 rm ${TMPDIR}/disk-${DISK}
170 # Function which returns the partitions on a target disk
171 get_disk_partitions()
173 gpart show ${1} >/dev/null 2>/dev/null
174 if [ $? -ne 0 ] ; then
179 type=`gpart show ${1} | awk '/^=>/ { printf("%s",$5); }'`
181 SLICES="`gpart show ${1} | grep -v ${1} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4 | sed '/^$/d'`"
185 MBR) name="${1}s${i}" ;;
186 GPT) name="${1}p${i}";;
187 *) name="${1}s${i}";;
189 if [ -z "${RSLICES}" ]
193 RSLICES="${RSLICES} ${name}"
197 export VAL="${RSLICES}"
200 # Function which returns a target disks cylinders
203 cyl=`diskinfo -v ${1} | grep "# Cylinders" | tr -s ' ' | cut -f 2`
207 # Function which returns a target disks sectors
210 sec=`diskinfo -v ${1} | grep "# Sectors" | tr -s ' ' | cut -f 2`
214 # Function which returns a target disks heads
217 head=`diskinfo -v ${1} | grep "# Heads" | tr -s ' ' | cut -f 2`
221 # Function which returns a target disks mediasize in sectors
224 mediasize=`diskinfo -v ${1} | grep "# mediasize in sectors" | tr -s ' ' | cut -f 2`
225 export VAL="${mediasize}"
228 # Function which returns a target disks mediasize in megabytes
229 get_disk_mediasize_mb()
231 mediasize=`diskinfo -v ${1} | grep "# mediasize in bytes" | tr -s ' ' | cut -f 2`
232 mediasize=`expr $mediasize / 1024`
233 mediasize=`expr $mediasize / 1024`
234 export VAL="${mediasize}"
237 # Function to delete all gparts before starting an install
240 echo_log "Deleting all gparts"
243 # Check for any swaps to stop
244 for i in `swapctl -l | grep "$DISK" | awk '{print $1}'`
246 swapoff ${i} >/dev/null 2>/dev/null
249 # Delete the gparts now
250 for i in `gpart show ${DISK} 2>/dev/null | tr -s ' ' | cut -d ' ' -f 4`
252 if [ "/dev/${i}" != "${DISK}" -a "${i}" != "-" ] ; then
253 rc_nohalt "gpart delete -i ${i} ${DISK}"
257 # Destroy the disk geom
258 rc_nohalt "gpart destroy ${DISK}"
260 wipe_metadata "${DISK}"
263 # Function to export all zpools before starting an install
266 if [ ! -c /dev/zfs ]; then
269 local DISK="`echo ${1} | sed 's|/dev/||g'`"
271 # Export any zpools using this device so we can overwrite
272 for i in `zpool list -H -o name`
274 ztst=`zpool status ${i} | grep "ONLINE" | awk '{print $1}' | grep -q ${DISK}`
275 if [ "$ztst" = "$DISK" ] ; then
281 # Function which stops all gmirrors before doing any disk manipulation
284 if [ ! -d /dev/mirror ]; then
287 local DISK="`echo ${1} | sed 's|/dev/||g'`"
288 GPROV="`gmirror list | grep ". Name: mirror/" | cut -d '/' -f 2`"
291 gmirror list | grep -q "Name: ${DISK}" 2>/dev/null
294 echo_log "Stopping mirror $gprov $DISK"
295 rc_nohalt "gmirror remove $gprov $DISK"
296 wipe_metadata "${DISK}"
301 # Make sure we don't have any geli providers active on this disk
304 local _geld="`echo ${1} | sed 's|/dev/||g'`"
307 for i in `ls ${_geld}*`
309 echo $i | grep -q '.eli' 2>/dev/null
312 echo_log "Detaching GELI on ${i}"
313 rc_halt "geli detach ${i}"
319 # Function which reads in the disk slice config, and performs it
323 # Cleanup any slice / mirror dirs
324 rm -rf ${SLICECFGDIR} >/dev/null 2>/dev/null
326 rm -rf ${MIRRORCFGDIR} >/dev/null 2>/dev/null
327 mkdir ${MIRRORCFGDIR}
329 # Start with disk0 and gm0
333 # We are ready to start setting up the disks, lets read the config and do the actions
336 echo $line | grep -q "^disk${disknum}=" 2>/dev/null
340 # Found a disk= entry, lets get the disk we are working on
341 get_value_from_string "${line}"
342 strip_white_space "$VAL"
345 echo "${DISK}" | grep -q '^/dev/'
346 if [ $? -ne 0 ] ; then DISK="/dev/$DISK" ; fi
348 # Before we go further, lets confirm this disk really exists
349 if [ ! -e "${DISK}" ] ; then
350 exit_err "ERROR: The disk ${DISK} does not exist!"
353 # Make sure we stop any gmirrors on this disk
354 stop_all_gmirror ${DISK}
356 # Make sure we stop any geli stuff on this disk
357 stop_all_geli ${DISK}
359 # Make sure we don't have any zpools loaded
364 # Lets look if this device will be mirrored on another disk
365 echo $line | grep -q "^mirror=" 2>/dev/null
369 # Found a disk= entry, lets get the disk we are working on
370 get_value_from_string "${line}"
371 strip_white_space "$VAL"
373 echo "${MIRRORDISK}" | grep -q '^/dev/'
374 if [ $? -ne 0 ] ; then MIRRORDISK="/dev/$MIRRORDISK" ; fi
376 # Before we go further, lets confirm this disk really exists
377 if [ ! -e "${MIRRORDISK}" ]
379 exit_err "ERROR: The mirror disk ${MIRRORDISK} does not exist!"
382 # Make sure we stop any gmirrors on this mirror disk
383 stop_all_gmirror ${MIRRORDISK}
385 # Make sure we stop any geli stuff on this mirror disk
386 stop_all_geli ${MIRRORDISK}
388 # Make sure we don't have any zpools mirror loaded
389 stop_all_zfs ${MIRRORDISK}
393 # Lets see if we have been given a mirror balance choice
394 echo $line | grep -q "^mirrorbal=" 2>/dev/null
398 # Found a disk= entry, lets get the disk we are working on
399 get_value_from_string "${line}"
400 strip_white_space "$VAL"
404 echo $line | grep -q "^partition=" 2>/dev/null
407 # Found a partition= entry, lets read / set it
408 get_value_from_string "${line}"
409 strip_white_space "$VAL"
410 PTYPE=`echo $VAL|tr A-Z a-z`
412 # We are using free space, figure out the slice number
413 if [ "${PTYPE}" = "free" ]
415 # Lets figure out what number this slice will be
416 LASTSLICE="`gpart show ${DISK} \
424 if [ -z "${LASTSLICE}" ]
428 LASTSLICE=$((LASTSLICE+1))
431 if [ $LASTSLICE -gt 4 ]
433 exit_err "ERROR: BSD only supports primary partitions, and there are none available on $DISK"
439 # Check if we have an image file defined
440 echo $line | grep -q "^image=" 2>/dev/null
441 if [ $? -eq 0 ] ; then
442 # Found an image= entry, lets read / set it
443 get_value_from_string "${line}"
444 strip_white_space "$VAL"
446 if [ ! -f "$IMAGE" ] ; then
447 exit_err "$IMAGE file does not exist"
451 # Check if we have a partscheme specified
452 echo $line | grep -q "^partscheme=" 2>/dev/null
453 if [ $? -eq 0 ] ; then
454 # Found a partscheme= entry, lets read / set it
455 get_value_from_string "${line}"
456 strip_white_space "$VAL"
458 if [ "$PSCHEME" != "GPT" -a "$PSCHEME" != "MBR" ] ; then
459 exit_err "Unknown partition scheme: $PSCHEME"
463 echo $line | grep -q "^bootManager=" 2>/dev/null
466 # Found a bootManager= entry, lets read /set it
467 get_value_from_string "${line}"
468 strip_white_space "$VAL"
472 echo $line | grep -q "^commitDiskPart" 2>/dev/null
475 # Found our flag to commit this disk setup / lets do sanity check and do it
476 if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
478 # Make sure we are only installing ppc to full disk
479 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]; then
480 if [ "$PTYPE" != "all" ] ; then
481 exit_err "powerpc can only be installed to a full disk"
487 # If we have a gmirror, lets set it up
488 if [ -n "$MIRRORDISK" ]; then
489 # Default to round-robin if the user didn't specify
490 if [ -z "$MIRRORBAL" ]; then MIRRORBAL="round-robin" ; fi
492 _mFile=`echo $DISK | sed 's|/|%|g'`
493 echo "$MIRRORDISK:$MIRRORBAL:gm${gmnum}" >${MIRRORCFGDIR}/$_mFile
494 init_gmirror "$gmnum" "$MIRRORBAL" "$DISK" "$MIRRORDISK"
496 # Reset DISK to the gmirror device
497 DISK="/dev/mirror/gm${gmnum}"
501 if [ "$PSCHEME" = "MBR" -o -z "$PSCHEME" ] ; then
508 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]
514 run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}"
518 tmpSLICE="${DISK}${PTYPE}"
519 # Get the number of the slice we are working on
520 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
521 run_gpart_slice "${DISK}" "${BMANAGER}" "${s}"
524 p1|p2|p3|p4|p5|p6|p7|p8|p9|p10|p11|p12|p13|p14|p15|p16|p17|p18|p19|p20)
525 tmpSLICE="${DISK}${PTYPE}"
526 # Get the number of the gpt partition we are working on
527 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
528 run_gpart_gpt_part "${DISK}" "${BMANAGER}" "${s}"
532 tmpSLICE="${DISK}s${LASTSLICE}"
533 run_gpart_free "${DISK}" "${LASTSLICE}" "${BMANAGER}"
539 exit_err "ERROR: partition type image specified with no image!"
543 *) exit_err "ERROR: Unknown PTYPE: $PTYPE" ;;
551 if [ -n "${tmpSLICE}" ]
558 write_image "${IMAGE}" "${DEST}"
559 check_disk_layout "${DEST}"
562 # Now save which disk<num> this is, so we can parse it later during slice partition setup
565 _sFile=`echo $tmpSLICE | sed 's|/|-|g'`
566 echo "disk${disknum}" >${SLICECFGDIR}/$_sFile
569 # Increment our disk counter to look for next disk and unset
570 unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL PSCHEME IMAGE
571 disknum=$((disknum+1))
573 exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
582 # Init the gmirror device
589 # Create this mirror device
590 rc_halt "gmirror label -vb ${_mBal} gm${_mNum} ${_mDisk}"
596 # Stop all gjournals on disk / slice
599 _gdsk="`echo $1 | sed 's|/dev/||g'`"
600 # Check if we need to shutdown any journals on this drive
601 ls /dev/${_gdsk}*.journal >/dev/null 2>/dev/null
605 for i in `ls ${_gdsk}*.journal`
607 rawjournal="`echo ${i} | cut -d '.' -f 1`"
608 gjournal stop -f ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
609 gjournal clear ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
615 # Function to wipe the potential metadata from a disk
618 echo_log "Wiping possible metadata on ${1}"
619 local SIZE="`diskinfo ${1} | awk '{print int($3/(1024*1024)) }'`"
620 if [ "$SIZE" -gt "5" ] ; then
621 rc_halt "dd if=/dev/zero of=${1} bs=1m count=1"
622 rc_nohalt "dd if=/dev/zero of=${1} bs=1m oseek=$((SIZE-4))"
624 rc_nohalt "dd if=/dev/zero of=${1} bs=128k"
628 # Function which runs gpart and creates a single large APM partition scheme
633 # Set our sysctl so we can overwrite any geom using drives
634 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
636 # Stop any journaling
637 stop_gjournal "${_intDISK}"
639 # Remove any existing partitions
640 delete_all_gpart "${_intDISK}"
644 echo_log "Running gpart on ${_intDISK}"
645 rc_halt "gpart create -s APM ${_intDISK}"
646 rc_halt "gpart add -s 800k -t freebsd-boot ${_intDISK}"
648 echo_log "Stamping boot sector on ${_intDISK}"
649 rc_halt "gpart bootcode -p /boot/boot1.hfs -i 1 ${_intDISK}"
653 # Function which runs gpart and creates a single large GPT partition scheme
658 # Set our sysctl so we can overwrite any geom using drives
659 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
661 # Stop any journaling
662 stop_gjournal "${_intDISK}"
664 # Remove any existing partitions
665 delete_all_gpart "${_intDISK}"
669 echo_log "Running gpart on ${_intDISK}"
670 rc_halt "gpart create -s GPT ${_intDISK}"
671 rc_halt "gpart add -b 34 -s 128 -t freebsd-boot ${_intDISK}"
673 echo_log "Stamping boot sector on ${_intDISK}"
674 rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}"
678 # Function which runs gpart and creates a single large MBR partition scheme
686 # Set our sysctl so we can overwrite any geom using drives
687 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
689 # Stop any journaling
690 stop_gjournal "${_intDISK}"
692 # Remove any existing partitions
693 delete_all_gpart "${_intDISK}"
697 echo_log "Running gpart on ${_intDISK}"
698 rc_halt "gpart create -s mbr -f active ${_intDISK}"
700 # Install new partition setup
701 echo_log "Running gpart add on ${_intDISK}"
702 rc_halt "gpart add -a 4k -t freebsd -i 1 ${_intDISK}"
705 wipe_metadata "${_intDISK}s1"
707 # Make the partition active
708 rc_halt "gpart set -a active -i 1 ${_intDISK}"
710 if [ "$_intBOOT" = "bsd" ] ; then
711 echo_log "Stamping boot0 on ${_intDISK}"
712 rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}"
714 echo_log "Stamping boot1 on ${_intDISK}"
715 rc_halt "gpart bootcode -b /boot/boot1 ${_intDISK}"
720 # Function which runs gpart and creates a single large slice
727 if [ "$SCHEME" = "APM" ] ; then
728 init_apm_full_disk "$DISK"
729 slice=`echo "${DISK}:1:apm" | sed 's|/|-|g'`
730 elif [ "$SCHEME" = "MBR" ] ; then
731 init_mbr_full_disk "$DISK" "$BOOT"
732 slice=`echo "${DISK}:1:mbr" | sed 's|/|-|g'`
734 init_gpt_full_disk "$DISK"
735 slice=`echo "${DISK}:1:gpt" | sed 's|/|-|g'`
738 # Lets save our slice, so we know what to look for in the config file later on
739 if [ -z "$WORKINGSLICES" ]
741 WORKINGSLICES="${slice}"
744 WORKINGSLICES="${WORKINGSLICES} ${slice}"
749 # Function which runs gpart on a specified gpt partition
754 # Set the slice we will use later
757 # Set our sysctl so we can overwrite any geom using drives
758 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
760 # Get the number of the slice we are working on
763 # Stop any journaling
764 stop_gjournal "${slice}"
766 # Make sure we have disabled swap on this drive
767 if [ -e "${slice}b" ]
769 swapoff ${slice}b >/dev/null 2>/dev/null
770 swapoff ${slice}b.eli >/dev/null 2>/dev/null
773 # Modify partition type
774 echo_log "Running gpart modify on ${DISK}"
775 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
778 wipe_metadata "${slice}"
782 # Init the MBR partition
783 rc_halt "gpart create -s BSD ${DISK}p${slicenum}"
785 # Stamp the bootloader
787 rc_halt "gpart bootcode -b /boot/boot ${DISK}p${slicenum}"
789 # Set the slice to the format we'll be using for gpart later
790 slice=`echo "${1}:${3}:gptslice" | sed 's|/|-|g'`
792 # Lets save our slice, so we know what to look for in the config file later on
793 if [ -z "$WORKINGSLICES" ]
795 WORKINGSLICES="${slice}"
798 WORKINGSLICES="${WORKINGSLICES} ${slice}"
803 # Function which runs gpart on a specified s1-4 slice
812 # Set the slice we will use later
815 # Set our sysctl so we can overwrite any geom using drives
816 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
818 # Get the number of the slice we are working on
821 # Stop any journaling
822 stop_gjournal "${slice}"
824 # Make sure we have disabled swap on this drive
825 if [ -e "${slice}b" ]
827 swapoff ${slice}b >/dev/null 2>/dev/null
828 swapoff ${slice}b.eli >/dev/null 2>/dev/null
831 # Modify partition type
832 echo_log "Running gpart modify on ${DISK}"
833 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
836 wipe_metadata "${slice}"
840 if [ "${BMANAGER}" = "bsd" ]
842 echo_log "Stamping boot sector on ${DISK}"
843 rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
846 # Set the slice to the format we'll be using for gpart later
847 slice=`echo "${1}:${3}:mbr" | sed 's|/|-|g'`
849 # Lets save our slice, so we know what to look for in the config file later on
850 if [ -z "$WORKINGSLICES" ]
852 WORKINGSLICES="${slice}"
855 WORKINGSLICES="${WORKINGSLICES} ${slice}"
860 # Function which runs gpart and creates a new slice from free disk space
870 # Set our sysctl so we can overwrite any geom using drives
871 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
873 slice="${DISK}s${SLICENUM}"
874 slicenum="${SLICENUM}"
876 # Working on the first slice, make sure we have MBR setup
877 gpart show ${DISK} >/dev/null 2>/dev/null
878 if [ $? -ne 0 -a "$SLICENUM" = "1" ] ; then
879 echo_log "Initializing disk, no existing MBR setup"
880 rc_halt "gpart create -s mbr ${DISK}"
883 # Install new partition setup
884 echo_log "Running gpart on ${DISK}"
885 rc_halt "gpart add -a 4k -t freebsd -i ${slicenum} ${DISK}"
888 wipe_metadata "${slice}"
892 if [ "${BMANAGER}" = "bsd" ]
894 echo_log "Stamping boot sector on ${DISK}"
895 rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
898 slice=`echo "${DISK}:${SLICENUM}:mbr" | sed 's|/|-|g'`
899 # Lets save our slice, so we know what to look for in the config file later on
900 if [ -z "$WORKINGSLICES" ]
902 WORKINGSLICES="${slice}"
905 WORKINGSLICES="${WORKINGSLICES} ${slice}"