Aligning MBR for ZFS boot help

Cody Ritts cr at caltel.com
Sun Mar 10 19:06:26 UTC 2013


So, aligning to 63MB was still tricky.  I found your thread, but I could 
not find step by step how to calculate the offset.

So to put a close to this thread (hopefully), here is how I calculated 
my MBR alignment.

The MBR seems to force partitions to start on a track

There are 63 sectors/track

Rule of thumb for SSD Erase Blocks is align to 1MB (2048s)

I can start a partition on every 63rd sector:
63,126,189,252... etc

63 and 2048 have no common multiples, so
63x2048 = 129024

> root@:/root # gpart add -b 129024 -t freebsd ada0
> ada0s1 added
> root@:/root # gpart show ada0
> =>       63  125045361  ada0  MBR  (59G)
>          63     128961        - free -  (63M)
>      129024  124916400     1  freebsd  (59G)

YAY, my partition now starts at track 2048.


1MB for SSDs is a rule of thumb and most erase blocks are 128 256 or 
512. (so I have read on the internet).

Odds are, my SSD has an erase block of 512K or less, so, I can choose a 
smaller offset:

512K = 1024 sectors
1024*63 = 64512
> root@:/root # gpart add -b 64512 -t freebsd ada0
> ada0s1 added
> root@:/root # gpart show ada0
> =>       63  125045361  ada0  MBR  (59G)
>          63      64449        - free -  (31M)
>       64512  124980912     1  freebsd  (59G)


Anyway, that is good enough for me.
In the end, here are my working commands to create an aligned MBR 
partition ready for zpool creation and boot.
> gpart create -s mbr ada0
> gpart add -b 64512 -t freebsd ada0
> gpart create -s bsd ada0s1
> gpart add -s 52833M -t freebsd-zfs  ada0s1
> gpart add -t freebsd-swap ada0s1
> gpart set -a active -i 1 ada0
> gpart bootcode -b /boot/mbr ada0
> dd if=/boot/zfsboot of=/dev/ada0s1 count=1
> dd if=/boot/zfsboot of=/dev/ada0s1a skip=1 seek=1024

Also as related bonus, if you are reading about alignment, here is how 
to get 4k blocks for your zpool on an SSD or AF/4K hard drive.
> glabel label zfs  /dev/ada0s1a
> gnop create -S 4096 /dev/label/zfs
> zpool create -R /mnt tank /dev/label/zfs.nop
> zpool export tank
> gnop destroy /dev/label/zfs.nop
> zpool import -R /mnt -o cachefile=/tmp/zpool.cache system
> zdb -U /tmp/zpool.cache | grep ashift
>    ashift: 12
   2^12 = 4096


Thanks,

Cody



On 3/10/13 9:22 AM, Warren Block wrote:
> On Sat, 9 Mar 2013, Cody Ritts wrote:
>
>> Poking around on the internet, it looks like gpart is possibly
>> enforcing geometry boundaries?
>
> Not gpart, but the kernel.  At present, I don't know of any way to use
> FreeBSD for creating MBR slices aligned to anything other than 63
> blocks.  FreeBSD partitions can be aligned inside a slice with an
> offset.  Putting ZFS on one of those partitions may be the easiest way
> to do this.  Put the slice at block 2016, then align the first FreeBSD
> partition inside that slice to 1M and it should land at block 2048.
>
> Another option is to create the MBR with aligned slices using another
> operating system, one that allows deviation from the MBR standard.
> Ronald Guilmette recently showed an interesting approach of starting the
> slice at 63M, the least common multiple of 63 and 1M.
>
> If the BIOS does not like GPT, check for BIOS updates.  And make sure
> the vendor knows about the problem.
>


More information about the freebsd-fs mailing list