Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Starting with RCE SDK V1.7.0, Linux may be loaded an RCE may load Linux over NFS, and run as a diskless node.

...

Please note that this feature is currently experimental!

Use at your own risk!

Unresolved issues include:

  • Node unique SSH key generation and storage
  • Dynamic read/write access to root filesystem files and directories
  • Arch Linux ARM package maintenance (pacman)
  • Bootloader NFS read performance

Install the SDK

First, download and install the latest RCE SDK.

...

Prepare the Arch Linux installation

mkdir <arch_linux_root>/boot (if not already present)
mkdir <arch_linux_root>/var/lib/machines

Copy the following files from the RCE SDK to the Arch Linux filesystem:

cp arm-linux/tgt/linux/fstab.diskless <arch_linux_root>/etc/fstab
cp arm-linux/tgt/linux/kernel/uImage to <arch_linux_root>/boot
cp arm-linux/tgt/linux/kernel/devicetree.dtb to <arch_linux_root>/boot

Copy your own firmware file to <arch_linux_root>/boot/fpga.bit

Or download and copy the default firmware bitfile for your RCE to <arch_linux_root>/bootcp arm-linux/tgt/linux/boot/<rce_type>/fpga.bit, or your own firmware file, to <arch

For diskless DTMs, use a different filename than DPMs, like <arch_linux_root>/boot/fpga_dtm.bit

wget http://www.slac.stanford.edu/projects/CTK/SDK/fpga.dpm.bit

wget http://www.slac.stanford.edu/projects/CTK/SDK/fpga.dtm.bit

Remove the following service file links:

rm <arch_linux_root>/etc/systemd/system/sockets.target.wants/systemd-networkd.socket
rm <arch_linux_root>/etc/systemd/system/multi-user.target.wants/systemd-networkd.service

For console or SSH login, allow read access to shadow:

chmod a+r <arch_linux_root>/etc/shadow

For SSH usage, allow root login permission by modifying the SSH daemon configuration:

edit <arch_linux_root>/etc/ssh/sshd_config - uncomment PermitRootLogin and set value to yes

For SSH usage, allow read/write access for ssh key generation:

chmod a+rw <arch_linux_root>/etc/ssh

Change back to read-only after first boot

Add RCE core software (optional)

To make use of the RCE core software on the diskless node, copy the following files from the RCE SDK:

