This topic is guaranteed to bore most people. Or, maybe I am wrong. Are you the kind of person that loves to defrag your disk? Are you always looking for new ways of speeding up your machine? Are knobs and buttons something you love to tweak? How about that registry cleaner?
No, I am not saying those things are bad. Some people have the patience for this while others do not. Usually the people that fiddle with the settings are eventually rewarded. At the very least they can proclaim that they understand what the settings are really doing.
Thanks to a reader (thanks John!) I was made aware of the offset problem within VHDs. Well, let me rephrase that. I knew about it but I did not know its official name or that people had solved it.
John pointed me to this blog post about the offset problem. There are already tools out there from NetApp to solve the issue but basically you need to be a NetApp customer in order to get access (at least for the tools that actually fix your images). In truth, the problem affects most virtualisation users.
So, this is the part where the problem is dissected and understood. Virtual disks still follow rules left over from physical disks. Specifically, they have a “geometry” setting that indicates things like sectors per track. Here is an example from my tool named vhddump of one the test VHDs laying around.
Geometry 3F10BA9ECylinders 9EBAHeads 10Sectors/Track 3F
This information is a field inside the VHD header. The geometry value splits into the next three values based on interpreting the bytes. Since VHDs are big endian (big bytes first instead the typical little endian on Windows). vhddump is reporting the field backwards since it had not been important to preserve the byte order.
Anyways, you can see that our virtual disk has 3F sectors per track. This translates to 63 sectors in decimal. The geometry reported (also known as CHS) affects the alignment of partitions. The rule with older versions of Windows is that the boot partition starts after the first track. This is the output for the same VHD with vhddump:
Index(0) 80 01 01 00 07 FE FF FF 3F 00 00 00 B5 98 70 02 Index(0) BootFlag(80) Type(07) SectorStart(0000003F) SectorLength(027098B5) Index(0) CHSStart(010100) CHSEnd(FEFFFF) Start CHS Head(01) Sector(01) Cylinder(0000) End CHS Head(FE) Sector(3F) Cylinder(03FF) Volume Count 1 Volume Index 0 FirstVolumeSector 3F
The master boot record starts at the first sector of the virtual disk. This dump is from a Windows XP image. The first sector of the first volume/partition is at 0x3f.
Why is this a problem?
Well the most obvious problem is that the sector 0x3f does not align with VHD blocks or even NTFS clusters. Since it is an ‘odd’ sector, it is guaranteed never to align with anything inside the VHD.
This problem was first seen when exploring the clusters inside the VHD. Instead of being neatly aligned with the VHD blocks, it was possible to have a cluster that spanned two blocks. Even the sector bitmap showing the written clusters did not align on byte boundaries for a cluster. Not only did it make it harder to correspond information, it was more wasteful to do more work for something that should have been aligned in the first place.
This kind of offset problem would show as a performance problem over time. It is always more efficient to have alignment.
If people really understood this problem, they would probably insist that the partitions were aligned. A simple example is a cluster that spans two blocks. Not only is it a read/write hit to access two blocks, but it also potentially wastes space with the second block if there is nothing else there.
If clusters are aligned with VHD blocks, it is much easier to correlate the file data. It makes sense that the disk should be aligned not with pretend physical settings but rather the VHD format itself. Even though it is counter-intuitive, it might make sense to have the first partition start at a 2MB boundary. Some space would be wasted before and after a given partition but the partition would be guaranteed to be isolated from the MBR area and the other partitions.
John had asked for a tool to fix this. Unfortunately I do not have time right now to solve it. There are other areas which are currently more important. However, it would be fun to write such a tool.