OpenWRT x86 Style Disks and Booting
For this experiment EXT 4 will be used (as opposed to SquashFS)
For Cloning a Drive
Copy the MBR (GRUB Stage 1 and Partition Table): dd if=/dev/sdX of=/dev/sdY bs=512 count=1
Copy the "MBR Gap" (GRUB Stage 1.5, containing the CORE.IMG file): dd if=/dev/sdX of=/dev/sdY bs=512 skip=1 count=511
Copy the First Partition (/boot Directory): dd if=/dev/sdX1 of=/dev/sdY1 bs=128M conv=noerror progress=status
Copy the Second Partition (/root equivalent): dd if=/dev/sdX2 of=/dev/sdY2 bs=128M conv=noerror progress=status
Flush any buffered information to disk: sync
Syntax Notes;
- if: Input File (or Device)
- of: Output File (or Device)
- bs: "How much to copy from one device to another at a time"
- conv=noerror: "Don't stop, just do what I told you to do, and don't give an excuse"
- progress = status: Show the progress of the copy process (only for a certain version of DD and up)
- sync: Write all buffered blocks to disk (just to be safe)
Other Notes
- Copying the MBR and MBR Gap can be combined into a single step (it was done to clarify and make an explicit point that there is important code stored in the MBR Gap necessary to boot OpenWRT with GRUB):
dd if=/dev/sdX of=/dev/sdY bs=512 count=512
- The "MBR Gap" for OpenWRT's x86 "flavor" is 511 Sectors (Sectors 2 - 511, 512 is the beginning of the first partition, AKA /boot Partition). That's just how it is for OpenWRT because it is what they decided. And just as a historical note, the "MBR Gap" is almost twice as big as the entire capacity of a Commodore 1541 disk (single sided is 170K).
- If conv=sync is used an out of space error will occur.