cp arm-linux/bin/* <arch_linux_root>/bin
cp arm-linux/lib/* <arch_linux_root>/lib
cp arm-linux/tgt/linux/rced.service <arch_linux_root>/etc/systemd/system/multi-user.target.wants

COB DTM only:

cp arm-linux/tgt/linux/fmd.service <arch_linux_root>/etc/systemd/system/multi-user.target.wants
cp arm-linux/tgt/linux/packages/system/minirc/* <arch_linux_root>/etc
cp <arch_linux_root>/etc/minirc.bay0.0 <arch_linux_root>/etc/minirc.dfl

DTM DHCP server only:

cp arm-linux/tgt/linux/dtm_dhcp.sh <arch_linux_root>/bin
cp arm-linux/tgt/linux/dhcpd.dtm.conf <arch_linux_root>/etc
cp arm-linux/tgt/linux/dtm_dhcp.service <arch_linux_root>/etc/systemd/system/multi-user.target.wants

Configure the NFS server

Make sure <arch_linux_root> is exported by your NFS server

...

Set the next-server parameter to the IP address of the NFS server.

next-server <nfs_server_ip_address>

Set the root filesystem path to the Arch Linux installation

option root-path "<arch_linux_root>"

See arm-linux/tgt/linux/dhcpd.dtm.conf in the RCE SDK for example entries.

...

First, update the RCE bootloader (boot.bin) with the version in the latest SDK.

Reboot the RCE.RCE with default firmware (reboot_rce -t linux -b 0)

Boot the RCE into the bootloader.

For non-eFUSE RCEs, make note of the ethaddr variable for later restoration.

Apply Reset the default u-boot environment, save, and reset:

zynq-uboot> env default -a
## Resetting to default environment

You may set nfs boot as the default boot option prior to saving the environment

zynq-uboot> setenv modeboot nfsboot

You may need to restore the MAC address (for non-eFUSE RCEs)

zynq-uboot> setenv ethaddr <mac_address>

You may need to restore the boot delay parameter (for autoboot)

zynq-uboot> setenv bootdelay 3

DTM Firmware FPGA Bitfile

DTMs use different firmware bit files than DPMs.

The default filename of fpga.bit must be updated to reflect the name of the DTM file located in <arch_linux_root>/boot.

In this example, the DTM firmware bitfile is named fpga_dtm.bit

zynq-uboot> setenv nfsfpga 'nfs 0x1000000 ${rootpath}/boot/fpga_dtm.bit && fpga loadb 0 0x1000000 ${filesize}'

Save the environment and reset:

zynq-uboot> saveenv
Saving Environment to FAT...
writing uboot.env
done
zynq-uboot> reset
resetting ...

 

You may set nfs boot as the default boot option prior to saving the environment

zynq-uboot> setenv modeboot nfsboot

Boot Using NFS

Boot the RCE into the bootloader.

...

zynq-uboot> run nfsboot
PHY not detected, assuming PHY at address 0
BOOTP broadcast 1
DHCP client bound to address 192.168.204.38
PHY not detected, assuming PHY at address 0
Gem.e000b000:0 is connected to Gem.e000b000. Reconnecting to Gem.e000b000
Using Gem.e000b000 device
File transfer via NFS from server 192.168.204.12; our IP address is 192.168.204.38
Filename '/nfsexport/users/smaldona/dat/arch-linux-arm/arch-linux/boot/uImage'.
Load address: 0x3000000
Loading: #################################################################
#########################
done
Bytes transferred = 3784144 (39bdd0 hex)
PHY not detected, assuming PHY at address 0
Gem.e000b000:0 is connected to Gem.e000b000. Reconnecting to Gem.e000b000
Using Gem.e000b000 device
File transfer via NFS from server 192.168.204.12; our IP address is 192.168.204.38
Filename '/nfsexport/users/smaldona/dat/arch-linux-arm/arch-linux/boot/devicetree.dtb'.
Load address: 0x2a00000
Loading: ##
done
Bytes transferred = 9984 (2700 hex)
PHY not detected, assuming PHY at address 0
Gem.e000b000:0 is connected to Gem.e000b000. Reconnecting to Gem.e000b000
Using Gem.e000b000 device
File transfer via NFS from server 192.168.204.12; our IP address is 192.168.204.38
Filename '/nfsexport/users/smaldona/dat/arch-linux-arm/arch-linux/boot/fpga.bit'.
Load address: 0x1000000
Loading: #################################################################
##
done
Bytes transferred = 13321492 (cb4514 hex)
design filename = "DpmTest;UserID=0XFFFFFFFF"
part number = "7z045ffg900"
date = "2014/10/22"
time = "15:38:09"
bytes in bitstream = 13321404
zynq_load: Bitstream is not swapped(1) - swap it
Net: mac 08:00:56:00:44:3f
## Booting kernel from Legacy Image at 03000000 ...
Image Name: Linux-4.4.0-xilinx-00025-g96ce8f
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3784080 Bytes = 3.6 MiB
Load Address: 00008000
Entry Point: 00008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
Booting using the fdt blob at 0x02a00000
Loading Kernel Image ... OK
OK
Loading Device Tree to 1fb4a000, end 1fb4f6ff ... OK
Starting kernel ...

Read-only ArchL inux Filesystem

In order to make the NFS Arch Linux filesystem read-only to the RCEs, execute this on the NFS host:

chmod -R a-w <arch_linux_root>

Note, command this may need to be performed with sudo privileges.

Once an RCE writes to the filesystem, the root user has ownership of any new files.

Adding Packages to the Arch Linux NFS Filesystem

In order to add packages using pacman, the NFS Arch Linux filesystem must have global read-write permissions.

On the NFS host, execute:

chmod -R a+w <arch_linux_root>

New packages are added using an RCE that is already running as a diskless node.

Package files must reside in a directory of <arch_linux_root> where RCEs have visibility.

Log into an RCE, and install the package(s) as follows:

pacman -U package_file.xz

Be sure to restore the filesystem to read-only permissions after package maintenance is complete.