Table of Contents


Now that we have our filesystem with necessary libraries ready and kernel modules installed to the root filesystem, we are going to put everything we have compiled/generated so far - bootloader, kernel and the root filesystem - into the SD card and boot from it.

Boot Raspberry Pi 3B from the SD card
Boot Raspberry Pi 3B from the SD card

Making a SquashFS image of the root filesystem

The SquashFS is a read only filesystem with high compression and read speed. We are going to create a SquashFS image of our root filesystem and flash that image to the secondary partition of SD card (we created the second partition with 512MB size).

Install squashfs-tools

Install the squashfs-tools package on your Ubuntu development system with the following command

sudo apt install squashfs-tools

Create squashfs image of root directory

mksquashfs ~/rpi3/nfs ~/rpi3/sdCardFiles/rootfs.sqfs -noappend

Flash the squashfs image to SD card

Unmount the SD card partitions using the following commands first before flashing

# Replace <USERNAME> with your Ubuntu system username.
sudo umount /media/<USERNAME>/rootfs

Using the dd command, flash the squashfs image to the second partition of the memory card.

# The second patition name might vary. Check `dmesg` output after inserting the SD card into the system.
sudo dd if=~/rpi3/sdCardFiles/rootfs.sqfs of=/dev/mmcblk0p2 bs=1M

Re-compile kernel with squashfs as inbuilt module

cd ~/rpi3/linux
make menuconfig

Make squashfs as inbuilt kernel module by going into File systems —> Miscellaneous filesystems —> SquashFS 4.0 - Squashed file system support.

Save the config file and recompile the kernel by running following commands.

export ARCH=arm64
export CROSS_COMPILE=aarch64-rpi3-linux-uclibc-
export PATH=$PATH:~/x-tools/aarch64-rpi3-linux-uclibc/bin/
make -j`nproc`

Copy the dtb and kernel image to SD card

cp ~/rpi3/linux/arch/arm64/boot/Image /media/<USERNAME>/boot/kernel.img
cp ~/rpi3/linux/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /media/<USERNAME>/boot/

Set bootcmd env in the board U-boot console

Insert SD card into the Raspberry Pi. Power up the board. Stop at U-boot console and run the following commands to boot the Raspberry Pi 3B completely from the SD card.

setenv bootargs earlyprintk root=/dev/mmcblk0p2 rootfstype=squashfs rootwait noinitrd
setenv bootcmd 'mmc dev 0; fatload mmc 0:1 0x2000000 kernel.img; fatload mmc 0:1 0x200000 bcm2710-rpi-3-b.dtb; booti 0x2000000 - 0x200000;'

The explanation of the first command as follows -

  • The bootargs env value is what will be passed as the kernel command line arguments while booting.
  • The root=/dev/mmcblk0p2 tells the kernel to look for the root filesystem from second partition of the kernel.
  • The rootfstype=squashfs tells the filesystem type. It is squash filesystem.
  • The rootwait tells the kernel to wait until the SD card is ready for the root filesystem.
  • The noinitrd tells there is no initramfs created.

The explanation of the second command as follows -

  • The bootcmd env value is a bunch of U-boot commands which will be executed every time the board boots.
  • The mmc dev 0 selects the first mmc device. Here the SD card. You can check the mmc details with the command mmc info in the U-boot console.
  • The fatload mmc 0:1 0x2000000 kernel.img loads the kernel.img image from the first partition of SD card to the RAM address 0x2000000
  • The fatload mmc 0:1 0x200000 bcm2710-rpi-3-b.dtb loads the device tree file from the first partition of SD card to the RAM address 0x200000
  • The booti 0x2000000 - 0x200000 boots the image (kernel.img) at address 0x2000000 with the dtb file (bcm2710-rpi-3-b.dtb) at address 0x200000 with no initramfs(-).

The final command saveenv saves the environment variables on SD card.

Reboot the board

Enter the following command in the U-boot console to reboot the Raspberry Pi 3B from the SD card.


Congratulations on successfully booting the board from SD card.