Boot from removable storage - ArchLinux

Among one of file systems supported by ESPRESSObin is ArchLinux ARM file system. Here we will show you how to transfer ArchLinux ARM file system for ESPRESSObin to either a microSD card or USB device. Note that you will need a Linux machine to follow the instructions on this page.

Creating bootable microSD card/USB device

Before we can download and extract ArchLinux ARM file system on microSD card, we need to prepare the SD card. The example instructions below show the case of Micro SD card in a card reader and are identical to how you would setup a bootable USB device.

First we will make a directory where we will download the file system (e.g. /home/user/archlinux/):

user@laptop:/$ mkdir -p archlinux && cd archlinux
user@laptop:~/archlinux/ wget http://os.archlinuxarm.org/os/ArchLinuxARM-espressobin-latest.tar.gz

Insert the microSD card in your local Linux machine (use a USB microSD card reader if your laptop does not have a microSD card slot) and you should see the microSD card listed most probably as /dev/sd* device (or /dev/mmcblk0*) so make sure to check with lsblk:

user@laptop:/$ lsblk
sda      8:0    0 238,5G  0 disk 
├─sda1   8:1    0   487M  0 part /boot/efi
├─sda2   8:2    0 234,1G  0 part /
└─sda3   8:3    0   3,9G  0 part [SWAP]
sdb      8:16   1   3,7G  0 disk 
└─sdb1   8:17   1   3,7G  0 part

Our microSD card is here listed as /dev/sdb but it is not empty. Since we will be formatting our SD card, we want to clear everything from it first (of course, backup content from your SD card before this). We clear it with:

user@laptop:/$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=100

and check again with lsblk that everything was cleared:

user@laptop:/$ lsblk
sda      8:0    0 238,5G  0 disk 
├─sda1   8:1    0   487M  0 part /boot/efi
├─sda2   8:2    0 234,1G  0 part /
└─sda3   8:3    0   3,9G  0 part [SWAP]
sdb      8:16   1   3,7G  0 disk

Now we will create a new partition (sdb1) on the empty SD card:

user@laptop:/$ (echo n; echo p; echo 1; echo ''; echo ''; echo w) | sudo fdisk /dev/sdb
[Example output]
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x0c01515c.

Command (m for help): Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): Partition number (1-4, default 1): First sector (2048-7744511, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-7744511, default 7744511): 
Created a new partition 1 of type 'Linux' and of size 3,7 GiB.

Command (m for help): The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

and format it as EXT4 with:

user@laptop:/$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 489472 1k blocks and 122400 inodes
Filesystem UUID: 938b353e-b156-48fd-afc0-626668f6d95a
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Next we mount this partition on our local Linux machine (e.g. we will mount it to /mnt/sdcard):

user@laptop:/$ sudo mkdir -p /mnt/sdcard
user@laptop:/$ sudo mount /dev/sdb1 /mnt/sdcard

Head into the mounted directory and there as root (not as sudo) download and extract the file system:

user@laptop:/$ cd /mnt/sdcard
user@laptop:/mnt/sdcard$ sudo su
root@laptop:~/mnt/sdcard$ tar -xzf /home/user/archlinux/ArchLinuxARM-espressobin-latest.tar.gz -C .

check that the filesystem has been correctly extracted to your SD card and exit sudo:

root@laptop:~/mnt/sdcard$ ls
bin   dev  home  lost+found  opt   root  sbin  sys  usr
boot  etc  lib   mnt         proc  run   srv   tmp  var
root@laptop:~/mnt/sdcard$ exit

Our SD card is now ready. Exit the mounted directory and unmount it from your local machine with:

user@laptop:/mnt/sdcard$ cd
user@laptop:/$ sudo umount /mnt/sdcard

USB device

Instructions for setting up a bootable USB device are similar to the instructions above with a minor exception. After untaring the ArchLinuxARM-espressobin-latest.tar.gz to your USB device, head to boot/ directory and create a file uEnv_usb.txt:

root@laptop:~/mnt/sdcard$ vim boot/uEnv_usb.txt

and in there paste the following:

