Linux SSD partition alignment tips

Yes, this is another post on the internet about properly aligning your SSD partitions on Linux. It’s mostly my notes that I have gathered from other posts around the net. Please read the whole post before starting to create partitions on your SSD.

Intro
I bought myself a brand new SSD for Xmas, OCZ Agilty 3 120Gb. But I also bought a CDROM caddy so that I could replace my useless macbook CDROM drive, last time I used it was probably 2009 or 2010. So my plan was to put the old, original macbook SATA hard disk inside the caddy and use the SSD as the primary one. Sounds easy right ? Well you just need patience, lots of patience in order to remove all necessary screws in order to get the CDROM drive out and replace it with the caddy. Instructions for this procedure can be found at iFixIt.com.

Create Partitions on the SSD disk
Before one begins some definitions!

Heads = Tracks per cylinder
Sectors = Sectors per track

The goal here is to have the partitions aligned to the SSD’s Erase Block Size.
Googling around the net I found out that OCZ always uses 512Kb as Erase Block Size. If one uses fdisk with 32 Heads and 32 Sectors that makes a cylinder size of 1024b = 1Kb. Multiplying with 512 (sector size), which is fdisk’s default unit size, that makes it 512kb (=32*32*512)! Exactly the Erase Block Size that’s needed. So one needs to start fdisk issuing the following command:
# fdisk -H32 -S32 /dev/sdb
where /dev/sdb is the SSD.

It is very important to remember to start the first partition from the 2nd unit (or 512kb if you prefer). Due to MS-DOS compatibility if the first partition were to start at the first cylinder, it would skip one track. So it would actually start at 32(sectors)*512(sector size)=16Kb, messing up the alignment.

Then create necessary partitions as needed.

LVM alignment
So, the partitions on the SSD are aligned, but what if one wants to use LVM ? Then LVM’s overhead has to be taken into account as well.
To create an aligned PV based on the partitions that have already been created one needs to use the “–dataalignment” option found in newer versions of LVM utilities.
# pvcreate --dataalignment 512k /dev/sdb3
To check the alignment use the following command:

# pvs /dev/sdb3 -o+pe_start
  PV         VG   Fmt  Attr PSize   PFree  1st PE 
  /dev/sdb3  ssd  lvm2 a-   111.46g 81.46g 512.00k

Check that “1st PE” is what is actually needed for the alignment.

Proceed creating VGs and LVs as needed.

Formatting Partitions with ext4
There’s no reason to use ext3 on SSD, one needs to take advantage of ext4 SSD features. I prefer 4K as block size.
For a further explanation of the following formulas read Linux RAID Wiki – RAID setup
stride = chunk (Sector size) / block size = 512Kb / 4K = 128
stripe-width is usually calculated by a formula that uses multiple disks. Since there’s only one disk in this scenario, stripe-width is equal to stride.
stripe-width = 128

# mkfs.ext4 -O extent -b 4096 -E stride=128,stripe-width=128 /dev/mapper/ssd-debian

Mounting the partition
To enable SSD TRIM support, which protects the disk from wearing off, one needs to enable the discard option while mounting the partition. Edit /etc/fstab and add the discard mount option (and noatime if you want to).
/dev/mapper/ssd-deb / ext4 discard,noatime,errors=remount-ro 0 1

Note 1: As of 2.6.37 Linux Kernel supports TRIM on device mapper. Previous kernel versions will report errors upon trying to mount an LVM partition with discard mount option. If you have an older kernel either don’t use LVM on your SSD yet or upgrade your kernel!
Note 2: Read the links posted below for a complete blog post over TRIM command. Apparently it’s not always the best choice

That’s basically it…

Extra – copying the old root partition to the new disk

# mkdir /mnt/ssd/
# mount /dev/mapper/ssd-debian /mnt/ssd/
# rsync -aPEHv --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/var/cache/apt/archives/ / /mnt/ssd/
# mkdir /mnt/ssd/dev
# mkdir /mnt/ssd/proc
# mkdir /mnt/ssd/sys
# mkdir /mnt/ssd/mnt
# cp -avp /dev/console /mnt/ssd/dev/
# cp -avp /dev/urandom /mnt/ssd/dev/
# cp -avp /dev/zero /mnt/ssd/dev/
# cp -avp /dev/random /mnt/ssd/dev/
# Edit /mnt/ssd/etc/fstab to change the device names
# Update grub

Using the above commands one avoids copying unneeded directories like /dev, /sys, etc that will be recreated later. Don’t forget to at least copy the above 4 devices in the new /mnt/ssd/dev dir, else the partition won’t be bootable.

References
1. Aligning Filesystems to an SSD’s Erase Block Size (link goes to archive.org since original article has unfortunately disappeared from the web)
2. [linux-lvm] Re: Aligning PVs on SSDs?
3. Aligning an SSD on Linux (excellent article!)
4. ArchWiki – Solid State Drives
5. SSD performance tips for RHEL6 and Fedora
6. Re: [dm-devel] trim support (discard)
7. How to check TRIM is working on your SSD running Linux
8. Impact of ext4′s discard option on my SSD (very useful insight on TRIM command, read the comments as well)

