-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
growpart: Add support for overprovisioning (#35)
Add option to 'growpart' to specify percentage of device that should be left unallocated when growing partition. This is intended for consumer SSDs and SD cards where the performance and/or lifetime of these devices can be improved if some disk space (in addition to any the device "hides" from users) is left unallocated. Overprovisioning code caters for several distinct scenarios: (1) MSDOS/MBR partitioned disk where the disk is >2TB and so MBR partitions cannot extend beyond 2TB - if disk is larger than (2TB + overprovisioning requirement) then nothing needs to be done. (2) MSDOS/MBR partitioned disk where the disk is >2TB and so MBR partitions cannot extend beyond 2TB - if disk is not larger than (2TB + overprovisioning requirement) then *some* overprovisioning space still needs to be reserved. (3) MSDOS/MBR partitioned disk <=2TB where overprovisioning space needs to be reserved. (4) GPT partitioned disk where overprovisioning space needs to be reserved. Also added a testcase script, test-growpart-overprovision. Also correct some off-by-one errors in the existing growpart code and correct some existing testcases affected by this.
- Loading branch information
1 parent
5c24f6a
commit c00ff0c
Showing
5 changed files
with
176 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
#!/bin/bash | ||
# | ||
# Just create an image in the filesystem, then grow it. | ||
|
||
set -e | ||
|
||
PT_TYPE="${PT_TYPE:-dos}" # dos or gpt | ||
size=${DISK_SIZE_NEW:-100M} | ||
osize=${DISK_SIZE_ORIG:-50M} | ||
freepercent=${OVER_PROVISION_PERCENT:-10} | ||
|
||
TEMP_D="" | ||
|
||
cleanup() { | ||
[ ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}" | ||
} | ||
rq() { | ||
local out="${TEMP_D}/out" | ||
"$@" > "$out" 2>&1 || { echo "FAILED:" "$@"; cat "$out"; return 1; } | ||
} | ||
|
||
TEMP_D=$(mktemp -d ${TMPDIR:-/tmp}/${0##*/}.XXXXXX) | ||
trap cleanup EXIT | ||
|
||
img="${TEMP_D}/disk.img" | ||
|
||
echo "Partitioning $PT_TYPE orig_size=$osize grow_size=$size, overprovisioning=$freepercent%." | ||
echo "growpart is $(which growpart)" | ||
rm -f $img | ||
|
||
truncate --size $osize "$img" | ||
|
||
label_flag="--label=${PT_TYPE}" | ||
echo "2048," | rq sfdisk $label_flag --force --unit=S "$img" | ||
|
||
truncate --size "$size" "$img" | ||
|
||
echo "==== before ====" | ||
sfdisk --list --unit=S "$img" | ||
|
||
err="${TEMP_D}/gp.err" | ||
out="${TEMP_D}/gp.out" | ||
if ! growpart -v -v --free-percent "$freepercent" "$img" 1 2>"$err" > "$out"; then | ||
cat "$err" "$out" | ||
echo "failed" | ||
exit 1 | ||
fi | ||
echo "==== growpart-stderr ====" | ||
cat "$err" | ||
echo "==== growpart-stdout ====" | ||
cat "$out" | ||
grep -q "^CHANGED:" "$out" || | ||
{ echo "did not find 'CHANGED'"; exit 1; } | ||
|
||
echo "==== after ====" | ||
sfdisk --list --unit=S "$img" | ||
|
||
enddevice=$(sfdisk --list --unit=S "$img" | grep "Disk $img:" | awk '{print $7}') | ||
endpart=$(sfdisk --list --unit=S "$img" | grep "$img" | grep -v "Disk" | awk '{print $3}') | ||
# Subtract the following from disk image end in sectors: | ||
# - required number of overprovisioning sectors to leave unused | ||
# - 33 sectors (MBR padding for GPT conversion) | ||
# - 1 (as sector numbers start from 0) | ||
# to calculate the expected end of resized partition in sectors. | ||
expectedendpart=$((enddevice-(enddevice/100*freepercent)-33-1)) | ||
echo | ||
if [ $endpart = $expectedendpart ]; then | ||
echo "Final partition size matches expected partition size" | ||
echo | ||
else | ||
echo "ERROR: final partition size of $endpart is different than expected size of $expectedendpart" | ||
exit 1 | ||
fi | ||
|
||
# vi: ts=4 noexpandtab |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters