[parted-devel] [rfc] SSD partition alignment

Jim Meyering jim at meyering.net
Sun Feb 22 11:39:46 UTC 2009

Colin Watson wrote:
> On Sun, Feb 22, 2009 at 01:40:16AM +0100, Jim Meyering wrote:
>> Daniel J Blueman wrote:
>> > I've checked into this, and since libparted sees the SATA block device
>> > as SCSI, it doesn't perform the expected ATA 'identify' command to
>> > fill out the 512 bytes of device info, of which (short) word 217 is
>> > device RPM, defined to be 1 on newer compliant SSDs. The kernel uses
>> > this word to detect if a device is an SSD or not, so I suggest we use
>> > the same.
>> >
>> > Anyone think of objections to calling the ATA identify ioctl to fill
>> > out the structure, then storing this flat for later use in constraint
>> > checking? If the SCSI device supports it also, fine, else nothing
>> > lost.
>> >
>> > For now, a 1MB starting offset for an SSD seems safest, and is what MS
>> > Windows 7 and Server 2008 use, thus a number of vendors will also be
>> > testing/optimising with this case too.
>> Does this really need to be SSD-specific?
>> I hear that this (alignment) is high priority also for many
>> of the big new disks, since they have 4k-byte sectors.
>> Without better alignment, their performance will suffer, too.
> Well, one step at a time. We can detect SSD; can we detect those big new
> disks (or, in general, the desired sector size)?

Alignment-related changes that are useful for SSDs will also benefit
other hardware, so we'd be remiss not to consider that up-front.

I think we agree:
Writing a "device-is-an-SSD" function that queries the kernel, and
then having some caller use that to look up reasonable-for-SSD
alignment parameters would be useful.  Just make it general
enough to also work with e.g., a "device-has-4kb-sector" function.

However, I'm beginning to wonder if that'd be more appropriate
at a higher level than parted, like in gparted.  More below.

> Or are you saying that we should increase the alignment to 4KB in
> general?

Changing the default for both interactive and -s might be easiest,
but IMHO, that is not an option.

> It seems that SSDs actually really want 128KB, which starts to
> feel like a bit much to apply to all disks:
>   http://thunk.org/tytso/blog/2009/02/20/aligning-filesystems-to-an-ssds-erase-block-size/

Yes, I read that, too.
And so have others, which prompted some IRC discussion Friday morning.

But let's back up a step.
Do we really need to change anything?
Or are you proposing (like I think Eric was) a way to
make this merely more convenient?

I can already create partitions aligned to 128KiB boundaries.
This creates a first partition of just less than 1GiB,
and the second taking up the remainder of the space
and also using a size that's a multiple of 128KiB:

    dev=file; : > $file
    k=1024 m=$(($k*$k)) g=$(($k*$k*$k))
    dd if=/dev/null of=$dev bs=1 seek=32GiB
    parted -s $dev mklabel gpt
    parted -s $dev u B mkpart primary $((128*$k)) $(($g-1))
    parted -s $dev u B mkpart primary $g $((32*$g - $m - 1))
    parted -s $dev u B p

    Model:  (file)
    Disk /t/file: 34359738368B
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt

    Number  Start        End           Size          File system  Name     Flags
     1      131072B      1073741823B   1073610752B                primary
     2      1073741824B  34358689791B  33284947968B               primary

Now, I think that this functionality
(snap-to-user-specified-or-system-derived-alignment) belongs in gparted,
and not in parted.

More information about the parted-devel mailing list