Aligning MBR for ZFS boot help

Bruce Evans brde at optusnet.com.au
Mon Mar 18 12:03:05 UTC 2013


On Thu, 14 Mar 2013, Peter Maloney wrote:

> On 2013-03-14 12:47, Peter Maloney wrote:
>> On 2013-03-14 10:41, Bruce Evans wrote:
>>> On Wed, 13 Mar 2013, Cody Ritts wrote:
>>>
>>>> So, by setting those CHS values I am:
>>>>  making the partition table more compatible with other operating
>>>> systems and BIOSes?
>>>>  and giving some utilities the CHS stuff they need to function right?
>>> It's not completely clear that S=32 H=64 is portable, but it is what most
>>> old SCSI BIOSes used.
>>>
>>> Also, if the disk already has some partitions with a certain geometry,
>>> use
>>> the same geometry for other partitions and don't use fdisk's defaults if
>>> they differ.
>>>
>>> Bruce
>> Oh man... I thought yeah that -a 1 or -a 2048 should work, but it
>> doesn't. And then I thought I'd be extra crafty and use dd to directly
>> write the partition table myself and send that as a solution to you
>> guys, but even that fails!
>>
>> Here's writing a 63 alignment mbr to the disk, just to prove dd can do this:
>>
>> # gdd if=mbr.img of=/dev/md10 bs=512 count=1
>> 1+0 records in
>> 1+0 records out
>> 512 bytes (512 B) copied, 16.8709 s, 0.0 kB/s
>>
>> # gpart show md10
>> =>     63  4194241  md10  MBR  (2.0G)
>>        63    40950     1  freebsd  (20M)
>>     41013  4153291        - free -  (2G)
>>
>> Here's changing the start sector on the first partition to 2048 ;)
>> Writing to the device works with bs=512, but not bs=1, so we use a file
>> and bs=1 to do our edits, and then bs=512 to the disk.

I use files too often to edit disks, because the binary editor that I
use is old and assumes that block devices aren't broken, so it doesn't
do its own blocking and thus always fails for disks, since it always
writes 1 byte at a time.  Of course, it is safer to edit a copy, but
then it is too easy to make an error with the input or output offsets
when dd'ing the files back to the disk.

>> # gdd if=<(echo -ne "\x00\x08" ) of=mbr.img bs=1 seek=454
>> 2+0 records in
>> 2+0 records out
>> 2 bytes (2 B) copied, 0.000112023 s, 17.9 kB/s
>>
>> Here's writing the new 2048 aligned mbr to the disk:
>>
>> # gdd if=mbr.img of=/dev/md10 bs=1 count=1
>> gdd: writing `/dev/md10': *Invalid argument*
>> 1+0 records in
>> 0+0 records out
>> 0 bytes (0 B) copied, 21.0247 s, 0.0 kB/s
>>
>> :O
>> _________________________________________
>
> Oh, and I almost forgot the most important part... the solution!
>
> The solution is to align to 129024 sectors instead, which fits the needs
> of modern 512/1024/2048 alignment, and also the crazy old thing.

Except it is beyond the end of the disk for a crazy old fdisk :-).

> # gpart add -t freebsd -a 129024 -s 1M md10
> md10s1 added
> # gpart add -t freebsd -a 129024 -s 1511M md10
> md10s2 added
> # gpart show md10
> =>     63  4194241  md10  MBR  (2.0G)
>       63   128961        - free -  (63M)
>   129024     2016     1  freebsd  (1M)
>   131040   127008        - free -  (62M)
>   258048  2967552     2  freebsd  (1.4G)
>  3225600   968704        - free -  (473M)
> ...

Bruce


More information about the freebsd-fs mailing list