著書「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が使えないらしい。
これ、ちょっと元のコード読んでみるしかないですね……。