有一个项目,使用ramdisk和jffs2混合根文件系统,偶尔需要跟新机器的个别应用,但是不想重新烧写根文件系统,于是想在arm linux里架设一个tftpd服务器,使用windows机器传应用程序到arm linux机器上,本应该是一个很简单的事情,但是实际做的时候还是遇到很多麻烦。好在最后终于搞成功,现在把过程记录下来,以备后来者参考。
1. 找tftpd源代码.
我共找到3份tftpd源代码一个是tftpd.tar.gz tftpd-1.3.tar.gz, tftp-hpa_0.40.orig.tar.gz,
2. 移植
我最先移植的 是tftpd-1.3.tar.gz,移植好后发现该代码不支持上传,只支持下载。
有移植tftpd但是很快发现tftpd不支持standlone方式工作,这里有必要解释一下tftpd的工作方式:
a. 使用standlone方式工作,也就是把tftpd当作一个应用程序,背景下运行相当于一个守护进程,当接收到tftp客户端连接时,直接和客户端交互。
b. 使用inetd 服务启动方式,需要配置inetd.conf,当inetd接收到tftp连接请求时,启动tftpd进行tftp传输。
我比较喜欢第a种工作方式。所以tftpd不适合我,同样tftpd-1.3不支持上传当然也不适合我。最后找到tftp-hpa_0.40.orig.tar.gz可以正常工作对于tftp-hpa_0.40.orig.tar.gz的修改如下:
a. 直接写standalone等于1 只工作在standalone方式。
b. 修改 validate_access函数里的上传文件的而进行文件创建时的文件属性检测,直接#if 0掉open 文件后的部分代码。
3. 测试
经过上面的处理tftpd应该可以正常工作了,测试方法是:
1. 在root用户下运行tftpd
2. 建立/tftpboot/ 目录并且使用chmod 777 -R /tftpboot 修改该目录权限
3. 在主机上运行tftp 192.168.2.20 (192.168.2.20是arm linux板的ip)
4. 在tftp里输入:
get /tftpboot/a.txt //从arm linux板子下载 a.txt文件
put a.txt /tftpboot/b.txt //上传a.txt 到arm linux板子的tftpboot目录下并命名为b.txt
4. 注意:
其实上面的步骤看起来很简单,但是实际调试时还是很麻烦的,这里有几点要注意的是
1. 在主机上运行tftp时可以使用trace命令把执行的过程打印出来
2. 在arm linux板子上把syslogd启动起来,这样就可以通过/var/log/message查看到log记录。 这样调试起来就很容易定位故障信息了。
20100316 : 测试方法
1. 在winxp的cmd窗口运行: tftp -i 192.168.2.177 put c:rr.log /bin/rr.log
可以把c盘的rr.log 传到.177 arm板子上的bin目录下
2. tftp -i 192.168.2.177 get /bin/a.txt
从.177 arm板的bin目录下载a.txt到winxp