Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Jan 2011 19:11:26 +0000 (UTC)
From:      Josh Paetzel <jpaetzel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r217229 - head/usr.sbin/pc-sysinstall/backend
Message-ID:  <201101101911.p0AJBQKG090310@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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}"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101101911.p0AJBQKG090310>