From owner-svn-src-all@FreeBSD.ORG Mon Jan 10 19:11:26 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2342C106564A; Mon, 10 Jan 2011 19:11:26 +0000 (UTC) (envelope-from jpaetzel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1148A8FC08; Mon, 10 Jan 2011 19:11:26 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p0AJBQng090313; Mon, 10 Jan 2011 19:11:26 GMT (envelope-from jpaetzel@svn.freebsd.org) Received: (from jpaetzel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0AJBQKG090310; Mon, 10 Jan 2011 19:11:26 GMT (envelope-from jpaetzel@svn.freebsd.org) Message-Id: <201101101911.p0AJBQKG090310@svn.freebsd.org> From: Josh Paetzel Date: Mon, 10 Jan 2011 19:11:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r217229 - head/usr.sbin/pc-sysinstall/backend X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Jan 2011 19:11:26 -0000 Author: jpaetzel (ports committer) Date: Mon Jan 10 19:11:25 2011 New Revision: 217229 URL: http://svn.freebsd.org/changeset/base/217229 Log: Patch pc-sysinstall to deal with 4k sector size drives PR: bin/151967 Submitted by: kmoore Approved by: imp Modified: head/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh head/usr.sbin/pc-sysinstall/backend/functions-disk.sh Modified: head/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh ============================================================================== --- head/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh Mon Jan 10 18:15:34 2011 (r217228) +++ head/usr.sbin/pc-sysinstall/backend/functions-bsdlabel.sh Mon Jan 10 19:11:25 2011 (r217229) @@ -158,227 +158,29 @@ gen_glabel_name() export VAL }; -# Function to setup / stamp a legacy MBR bsdlabel -setup_mbr_partitions() +# Function to setup partitions using gpart +setup_gpart_partitions() { - DISKTAG="$1" - WRKSLICE="$2" + local _dTag="$1" + local _pDisk="$2" + local _wSlice="$3" + local _sNum="$4" + local _pType="$5" FOUNDPARTS="1" - # Lets setup the BSDLABEL - BSDLABEL="${TMPDIR}/bsdLabel-${WRKSLICE}" - export BSDLABEL - rm $BSDLABEL >/dev/null 2>/dev/null - echo "# /dev/${WRKSLICE}" >>$BSDLABEL - echo "8 partitions:" >>$BSDLABEL - echo "# size offset fstype bsize bps/cpg" >>$BSDLABEL - - PARTLETTER="a" - - # Lets read in the config file now and populate this - while read line - do - # Check for data on this slice - echo $line | grep "^${DISKTAG}-part=" >/dev/null 2>/dev/null - if [ "$?" = "0" ] - then - # Found a slice- entry, lets get the slice info - get_value_from_string "${line}" - STRING="$VAL" - FOUNDPARTS="0" - - # We need to split up the string now, and pick out the variables - FS=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 1` - SIZE=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 2` - MNT=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 3` - - if echo $STRING | grep -E '^/.+' >/dev/null 2>&1 - then - IMAGE=`echo ${STRING} | cut -f1 -d' '` - fi - - # Check if we have a .eli extension on this FS - echo ${FS} | grep ".eli" >/dev/null 2>/dev/null - if [ "$?" = "0" ] - then - FS="`echo ${FS} | cut -d '.' -f 1`" - ENC="ON" - check_for_enc_pass "${line}" - if [ "${VAL}" != "" ] ; then - # We have a user supplied password, save it for later - ENCPASS="${VAL}" - fi - else - ENC="OFF" - fi - - # Check if the user tried to setup / as an encrypted partition - check_for_mount "${MNT}" "/" - if [ "${?}" = "0" -a "${ENC}" = "ON" ] - then - USINGENCROOT="0" ; export USINGENCROOT - fi - - if [ -n "${IMAGE}" ] - then - FS="IMAGE" - SIZE=`ls -l "${IMAGE}" | awk '{ print $5 }'` - MNT=`echo $STRING | tr -s '\t' ' ' | cut -d ' ' -f 2` - SIZE=`convert_byte_to_megabyte $SIZE` - fi - - # Now check that these values are sane - case $FS in - UFS|UFS+S|UFS+J|UFS+SUJ|ZFS|SWAP|IMAGE) ;; - *) exit_err "ERROR: Invalid file system specified on $line" ;; - esac - - # Check that we have a valid size number - expr $SIZE + 1 >/dev/null 2>/dev/null - if [ "$?" != "0" ]; then - exit_err "ERROR: The size specified on $line is invalid" - fi - - # Check that the mount-point starts with / - echo "$MNT" | grep -e "^/" -e "^none" >/dev/null 2>/dev/null - if [ "$?" != "0" ]; then - exit_err "ERROR: The mount-point specified on $line is invalid" - fi - - if [ "$SIZE" = "0" ] - then - SOUT="*" - else - SOUT="${SIZE}M" - fi - - # OK, we passed all tests, now lets put these values into a config - # If the part - if [ "${PARTLETTER}" = "a" ] - then - if [ "$FS" = "SWAP" ] - then - echo "a: ${SOUT} * swap 0 0" >>${BSDLABEL} - else - echo "a: ${SOUT} 0 4.2BSD 0 0" >>${BSDLABEL} - fi - - # Check if we found a valid root partition - check_for_mount "${MNT}" "/" - if [ "$?" = "0" ] ; then - FOUNDROOT="0" ; export FOUNDROOT - fi - - # Check if we have a "/boot" instead - check_for_mount "${MNT}" "/boot" - if [ "${?}" = "0" ] ; then - USINGBOOTPART="0" ; export USINGBOOTPART - if [ "${FS}" != "UFS" -a "${FS}" != "UFS+S" -a "${FS}" != "UFS+J" -a "${FS}" != "UFS+SUJ" ] - then - exit_err "/boot partition must be formatted with UFS" - fi - fi - - else - # Done with the a: partitions - - # Check if we found a valid root partition not on a: - check_for_mount "${MNT}" "/" - if [ "${?}" = "0" ] ; then - FOUNDROOT="1" ; export FOUNDROOT - fi - - # Check if we have a /boot partition, and fail since its not first - check_for_mount "${MNT}" "/boot" - if [ "${?}" = "0" ] ; then - exit_err "/boot partition must be first partition" - fi - - - if [ "$FS" = "SWAP" ] - then - echo "${PARTLETTER}: ${SOUT} * swap" >>${BSDLABEL} - else - echo "${PARTLETTER}: ${SOUT} * 4.2BSD" >>${BSDLABEL} - fi - fi - - # Generate a unique label name for this mount - gen_glabel_name "${MNT}" "${FS}" - PLABEL="${VAL}" - - # Get any extra options for this fs / line - get_fs_line_xvars "${WRKSLICE}${PARTLETTER}" "${STRING}" - XTRAOPTS="${VAR}" - - # Check if using zfs mirror - echo ${XTRAOPTS} | grep "mirror" >/dev/null 2>/dev/null - if [ "$?" = "0" ] ; then - XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${WRKSLICE}${PARTLETTER}") - fi - - # Save this data to our partition config dir - echo "${FS}:${MNT}:${ENC}:${PLABEL}:MBR:${XTRAOPTS}:${IMAGE}" >${PARTDIR}/${WRKSLICE}${PARTLETTER} - - # If we have a enc password, save it as well - if [ ! -z "${ENCPASS}" ] ; then - echo "${ENCPASS}" >${PARTDIR}-enc/${WRKSLICE}${PARTLETTER}-encpass - fi - - # This partition letter is used, get the next one - case ${PARTLETTER} in - a) PARTLETTER="b" ;; - b) # When we hit b, add the special c: setup for bsdlabel - echo "c: * * unused" >>${BSDLABEL} - PARTLETTER="d" ;; - d) PARTLETTER="e" ;; - e) PARTLETTER="f" ;; - f) PARTLETTER="g" ;; - g) PARTLETTER="h" ;; - h) PARTLETTER="ERR" ;; - *) exit_err "ERROR: bsdlabel only supports up to letter h for partitions." ;; - esac - - unset IMAGE - - fi # End of subsection locating a slice in config - - echo $line | grep "^commitDiskLabel" >/dev/null 2>/dev/null - if [ "$?" = "0" -a "${FOUNDPARTS}" = "0" ] - then - # Found our flag to commit this label setup, check that we found at least 1 partition and do it - if [ "${PARTLETTER}" != "a" ] - then - # Check if we only had 1 partition, and make sure we add "c:" section to label - if [ "${PARTLETTER}" = "b" ] - then - echo "c: * * unused" >>${BSDLABEL} - fi - - echo "bsdlabel -R -B /dev/${WRKSLICE} ${BSDLABEL}" - bsdlabel -R -B ${WRKSLICE} ${BSDLABEL} - - break - else - exit_err "ERROR: commitDiskLabel was called without any partition entries for it!" - fi - fi - done <${CFGF} -}; - -# Function to setup partitions using gpt -setup_gpt_partitions() -{ - DISKTAG="$1" - DISK="$2" - FOUNDPARTS="1" + # Lets read in the config file now and setup our partitions + if [ "${_pType}" = "gpt" ] ; then + CURPART="2" + else + PARTLETTER="a" + CURPART="1" + rc_halt "gpart create -s BSD ${_wSlice}" + fi - # Lets read in the config file now and setup our GPT partitions - CURPART="2" while read line do # Check for data on this slice - echo $line | grep "^${DISKTAG}-part=" >/dev/null 2>/dev/null + echo $line | grep "^${_dTag}-part=" >/dev/null 2>/dev/null if [ "$?" = "0" ] then FOUNDPARTS="0" @@ -441,24 +243,28 @@ setup_gpt_partitions() # Check if we found a valid root partition check_for_mount "${MNT}" "/" if [ "${?}" = "0" ] ; then - if [ "${CURPART}" = "2" ] ; then + FOUNDROOT="1" ; export FOUNDROOT + if [ "${CURPART}" = "2" -a "$_pType" = "gpt" ] ; then + FOUNDROOT="0" ; export FOUNDROOT + fi + if [ "${CURPART}" = "1" -a "$_pType" = "mbr" ] ; then FOUNDROOT="0" ; export FOUNDROOT - else - FOUNDROOT="1" ; export FOUNDROOT fi fi check_for_mount "${MNT}" "/boot" if [ "${?}" = "0" ] ; then - if [ "${CURPART}" = "2" ] ; then - USINGBOOTPART="0" ; export USINGBOOTPART - if [ "${FS}" != "UFS" -a "${FS}" != "UFS+S" -a "${FS}" != "UFS+J" -a "${FS}" != "UFS+SUJ" ] - then - exit_err "/boot partition must be formatted with UFS" - fi - else + USINGBOOTPART="0" ; export USINGBOOTPART + if [ "${CURPART}" != "2" -a "${_pType}" = "gpt" ] ; then + exit_err "/boot partition must be first partition" + fi + if [ "${CURPART}" != "1" -a "${_pType}" = "mbr" ] ; then exit_err "/boot partition must be first partition" fi + + if [ "${FS}" != "UFS" -a "${FS}" != "UFS+S" -a "${FS}" != "UFS+J" -a "${FS}" != "UFS+SUJ" ] ; then + exit_err "/boot partition must be formatted with UFS" + fi fi # Generate a unique label name for this mount @@ -466,13 +272,21 @@ setup_gpt_partitions() PLABEL="${VAL}" # Get any extra options for this fs / line - get_fs_line_xvars "${DISK}p${CURPART}" "${STRING}" + if [ "${_pType}" = "gpt" ] ; then + get_fs_line_xvars "${_pDisk}p${CURPART}" "${STRING}" + else + get_fs_line_xvars "${_wSlice}" "${STRING}" + fi XTRAOPTS="${VAR}" # Check if using zfs mirror echo ${XTRAOPTS} | grep "mirror" >/dev/null 2>/dev/null if [ "$?" = "0" ] ; then - XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${DISK}p${CURPART}") + if [ "${_pType}" = "gpt" ] ; then + XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_pDisk}p${CURPART}") + else + XTRAOPTS=$(setup_zfs_mirror_parts "$XTRAOPTS" "${_wSlice}") + fi fi # Figure out the gpart type to use @@ -483,7 +297,16 @@ setup_gpt_partitions() esac # Create the partition - rc_halt "gpart add ${SOUT} -t ${PARTYPE} ${DISK}" + if [ "${_pType}" = "gpt" ] ; then + if [ "$CURPART" = "2" ] ; then + # If this is GPT, make sure first partition is aligned to 4k + rc_halt "gpart add -b 2016 ${SOUT} -t ${PARTYPE} ${_pDisk}" + else + rc_halt "gpart add ${SOUT} -t ${PARTYPE} ${_pDisk}" + fi + else + rc_halt "gpart add ${SOUT} -t ${PARTYPE} -i ${CURPART} ${_wSlice}" + fi # Check if this is a root / boot partition, and stamp the right loader for TESTMNT in `echo ${MNT} | sed 's|,| |g'` @@ -497,19 +320,53 @@ setup_gpt_partitions() done # Save this data to our partition config dir - echo "${FS}:${MNT}:${ENC}:${PLABEL}:GPT:${XTRAOPTS}" >${PARTDIR}/${DISK}p${CURPART} + if [ "${_pType}" = "gpt" ] ; then + echo "${FS}:${MNT}:${ENC}:${PLABEL}:GPT:${XTRAOPTS}" >${PARTDIR}/${_pDisk}p${CURPART} - # Clear out any headers - sleep 2 - dd if=/dev/zero of=${DISK}p${CURPART} count=2048 >/dev/null 2>/dev/null - - # If we have a enc password, save it as well - if [ ! -z "${ENCPASS}" ] ; then - echo "${ENCPASS}" >${PARTDIR}-enc/${DISK}p${CURPART}-encpass + # Clear out any headers + sleep 2 + dd if=/dev/zero of=${_pDisk}p${CURPART} count=2048 >/dev/null 2>/dev/null + + # If we have a enc password, save it as well + if [ ! -z "${ENCPASS}" ] ; then + echo "${ENCPASS}" >${PARTDIR}-enc/${_pDisk}p${CURPART}-encpass + fi + else + # MBR Partition + echo "${FS}:${MNT}:${ENC}:${PLABEL}:MBR:${XTRAOPTS}:${IMAGE}" >${PARTDIR}/${_wSlice}${PARTLETTER} + # Clear out any headers + sleep 2 + dd if=/dev/zero of=${_wSlice}${PARTLETTER} count=2048 >/dev/null 2>/dev/null + + # If we have a enc password, save it as well + if [ ! -z "${ENCPASS}" ] ; then + echo "${ENCPASS}" >${PARTDIR}-enc/${_wSlice}${PARTLETTER}-encpass + fi fi + # Increment our parts counter - CURPART="`expr ${CURPART} + 1`" + if [ "$_pType" = "gpt" ] ; then + CURPART="`expr ${CURPART} + 1`" + # If this is a gpt partition, we can continue and skip the MBR part letter stuff + continue + else + CURPART="`expr ${CURPART} + 1`" + if [ "$CURPART" = "3" ] ; then CURPART="4" ; fi + fi + + + # This partition letter is used, get the next one + case ${PARTLETTER} in + a) PARTLETTER="b" ;; + b) PARTLETTER="d" ;; + d) PARTLETTER="e" ;; + e) PARTLETTER="f" ;; + f) PARTLETTER="g" ;; + g) PARTLETTER="h" ;; + h) PARTLETTER="ERR" ;; + *) exit_err "ERROR: bsdlabel only supports up to letter h for partitions." ;; + esac fi # End of subsection locating a slice in config @@ -518,13 +375,17 @@ setup_gpt_partitions() then # If this is the boot disk, stamp the right gptboot - if [ ! -z "${BOOTTYPE}" ] ; then + if [ ! -z "${BOOTTYPE}" -a "$_pType" = "gpt" ] ; then case ${BOOTTYPE} in - freebsd-ufs) rc_halt "gpart bootcode -p /boot/gptboot -i 1 ${DISK}" ;; - freebsd-zfs) rc_halt "gpart bootcode -p /boot/gptzfsboot -i 1 ${DISK}" ;; + freebsd-ufs) rc_halt "gpart bootcode -p /boot/gptboot -i 1 ${_pDisk}" ;; + freebsd-zfs) rc_halt "gpart bootcode -p /boot/gptzfsboot -i 1 ${_pDisk}" ;; esac fi + # Make sure to stamp the MBR loader + if [ "$_pType" = "mbr" ] ; then + rc_halt "gpart bootcode -b /boot/boot ${_wSlice}" + fi # Found our flag to commit this label setup, check that we found at least 1 partition if [ "${CURPART}" = "2" ] ; then @@ -564,15 +425,9 @@ populate_disk_label() exit_err "ERROR: Missing SLICETAG data. This shouldn't happen - please let the developers know" fi - # Using Traditional MBR for dual-booting - if [ "$type" = "mbr" ] ; then - setup_mbr_partitions "${disktag}" "${wrkslice}" - fi - # Using entire disk mode, use GPT for this - if [ "$type" = "gpt" ] ; then - setup_gpt_partitions "${disktag}" "${disk}" - fi + # Setup the partitions with gpart + setup_gpart_partitions "${disktag}" "${disk}" "${wrkslice}" "${slicenum}" "${type}" }; Modified: head/usr.sbin/pc-sysinstall/backend/functions-disk.sh ============================================================================== --- head/usr.sbin/pc-sysinstall/backend/functions-disk.sh Mon Jan 10 18:15:34 2011 (r217228) +++ head/usr.sbin/pc-sysinstall/backend/functions-disk.sh Mon Jan 10 19:11:25 2011 (r217229) @@ -243,7 +243,7 @@ export_all_zpools() delete_all_gpart() { echo_log "Deleting all gparts" - DISK="$1" + local DISK="$1" # Check for any swaps to stop for i in `gpart show ${DISK} 2>/dev/null | grep 'freebsd-swap' | tr -s ' ' | cut -d ' ' -f 4` @@ -260,6 +260,13 @@ delete_all_gpart() fi done + # Destroy the disk geom + rc_nohalt "gpart destroy ${DISK}" + + # Make sure we clear any hidden gpt tables + clear_backup_gpt_table "${DISK}" + + # Wipe out front of disk rc_nohalt "dd if=/dev/zero of=/dev/${DISK} count=3000" }; @@ -553,6 +560,24 @@ stop_gjournal() fi } ; + +# Function to wipe the potential backup gpt table from a disk +clear_backup_gpt_table() +{ + # Get the disk block size + local dSize="`gpart show $1 | grep $1 | tr -s ' ' | cut -d ' ' -f 3`" + + # Make sure this is a valid number + is_num "${dSize}" >/dev/null 2>/dev/null + if [ "$?" != "0" ] ; then return ; fi + + # Die backup label, DIE + echo_log "Clearing gpt backup table location on disk" + rc_nohalt "dd if=/dev/zero of=${1} bs=512 seek=${dSize}" + +} ; + + # Function which runs gpart and creates a single large GPT partition scheme init_gpt_full_disk() { @@ -567,15 +592,11 @@ init_gpt_full_disk() # Remove any existing partitions delete_all_gpart "${_intDISK}" - #Erase any existing bootloader - echo_log "Cleaning up ${_intDISK}" - rc_halt "dd if=/dev/zero of=/dev/${_intDISK} count=2048" - 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}" + rc_halt "gpart add -b 34 -s 64 -t freebsd-boot ${_intDISK}" echo_log "Stamping boot sector on ${_intDISK}" rc_halt "gpart bootcode -b /boot/pmbr ${_intDISK}" @@ -588,7 +609,7 @@ init_mbr_full_disk() _intDISK=$1 _intBOOT=$2 - startblock="63" + startblock="2016" # Set our sysctl so we can overwrite any geom using drives sysctl kern.geom.debugflags=16 >>${LOGOUT} 2>>${LOGOUT} @@ -599,10 +620,6 @@ init_mbr_full_disk() # Remove any existing partitions delete_all_gpart "${_intDISK}" - #Erase any existing bootloader - echo_log "Cleaning up ${_intDISK}" - rc_halt "dd if=/dev/zero of=/dev/${_intDISK} count=2048" - sleep 2 echo_log "Running gpart on ${_intDISK}"