ftp/nfs卸载自定义文件系统数据

在存储领域对于数据卸载有很多种方式,比如通过高速GTX接口流模式卸载,或者通过网络卸载数据,通过网络卸载数据可以开发上位机定制化卸载数据,但是开发上位机软件比较麻烦,以及需要安装软件,软件容易出现BUG等诸多问题,这篇文章分享通过自定义文件系统管理数据,并且通过自带的nfs客户端卸载存储板卡中的数据,端通过nfs映射磁盘到共享文件夹,用户看到的储存板卡存储空间就像看电脑本地磁盘一样方便,这种方式安全可靠,不需要专门定制客户端,并且具有通用性 。
读者都知道,对于SSD盘来说,顺序读写速度远远大于随机读写,如果采用标准文件系统,对于循环记录时间过久后,离散的SSD扇区会很多,那么随机读写占比很高,所以存储效率会大大降低,所以对于定制化存储开发,尽量自定义文件系统,采用顺序读写方式读写SSD盘来存储数据,这里作者分享一种比较简单的方式,就是将多个LBA扇区组合成Block块进行管理,每个文件由多个Block块组成,将Block块分为已经被使用和未被使用,当需要写新文件时,就去空闲的Block块队列申请Block地址,当需要删除某个文件时就将Block地址存放到空闲的Block块队列中,这里需要注意,因为存储删除文件的情况,那么一个文件占用的Block块可能是离散的,需要读者自行定义算法去管理,文件与Block块对应关系如下图所示 。
上图的算法读者可以自定研究,其实也不是很复杂,这里读者可以参考AVL二叉树算法,这样在查找时效率很高,用AVL树+Hash效率是最高的,千万不要傻到用遍历思想去做,不管做哪方面的软件开发工作,算法思想一定要具备 。自定义文件系统按照常规操作是不能对接标准文件系统,所以在内核态驱动将自定义文件系统对接到标准文件系统,然后按照标准做法挂载nfs网络文件系统 。我通过NFS映射自定义文件系统访问SSD磁盘显示如下所示 。
在界面我们看到了SSD磁盘上自定义的文件系统,在这里支持数据卸载,删除,重命名,查看文件属性等操作,这里不支持编辑操作,因为对于大数据存储来说编辑功能没得实际意义,如果客户有需要也是可以实现编辑功能 。千兆网数据卸载速率为85MB/s,如果通过上位机卸载磁盘数据,TCP协议下数据卸载速率可以到达105MB/s,这些数据都是作者实测数据(千兆网速度计算1Gb=1000*1000*1000/8/1024/1024=119MB/s,抛开协议开销,理论值可以到达113MB),网络共享方式访问磁盘优点确实很多,这种方式自定义文件系统实现难度,作者最开始研究这个功能是在平台,反正折腾了大半个月才搞定,后期作者在linux平台也完成了该功能 。
同样也可以自定义上位机软件进行数据卸载,上位机还可以实现常规的人机交互,上位机参考界面如下如所示 。
自定文件系统只有在存储领域才会有应用场景,所以网上资料比较少,读者可以研究linux vfs文件系统结构,在vfs下构造假的文件系统接口就可以实现自定义数据到标准文件系统的转换,读者可以深入了解一下linux内核文件系统,内存管理模块和驱动模块,这几个模块的算法比较经典,对于写其他软件有很大的参考价值 。现在.x内核版本已经开始支持PCIeP2P模式了,所以说linux内核是真的强大,真的是学无止境 。
这里分享一种简易式的文件系统,我们整个磁盘空间最小单位是扇区 。它以512字节为单位划分为虚拟的块 。第一块的序号为0 。
超级块映射到,存储结构如下所示 。
struct sb{long fs_size; //size of file system, in blockslong first_blk; //first block of root directorylong bitmap; //size of bitmap, in blocks};