I like the extlinux.conf method as well. Things get a lot easier if you simply install to eMMC, but then add a boot entry to tell the system the root partition is on the SD card. When you say to install to SD card, then the boot loader itself goes there, causing the SD card to have to be present for the system to even try to boot. So I suggest install normally to eMMC, create your file system on SD card, put that in, and then create an alternate entry in “/boot/extlinux/extlinux.conf”. You’ll then be able to use serial console to switch entries at boot time; if things look ok, you can make the SD card the default choice. When things work, you’ll still have the non-SD card eMMC as a “rescue” system.
For this next part, keep in mind that not all SD cards are the same quality…most work to store data, but some fail under more strenuous use as a root file system.
To create your root on the SD card, go to your host, format the SD card partition as ext4, and then mount it somewhere. Next, you can either create the rootfs from a clone of a known good JTK1, or via unpacking the sample rootfs there (plus the apply_binaries.sh script of the driver package).
If you use the driver package instead of clone, and if you have already mounted the ext4 SD card to /mnt, then the steps are something like this:
sudo tar xvjf /wherever/sample/rootfs/is/Tegra_Linux_Sample-Root-Filesystem_R21.4.0_armhf.tbz2
sudo ./apply_binaries.sh -r /mnt
Alternately, you could skip unpacking sample rootfs and apply_binaries.sh by using a loopback mounted clone and copy via sudo cp -adpR from the clone to the mount point of the SD card. Disadvantage: Lots of time to create the clone. Advantage: exact copy of the Jetson you cloned, including all updates and configuration.
In a running Jetson, edit /boot/extlinux/extlinux.conf, and add a duplicate entry with a new LABEL and MENU LABEL, then find and change from the APPEND text “root=/dev/mmcblk0p1” to instead be “root=/dev/mmcblk1p1”. My test entry is like this:
MENU LABEL SD Card
APPEND console=ttyS0,115200n8 console=tty1 no_console_suspend=1 lp0_vec=2064@0xf46ff000 mem=2015M@2048M memtype=255 ddr_die=2048M@2048M section=256M pmuboard=0x0177:0x0000:0x02:0x43:0x00 tsec=32M@3913M otf_key=c75e5bb91eb3bd947560357b64422f85 usbcore.old_scheme_first=1 core_edp_mv=1150 core_edp_ma=4000 tegraid=22.214.171.124.0 debug_uartport=lsport,3 power_supply=Adapter audio_codec=rt5640 modem_id=0 android.kerneltype=normal fbcon=map:1 commchip_id=0 usb_port_owner_info=0 lane_owner_info=6 emc_max_dvfs=0 touch_id=0@0 board_info=0x0177:0x0000:0x02:0x43:0x00 <b>root=/dev/mmcblk1p1</b> rw rootwait tegraboot=sdmmc gpt
Boot with serial console running and select that new entry.
Note that when the SD card is mounted as rootfs, that the /boot of the SD card will show up, but it is really the /boot of the eMMC which is running…changes to boot time behavior would go in the eMMC /boot, changes to the run time /boot would go to the SD card’s /boot.