NFS

NFS是Network File System(网络文件系统)的简称。NFS允许一个系统在网络上与他人共享目录和文件。通过NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。NFS可以加速程序的开发调试,在嵌入式系统中应用十分广泛。

NFS主要由部分组成:一台服务器和一台或多台客户机。客户机远程访问存放在服务器上的资源。

PC上运行NFS server程序,运行RT-Thread的嵌入式系统做NFS Client,可以将PC上的目录通过以太网络挂载到RT-Thread中。

RT-Thread中使用NFS

NFS通过以太网实现数据传输,因此要想在RT-Thread中使用NFS,需要一些基本条件:

  • 开发板硬件带有以太网支持
  • 以太网驱动测试通过,可以在RT-Thread中正确运行Lwip
    当具备这两个条件,我们就可以在RT-Thread上使用NFS了。

主机配置

Windows上可以使用FreeNFS搭建一个简单的NFS Server。下载FreeNFS

双击即可运行。运行以后,程序会在系统托盘中,右击选择setting,可以主机的目录(如下)

  1. C:\Users\Administrator\Documents\FreeNFS

被作为共享目录,读者可以根据需要修改此路径。

开发板配置

需要在rtconfig.h中开DFS以及LWIP,并根据开发板的网络环境修改网络配置,并确保PC机与开发板可以正常ping通。

  1. #define RT_USING_LWIP
  2.  
  3. #define RT_LWIP_IPADDR0 192
  4. #define RT_LWIP_IPADDR1 168
  5. #define RT_LWIP_IPADDR2 1
  6. #define RT_LWIP_IPADDR3 30
  7.  
  8. /* gateway address of target*/
  9. #define RT_LWIP_GWADDR0 192
  10. #define RT_LWIP_GWADDR1 168
  11. #define RT_LWIP_GWADDR2 1
  12. #define RT_LWIP_GWADDR3 1
  13.  
  14. /* mask address of target*/
  15. #define RT_LWIP_MSKADDR0 255
  16. #define RT_LWIP_MSKADDR1 255
  17. #define RT_LWIP_MSKADDR2 255
  18. #define RT_LWIP_MSKADDR3 0
  19. #define RT_USING_DFS_NFS

NFS属于DFS组件,因此同样需要打开DFS宏,以及DFS_NFS宏,并配置RT_NFS_HOST_EXPORT宏。

  1. #define RT_USING_DFS
  2. #define RT_USING_DFS_NFS
  3. #define RT_NFS_HOST_EXPORT "192.168.1.2:/"

RT_NFS_HOST_EXPORT宏用于指定NFS Server的ip地址以及共享目录路径。

如果读者使用的bsp中的rtconfig.h中没有上述宏,则需要自己添加上。

NFS相关的启动代码,如下所示(以stmf10x作为参考平台)。

  1. /* LwIP Initialization */
  2. #ifdef RT_USING_LWIP
  3. {
  4. extern void lwip_sys_init(void);
  5.  
  6. /* register ethernetif device */
  7. eth_system_device_init();
  8.  
  9. #ifdef STM32F10X_CL
  10. rt_hw_stm32_eth_init();
  11. #else
  12. /* STM32F103 */
  13. #if STM32_ETH_IF == 0
  14. rt_hw_enc28j60_init();
  15. #elif STM32_ETH_IF == 1
  16. rt_hw_dm9000_init();
  17. #endif
  18. #endif
  19.  
  20. /* re-init device driver */
  21. rt_device_init_all();
  22.  
  23. /* init lwip system */
  24. lwip_sys_init();
  25. rt_kprintf("TCP/IP initialized!\n");
  26. }
  27. #endif
  28.  
  29. #if defined(RT_USING_DFS) && defined(RT_USING_LWIP) && defined(RT_USING_DFS_NFS)
  30. {
  31. /* NFSv3 Initialization */
  32. rt_kprintf("begin init NFSv3 File System ...\n");
  33. nfs_init();
  34.  
  35. if (dfs_mount(RT_NULL, "/", "nfs", 0, RT_NFS_HOST_EXPORT) == 0)
  36. rt_kprintf("NFSv3 File System initialized!\n");
  37. else
  38. rt_kprintf("NFSv3 File System initialzation failed!\n");
  39. }
  40. #endif

上述代码可以分为两部分,第一部分是初始化lwip组件。第二部分包括NFS初始化,以及挂在NFS Server上的共享目录。示例代码中将NFS挂载到了系统根目录下, 读者也可以选择其他文件系统挂在根目录,并将NFS挂载到其他子路径下。

编译烧录程序后,就可以在finsh中使用lsmkdircat等命令操作NFS共享的目录中的文件了。