This is a small script to check GUID partition alignment to the EBS (Erase block size) of Solid State Disks. The EBS is expressed in KB and will be converted into sectors (x 2). Don't give an EBS of 2048! It would match 4096 sectors. AFAIK the EBS should be 512 KB for SLC NAND (Single Level cell) and 1024 KB for MLC NAND (Multi Level cell). But you should check on manufacturers' websites if they provide this info (which seems to be yet another hidden one).
The script uses gdisk to list the partitions installs it if needed. You'll likely run this script on a live CD and install gdisk on the live system.
I branched gdisk from the author's project in my repo to make it easier to install for me (and for you).
Syntax is simple:
which is the same as:Code:checkalign /dev/sda
You can specify any other multiple of 512 as block size.Code:checkalign -e 1024 /dev/sda
Example:
Partitions are aligned on 1024 KB (2048 sector) boundaries:
In this case, the are also aligned on 512 KB (1024 sector) boundaries:Code:# checkalign /dev/sda 1: 321535 - 2048 + 1 = 319488 / 2048 = 156.00 => aligned 2: 4530175 - 321536 + 1 = 4208640 / 2048 = 2055.00 => aligned 3: 88422399 - 4530176 + 1 = 83892224 / 2048 = 40963.00 => aligned 4: 234440703 - 88422400 + 1 = 146018304 / 2048 = 71298.00 => aligned
They might even be aligned on 2048 KB (4096 sector) boundaries:Code:# checkalign -e 512 /dev/sda 1: 321535 - 2048 + 1 = 319488 / 1024 = 312.00 => aligned 2: 4530175 - 321536 + 1 = 4208640 / 1024 = 4110.00 => aligned 3: 88422399 - 4530176 + 1 = 83892224 / 1024 = 81926.00 => aligned 4: 234440703 - 88422400 + 1 = 146018304 / 1024 = 142596.00 => aligned
But probably not on 1536 KB (3072 sector) boundaries:Code:# checkalign -e 2048 /dev/sda 1: 321535 - 2048 + 1 = 319488 / 4096 = 78.00 => aligned 2: 4530175 - 321536 + 1 = 4208640 / 4096 = 1027.50 => aligned 3: 88422399 - 4530176 + 1 = 83892224 / 4096 = 20481.50 => aligned 4: 234440703 - 88422400 + 1 = 146018304 / 4096 = 35649.00 => aligned
Here's the script:Code:# checkalign -e 1536 /dev/sda 1: 321535 - 2048 + 1 = 319488 / 3072 = 104.00 => aligned 2: 4530175 - 321536 + 1 = 4208640 / 3072 = 1370.00 => aligned 3: 88422399 - 4530176 + 1 = 83892224 / 3072 = 27308.67 => not aligned 4: 234440703 - 88422400 + 1 = 146018304 / 3072 = 47532.00 => aligned
And no, I'm not going to write a fdisk/MBR version ... But feel free to write it. It's just one line of code in awk (3 lines with line breaks here).Code:#!/bin/bash #: Title : checkalign #: Date Created : Wed Jan 25 00:41:44 PST 2012 #: Last Edit : Wed Jan 25 15:02:25 PST 2012 #: Author : please_try_again #: Version : 1.0 #: Description : Checks if GUID partitions are aligned to the given EBS of SSD isk (default is 1024) #: Options : EBS in kb (1024 or 512) # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # current version version="1.0" EBS=1024 EBSMIN=512 VER=$(lsb_release -rs 2>/dev/null) VER=${VER:-12.1} # ------------------------------------------------- function gdisk_install { while [ "$yesno" != "y" -a "$yesno" != "n" ] ; do read -p "$(tput setaf 1)gdisk not installed. Do you want to install it? (y|n) $(tput sgr0)$(tput bold)" -N 1 yesno echo [ "$yesno" ] && yesno=$(echo $yesno | tr "YN" "yn") [ "$yesno" == "n" ] && exit [ "$yesno" == "y" ] && break printf "%sPlease answer with n or y.%s\n" "$(tput setaf 1)" "$(tput sgr0)" done sudo zypper ar http://download.opensuse.org/repositories/home:/please_try_again/openSUSE_$VER/ PTA sudo zypper --non-interactive --gpg-auto-import-keys refresh -r PTA sudo zypper --non-interactive in -r PTA gdisk echo } args=`getopt -q -u -o e: -l ebs: -- "$@"` set -- $args for i; do case "$i" in -e|--ebs) shift ; EBS=$1 ; shift ;; -h|--help) syntax ; shift ;; --) shift ; break ;; esac done dev=$1 shift # Possible Errors [ "$dev" ] || exec echo "missing argument" [ "$1" ] && exec echo "too many arguments" [ -b $dev ] || exec echo "invalide block device" [ -e /sbin/udevadm ] && eval $(/sbin/udevadm info --query=property --name=$dev | awk '/DEVTYPE|ID_PART_TABLE_TYPE/ { printf "%s;", $0 }') || exec echo "udevadm not found" [ "x$DEVTYPE" == "xdisk" ] || exec echo "not a disk device" [ "x$ID_PART_TABLE_TYPE" == "xgpt" ] || exec echo "no GPT found on disk device" [ $(($EBS % $EBSMIN)) -gt 0 ] && exec echo "invalid EBS: $EBS" [ -e /usr/sbin/gdisk ] || gdisk_install # Finally run gdisk sudo /usr/sbin/gdisk -l $dev | sed '1,/^Number/d' | awk '\ BEGIN { EBS = "'"$EBS"'" ; EBS *= 2 } ;\ /primary/ { S = $3 - $2 + 1 ; D = S / EBS ; M = S % D ; if ( M > 0 ) A="not aligned" ; else A="aligned" ;\ printf "%s: %12i - %10d + 1 = %12d / %d = %12.2f => %s\n", $1, $3, $2, S, EBS, D, A }'


Reply With Quote
Bookmarks