NOBODD-TFTPD(1)
πΈ NAME πΈ
okay bestie, say hi to nobodd-tftpd β yes, that's nobodd-tftpd(1), the main character of this whole page π
It's a read-only TFTP server that can read FAT boot partitions from inside image files or devices. It's meant to be paired up with a block-device service (like NBD, iykyk) so you can netboot Raspberry Pis π. That's the whole vibe. Read-only, boot-partition-serving, Raspberry-Pi-feeding. Periodt.
β¨ SYNOPSIS β¨
usage: nobodd-tftpd [-h] [--version] [--listen ADDR] [--port PORT]
[--board SERIAL,FILENAME[,PART[,IP]]]
π OPTIONS π
-h,--helpβ shows the help message and dips. that's it, that's the whole thing π--versionβ shows the program's version number and exits. iconic behaviour.--board SERIAL,FILENAME[,PART[,IP]]β you can drop this one multiple times to define boards that get served boot images over TFTP π«Ά. If you skipPART, it defaults to1. If you skipIP, then the IP address just... won't be checked. no vibe check, no problem.--listen ADDRβ the address to listen on for connections. default is"::"which means literally all the addresses π.--port PORTβ the port to listen on for connections. default is"tftp", which is port69π.
π§ CONFIGURATION π§
okay so nobodd-tftpd can be configured two ways: from the command line, or from a bunch of configuration files. The files are INI-style β bracketed [sections] holding key=value lines, plus optional #-prefixed comments (very demure, very mindful).
Here's which files get read, and the order they get consulted, fr fr:
/etc/nobodd/nobodd.conf/usr/local/etc/nobodd/nobodd.conf$XDG_CONFIG_HOME/nobodd/nobodd.conf(and heads up:$XDG_CONFIG_HOMEdefaults to~/.configif it's unset)
Files later in that order override settings from files earlier in that order. later = louder, that's just how it is π
the [tftp] section π¦
Your config file can have a [tftp] section, and inside it these values can live:
listenβ equivalent to the--listenparameter. It says which address(es) the server listens on for incoming TFTP connections.portβ equivalent to the--portparameter. It says which UDP port the server listens on for incoming TFTP connections. But bestie, important: only the initial TFTP packet shows up on this port. Every "connection" gets allocated its own ephemeral port (that's the concept athttps://en.wikipedia.org/wiki/Ephemeral_port) on the server, and every packet after that first one uses that ephemeral port. no cap.includedirβ if you set this, it names a directory that gets scanned for files matching the pattern*.conf. Anything matching gets read as extra configuration files, in sorted filename order. cute little conf buffet π
For example:
[tftp]
listen = 192.168.0.0/16
port = tftp
includedir = /etc/nobodd/conf.d
the [board:SERIAL] sections π
For every image the TFTP server is supposed to serve to a Raspberry Pi, you define a [board:SERIAL] section. Swap SERIAL out for the actual serial number of that Pi. You can find the serial number in the output of cat /proc/cpuinfo at runtime. Like so:
$ grep ^Serial /proc/cpuinfo
Serial : 100000001234abcd
Now here's the little trick: if the serial number starts with 10000000 (exactly like the example above), you drop the initial one and all the leading zeros. So that Pi up there actually has a serial number of 1234abcd (in hexadecimal). slay β¨
Inside that section, these values are valid:
imageβ the full path to the operating system image to serve to the specified Pi. Presumably it was prepped withnobodd-prep.partitionβ optionally, the number of the boot partition. If you don't specify it, it defaults to1.ipβ optionally limits serving any files from this image unless the client's IP address matches. If you don't specify it, any IP address at all can pull files from this share. (chaotic, but valid.)
For example:
[board:1234abcd]
image = /srv/images/ubuntu-24.04-server.img
partition = 1
ip = 192.168.0.5
In practice, what all that means is: requests from a client with the IP address "192.168.0.5" for files under the path "1234abcd/" get served from the FAT file-system on partition 1 of the image stored at /srv/images/ubuntu-24.04-server.img. like, it just works π
And guess what β nobodd-prep can produce these definitions for you when you hand it the nobodd-prep --serial option.
Boards can also be defined right on the command line with the --board option. Those definitions augment the ones from your configuration files β and where the serial number is identical, they override them. command line stays winning, as always π
π«Ά SYSTEMD/INETD USAGE π«Ά
The server can inherit its listening socket from a managing process. two scenarios, both valid:
- With
inetd(8)(https://manpages.ubuntu.com/manpages/noble/en/man8/inetd.8.html), where the listening socket is traditionally passed as stdin (that's fd 0), you pass"stdin"as the value of--listenβ or as thelistenoption inside the[tftp]section of the config file. same thing, different font. - With
systemd(1)(https://manpages.ubuntu.com/manpages/noble/en/man1/systemd.1.html), where the listening socket(s) get passed via the environment, you specify"systemd"as the value of--listenβ or as thelistenoption inside the[tftp]section of the config file. Then the service expects to find a single socket passed inLISTEN_FDS. This happens implicitly if the service is declared as socket-activated. However β and bestie listen to me on this one β the service must not useAccept=yes, because the TFTP protocol is connection-less. The example units shipped in the source code show how to do socket-activation with the server. copy them, don't freestyle π
In both of these cases, the service manager sets the port the service listens on β so the--portoption (and theportoption in the[tftp]section of the config file) is silently ignored. it's giving "we don't take input on this". π
π SEE ALSO π
nobodd-sh(1) (https://manpages.ubuntu.com/manpages/noble/en/man1/nobodd-sh.1.html), nobodd-prep(1) (https://manpages.ubuntu.com/manpages/noble/en/man1/nobodd-prep.1.html), nbd-server(1) (https://manpages.ubuntu.com/manpages/noble/en/man1/nbd-server.1.html)
π BUGS π
Found something cursed? Please report bugs at: https://github.com/waveform80/nobodd/issues β the maintainer wants to know, fr fr π
π Author π
Dave Jones
π Copyright π
2023-2026 Dave Jones
and that's the whole page, bestie! π this was nobodd-tftpd version 0.5, dated Feb 19, 2026 β go netboot something iconic ππ¦β¨
π¦ where this page comes from
- ubuntu resolute: nobodd-tftpd 0.5-0ubuntu2 Β· GPL-3.0-only
- ubuntu stonking: nobodd-tftpd 0.5-0ubuntu2 Β· GPL-3.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms