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
41 # Get a MBR partitions sysid
42 get_partition_sysid_mbr()
46 PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
47 fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
50 echo "$i" | grep -q "The data for partition" 2>/dev/null
51 if [ $? -eq 0 ] ; then
53 PART="`echo ${i} | cut -d ' ' -f 5`"
54 if [ "$PART" = "$PARTNUM" ] ; then
59 # In the partition section
60 if [ "$INPART" = "1" ] ; then
61 echo "$i" | grep -q "^sysid" 2>/dev/null
62 if [ $? -eq 0 ] ; then
63 SYSID="`echo ${i} | tr -s '\t' ' ' | cut -d ' ' -f 2`"
69 done < ${TMPDIR}/disk-${DISK}
70 rm ${TMPDIR}/disk-${DISK}
75 # Get the partitions MBR label
76 get_partition_label_mbr()
80 PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
81 fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
84 echo "$i" | grep -q "The data for partition" 2>/dev/null
85 if [ $? -eq 0 ] ; then
87 PART="`echo ${i} | cut -d ' ' -f 5`"
88 if [ "$PART" = "$PARTNUM" ] ; then
93 # In the partition section
94 if [ "$INPART" = "1" ] ; then
95 echo "$i" | grep -q "^sysid" 2>/dev/null
96 if [ $? -eq 0 ] ; then
97 LABEL="`echo ${i} | tr -s '\t' ' ' | cut -d ',' -f 2-10`"
103 done < ${TMPDIR}/disk-${DISK}
104 rm ${TMPDIR}/disk-${DISK}
106 export VAL="${LABEL}"
109 # Get a GPT partitions label
110 get_partition_label_gpt()
113 PARTNUM=`echo ${2} | sed "s|${DISK}p||g"`
115 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
118 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
119 if [ "${SLICE}" = "${PARTNUM}" ] ; then
120 LABEL="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4`"
123 done <${TMPDIR}/disk-${DISK}
124 rm ${TMPDIR}/disk-${DISK}
126 export VAL="${LABEL}"
129 # Get a partitions startblock
130 get_partition_startblock()
133 PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
135 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
138 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
139 if [ "$SLICE" = "${PARTNUM}" ] ; then
140 SB="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 1`"
143 done <${TMPDIR}/disk-${DISK}
144 rm ${TMPDIR}/disk-${DISK}
149 # Get a partitions blocksize
150 get_partition_blocksize()
153 PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
155 gpart show ${DISK} >${TMPDIR}/disk-${DISK}
158 SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
159 if [ "$SLICE" = "${PARTNUM}" ] ; then
160 BS="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 2`"
163 done <${TMPDIR}/disk-${DISK}
164 rm ${TMPDIR}/disk-${DISK}
169 # Function which returns the partitions on a target disk
170 get_disk_partitions()
172 gpart show ${1} >/dev/null 2>/dev/null
173 if [ $? -ne 0 ] ; then
178 type=`gpart show ${1} | awk '/^=>/ { printf("%s",$5); }'`
180 SLICES="`gpart show ${1} | grep -v ${1} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4 | sed '/^$/d'`"
184 MBR) name="${1}s${i}" ;;
185 GPT) name="${1}p${i}";;
186 *) name="${1}s${i}";;
188 if [ -z "${RSLICES}" ]
192 RSLICES="${RSLICES} ${name}"
196 export VAL="${RSLICES}"
199 # Function which returns a target disks cylinders
202 cyl=`diskinfo -v ${1} | grep "# Cylinders" | tr -s ' ' | cut -f 2`
206 # Function which returns a target disks sectors
209 sec=`diskinfo -v ${1} | grep "# Sectors" | tr -s ' ' | cut -f 2`
213 # Function which returns a target disks heads
216 head=`diskinfo -v ${1} | grep "# Heads" | tr -s ' ' | cut -f 2`
220 # Function which returns a target disks mediasize in sectors
223 mediasize=`diskinfo -v ${1} | grep "# mediasize in sectors" | tr -s ' ' | cut -f 2`
224 export VAL="${mediasize}"
227 # Function which returns a target disks mediasize in megabytes
228 get_disk_mediasize_mb()
230 mediasize=`diskinfo -v ${1} | grep "# mediasize in bytes" | tr -s ' ' | cut -f 2`
231 mediasize=`expr $mediasize / 1024`
232 mediasize=`expr $mediasize / 1024`
233 export VAL="${mediasize}"
236 # Function to delete all gparts before starting an install
239 echo_log "Deleting all gparts"
242 # Check for any swaps to stop
243 for i in `swapctl -l | grep "$DISK" | awk '{print $1}'`
245 swapoff ${i} >/dev/null 2>/dev/null
248 # Delete the gparts now
249 for i in `gpart show ${DISK} 2>/dev/null | tr -s ' ' | cut -d ' ' -f 4`
251 if [ "/dev/${i}" != "${DISK}" -a "${i}" != "-" ] ; then
252 rc_nohalt "gpart delete -i ${i} ${DISK}"
256 # Destroy the disk geom
257 rc_nohalt "gpart destroy ${DISK}"
259 # Make sure we clear any hidden gpt tables
260 clear_backup_gpt_table "${DISK}"
262 # Wipe out front of disk
263 rc_nohalt "dd if=/dev/zero of=${DISK} count=3000"
267 # Function to export all zpools before starting an install
270 local DISK="`echo ${1} | sed 's|/dev/||g'`"
272 # Export any zpools using this device so we can overwrite
273 for i in `zpool list -H -o name`
275 ztst=`zpool status ${i} | grep "ONLINE" | awk '{print $1}' | grep -q ${DISK}`
276 if [ "$ztst" = "$DISK" ] ; then
282 # Function which stops all gmirrors before doing any disk manipulation
285 local DISK="`echo ${1} | sed 's|/dev/||g'`"
286 GPROV="`gmirror list | grep ". Name: mirror/" | cut -d '/' -f 2`"
289 gmirror list | grep -q "Name: ${DISK}" 2>/dev/null
292 echo_log "Stopping mirror $gprov $DISK"
293 rc_nohalt "gmirror remove $gprov $DISK"
294 rc_nohalt "dd if=/dev/zero of=/dev/${DISK} count=4096"
299 # Make sure we don't have any geli providers active on this disk
302 local _geld="`echo ${1} | sed 's|/dev/||g'`"
305 for i in `ls ${_geld}*`
307 echo $i | grep -q '.eli' 2>/dev/null
310 echo_log "Detaching GELI on ${i}"
311 rc_halt "geli detach ${i}"
317 # Function which reads in the disk slice config, and performs it
321 # Cleanup any slice / mirror dirs
322 rm -rf ${SLICECFGDIR} >/dev/null 2>/dev/null
324 rm -rf ${MIRRORCFGDIR} >/dev/null 2>/dev/null
325 mkdir ${MIRRORCFGDIR}
327 # Start with disk0 and gm0
331 # We are ready to start setting up the disks, lets read the config and do the actions
334 echo $line | grep -q "^disk${disknum}=" 2>/dev/null
338 # Found a disk= entry, lets get the disk we are working on
339 get_value_from_string "${line}"
340 strip_white_space "$VAL"
343 echo "${DISK}" | grep -q '^/dev/'
344 if [ $? -ne 0 ] ; then DISK="/dev/$DISK" ; fi
346 # Before we go further, lets confirm this disk really exists
347 if [ ! -e "${DISK}" ] ; then
348 exit_err "ERROR: The disk ${DISK} does not exist!"
351 # Make sure we stop any gmirrors on this disk
352 stop_all_gmirror ${DISK}
354 # Make sure we stop any geli stuff on this disk
355 stop_all_geli ${DISK}
357 # Make sure we don't have any zpools loaded
362 # Lets look if this device will be mirrored on another disk
363 echo $line | grep -q "^mirror=" 2>/dev/null
367 # Found a disk= entry, lets get the disk we are working on
368 get_value_from_string "${line}"
369 strip_white_space "$VAL"
371 echo "${MIRRORDISK}" | grep -q '^/dev/'
372 if [ $? -ne 0 ] ; then MIRRORDISK="/dev/$MIRRORDISK" ; fi
374 # Before we go further, lets confirm this disk really exists
375 if [ ! -e "${MIRRORDISK}" ]
377 exit_err "ERROR: The mirror disk ${MIRRORDISK} does not exist!"
380 # Make sure we stop any gmirrors on this mirror disk
381 stop_all_gmirror ${MIRRORDISK}
383 # Make sure we stop any geli stuff on this mirror disk
384 stop_all_geli ${MIRRORDISK}
386 # Make sure we don't have any zpools mirror loaded
387 stop_all_zfs ${MIRRORDISK}
391 # Lets see if we have been given a mirror balance choice
392 echo $line | grep -q "^mirrorbal=" 2>/dev/null
396 # Found a disk= entry, lets get the disk we are working on
397 get_value_from_string "${line}"
398 strip_white_space "$VAL"
402 echo $line | grep -q "^partition=" 2>/dev/null
405 # Found a partition= entry, lets read / set it
406 get_value_from_string "${line}"
407 strip_white_space "$VAL"
408 PTYPE=`echo $VAL|tr A-Z a-z`
410 # We are using free space, figure out the slice number
411 if [ "${PTYPE}" = "free" ]
413 # Lets figure out what number this slice will be
414 LASTSLICE="`gpart show ${DISK} \
422 if [ -z "${LASTSLICE}" ]
426 LASTSLICE=$((LASTSLICE+1))
429 if [ $LASTSLICE -gt 4 ]
431 exit_err "ERROR: BSD only supports primary partitions, and there are none availble on $DISK"
437 # Check if we have an image file defined
438 echo $line | grep -q "^image=" 2>/dev/null
439 if [ $? -eq 0 ] ; then
440 # Found an image= entry, lets read / set it
441 get_value_from_string "${line}"
442 strip_white_space "$VAL"
444 if [ ! -f "$IMAGE" ] ; then
445 exit_err "$IMAGE file does not exist"
449 # Check if we have a partscheme specified
450 echo $line | grep -q "^partscheme=" 2>/dev/null
451 if [ $? -eq 0 ] ; then
452 # Found a partscheme= entry, lets read / set it
453 get_value_from_string "${line}"
454 strip_white_space "$VAL"
456 if [ "$PSCHEME" != "GPT" -a "$PSCHEME" != "MBR" ] ; then
457 exit_err "Unknown partition scheme: $PSCHEME"
461 echo $line | grep -q "^bootManager=" 2>/dev/null
464 # Found a bootManager= entry, lets read /set it
465 get_value_from_string "${line}"
466 strip_white_space "$VAL"
470 echo $line | grep -q "^commitDiskPart" 2>/dev/null
473 # Found our flag to commit this disk setup / lets do sanity check and do it
474 if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
476 # Make sure we are only installing ppc to full disk
477 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]; then
478 if [ "$PTYPE" != "all" ] ; then
479 exit_err "powerpc can only be installed to a full disk"
485 # If we have a gmirror, lets set it up
486 if [ -n "$MIRRORDISK" ]; then
487 # Default to round-robin if the user didn't specify
488 if [ -z "$MIRRORBAL" ]; then MIRRORBAL="round-robin" ; fi
490 _mFile=`echo $DISK | sed 's|/|%|g'`
491 echo "$MIRRORDISK:$MIRRORBAL:gm${gmnum}" >${MIRRORCFGDIR}/$_mFile
492 init_gmirror "$gmnum" "$MIRRORBAL" "$DISK" "$MIRRORDISK"
494 # Reset DISK to the gmirror device
495 DISK="/dev/mirror/gm${gmnum}"
499 if [ "$PSCHEME" = "MBR" -o -z "$PSCHEME" ] ; then
506 if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]
512 run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}"
516 tmpSLICE="${DISK}${PTYPE}"
517 # Get the number of the slice we are working on
518 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
519 run_gpart_slice "${DISK}" "${BMANAGER}" "${s}"
522 p1|p2|p3|p4|p5|p6|p7|p8|p9|p10|p11|p12|p13|p14|p15|p16|p17|p18|p19|p20)
523 tmpSLICE="${DISK}${PTYPE}"
524 # Get the number of the gpt partition we are working on
525 s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
526 run_gpart_gpt_part "${DISK}" "${BMANAGER}" "${s}"
530 tmpSLICE="${DISK}s${LASTSLICE}"
531 run_gpart_free "${DISK}" "${LASTSLICE}" "${BMANAGER}"
537 exit_err "ERROR: partition type image specified with no image!"
541 *) exit_err "ERROR: Unknown PTYPE: $PTYPE" ;;
549 if [ -n "${tmpSLICE}" ]
556 write_image "${IMAGE}" "${DEST}"
557 check_disk_layout "${DEST}"
560 # Now save which disk<num> this is, so we can parse it later during slice partition setup
563 _sFile=`echo $tmpSLICE | sed 's|/|-|g'`
564 echo "disk${disknum}" >${SLICECFGDIR}/$_sFile
567 # Increment our disk counter to look for next disk and unset
568 unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL PSCHEME IMAGE
569 disknum=$((disknum+1))
571 exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
580 # Init the gmirror device
587 # Create this mirror device
588 rc_halt "gmirror label -vb ${_mBal} gm${_mNum} ${_mDisk}"
594 # Stop all gjournals on disk / slice
597 _gdsk="`echo $1 | sed 's|/dev/||g'`"
598 # Check if we need to shutdown any journals on this drive
599 ls /dev/${_gdsk}*.journal >/dev/null 2>/dev/null
603 for i in `ls ${_gdsk}*.journal`
605 rawjournal="`echo ${i} | cut -d '.' -f 1`"
606 gjournal stop -f ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
607 gjournal clear ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
613 # Function to wipe the potential backup gpt table from a disk
614 clear_backup_gpt_table()
616 echo_log "Clearing gpt backup table location on disk"
617 rc_nohalt "dd if=/dev/zero of=${1} bs=1m count=1"
618 rc_nohalt "dd if=/dev/zero of=${1} bs=1m oseek=`diskinfo ${1} | awk '{print int($3 / (1024*1024)) - 4;}'`"
621 # Function which runs gpart and creates a single large APM partition scheme
626 # Set our sysctl so we can overwrite any geom using drives
627 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
629 # Stop any journaling
630 stop_gjournal "${_intDISK}"
632 # Remove any existing partitions
633 delete_all_gpart "${_intDISK}"
637 echo_log "Running gpart on ${_intDISK}"
638 rc_halt "gpart create -s APM ${_intDISK}"
639 rc_halt "gpart add -s 800k -t freebsd-boot ${_intDISK}"
641 echo_log "Stamping boot sector on ${_intDISK}"
642 rc_halt "gpart bootcode -p /boot/boot1.hfs -i 1 ${_intDISK}"
646 # Function which runs gpart and creates a single large GPT partition scheme
651 # Set our sysctl so we can overwrite any geom using drives
652 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
654 # Stop any journaling
655 stop_gjournal "${_intDISK}"
657 # Remove any existing partitions
658 delete_all_gpart "${_intDISK}"
662 echo_log "Running gpart on ${_intDISK}"
663 rc_halt "gpart create -s GPT ${_intDISK}"
664 rc_halt "gpart add -b 34 -s 128 -t freebsd-boot ${_intDISK}"
666 echo_log "Stamping boot sector on ${_intDISK}"
667 rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}"
671 # Function which runs gpart and creates a single large MBR partition scheme
679 # Set our sysctl so we can overwrite any geom using drives
680 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
682 # Stop any journaling
683 stop_gjournal "${_intDISK}"
685 # Remove any existing partitions
686 delete_all_gpart "${_intDISK}"
690 echo_log "Running gpart on ${_intDISK}"
691 rc_halt "gpart create -s mbr -f active ${_intDISK}"
693 # Install new partition setup
694 echo_log "Running gpart add on ${_intDISK}"
695 rc_halt "gpart add -a 4k -t freebsd -i 1 ${_intDISK}"
698 echo_log "Cleaning up ${_intDISK}s1"
699 rc_halt "dd if=/dev/zero of=${_intDISK}s1 count=1024"
701 # Make the partition active
702 rc_halt "gpart set -a active -i 1 ${_intDISK}"
704 if [ "$_intBOOT" = "bsd" ] ; then
705 echo_log "Stamping boot0 on ${_intDISK}"
706 rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}"
708 echo_log "Stamping boot1 on ${_intDISK}"
709 rc_halt "gpart bootcode -b /boot/boot1 ${_intDISK}"
714 # Function which runs gpart and creates a single large slice
721 if [ "$SCHEME" = "APM" ] ; then
722 init_apm_full_disk "$DISK"
723 slice=`echo "${DISK}:1:apm" | sed 's|/|-|g'`
724 elif [ "$SCHEME" = "MBR" ] ; then
725 init_mbr_full_disk "$DISK" "$BOOT"
726 slice=`echo "${DISK}:1:mbr" | sed 's|/|-|g'`
728 init_gpt_full_disk "$DISK"
729 slice=`echo "${DISK}:1:gpt" | sed 's|/|-|g'`
732 # Lets save our slice, so we know what to look for in the config file later on
733 if [ -z "$WORKINGSLICES" ]
735 WORKINGSLICES="${slice}"
738 WORKINGSLICES="${WORKINGSLICES} ${slice}"
743 # Function which runs gpart on a specified gpt partition
748 # Set the slice we will use later
751 # Set our sysctl so we can overwrite any geom using drives
752 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
754 # Get the number of the slice we are working on
757 # Stop any journaling
758 stop_gjournal "${slice}"
760 # Make sure we have disabled swap on this drive
761 if [ -e "${slice}b" ]
763 swapoff ${slice}b >/dev/null 2>/dev/null
764 swapoff ${slice}b.eli >/dev/null 2>/dev/null
767 # Modify partition type
768 echo_log "Running gpart modify on ${DISK}"
769 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
772 # Clean up old partition
773 echo_log "Cleaning up $slice"
774 rc_halt "dd if=/dev/zero of=${DISK}p${slicenum} count=1024"
778 # Init the MBR partition
779 rc_halt "gpart create -s BSD ${DISK}p${slicenum}"
781 # Stamp the bootloader
783 rc_halt "gpart bootcode -b /boot/boot ${DISK}p${slicenum}"
785 # Set the slice to the format we'll be using for gpart later
786 slice=`echo "${1}:${3}:gptslice" | sed 's|/|-|g'`
788 # Lets save our slice, so we know what to look for in the config file later on
789 if [ -z "$WORKINGSLICES" ]
791 WORKINGSLICES="${slice}"
794 WORKINGSLICES="${WORKINGSLICES} ${slice}"
799 # Function which runs gpart on a specified s1-4 slice
808 # Set the slice we will use later
811 # Set our sysctl so we can overwrite any geom using drives
812 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
814 # Get the number of the slice we are working on
817 # Stop any journaling
818 stop_gjournal "${slice}"
820 # Make sure we have disabled swap on this drive
821 if [ -e "${slice}b" ]
823 swapoff ${slice}b >/dev/null 2>/dev/null
824 swapoff ${slice}b.eli >/dev/null 2>/dev/null
827 # Modify partition type
828 echo_log "Running gpart modify on ${DISK}"
829 rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
832 # Clean up old partition
833 echo_log "Cleaning up $slice"
834 rc_halt "dd if=/dev/zero of=${DISK}s${slicenum} count=1024"
838 if [ "${BMANAGER}" = "bsd" ]
840 echo_log "Stamping boot sector on ${DISK}"
841 rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
844 # Set the slice to the format we'll be using for gpart later
845 slice=`echo "${1}:${3}:mbr" | sed 's|/|-|g'`
847 # Lets save our slice, so we know what to look for in the config file later on
848 if [ -z "$WORKINGSLICES" ]
850 WORKINGSLICES="${slice}"
853 WORKINGSLICES="${WORKINGSLICES} ${slice}"
858 # Function which runs gpart and creates a new slice from free disk space
868 # Set our sysctl so we can overwrite any geom using drives
869 sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
871 slice="${DISK}s${SLICENUM}"
872 slicenum="${SLICENUM}"
874 # Working on the first slice, make sure we have MBR setup
875 gpart show ${DISK} >/dev/null 2>/dev/null
876 if [ $? -ne 0 -a "$SLICENUM" = "1" ] ; then
877 echo_log "Initializing disk, no existing MBR setup"
878 rc_halt "gpart create -s mbr ${DISK}"
881 # Install new partition setup
882 echo_log "Running gpart on ${DISK}"
883 rc_halt "gpart add -a 4k -t freebsd -i ${slicenum} ${DISK}"
886 echo_log "Cleaning up $slice"
887 rc_halt "dd if=/dev/zero of=${slice} count=1024"
891 if [ "${BMANAGER}" = "bsd" ]
893 echo_log "Stamping boot sector on ${DISK}"
894 rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
897 slice=`echo "${DISK}:${SLICENUM}:mbr" | sed 's|/|-|g'`
898 # Lets save our slice, so we know what to look for in the config file later on
899 if [ -z "$WORKINGSLICES" ]
901 WORKINGSLICES="${slice}"
904 WORKINGSLICES="${WORKINGSLICES} ${slice}"