# Best practices

## Debugging

The migration stream can be analyzed thanks to `scripts/analyze-migration.py`.

Example usage:

    $ qemu-system-x86_64 -display none -monitor stdio
    (qemu) migrate "exec:cat > mig"
    (qemu) q
    $ ./scripts/analyze-migration.py -f mig
    {
      "ram (3)": {
          "section sizes": {
              "pc.ram": "0x0000000008000000",
    ...

See also `analyze-migration.py -h` help for more options.

## Firmware

Migration migrates the copies of RAM and ROM, and thus when running on the destination it includes the firmware from the source. Even after resetting a VM, the old firmware is used. Only once QEMU has been restarted is the new firmware in use.

- Changes in firmware size can cause changes in the required RAMBlock size to hold the firmware and thus migration can fail. In practice it’s best to pad firmware images to convenient powers of 2 with plenty of space for growth.

- Care should be taken with device emulation code so that newer emulation code can work with older firmware to allow forward migration.

- Care should be taken with newer firmware so that backward migration to older systems with older device emulation code will work.

In some cases it may be best to tie specific firmware versions to specific versioned machine types to cut down on the combinations that will need support. This is also useful when newer versions of firmware outgrow the padding.