get_env=if ext4load usb 0:1 $loadaddr /boot/uEnv_usb.txt; then env import -t $loadaddr $filesize; if test -n ${uenvcmd}; then run uenvcmd; fi; fi
get_images=ext4load usb 0:1 $kernel_addr $image_name && ext4load usb 0:1 $fdt_addr $fdt_name
get_ramdisk=ext4load usb 0:1 $ramdisk_addr $ramdisk_name
bootargs=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000 root=/dev/sda1 rw rootwait
bootcmd=usb start; run get_env; if run get_images; then if run get_ramdisk; then booti $kernel_addr $ramdisk_addr $fdt_addr; else booti $kernel_addr - $fdt_addr; fi; fi

after which you can exit the mounted directory and unmount the USB device.

Setting U-Boot parameters

Using microSD card

Unplug the SD card from your local machine and plug it into the SD card slot on the ESPRESSObin, plug the power adapter and connect to the board using micro USB cable and serial connection as described in Quick User Guide, section Serial Connection.

For the ESPRESSObin to boot ArchLinux filesystem and images we have placed on the SD card, we must configure U-Boot parameters to do so. When the boot starts, hit any key to stop autoboot and get to the Marvell U-Boot prompt:

Hit any key to stop autoboot:

Here we need to set several environment variables:

Marvell>> mmc dev 0
Marvell>> ext4load mmc 0 $loadaddr /boot/uEnv.txt
Marvell>> env import -t $loadaddr $filesize

and save the environment with:

Marvell>> saveenv

Lastly we boot the system with (login as the default user alarm with the password alarm):

Marvell>> boot
[Truncated output]

[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.

Arch Linux 4.4.65-1-ARCH (ttyMV0)

alarm login: alarm
[alarm@alarm ~]$

The default root password is root.

Using USB device

If you are using the USB stick to store the ArchLinux root file system for ESPRESSObin, you will need to configure the U-Boot environment variables differently than those for Micro SD card in order to pick up the content from the USB stick.

Assuming you already have the USB stick with root file system created, first you will need to setup the proper connections on ESPRESSObin, plug in the USB stick to the USB port and power on the board. When the U-Boot starts please hit enter key to stop the autoboot process.

Hit any key to stop autoboot:  0

Do usb reset command under U-Boot command line to activate the USB stick, the example below shows there is one USB storage device being detected.

Marvell>> usb reset
(Re)start USB...
USB0:   Register 2000120 NbrPorts 2
Starting the controller
scanning bus 0 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
       scanning usb for ethernet devices... 0 Ethernet Device(s) found

after which load the environment variables from the boot/uEnv_usb.txt file we have made earlier:

Marvell>> ext4load usb 0:1 $loadaddr /boot/uEnv_usb.txt
766 bytes read in 171 ms (3.9 KiB/s)
Marvell>> env import -t $loadaddr $filesize

Optionally, you can save these variables to boot from the USB every time you startup ESPRESSObin:

Marvell>> saveenv

and lastly boot the system (login as the default user alarm with the password alarm):

Marvell>> boot
[Truncated output]

[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.

Arch Linux 4.4.65-1-ARCH (ttyMV0)

alarm login: alarm
[alarm@alarm ~]$

The default root password is root.

Default system configuration

Few notes regarding the default system configuration:

  • All network interface configuration is handled by systemd-networkd, with the configurations in /etc/systemd/network.
  • Plug an Ethernet cable into the WAN port on the ESPRESSObin (the port closest to the USB 3.0 port). This port is instantiated as the wan interface for connecting to the Internet.
    • This is set up via wan.network. The eth0.network file is required to bring up the link on the eth0 interface to bring up all three ports.
  • The two other ethernet ports are the lan0 and lan1 interfaces, and have been combined into the bridge interface br0 with the static IP
    • These are set up via lan.network, br0.network, and br0.netdev.
  • The br0 interface is set up for IP masquerading through the wan interface, and both have IP forwarding enabled.
  • The dnsmasq service is started on boot to provide a DHCP server for the br0 interface, serving the IP range