mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-29 16:44:03 +00:00
Fix some issues creating zpool mirror / raidz1(2)(3) devices.
Fix issues stamping boot on other ZFS drives, now you can boot after removing mirror drive. Submitted by: kmoore Obtained from: PC-BSD MFC after: 3 days Sponsored by: iXsystems
This commit is contained in:
parent
b8be27bf29
commit
7053a07e66
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=234990
@ -50,41 +50,39 @@ get_fs_line_xvars()
|
||||
ACTIVEDEV="${1}"
|
||||
LINE="${2}"
|
||||
|
||||
echo $LINE | cut -d ' ' -f 4 | grep -q ' (' 2>/dev/null
|
||||
echo $LINE | cut -d ' ' -f 4 | grep -q '(' 2>/dev/null
|
||||
if [ $? -ne 0 ] ; then return ; fi
|
||||
|
||||
# See if we are looking for ZFS specific options
|
||||
echo $LINE | grep -q '^ZFS' 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
ZTYPE="NONE"
|
||||
ZFSVARS="`echo $LINE | cut -d ' ' -f 4-20 |cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`"
|
||||
|
||||
# See if we are looking for ZFS specific options
|
||||
echo $LINE | grep -q '^ZFS' 2>/dev/null
|
||||
echo $ZFSVARS | grep -qE "^(disk|file|mirror|raidz(1|2|3)?|spare|log|cache):" 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
ZTYPE="NONE"
|
||||
ZFSVARS="`echo $LINE | cut -d ' ' -f 4 |cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`"
|
||||
|
||||
echo $ZFSVARS | grep -qE "^(disk|file|mirror|raidz(1|2|3)?|spare|log|cache):" 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
ZTYPE=`echo $ZFSVARS | cut -f1 -d:`
|
||||
ZFSVARS=`echo $ZFSVARS | sed "s|$ZTYPE: ||g" | sed "s|$ZTYPE:||g"`
|
||||
fi
|
||||
|
||||
# Return the ZFS options
|
||||
if [ "${ZTYPE}" = "NONE" ] ; then
|
||||
VAR="${ACTIVEDEV} ${ZFSVARS}"
|
||||
else
|
||||
VAR="${ZTYPE} ${ACTIVEDEV} ${ZFSVARS}"
|
||||
fi
|
||||
export VAR
|
||||
return
|
||||
fi # End of ZFS block
|
||||
|
||||
# See if we are looking for UFS specific newfs options
|
||||
echo $LINE | grep -q '^UFS' 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
FSVARS="`echo $LINE | cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`"
|
||||
VAR="${FSVARS}"
|
||||
export VAR
|
||||
return
|
||||
fi
|
||||
|
||||
fi # End of xtra-options block
|
||||
# Return the ZFS options
|
||||
if [ "${ZTYPE}" = "NONE" ] ; then
|
||||
VAR="${ACTIVEDEV} ${ZFSVARS}"
|
||||
else
|
||||
VAR="${ZTYPE} ${ACTIVEDEV} ${ZFSVARS}"
|
||||
fi
|
||||
export VAR
|
||||
return
|
||||
fi # End of ZFS block
|
||||
|
||||
# See if we are looking for UFS specific newfs options
|
||||
echo $LINE | grep -q '^UFS' 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
FSVARS="`echo $LINE | cut -d '(' -f 2- | cut -d ')' -f 1 | xargs`"
|
||||
VAR="${FSVARS}"
|
||||
export VAR
|
||||
return
|
||||
fi
|
||||
|
||||
# If we got here, set VAR to empty and export
|
||||
export VAR=""
|
||||
@ -96,8 +94,10 @@ setup_zfs_mirror_parts()
|
||||
{
|
||||
_nZFS=""
|
||||
|
||||
ZTYPE="`echo ${1} | awk '{print $1}'`"
|
||||
|
||||
# Using mirroring, setup boot partitions on each disk
|
||||
_mirrline="`echo ${1} | sed 's|mirror ||g'`"
|
||||
_mirrline="`echo ${1} | sed 's|mirror ||g' | sed 's|raidz1 ||g' | sed 's|raidz2 ||g' | sed 's|raidz3 ||g' | sed 's|raidz ||g'`"
|
||||
for _zvars in $_mirrline
|
||||
do
|
||||
echo "Looping through _zvars: $_zvars" >>${LOGOUT}
|
||||
@ -107,15 +107,16 @@ setup_zfs_mirror_parts()
|
||||
|
||||
is_disk "$_zvars" >/dev/null 2>/dev/null
|
||||
if [ $? -eq 0 ] ; then
|
||||
echo "Setting up ZFS mirror disk $_zvars" >>${LOGOUT}
|
||||
echo "Setting up ZFS disk $_zvars" >>${LOGOUT}
|
||||
init_gpt_full_disk "$_zvars" >/dev/null 2>/dev/null
|
||||
rc_halt "gpart add -t freebsd-zfs ${_zvars}" >/dev/null 2>/dev/null
|
||||
rc_halt "gpart add -a 4k -t freebsd-zfs ${_zvars}" >/dev/null 2>/dev/null
|
||||
rc_halt "gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${_zvars}" >/dev/null 2>/dev/null
|
||||
_nZFS="$_nZFS ${_zvars}p2"
|
||||
else
|
||||
_nZFS="$_nZFS ${_zvars}"
|
||||
fi
|
||||
done
|
||||
echo "mirror $2 `echo $_nZFS | tr -s ' '`"
|
||||
echo "$ZTYPE $2 `echo $_nZFS | tr -s ' '`"
|
||||
} ;
|
||||
|
||||
# Function which creates a unique label name for the specified mount
|
||||
@ -290,15 +291,15 @@ setup_gpart_partitions()
|
||||
else
|
||||
get_fs_line_xvars "${_wSlice}${PARTLETTER}" "${STRING}"
|
||||
fi
|
||||
XTRAOPTS="${VAR}"
|
||||
XTRAOPTS="$VAR"
|
||||
|
||||
# Check if using zfs mirror
|
||||
echo ${XTRAOPTS} | grep -q "mirror" 2>/dev/null
|
||||
echo ${XTRAOPTS} | grep -q -e "mirror" -e "raidz"
|
||||
if [ $? -eq 0 -a "$FS" = "ZFS" ] ; then
|
||||
if [ "${_pType}" = "gpt" -o "${_pType}" = "gptslice" ] ; then
|
||||
XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_pDisk}p${CURPART}")
|
||||
else
|
||||
XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_wSlice}")
|
||||
XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_wSlice}${PARTLETTER}")
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -44,6 +44,23 @@ setup_zfs_filesystem()
|
||||
sleep 5
|
||||
sync
|
||||
|
||||
# Check if we have multiple zfs mounts specified
|
||||
for i in `echo ${PARTMNT} | sed 's|,| |g'`
|
||||
do
|
||||
# Check if we ended up with needing a zfs bootable partition
|
||||
if [ "${i}" = "/" -o "${i}" = "/boot" ]
|
||||
then
|
||||
if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi
|
||||
if [ "${PARTGEOM}" = "MBR" ] ; then
|
||||
# Lets stamp the proper ZFS boot loader
|
||||
echo_log "Setting up ZFS boot loader support"
|
||||
rc_halt "dd if=/boot/zfsboot of=${ROOTSLICE} count=1"
|
||||
rc_halt "dd if=/boot/zfsboot of=${PART}${EXT} skip=1 seek=1024"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Check if we have some custom zpool arguments and use them if so
|
||||
if [ ! -z "${ZPOOLOPTS}" ] ; then
|
||||
rc_halt "zpool create -m none -f ${ZPOOLNAME} ${ZPOOLOPTS}"
|
||||
@ -55,23 +72,13 @@ setup_zfs_filesystem()
|
||||
# Disable atime for this zfs partition, speed increase
|
||||
rc_nohalt "zfs set atime=off ${ZPOOLNAME}"
|
||||
|
||||
# Check if we have multiple zfs mounts specified
|
||||
# Check if we need to set a bootable zpool
|
||||
for i in `echo ${PARTMNT} | sed 's|,| |g'`
|
||||
do
|
||||
# Check if we ended up with needing a zfs bootable partition
|
||||
if [ "${i}" = "/" -o "${i}" = "/boot" ]
|
||||
then
|
||||
if [ "${i}" = "/" -o "${i}" = "/boot" ] ; then
|
||||
if [ "$HAVEBOOT" = "YES" ] ; then continue ; fi
|
||||
if [ "${PARTGEOM}" = "MBR" ]
|
||||
then
|
||||
# Lets stamp the proper ZFS boot loader
|
||||
echo_log "Setting up ZFS boot loader support"
|
||||
rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}"
|
||||
rc_halt "zpool export ${ZPOOLNAME}"
|
||||
rc_halt "dd if=/boot/zfsboot of=${ROOTSLICE} count=1"
|
||||
rc_halt "dd if=/boot/zfsboot of=${PART}${EXT} skip=1 seek=1024"
|
||||
rc_halt "zpool import ${ZPOOLNAME}"
|
||||
fi
|
||||
echo_log "Stamping zpool as bootfs"
|
||||
rc_halt "zpool set bootfs=${ZPOOLNAME} ${ZPOOLNAME}"
|
||||
fi
|
||||
done
|
||||
|
||||
@ -90,11 +97,6 @@ setup_filesystems()
|
||||
for PART in `ls ${PARTDIR}`
|
||||
do
|
||||
PARTDEV="`echo $PART | sed 's|-|/|g'`"
|
||||
if [ ! -e "${PARTDEV}" ]
|
||||
then
|
||||
exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?"
|
||||
fi
|
||||
|
||||
PARTFS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 1`"
|
||||
PARTMNT="`cat ${PARTDIR}/${PART} | cut -d '#' -f 2`"
|
||||
PARTENC="`cat ${PARTDIR}/${PART} | cut -d '#' -f 3`"
|
||||
@ -103,6 +105,10 @@ setup_filesystems()
|
||||
PARTXTRAOPTS="`cat ${PARTDIR}/${PART} | cut -d '#' -f 6`"
|
||||
PARTIMAGE="`cat ${PARTDIR}/${PART} | cut -d '#' -f 7`"
|
||||
|
||||
if [ ! -e "${PARTDEV}" ] ; then
|
||||
exit_err "ERROR: The partition ${PARTDEV} does not exist. Failure in bsdlabel?"
|
||||
fi
|
||||
|
||||
# Make sure journaling isn't enabled on this device
|
||||
if [ -e "${PARTDEV}.journal" ]
|
||||
then
|
||||
|
Loading…
Reference in New Issue
Block a user