Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 May 2016 18:53:59 +0000
From:      William Waites <wwaites@tardis.ed.ac.uk>
To:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Booting the Beaglebone Black from internal flash
Message-ID:  <86zirhq5yw.fsf@naartjie.uucp>

next in thread | raw e-mail | index | archive | help
I've gotten my BBB to boot and run off of its internal flash. It wasn't
terribly difficult and maybe this is old news, but I had a lot of
trouble finding instructions for how to do it. Here's what I did, in
case it's useful.

  1. Start from an image written to SD card. At the time of writing
     there seems to be a problem with the 11 images, but 10.3 works
     fine.

  2. Delete any existing partitions from the internal flash, as well as
     the partition table so that we can start from scratch:

     gpart delete -i 2 mmcsd1
     gpart delete -i 1 mmcsd1
     gpart destroy mmcsd1

  3. Create partitions similarly to the SD card:

     gpart create -s GPT mmcsd1
     gpart add -t \!12 -b 63 -s 2M mmcsd1
     gpart set -a active -i 1 mmcsd1
     gpart add -t freebsd mmcsd1
     gpart add -t freebsd-ufs mmcsd1s2
     
     It is unclear if it is necessary or why to use a traditional
     disklabel here instead of just putting the freebsd-ufs directly in
     slice 2.

  4. Create filesystems:

     newfs_msdos -F 12 /dev/mmcsd1s1
     newfs -U -t /dev/mmcsd1s2a

     These filesystems do not (yet) have labels so they won't be
     magically found by the boot process. It does not appear to be
     possible to label them while there are other filesystems mounted
     with those labels.

  5. Mount the filesystems:

     mount /dev/mmcsd1s2a /mnt
     mkdir -p /mnt/boot/msdos
     mount -t msdosfs /dev/mmcsd1s1 /mnt/boot/msdos

  6. Copy the running system onto the internal flash:

     cd /boot/msdos; tar -cf - ./ | (cd /mnt/boot/msdos; tar -xpvf -)
     cd /; tar --one-file-system -cf - ./ | (cd /mnt; tar -xpvf -)

     This could alternatively be done by building from source, and
     installing with DESTDIR=/mnt or potentially using the distribution
     sets. Except perhaps for the early bootloader stages which come
     from the sysutils/u-boot-beaglebone port I believe.

  7. Make sure that booting will proceed from the internal flash,
     because the default in u-boot is to use mmc 0 (the external SD
     card).

     echo 'fatdev=mmc 1' > /mnt/boot/msdos/uenv.txt

  8. Halt the system, remove the SD card, boot into single user mode to
     label the disks. The kernel will not be able to find the root
     partition, and it needs to be specified as ufs:/dev/mmcsd0s2a when
     asked. 

     glabel label MSDOSBOOT mmcsd0s1
     glabel label rootfs mmcsd0s2a

     Notice that now the device is mmcsd0 and not mmcsd1. This is
     because of the way the numbering works which is slightly
     inconvenient.

  9. Reboot and done.

  9a. Not really, for me the kernel was still unable to find the
      filesystem with rootfs label, and I resorted to building a kernel
      with

      options         ROOTDEVNAME=\"ufs:mmcsd0s2a\"

      The default in the BEAGLEBONE config is ufs:mmcsd0s2 which would
      probably have worked if not using BSD disklabels and putting the
      filesystem directly there (see #3).

Is it a good idea to write this down in the wiki?

Best wishes,
-w

------------------------------------------------+------------------------
William Waites        <wwaites@tardis.ed.ac.uk> : School of Informatics
Synthsys Centre for Mammalian Synthetic Biology : University of Edinburgh
------------------------------------------------+------------------------
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86zirhq5yw.fsf>