The new MacBooks and MacBook Pros have garnered a bunch of discussions online, mainly around the new Touch Bar and the USB-C only inputs. There was an additional change as well: The hardware block size is now 4096 bytes versus 512 bytes. While this is pretty esoteric, it does represent a pretty big switch for a computing platform. But first some background.
What is physical block size?
Physical Block size is the smallest amount of data that can be written at one time to a disk. Physical Block Size can also be referred to as sectors, but sectors is a term that has its roots in spinning platter disks. I suspect Apple uses the term Physical Block Size since it is more universal across SSD’s and spinning platter disks.
You can see the physical block size of compared to the filesystem block size on a prior generation of MacBook Pro:
MachPower:~ tperfitt$ diskutil info /dev/disk1|grep Block
Device Block Size: 512 Bytes
Allocation Block Size: 4096 Bytes
For this MacBook Pro, the smallest amount of data that the filesystem can write at one time is 4096 bytes, and the smallest amount of data that the device (in this case, my internal SSD) is 512.
Advanced Format Drives
It is important to understand that the Device Block Size is set by the physical device (like a SSD or spinning platter disk) and is not adjustable by the filesystem. However, having the filesystem block size be a multiple of the physical block size is important for speed, so they two are related. Also, there are some speed advantages for having the physical block size and filesystem block size be the same. To address this, Advanced Format Drives were created. Advanced Format Drives support 4096 Device Block Size and have many advantages (see here). However, there is one major disadvantage: software legacy assumptions. Disk Utilities and Operating Systems (such as Windows) assumed that a physical block size of 512 bytes. To address this, a compatibility layer was introduced called 512e. The disk used 4096 Physical Block Size, but tells the attached computer that the physical block size is actually 512 bytes. This provided compatibility but did not expose all the advantages of the native 4096 byte Physical Block Size.
USB-C MacBooks
So with the USB-C MacBook and the new MacBook Pros, the Physical Block Size changed to 4096. You can see this change by running the same command as above on one of these new Macs:
Device Block Size: 4096 Bytes
Implications For Boot Camp Booting Windows
We discovered an issue with Advanced Format Drives in MacBooks when the USB-C MacBooks came out. Modern versions of Windows fully support Advanced Format Drives, both native 4096 blocks size and 512e emulation. However, issues come about when transferring a filesystem from a 512 physical blocks size to a 4096 physical block size. The Master File Table (MFT) is what keeps track of all the files on the NTFS filesystem, and it normally has a 1024 bytes entry per file on 512 physical block device. However, if you install Windows on a 4k physical block disk, the MFT has an entry size is 4096 bytes. When you transfer NTFS from a device that has a physical block size of 512 to one that has a physical block size of 4096, the MFT entry size is still 1024 bytes. This is what causes Windows issues with booting. Windows assumes that if the physical block size is 4096 or greater, then the MFT entry size will be the same size (4096 or greater). From the MSFT note on 4k file systems here:
2. File records will assume the size of the logical block size of 4KB, rather than the previous size of 1KB. This actually improves scalability to some degree, but the down-side is that each NTFS file record will require 4KB or more in the MFT.
In fact, if you go and update the NTFS BPB Bytes per Sector, sectors per cluster, and Total Sectors to make it match the 4096 physical block size of a device, and then try and mount it, MacOS will give you:
Mft record size (1024) is smaller than the sector size (4096). This is not supported. Sorry.
When you try to boot Windows on the USB-C MacBook after these modifications, Windows will error with an “Unaccessible_Boot_Device” error. I highly suspect that the reason that the boot partition cannot be mounted is due to the MFT record size.
There is currently no way to update the MFT record size without reformatting, but I will continue to investigate and will update as I know more. In the meantime, you can always boot Windows in Boot Camp with an external drive, or reinstall/migrate Windows.
UPDATE: Winclone 6 solves this!