I’ve been doing embedded for a long time but I’ve been doing unix admin stuff for way longer. I’ve probably been using inetd and tftp for 25 years. I’m always shocked at the ability for tftp to take up a couple hours of time the first time you want to get it running on a host.
When doing embedded, I typically like to point tftpboot at my compiler output directory which saves a copy step. Sometimes you forget to copy and you can’t figure out why your printf()s aren’t showing up (because you’re still running an old version).
Anyway, on Ubuntu, you typically install xinetd and tftpd…
sudo apt-get install xinetd tftpd
Then you want to create /etc/xinetd.d/tftpd :
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = hpeyerl
server = /usr/sbin/in.tftpd
server_args = -s /home/hpeyerl/trunk/firmware/esp8266
Then poke xinetd:
$ sudo pkill -1 xinetd
I always like to debug by using tcpdump:
06:11:42.796755 IP (tos 0x0, ttl 255, id 4, offset 0, flags [none], proto UDP (17), length 56)
192.168.37.249.69 > 192.168.37.30.69: 28 RRQ "/images/antares.rom" octet
0x0000: 4500 0038 0004 0000 ff11 ef48 c0a8 25f9 E..8.......H..%.
0x0010: c0a8 251e 0045 0045 0024 c8b6 0001 2f69 ..%..E.E.$..../i
0x0020: 6d61 6765 732f 616e 7461 7265 732e 726f mages/antares.ro
0x0030: 6d00 6f63 7465 7400 m.octet.
06:11:42.799663 IP (tos 0x0, ttl 64, id 8086, offset 0, flags [DF], proto UDP (17), length 49)
192.168.37.30.42622 > 192.168.37.249.69: 21 ERROR EACCESS "Access violation"
0x0000: 4500 0031 1f96 4000 4011 4ebe c0a8 251e E..1..@.@.N...%.
0x0010: c0a8 25f9 a67e 0045 001d cc96 0005 0002 ..%..~.E........
0x0020: 4163 6365 7373 2076 696f 6c61 7469 6f6e Access.violation
0x0030: 00 .
Sometimes syslog is helpful:
May 10 06:03:57 pm001 in.tftpd: connect from 192.168.37.30 (192.168.37.30)
May 10 06:03:57 pm001 tftpd: tftpd: trying to get file: antares.rom
May 10 06:03:57 pm001 tftpd: tftpd: serving file from /srv/tftp
The key there is “/srv/tftp”… Since there’s no mention of /srv/tftp in your xinetd.d config file, something else must be happening…
So, here are some gotchas that will consume some debug time:
- If you’re testing this by using tftp on the same host as tftpd, you won’t see anything in tcpdump because the packets are short-cutting through your localhost interface.
- On Ubuntu, there is also an /etc/inetd.conf which is your culprit:
#:BOOT: TFTP service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers."
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp
- tftpd is very picky about permissions. You might be tempted to make every element in your path 777, I don’t need to tell you this is a bad idea.