freebsd-dev/usr.sbin/pc-sysinstall/backend/functions-disk.sh
Pedro F. Giffuni f0cfa1b168 share and pc-sysinstall: adoption of SPDX licensing ID tags.
Mainly focus on files that use BSD 2-Clause license, however the tool I
was using misidentified many licenses so this was mostly a manual - error
prone - task.

The Software Package Data Exchange (SPDX) group provides a specification
to make it easier for automated tools to detect and summarize well known
opensource licenses. We are gradually adopting the specification, noting
that the tags are considered only advisory and do not, in any way,
superceed or replace the license texts.

Commit these apart because compile testing doesn't guarantee I didn't made
some nasty mistake. No functional change intended.
2017-11-27 15:28:26 +00:00

911 lines
23 KiB
Bash
Executable File

#!/bin/sh
#-
# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
#
# Copyright (c) 2010 iXsystems, Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
# Functions related to disk operations using gpart
# See if device is a full disk or partition/slice
is_disk()
{
for _dsk in `sysctl -n kern.disks`
do
[ "$_dsk" = "${1}" ] && return 0
[ "/dev/$_dsk" = "${1}" ] && return 0
done
return 1
}
# Get a MBR partitions sysid
get_partition_sysid_mbr()
{
INPART="0"
DISK="$1"
PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
while read i
do
echo "$i" | grep -q "The data for partition" 2>/dev/null
if [ $? -eq 0 ] ; then
INPART="0"
PART="`echo ${i} | cut -d ' ' -f 5`"
if [ "$PART" = "$PARTNUM" ] ; then
INPART="1"
fi
fi
# In the partition section
if [ "$INPART" = "1" ] ; then
echo "$i" | grep -q "^sysid" 2>/dev/null
if [ $? -eq 0 ] ; then
SYSID="`echo ${i} | tr -s '\t' ' ' | cut -d ' ' -f 2`"
break
fi
fi
done < ${TMPDIR}/disk-${DISK}
rm ${TMPDIR}/disk-${DISK}
export VAL="${SYSID}"
};
# Get the partitions MBR label
get_partition_label_mbr()
{
INPART="0"
DISK="$1"
PARTNUM=`echo ${2} | sed "s|${DISK}s||g"`
fdisk ${DISK} >${TMPDIR}/disk-${DISK} 2>/dev/null
while read i
do
echo "$i" | grep -q "The data for partition" 2>/dev/null
if [ $? -eq 0 ] ; then
INPART="0"
PART="`echo ${i} | cut -d ' ' -f 5`"
if [ "$PART" = "$PARTNUM" ] ; then
INPART="1"
fi
fi
# In the partition section
if [ "$INPART" = "1" ] ; then
echo "$i" | grep -q "^sysid" 2>/dev/null
if [ $? -eq 0 ] ; then
LABEL="`echo ${i} | tr -s '\t' ' ' | cut -d ',' -f 2-10`"
break
fi
fi
done < ${TMPDIR}/disk-${DISK}
rm ${TMPDIR}/disk-${DISK}
export VAL="${LABEL}"
};
# Get a GPT partitions label
get_partition_label_gpt()
{
DISK="${1}"
PARTNUM=`echo ${2} | sed "s|${DISK}p||g"`
gpart show ${DISK} >${TMPDIR}/disk-${DISK}
while read i
do
SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
if [ "${SLICE}" = "${PARTNUM}" ] ; then
LABEL="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4`"
break
fi
done <${TMPDIR}/disk-${DISK}
rm ${TMPDIR}/disk-${DISK}
export VAL="${LABEL}"
};
# Get a partitions startblock
get_partition_startblock()
{
DISK="${1}"
PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
gpart show ${DISK} >${TMPDIR}/disk-${DISK}
while read i
do
SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
if [ "$SLICE" = "${PARTNUM}" ] ; then
SB="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 1`"
break
fi
done <${TMPDIR}/disk-${DISK}
rm ${TMPDIR}/disk-${DISK}
export VAL="${SB}"
};
# Get a partitions blocksize
get_partition_blocksize()
{
DISK="${1}"
PARTNUM=`echo ${2} | sed "s|${DISK}p||g" | sed "s|${DISK}s||g"`
gpart show ${DISK} >${TMPDIR}/disk-${DISK}
while read i
do
SLICE="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 3`"
if [ "$SLICE" = "${PARTNUM}" ] ; then
BS="`echo ${i} | grep -v ${DISK} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 2`"
break
fi
done <${TMPDIR}/disk-${DISK}
rm ${TMPDIR}/disk-${DISK}
export VAL="${BS}"
};
# Function which returns the partitions on a target disk
get_disk_partitions()
{
gpart show ${1} >/dev/null 2>/dev/null
if [ $? -ne 0 ] ; then
export VAL=""
return
fi
type=`gpart show ${1} | awk '/^=>/ { printf("%s",$5); }'`
SLICES="`gpart show ${1} | grep -v ${1} | grep -v ' free ' |tr -s '\t' ' ' | cut -d ' ' -f 4 | sed '/^$/d'`"
for i in ${SLICES}
do
case $type in
MBR) name="${1}s${i}" ;;
GPT) name="${1}p${i}";;
*) name="${1}s${i}";;
esac
if [ -z "${RSLICES}" ]
then
RSLICES="${name}"
else
RSLICES="${RSLICES} ${name}"
fi
done
export VAL="${RSLICES}"
};
# Function which returns a target disks cylinders
get_disk_cyl()
{
cyl=`diskinfo -v ${1} | grep "# Cylinders" | tr -s ' ' | cut -f 2`
export VAL="${cyl}"
};
# Function which returns a target disks sectors
get_disk_sectors()
{
sec=`diskinfo -v ${1} | grep "# Sectors" | tr -s ' ' | cut -f 2`
export VAL="${sec}"
};
# Function which returns a target disks heads
get_disk_heads()
{
head=`diskinfo -v ${1} | grep "# Heads" | tr -s ' ' | cut -f 2`
export VAL="${head}"
};
# Function which returns a target disks mediasize in sectors
get_disk_mediasize()
{
mediasize=`diskinfo -v ${1} | grep "# mediasize in sectors" | tr -s ' ' | cut -f 2`
export VAL="${mediasize}"
};
# Function which returns a target disks mediasize in megabytes
get_disk_mediasize_mb()
{
mediasize=`diskinfo -v ${1} | grep "# mediasize in bytes" | tr -s ' ' | cut -f 2`
mediasize=`expr $mediasize / 1024`
mediasize=`expr $mediasize / 1024`
export VAL="${mediasize}"
};
# Function to delete all gparts before starting an install
delete_all_gpart()
{
echo_log "Deleting all gparts"
local DISK="$1"
# Check for any swaps to stop
for i in `swapctl -l | grep "$DISK" | awk '{print $1}'`
do
swapoff ${i} >/dev/null 2>/dev/null
done
# Delete the gparts now
for i in `gpart show ${DISK} 2>/dev/null | tr -s ' ' | cut -d ' ' -f 4`
do
if [ "/dev/${i}" != "${DISK}" -a "${i}" != "-" ] ; then
rc_nohalt "gpart delete -i ${i} ${DISK}"
fi
done
# Destroy the disk geom
rc_nohalt "gpart destroy ${DISK}"
wipe_metadata "${DISK}"
};
# Function to export all zpools before starting an install
stop_all_zfs()
{
if [ ! -c /dev/zfs ]; then
return;
fi
local DISK="`echo ${1} | sed 's|/dev/||g'`"
# Export any zpools using this device so we can overwrite
for i in `zpool list -H -o name`
do
ztst=`zpool status ${i} | grep "ONLINE" | awk '{print $1}' | grep -q ${DISK}`
if [ "$ztst" = "$DISK" ] ; then
zpool export -f ${i}
fi
done
};
# Function which stops all gmirrors before doing any disk manipulation
stop_all_gmirror()
{
if [ ! -d /dev/mirror ]; then
return;
fi
local DISK="`echo ${1} | sed 's|/dev/||g'`"
GPROV="`gmirror list | grep ". Name: mirror/" | cut -d '/' -f 2`"
for gprov in $GPROV
do
gmirror list | grep -q "Name: ${DISK}" 2>/dev/null
if [ $? -eq 0 ]
then
echo_log "Stopping mirror $gprov $DISK"
rc_nohalt "gmirror remove $gprov $DISK"
wipe_metadata "${DISK}"
fi
done
};
# Make sure we don't have any geli providers active on this disk
stop_all_geli()
{
local _geld="`echo ${1} | sed 's|/dev/||g'`"
cd /dev
for i in `ls ${_geld}*`
do
echo $i | grep -q '.eli' 2>/dev/null
if [ $? -eq 0 ]
then
echo_log "Detaching GELI on ${i}"
rc_halt "geli detach ${i}"
fi
done
};
# Function which reads in the disk slice config, and performs it
setup_disk_slice()
{
# Cleanup any slice / mirror dirs
rm -rf ${SLICECFGDIR} >/dev/null 2>/dev/null
mkdir ${SLICECFGDIR}
rm -rf ${MIRRORCFGDIR} >/dev/null 2>/dev/null
mkdir ${MIRRORCFGDIR}
# Start with disk0 and gm0
disknum="0"
gmnum="0"
# We are ready to start setting up the disks, lets read the config and do the actions
while read line
do
echo $line | grep -q "^disk${disknum}=" 2>/dev/null
if [ $? -eq 0 ]
then
# Found a disk= entry, lets get the disk we are working on
get_value_from_string "${line}"
strip_white_space "$VAL"
DISK="$VAL"
echo "${DISK}" | grep -q '^/dev/'
if [ $? -ne 0 ] ; then DISK="/dev/$DISK" ; fi
# Before we go further, lets confirm this disk really exists
if [ ! -e "${DISK}" ] ; then
exit_err "ERROR: The disk ${DISK} does not exist!"
fi
# Make sure we stop any gmirrors on this disk
stop_all_gmirror ${DISK}
# Make sure we stop any geli stuff on this disk
stop_all_geli ${DISK}
# Make sure we don't have any zpools loaded
stop_all_zfs ${DISK}
fi
# Lets look if this device will be mirrored on another disk
echo $line | grep -q "^mirror=" 2>/dev/null
if [ $? -eq 0 ]
then
# Found a disk= entry, lets get the disk we are working on
get_value_from_string "${line}"
strip_white_space "$VAL"
MIRRORDISK="$VAL"
echo "${MIRRORDISK}" | grep -q '^/dev/'
if [ $? -ne 0 ] ; then MIRRORDISK="/dev/$MIRRORDISK" ; fi
# Before we go further, lets confirm this disk really exists
if [ ! -e "${MIRRORDISK}" ]
then
exit_err "ERROR: The mirror disk ${MIRRORDISK} does not exist!"
fi
# Make sure we stop any gmirrors on this mirror disk
stop_all_gmirror ${MIRRORDISK}
# Make sure we stop any geli stuff on this mirror disk
stop_all_geli ${MIRRORDISK}
# Make sure we don't have any zpools mirror loaded
stop_all_zfs ${MIRRORDISK}
fi
# Lets see if we have been given a mirror balance choice
echo $line | grep -q "^mirrorbal=" 2>/dev/null
if [ $? -eq 0 ]
then
# Found a disk= entry, lets get the disk we are working on
get_value_from_string "${line}"
strip_white_space "$VAL"
MIRRORBAL="$VAL"
fi
echo $line | grep -q "^partition=" 2>/dev/null
if [ $? -eq 0 ]
then
# Found a partition= entry, lets read / set it
get_value_from_string "${line}"
strip_white_space "$VAL"
PTYPE=`echo $VAL|tr A-Z a-z`
# We are using free space, figure out the slice number
if [ "${PTYPE}" = "free" ]
then
# Lets figure out what number this slice will be
LASTSLICE="`gpart show ${DISK} \
| grep -v ${DISK} \
| grep -v ' free' \
| tr -s '\t' ' ' \
| cut -d ' ' -f 4 \
| sed '/^$/d' \
| tail -n 1`"
if [ -z "${LASTSLICE}" ]
then
LASTSLICE="1"
else
LASTSLICE=$((LASTSLICE+1))
fi
if [ $LASTSLICE -gt 4 ]
then
exit_err "ERROR: BSD only supports primary partitions, and there are none available on $DISK"
fi
fi
fi
# Check if we have an image file defined
echo $line | grep -q "^image=" 2>/dev/null
if [ $? -eq 0 ] ; then
# Found an image= entry, lets read / set it
get_value_from_string "${line}"
strip_white_space "$VAL"
IMAGE="$VAL"
if [ ! -f "$IMAGE" ] ; then
exit_err "$IMAGE file does not exist"
fi
fi
# Check if we have a partscheme specified
echo $line | grep -q "^partscheme=" 2>/dev/null
if [ $? -eq 0 ] ; then
# Found a partscheme= entry, lets read / set it
get_value_from_string "${line}"
strip_white_space "$VAL"
PSCHEME="$VAL"
if [ "$PSCHEME" != "GPT" -a "$PSCHEME" != "MBR" ] ; then
exit_err "Unknown partition scheme: $PSCHEME"
fi
fi
echo $line | grep -q "^bootManager=" 2>/dev/null
if [ $? -eq 0 ]
then
# Found a bootManager= entry, lets read /set it
get_value_from_string "${line}"
strip_white_space "$VAL"
BMANAGER="$VAL"
fi
echo $line | grep -q "^commitDiskPart" 2>/dev/null
if [ $? -eq 0 ]
then
# Found our flag to commit this disk setup / lets do sanity check and do it
if [ ! -z "${DISK}" -a ! -z "${PTYPE}" ]
then
# Make sure we are only installing ppc to full disk
if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]; then
if [ "$PTYPE" != "all" ] ; then
exit_err "powerpc can only be installed to a full disk"
fi
fi
case ${PTYPE} in
all)
# If we have a gmirror, lets set it up
if [ -n "$MIRRORDISK" ]; then
# Default to round-robin if the user didn't specify
if [ -z "$MIRRORBAL" ]; then MIRRORBAL="round-robin" ; fi
_mFile=`echo $DISK | sed 's|/|%|g'`
echo "$MIRRORDISK:$MIRRORBAL:gm${gmnum}" >${MIRRORCFGDIR}/$_mFile
init_gmirror "$gmnum" "$MIRRORBAL" "$DISK" "$MIRRORDISK"
# Reset DISK to the gmirror device
DISK="/dev/mirror/gm${gmnum}"
gmnum=$((gmknum+1))
fi
if [ "$PSCHEME" = "MBR" -o -z "$PSCHEME" ] ; then
PSCHEME="MBR"
tmpSLICE="${DISK}s1"
else
tmpSLICE="${DISK}p1"
fi
if [ `uname -m` = "powerpc" -o `uname -m` = "powerpc64" ]
then
PSCHEME="APM"
tmpSLICE="${DISK}s1"
fi
run_gpart_full "${DISK}" "${BMANAGER}" "${PSCHEME}"
;;
s1|s2|s3|s4)
tmpSLICE="${DISK}${PTYPE}"
# Get the number of the slice we are working on
s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
run_gpart_slice "${DISK}" "${BMANAGER}" "${s}"
;;
p1|p2|p3|p4|p5|p6|p7|p8|p9|p10|p11|p12|p13|p14|p15|p16|p17|p18|p19|p20)
tmpSLICE="${DISK}${PTYPE}"
# Get the number of the gpt partition we are working on
s="`echo ${PTYPE} | awk '{print substr($0,length,1)}'`"
run_gpart_gpt_part "${DISK}" "${BMANAGER}" "${s}"
;;
free)
tmpSLICE="${DISK}s${LASTSLICE}"
run_gpart_free "${DISK}" "${LASTSLICE}" "${BMANAGER}"
;;
image)
if [ -z "${IMAGE}" ]
then
exit_err "ERROR: partition type image specified with no image!"
fi
;;
*) exit_err "ERROR: Unknown PTYPE: $PTYPE" ;;
esac
if [ -n "${IMAGE}" ]
then
local DEST
if [ -n "${tmpSLICE}" ]
then
DEST="${tmpSLICE}"
else
DEST="${DISK}"
fi
write_image "${IMAGE}" "${DEST}"
check_disk_layout "${DEST}"
fi
# Now save which disk<num> this is, so we can parse it later during slice partition setup
if [ -z "${IMAGE}" ]
then
_sFile=`echo $tmpSLICE | sed 's|/|-|g'`
echo "disk${disknum}" >${SLICECFGDIR}/$_sFile
fi
# Increment our disk counter to look for next disk and unset
unset BMANAGER PTYPE DISK MIRRORDISK MIRRORBAL PSCHEME IMAGE
disknum=$((disknum+1))
else
exit_err "ERROR: commitDiskPart was called without procceding disk<num>= and partition= entries!!!"
fi
fi
done <${CFGF}
};
# Init the gmirror device
init_gmirror()
{
local _mNum=$1
local _mBal=$2
local _mDisk=$3
# Create this mirror device
rc_halt "gmirror label -vb ${_mBal} gm${_mNum} ${_mDisk}"
sleep 3
}
# Stop all gjournals on disk / slice
stop_gjournal()
{
_gdsk="`echo $1 | sed 's|/dev/||g'`"
# Check if we need to shutdown any journals on this drive
ls /dev/${_gdsk}*.journal >/dev/null 2>/dev/null
if [ $? -eq 0 ]
then
cd /dev
for i in `ls ${_gdsk}*.journal`
do
rawjournal="`echo ${i} | cut -d '.' -f 1`"
gjournal stop -f ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
gjournal clear ${rawjournal} >>${LOGOUT} 2>>${LOGOUT}
done
fi
} ;
# Function to wipe the potential metadata from a disk
wipe_metadata()
{
echo_log "Wiping possible metadata on ${1}"
local SIZE="`diskinfo ${1} | awk '{print int($3/(1024*1024)) }'`"
if [ "$SIZE" -gt "5" ] ; then
rc_halt "dd if=/dev/zero of=${1} bs=1m count=1"
rc_nohalt "dd if=/dev/zero of=${1} bs=1m oseek=$((SIZE-4))"
else
rc_nohalt "dd if=/dev/zero of=${1} bs=128k"
fi
} ;
# Function which runs gpart and creates a single large APM partition scheme
init_apm_full_disk()
{
_intDISK=$1
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
# Stop any journaling
stop_gjournal "${_intDISK}"
# Remove any existing partitions
delete_all_gpart "${_intDISK}"
sleep 2
echo_log "Running gpart on ${_intDISK}"
rc_halt "gpart create -s APM ${_intDISK}"
rc_halt "gpart add -s 800k -t freebsd-boot ${_intDISK}"
echo_log "Stamping boot sector on ${_intDISK}"
rc_halt "gpart bootcode -p /boot/boot1.hfs -i 1 ${_intDISK}"
}
# Function which runs gpart and creates a single large GPT partition scheme
init_gpt_full_disk()
{
_intDISK=$1
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
# Stop any journaling
stop_gjournal "${_intDISK}"
# Remove any existing partitions
delete_all_gpart "${_intDISK}"
sleep 2
echo_log "Running gpart on ${_intDISK}"
rc_halt "gpart create -s GPT ${_intDISK}"
rc_halt "gpart add -b 34 -s 128 -t freebsd-boot ${_intDISK}"
echo_log "Stamping boot sector on ${_intDISK}"
rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}"
}
# Function which runs gpart and creates a single large MBR partition scheme
init_mbr_full_disk()
{
_intDISK=$1
_intBOOT=$2
startblock="2016"
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
# Stop any journaling
stop_gjournal "${_intDISK}"
# Remove any existing partitions
delete_all_gpart "${_intDISK}"
sleep 2
echo_log "Running gpart on ${_intDISK}"
rc_halt "gpart create -s mbr -f active ${_intDISK}"
# Install new partition setup
echo_log "Running gpart add on ${_intDISK}"
rc_halt "gpart add -a 4k -t freebsd -i 1 ${_intDISK}"
sleep 2
wipe_metadata "${_intDISK}s1"
# Make the partition active
rc_halt "gpart set -a active -i 1 ${_intDISK}"
if [ "$_intBOOT" = "bsd" ] ; then
echo_log "Stamping boot0 on ${_intDISK}"
rc_halt "gpart bootcode -b /boot/boot0 ${_intDISK}"
else
echo_log "Stamping boot1 on ${_intDISK}"
rc_halt "gpart bootcode -b /boot/boot1 ${_intDISK}"
fi
}
# Function which runs gpart and creates a single large slice
run_gpart_full()
{
DISK=$1
BOOT=$2
SCHEME=$3
if [ "$SCHEME" = "APM" ] ; then
init_apm_full_disk "$DISK"
slice=`echo "${DISK}:1:apm" | sed 's|/|-|g'`
elif [ "$SCHEME" = "MBR" ] ; then
init_mbr_full_disk "$DISK" "$BOOT"
slice=`echo "${DISK}:1:mbr" | sed 's|/|-|g'`
else
init_gpt_full_disk "$DISK"
slice=`echo "${DISK}:1:gpt" | sed 's|/|-|g'`
fi
# Lets save our slice, so we know what to look for in the config file later on
if [ -z "$WORKINGSLICES" ]
then
WORKINGSLICES="${slice}"
export WORKINGSLICES
else
WORKINGSLICES="${WORKINGSLICES} ${slice}"
export WORKINGSLICES
fi
};
# Function which runs gpart on a specified gpt partition
run_gpart_gpt_part()
{
DISK=$1
# Set the slice we will use later
slice="${1}p${3}"
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
# Get the number of the slice we are working on
slicenum="$3"
# Stop any journaling
stop_gjournal "${slice}"
# Make sure we have disabled swap on this drive
if [ -e "${slice}b" ]
then
swapoff ${slice}b >/dev/null 2>/dev/null
swapoff ${slice}b.eli >/dev/null 2>/dev/null
fi
# Modify partition type
echo_log "Running gpart modify on ${DISK}"
rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
sleep 2
wipe_metadata "${slice}"
sleep 4
# Init the MBR partition
rc_halt "gpart create -s BSD ${DISK}p${slicenum}"
# Stamp the bootloader
sleep 4
rc_halt "gpart bootcode -b /boot/boot ${DISK}p${slicenum}"
# Set the slice to the format we'll be using for gpart later
slice=`echo "${1}:${3}:gptslice" | sed 's|/|-|g'`
# Lets save our slice, so we know what to look for in the config file later on
if [ -z "$WORKINGSLICES" ]
then
WORKINGSLICES="${slice}"
export WORKINGSLICES
else
WORKINGSLICES="${WORKINGSLICES} ${slice}"
export WORKINGSLICES
fi
};
# Function which runs gpart on a specified s1-4 slice
run_gpart_slice()
{
DISK=$1
if [ -n "$2" ]
then
BMANAGER="$2"
fi
# Set the slice we will use later
slice="${1}s${3}"
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
# Get the number of the slice we are working on
slicenum="$3"
# Stop any journaling
stop_gjournal "${slice}"
# Make sure we have disabled swap on this drive
if [ -e "${slice}b" ]
then
swapoff ${slice}b >/dev/null 2>/dev/null
swapoff ${slice}b.eli >/dev/null 2>/dev/null
fi
# Modify partition type
echo_log "Running gpart modify on ${DISK}"
rc_halt "gpart modify -t freebsd -i ${slicenum} ${DISK}"
sleep 2
wipe_metadata "${slice}"
sleep 1
if [ "${BMANAGER}" = "bsd" ]
then
echo_log "Stamping boot sector on ${DISK}"
rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
fi
# Set the slice to the format we'll be using for gpart later
slice=`echo "${1}:${3}:mbr" | sed 's|/|-|g'`
# Lets save our slice, so we know what to look for in the config file later on
if [ -z "$WORKINGSLICES" ]
then
WORKINGSLICES="${slice}"
export WORKINGSLICES
else
WORKINGSLICES="${WORKINGSLICES} ${slice}"
export WORKINGSLICES
fi
};
# Function which runs gpart and creates a new slice from free disk space
run_gpart_free()
{
DISK=$1
SLICENUM=$2
if [ -n "$3" ]
then
BMANAGER="$3"
fi
# Set our sysctl so we can overwrite any geom using drives
sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT}
slice="${DISK}s${SLICENUM}"
slicenum="${SLICENUM}"
# Working on the first slice, make sure we have MBR setup
gpart show ${DISK} >/dev/null 2>/dev/null
if [ $? -ne 0 -a "$SLICENUM" = "1" ] ; then
echo_log "Initializing disk, no existing MBR setup"
rc_halt "gpart create -s mbr ${DISK}"
fi
# Install new partition setup
echo_log "Running gpart on ${DISK}"
rc_halt "gpart add -a 4k -t freebsd -i ${slicenum} ${DISK}"
sleep 2
wipe_metadata "${slice}"
sleep 1
if [ "${BMANAGER}" = "bsd" ]
then
echo_log "Stamping boot sector on ${DISK}"
rc_halt "gpart bootcode -b /boot/boot0 ${DISK}"
fi
slice=`echo "${DISK}:${SLICENUM}:mbr" | sed 's|/|-|g'`
# Lets save our slice, so we know what to look for in the config file later on
if [ -z "$WORKINGSLICES" ]
then
WORKINGSLICES="${slice}"
export WORKINGSLICES
else
WORKINGSLICES="${WORKINGSLICES} ${slice}"
export WORKINGSLICES
fi
};