Thanks
Thanks fly to @apoikos for helping me with the CDROM replacement and @faidonl for his original SSD alignment tips :)

13 Responses to “Linux SSD partition alignment tips”

  1. Max Blank
    January 12th, 2012 | 17:43
    Using Google Chrome Google Chrome 16.0.912.75 on Linux Linux

    You could just bind mount Your / and copy everything:

    mkdir /bindroot
    mount –bind / /bindroot
    rsync [...] /bindroot /mnt/ssd

    This way You don’t need to mess up with /dev, /proc and /sys

  2. Gregory
    January 12th, 2012 | 19:29
    Using Debian IceWeasel Debian IceWeasel 8.0 on Linux Linux

    U haz made a typo. Filesystem should be ext4, not ext3 in /etc/fstab.

  3. January 12th, 2012 | 21:22
    Using Google Chrome Google Chrome 16.0.912.75 on Linux Linux

    typo fixed. thnx

  4. Thomas
    January 13th, 2012 | 01:23
    Using Google Chrome Google Chrome 18.0.1003.1 on Linux Linux

    In our data center I often leave the device clean of any partition table and format the raw device. That way you can completely ignore the who alignment stuff.

  5. January 14th, 2012 | 04:33
    Using WordPress WordPress 3.3.1

    [...] Linux SSD partition alignment tips Yes, this is another post on the internet about properly aligning your SSD partitions on Linux. It’s mostly my notes that I have gathered from other posts around the net. Please read the whole post before starting to create partitions on your SSD. [...]

  6. January 15th, 2012 | 09:21
    Using Mozilla Firefox Mozilla Firefox 10.0 on Windows Windows 7

    Thanks for that summary. May I suggest an article I wrote a while back: Impact of ext4′s discard option on my SSD – https://patrick-nagel.net/blog/archives/337

    In short: the discard option may not be the best choice.

  7. January 15th, 2012 | 18:09
    Using Google Chrome Google Chrome 16.0.912.75 on Linux Linux

    Thanks for the helpful comment. I added a link to your blog post regarding the usage of TRIM.

  8. January 17th, 2012 | 02:40
    Using WordPress WordPress 3.3.1

    [...] Linux SSD partition alignment tips [...]

  9. Artur Linhart
    May 31st, 2012 | 11:48
    Using Opera Opera 9.80 on Windows Windows XP

    You write:
    “It is very important to remember to start the first partition from the 2nd unit (or 512th cylinder if you prefer). Due to MS-DOS compatibility if the first partition were to start at the first cylinder, it would skip one track. So it would actually start at 32(sectors)*512(sector size)=16Kb, messing up the alignment.”

    I think the part of the sentence “from the 2nd unit (or 512th cylinder if you prefer)” is misleading or not correct – if I use fdisk in similar situation, I get following information about the partition table (using cylinders as display unit):
    #fdisk -H32 -S32 /dev/sdc
    Command (m for help): p

    Disk /dev/sdc: 240.1 GB, 240057409536 bytes
    32 heads, 32 sectors/track, 457873 cylinders
    Units = cylinders of 1024 * 512 = 524288 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xcc00037a

    Device Boot Start End Blocks Id System

    – so the size of the cylinder is already 512kb, so 2nd unit means also 2nd cylinder, not 512th cylinder. Or am I wrong, did not understand it correctly what you have written? Correctly could/should from my point of view be:
    “from the 2nd unit (or 512kb if you prefer)”

  10. June 1st, 2012 | 07:26
    Using Google Chrome Google Chrome 19.0.1084.52 on Linux Linux

    @Artur Thanks for noticing! You were right about it, it’s been fixed now in the blog post.

  11. lvm2_headache
    October 23rd, 2012 | 07:12
    Using Google Chrome Google Chrome 22.0.1229.94 on Linux Linux

    Thanks for the great guide. I’m a little stuck on updating grub. When I have both the old (running) and new (ssd) logical volume filesystems mounted and run grub2-instal /dev/sda, I don’t get entries for the new root (/) in GRUB. What am I doing wrong?

  12. November 26th, 2012 | 07:30
    Using Netscape Navigator Netscape Navigator 4.0

    [...] if I can avoid…) In particular I read: https://wiki.archlinux.org/index.php…SD_Performance , Linux SSD partition alignment tips | Into.the.Void. and SSDoptimization – Debian Wiki I am using kernel 2.6.32-5-amd64 fdisk on the ssd gives the [...]

  13. May 27th, 2013 | 12:35
    Using Netscape Navigator Netscape Navigator 4.0

    [...] you sure about that? I don't have a SSD but according to some pages on the net like this one it seems that one should only take care of proper partition alignment and that can be done using [...]

Leave a reply