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 # Make sure we clear any hidden gpt tables
261 clear_backup_gpt_table "${DISK}"
263 # Wipe out front of disk
264 rc_nohalt "dd if=/dev/zero of=${DISK} count=3000"
268 # Function to export all zpools before starting an install
271 local DISK="`echo ${1} | sed 's|/dev/||g'`"
273 # Export any zpools using this device so we can overwrite
274 for i in `zpool list -H -o name`
276 ztst=`zpool status ${i} | grep "ONLINE" | awk '{print $1}' | grep -q ${DISK}`
277 if [ "$ztst" = "$DISK" ] ; then
283 # Function which stops all gmirrors before doing any disk manipulation
286 local DISK="`echo ${1} | sed 's|/dev/||g'`"
287 GPROV="`gmirror list | grep ". Name: mirror/" | cut -d '/' -f 2`"
290 gmirror list | grep -q "Name: ${DISK}" 2>/dev/null
293 echo_log "Stopping mirror $gprov $DISK"
294 rc_nohalt "gmirror remove $gprov $DISK"
295 rc_nohalt "dd if=/dev/zero of=/dev/${DISK} count=4096"
300 # Make sure we don't have any geli providers active on this disk
303 local _geld="`echo ${1} | sed 's|/dev/||g'`"
306 for i in `ls ${_geld}*`
308 echo $i | grep -q '.eli' 2>/dev/null
311 echo_log "Detaching GELI on ${i}"
312 rc_halt "geli detach ${i}"
318 # Function which reads in the disk slice config, and performs it
322 # Cleanup any slice / mirror dirs
323 rm -rf ${SLICECFGDIR} >/dev/null 2>/dev/null
325 rm -rf ${MIRRORCFGDIR} >/dev/null 2>/dev/null
326 mkdir ${MIRRORCFGDIR}
328 # Start with disk0 and gm0
332 # We are ready to start setting up the disks, lets read the config and do the actions
335 echo $line | grep -q "^disk${disknum}=" 2>/dev/null
339 # Found a disk= entry, lets get the disk we are working on
340 get_value_from_string "${line}"
341 strip_white_space "$VAL"
344 echo "${DISK}" | grep -q '^/dev/'
345 if [ $? -ne 0 ] ; then DISK="/dev/$DISK" ; fi
347 # Before we go further, lets confirm this disk really exists
348 if [ ! -e "${DISK}" ] ; then
349 exit_err "ERROR: The disk ${DISK} does not exist!"
352 # Make sure we stop any gmirrors on this disk
353 stop_all_gmirror ${DISK}
355 # Make sure we stop any geli stuff on this disk
356 stop_all_geli ${DISK}
358 # Make sure we don't have any zpools loaded
363 # Lets look if this device will be mirrored on another disk
364 echo $line | grep -q "^mirror=" 2>/dev/null
368 # Found a disk= entry, lets get the disk we are working on
369 get_value_from_string "${line}"
370 strip_white_space "$VAL"
372 echo "${MIRRORDISK}" | grep -q '^/dev/'
373 if [ $? -ne 0 ] ; then MIRRORDISK="/dev/$MIRRORDISK" ; fi
375 # Before we go further, lets confirm this disk really exists
376 if [ ! -e "${MIRRORDISK}" ]
378 exit_err "ERROR: The mirror disk ${MIRRORDISK} does not exist!"
381 # Make sure we stop any gmirrors on this mirror disk
382 stop_all_gmirror ${MIRRORDISK}
384 # Make sure we stop any geli stuff on this mirror disk
385 stop_all_geli ${MIRRORDISK}
387 # Make sure we don't have any zpools mirror loaded
388 stop_all_zfs ${MIRRORDISK}
392 # Lets see if we have been given a mirror balance choice
393 echo $line | grep -q "^mirrorbal=" 2>/dev/null
397 # Found a disk= entry, lets get the disk we are working on
398 get_value_from_string "${line}"
399 strip_white_space "$VAL"
403 echo $line | grep -q "^partition=" 2>/dev/null
406 # Found a partition= entry, lets read / set it
407 get_value_from_string "${line}"
408 strip_white_space "$VAL"
409 PTYPE=`echo $VAL|tr A-Z a-z`
411 # We are using free space, figure out the slice number
412 if [ "${PTYPE}" = "free" ]
414 # Lets figure out what number this slice will be
415 LASTSLICE="`gpart show ${DISK} \
423 if [ -z "${LASTSLICE}" ]
427 LASTSLICE=$((LASTSLICE+1))
430 if [ $LASTSLICE -gt 4 ]
432 exit_err "ERROR: BSD only supports primary partitions, and there are none available on $DISK"
438 # Check if we have an image file defined
439 echo $line | grep -q "^image=" 2>/dev/null
440 if [ $? -eq 0 ] ; then
441 # Found an image= entry, lets read / set it
442 get_value_from_string "${line}"
443 strip_white_space "$VAL"
445 if [ ! -f "$IMAGE" ] ; then
446 exit_err "$IMAGE file does not exist"
450 # Check if we have a partscheme specified
451 echo $line | grep -q "^partscheme=" 2>/dev/null
452 if [ $? -eq 0 ] ; then
453 # Found a partscheme= entry, lets read / set it
454 get_value_from_string "${line}"
455 strip_white_space "$VAL"
457 if [ "$PSCHEME" != "GPT" -a "$PSCHEME" != "MBR" ] ; then
458 exit_err "Unknown partition scheme: $PSCHEME"
462 echo $line | grep -q "^bootManager=" 2>/dev/null
465 # Found a bootManager= entry, lets read /set it
466 get_value_from_string "${line}"
467 strip_white_space "$VAL"
471 echo $line | grep -q "^commitDiskPart" 2>/dev/null
474 # Found our flag to commit this disk setup / lets do sanity check and do it
475 if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
477 # Make sure we are only installing ppc to full disk
478 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]; then
479 if [ "$PTYPE" != "all" ] ; then
480 exit_err "powerpc can only be installed to a full disk"
486 # If we have a gmirror, lets set it up
487 if [ -n "$MIRRORDISK" ]; then
488 # Default to round-robin if the user didn't specify
489 if [ -z "$MIRRORBAL" ]; then MIRRORBAL="round-robin" ; fi
491 _mFile=`echo $DISK | sed 's|/|%|g'`
492 echo "$MIRRORDISK:$MIRRORBAL:gm${gmnum}" >${MIRRORCFGDIR}/$_mFile
493 init_gmirror "$gmnum" "$MIRRORBAL" "$DISK" "$MIRRORDISK"
495 # Reset DISK to the gmirror device
496 DISK="/dev/mirror/gm${gmnum}"
500 if [ "$PSCHEME" = "MBR" -o -z "$PSCHEME" ] ; then
507 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]
513 run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}"
517 tmpSLICE="${DISK}${PTYPE}"
518 # Get the number of the slice we are working on
519 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
520 run_gpart_slice "${DISK}" "${BMANAGER}" "${s}"
523 p1|p2|p3|p4|p5|p6|p7|p8|p9|p10|p11|p12|p13|p14|p15|p16|p17|p18|p19|p20)
524 tmpSLICE="${DISK}${PTYPE}"
525 # Get the number of the gpt partition we are working on
526 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
527 run_gpart_gpt_part "${DISK}" "${BMANAGER}" "${s}"
531 tmpSLICE="${DISK}s${LASTSLICE}"
532 run_gpart_free "${DISK}" "${LASTSLICE}" "${BMANAGER}"
538 exit_err "ERROR: partition type image specified with no image!"
542 *) exit_err "ERROR: Unknown PTYPE: $PTYPE" ;;
550 if [ -n "${tmpSLICE}" ]
557 write_image "${IMAGE}" "${DEST}"
558 check_disk_layout "${DEST}"
561 # Now save which disk<num> this is, so we can parse it later during slice partition setup
564 _sFile=`echo $tmpSLICE | sed 's|/|-|g'`
565 echo "disk${disknum}" >${SLICECFGDIR}/$_sFile
568 # Increment our disk counter to look for next disk and unset
569 unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL PSCHEME IMAGE
570 disknum=$((disknum+1))
572 exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
581 # Init the gmirror device
588 # Create this mirror device
589 rc_halt "gmirror label -vb ${_mBal} gm${_mNum} ${_mDisk}"
595 # Stop all gjournals on disk / slice
598 _gdsk="`echo $1 | sed 's|/dev/||g'`"
599 # Check if we need to shutdown any journals on this drive
600 ls /dev/${_gdsk}*.journal >/dev/null 2>/dev/null
604 for i in `ls ${_gdsk}*.journal`
606 rawjournal="`echo ${i} | cut -d '.' -f 1`"
607 gjournal stop -f ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
608 gjournal clear ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
614 # Function to wipe the potential backup gpt table from a disk
615 clear_backup_gpt_table()
617 echo_log "Clearing gpt backup table location on disk"
618 rc_nohalt "dd if=/dev/zero of=${1} bs=1m count=1"
619 rc_nohalt "dd if=/dev/zero of=${1} bs=1m oseek=`diskinfo ${1} | awk '{print int($3 / (1024*1024)) - 4;}'`"
622 # Function which runs gpart and creates a single large APM partition scheme
627 # Set our sysctl so we can overwrite any geom using drives
628 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
630 # Stop any journaling
631 stop_gjournal "${_intDISK}"
633 # Remove any existing partitions
634 delete_all_gpart "${_intDISK}"
638 echo_log "Running gpart on ${_intDISK}"
639 rc_halt "gpart create -s APM ${_intDISK}"
640 rc_halt "gpart add -s 800k -t freebsd-boot ${_intDISK}"
642 echo_log "Stamping boot sector on ${_intDISK}"
643 rc_halt "gpart bootcode -p /boot/boot1.hfs -i 1 ${_intDISK}"
647 # Function which runs gpart and creates a single large GPT partition scheme
652 # Set our sysctl so we can overwrite any geom using drives
653 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
655 # Stop any journaling
656 stop_gjournal "${_intDISK}"
658 # Remove any existing partitions
659 delete_all_gpart "${_intDISK}"
663 echo_log "Running gpart on ${_intDISK}"
664 rc_halt "gpart create -s GPT ${_intDISK}"
665 rc_halt "gpart add -b 34 -s 128 -t freebsd-boot ${_intDISK}"
667 echo_log "Stamping boot sector on ${_intDISK}"
668 rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}"
672 # Function which runs gpart and creates a single large MBR partition scheme
680 # Set our sysctl so we can overwrite any geom using drives
681 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
683 # Stop any journaling
684 stop_gjournal "${_intDISK}"
686 # Remove any existing partitions
687 delete_all_gpart "${_intDISK}"
691 echo_log "Running gpart on ${_intDISK}"
692 rc_halt "gpart create -s mbr -f active ${_intDISK}"
694 # Install new partition setup
695 echo_log "Running gpart add on ${_intDISK}"
696 rc_halt "gpart add -a 4k -t freebsd -i 1 ${_intDISK}"
699 echo_log "Cleaning up ${_intDISK}s1"
700 rc_halt "dd if=/dev/zero of=${_intDISK}s1 count=1024"
702 # Make the partition active
703 rc_halt "gpart set -a active -i 1 ${_intDISK}"
705 if [ "$_intBOOT" = "bsd" ] ; then
706 echo_log "Stamping boot0 on ${_intDISK}"
707 rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}"
709 echo_log "Stamping boot1 on ${_intDISK}"
710 rc_halt "gpart bootcode -b /boot/boot1 ${_intDISK}"
715 # Function which runs gpart and creates a single large slice
722 if [ "$SCHEME" = "APM" ] ; then
723 init_apm_full_disk "$DISK"
724 slice=`echo "${DISK}:1:apm" | sed 's|/|-|g'`
725 elif [ "$SCHEME" = "MBR" ] ; then
726 init_mbr_full_disk "$DISK" "$BOOT"
727 slice=`echo "${DISK}:1:mbr" | sed 's|/|-|g'`
729 init_gpt_full_disk "$DISK"
730 slice=`echo "${DISK}:1:gpt" | sed 's|/|-|g'`
733 # Lets save our slice, so we know what to look for in the config file later on
734 if [ -z "$WORKINGSLICES" ]
736 WORKINGSLICES="${slice}"
739 WORKINGSLICES="${WORKINGSLICES} ${slice}"
744 # Function which runs gpart on a specified gpt partition
749 # Set the slice we will use later
752 # Set our sysctl so we can overwrite any geom using drives
753 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
755 # Get the number of the slice we are working on
758 # Stop any journaling
759 stop_gjournal "${slice}"
761 # Make sure we have disabled swap on this drive
762 if [ -e "${slice}b" ]
764 swapoff ${slice}b >/dev/null 2>/dev/null
765 swapoff ${slice}b.eli >/dev/null 2>/dev/null
768 # Modify partition type
769 echo_log "Running gpart modify on ${DISK}"
770 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
773 # Clean up old partition
774 echo_log "Cleaning up $slice"
775 rc_halt "dd if=/dev/zero of=${DISK}p${slicenum} count=1024"
779 # Init the MBR partition
780 rc_halt "gpart create -s BSD ${DISK}p${slicenum}"
782 # Stamp the bootloader
784 rc_halt "gpart bootcode -b /boot/boot ${DISK}p${slicenum}"
786 # Set the slice to the format we'll be using for gpart later
787 slice=`echo "${1}:${3}:gptslice" | sed 's|/|-|g'`
789 # Lets save our slice, so we know what to look for in the config file later on
790 if [ -z "$WORKINGSLICES" ]
792 WORKINGSLICES="${slice}"
795 WORKINGSLICES="${WORKINGSLICES} ${slice}"
800 # Function which runs gpart on a specified s1-4 slice
809 # Set the slice we will use later
812 # Set our sysctl so we can overwrite any geom using drives
813 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
815 # Get the number of the slice we are working on
818 # Stop any journaling
819 stop_gjournal "${slice}"
821 # Make sure we have disabled swap on this drive
822 if [ -e "${slice}b" ]
824 swapoff ${slice}b >/dev/null 2>/dev/null
825 swapoff ${slice}b.eli >/dev/null 2>/dev/null
828 # Modify partition type
829 echo_log "Running gpart modify on ${DISK}"
830 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
833 # Clean up old partition
834 echo_log "Cleaning up $slice"
835 rc_halt "dd if=/dev/zero of=${DISK}s${slicenum} count=1024"
839 if [ "${BMANAGER}" = "bsd" ]
841 echo_log "Stamping boot sector on ${DISK}"
842 rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
845 # Set the slice to the format we'll be using for gpart later
846 slice=`echo "${1}:${3}:mbr" | sed 's|/|-|g'`
848 # Lets save our slice, so we know what to look for in the config file later on
849 if [ -z "$WORKINGSLICES" ]
851 WORKINGSLICES="${slice}"
854 WORKINGSLICES="${WORKINGSLICES} ${slice}"
859 # Function which runs gpart and creates a new slice from free disk space
869 # Set our sysctl so we can overwrite any geom using drives
870 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
872 slice="${DISK}s${SLICENUM}"
873 slicenum="${SLICENUM}"
875 # Working on the first slice, make sure we have MBR setup
876 gpart show ${DISK} >/dev/null 2>/dev/null
877 if [ $? -ne 0 -a "$SLICENUM" = "1" ] ; then
878 echo_log "Initializing disk, no existing MBR setup"
879 rc_halt "gpart create -s mbr ${DISK}"
882 # Install new partition setup
883 echo_log "Running gpart on ${DISK}"
884 rc_halt "gpart add -a 4k -t freebsd -i ${slicenum} ${DISK}"
887 echo_log "Cleaning up $slice"
888 rc_halt "dd if=/dev/zero of=${slice} count=1024"
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}"