読者です 読者をやめる 読者になる 読者になる

/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

TFTPサーバーから相対パスでファイル取得できない問題について

著書「BareMetalで遊ぶ Raspberry Pi」追記のため、U-Bootを使ってプログラムをネットワークブートさせながら開発しようとしたのですが、RasPiがプログラムを拾ってこれずにこけてしまいました。

試しにログを吐かせてみると、こんなエラーが出ていました。

tftp> trace 
Packet tracing on.
tftp> verbose
Verbose mode on.

tftp> get test.img
getting from 192.168.12.50:test.img to test.img [octet]
sent RRQ <file=test.img, mode=octet>
received ERROR <code=2, msg=Only absolute filenames allowed>
Error code 2: Only absolute filenames allowed

absoluteと書いてあるので、試しに絶対パス指定でやってみたら成功。

tftp> get /srv/tftp/test.img
getting from 192.168.12.50:/srv/tftp/test.img to test.img [octet]
sent RRQ <file=/srv/tftp/test.img, mode=octet>
received DATA <block=1, 512 bytes>
sent ACK <block=1>
...

なんだこれ……。

調べて見ると「 -c -s オプションをつけるとうまくいった」という報告があったので、試しに /etc/default/tftpd-hpa を以下の様に書き換えて再起動してみると、今度は問題なく相対パス指定で取得できました。

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s"
$ sudo /etc/init.d/tftpd-hpa restart
tftp> get test.img
getting from 192.168.12.50:test.img to test.img [octet]
sent RRQ <file=test.img, mode=octet>
received DATA <block=1>

調べてみると、-cオプションは--createオプションの略で、これがあると新しいファイルの作成ができるようになる……あれ? 相対パスを指定するオプションではないですね……なぜ直った……。

なぜ直ったのか、ちょっと自信がありませんが、とにかくこの修正で動くようになったので、著書の方も修正しておくことにします。

追記

そもそも修正前の設定ファイルは以下の様になっていた。

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

つまり正確には --secure-s -c に変更を行った結果、動作するようになった。

調べてみるとsecure TFTPというのは、chrootのように特定のディレクトリをルートのように見せかけることで、他の様々なディレクトリを除かれないようにするものだった。

つまり、tftp-hpaは 127.0.0.1(localhost) に対しては --secure オプションが効くが、 どうやらその他のアドレスでは -s オプションでないと secure TFTPが使えないらしい。

これ、ちょっと元のコード読んでみるしかないですね……。