Services on a Pi host

You operate the fleet and want to know which systemd units run on every welland Pi, to understand or change one. This is the root fpgas.online-infra builds (main, read 2026-10-07: the roles onpi, cam_pi and fixpi), which welland’s Pis boot; ps1’s blades boot another root (The ps1 gateway and switch). What is installed is on What runs on a Pi host.

The units the root enables

Unit

Enabled by

What it does

On which Pi

fpgas-verify.service

onpi, fpga_verify.yml

The boot check of the Pi’s FPGA board; publishes its result to the site (fpgas-verify)

every Pi

fpgas-cam.service

cam_pi

The camera stream (Camera); stays stopped when the Pi has no camera

every Pi

fpgas-tt.service

onpi, tt.yml

The Tiny Tapeout daemon, fpgas-tt --device /dev/ttboard; it reads no board catalogue

a site that runs the Tiny Tapeout site (tt_boards defined; welland)

fpgas-fleet-agent.service and fpgas-fleet-event@… (network-online, time-synced, ssh-up, cam-streaming, tt-daemon-up)

onpi, fleet.yml

Report the Pi and its boot stages to the site’s server; inert until the site writes /etc/fpgas-online/fleet.toml

every Pi, once the site writes that file

nfsroot-watchdog units

the nfsroot-watchdog package, onpi, stale_root.yml

Reboot the Pi after a root update (Updating the NFS root)

every Pi

fpgas-hostname-hosts.service

fixpi

Writes the Pi’s DHCP name into /etc/hosts, so sudo does not wait on DNS

every Pi

ssh.service

fixpi

Remote login

every Pi

systemd-timesyncd.service

fixpi (a drop-in)

Time from the gateway: the server comes from the DHCP ntp-server option, through systemd-networkd, and the drop-in names the gateway as FallbackNTP=. The Pis have no internet, so without a server every Pi’s clock sits on the fake-hwclock date (comment in fixpi/tasks/netboot.yml)

every Pi

systemd-networkd.service and fpgas-uplink-network.service

onpi, networkd.yml

Manage the interface that carries the NFS root: keep the kernel’s address, renew the DHCP lease, set the port’s IPv6 address and route (The network after boot)

every Pi

networkd-dispatcher.service

the Debian package; onpi, networkd.yml

Runs fpgas-network-state at every state change of that interface, which sends a network-state record to the site

every Pi, once the site writes /etc/fpgas-online/fleet.toml

fpgas-network-state-flush.timer

onpi, networkd.yml

Every minute, sends the network-state records the broker did not take (only while there are any)

every Pi, once the site writes /etc/fpgas-online/fleet.toml

atftpd.socket

the Debian package; onpi, tftpd.yml, moves its port off 69

TFTP on the Pi

every Pi

lldpd.service

the Debian package

Names the Pi to its switch over LLDP

every Pi

fixpi also masks the first-boot wizard (userconfig.service), which would block the boot because it cannot see /boot/firmware, and the root-resize and swap services, which make no sense on a read-only NFS root.

The units get into the root through the include chain of roles/onpi/tasks/main.yml: apt.yml, the fpgas-online-setup-pi install, nonfs.yml, tt.yml, fleet.yml, tftpd.yml, tweeks.yml, litepcie.yml (only when onpi_litepcie_modules), fpga_verify.yml, stale_root.yml (read 2026-10-07). The site owns the root’s authorized_keys and the image carries none, so there is no key task.

The units shipped by fpgas-online-setup-pi, and why the pistat and Arty units do not run, are on Units shipped by fpgas-online-setup-pi; how to use the USB console is under When a Pi does not boot.

What config.txt and cmdline.txt set: Boot-time configuration.