Beaglebone boot device selection with U-Boot

Based on a recent discussion with a Mender user who was having issues with the Beaglebone Black platform, I thought I’d add this post for further clarification and discussion.

The Beaglebone docs indicate that the “USER/BOOT” button (labeled as S2) needs to be pressed to have the device boot off of SD Card instead of eMMC.

This button only determines where the U-Boot image itself is loaded from. U-Boot is then free to load the kernel, DTB and root filesystem from wherever it decides. This can cause confusion because it is possible to load U-Boot from eMMC but then have the BOOTCMD in U-Boot load the kernel and root filesystem from SDCard. The default U-Boot from the Beaglebone Debian image first checks if there is a bootable system on the SDCard and if so boots it, otherwise it will load it from the eMMC.

This can cause confusion when booting Mender-enabled images. The default Mender BOOTCMD assumes that the U-Boot image is running from the block device containing the kernel and root filesystem. If the default Beaglebone Debian U-Boot is installed in the eMMC, it will attempt to launch Linux from the SDCard without the proper Mender boot logic to select the correct partition. In this case, the boot may appear to succeed but still not be completely correct.

If you are using a Beaglebone Black platform, with SDCard as your root filesystem media, we recommend that you overwrite the boot block on the eMMC to ensure that your system does not accidentally boot an incorrect U-Boot version.

Warning: the following command will overwrite the first 1MB of the eMMC device with zeros, rendering the eMMC un-bootable:

$ sudo dd if=/dev/zero of=/dev/mmcblk1 bs=1M count=1