a simple way is to use Grub for ARM.
UPDATE: It works with a help of U-boot, so the uBoot actually boots up a Grub kernel, take a look here - it's a full step-by-step guide I used when I was working with G4A+uBoot, it is not so hard to compile. To achieve the exact task you want you use fdisk
to make 2 boot partitions and the rest is for your main system. You're booting the first boot partition, it works, make a sync/copy if the upgrades are made and tested to be working OK. To rollback - just as usual with grub - just use another boot menu option.
UPDATE#2: you can use UART TTY to have a console or just make a button-press to send a keycodes. It's a simple way of restoring hopelessly-broken system. The more complicated ways are :
- using uBoot you can try to get grub.conf over network like this way - it works, I checked
- you can boot an intermediate image via Grub or even the uBoot - a third boot partition - with SSH and/or VNC server enabled, wait for connection for some time - and then using
kexec()
system call fire-up the boot variant you need. Or - if the connection is made - you can switch in a script which kernel image will be booted. - a rescue system can be loaded via tftp and executed, so you will have your SSH or VNC environment to fix your boot.