在存储领域对于数据卸载有很多种方式,比如通过高速GTX接口流模式卸载,或者通过网络卸载数据,通过网络卸载数据可以开发上位机定制化卸载数据,但是开发上位机软件比较麻烦,以及需要安装软件,软件容易出现BUG等诸多问题,这篇文章分享通过自定义文件系统管理数据,并且通过windos自带的nfs客户端卸载存储板卡中的数据,windos端通过nfs映射磁盘到共享文件夹,用户看到的储存板卡存储空间就像看电脑本地磁盘一样方便,这种方式安全可靠,不需要专门定制客户端,并且具有通用性。

       读者都知道,对于SSD盘来说,顺序读写速度远远大于随机读写,如果采用标准文件系统,对于循环记录时间过久后,离散的SSD扇区会很多,那么随机读写占比很高,所以存储效率会大大降低,所以对于定制化存储开发,尽量自定义文件系统,采用顺序读写方式读写SSD盘来存储数据,这里作者分享一种比较简单的方式,就是将多个LBA扇区组合成Block块进行管理,每个文件由多个Block块组成,将Block块分为已经被使用和未被使用,当需要写新文件时,就去空闲的Block块队列申请Block地址,当需要删除某个文件时就将Block地址存放到空闲的Block块队列中,这里需要注意,因为存储删除文件的情况,那么一个文件占用的Block块可能是离散的,需要读者自行定义算法去管理,文件与Block块对应关系如下图所示。

nfs 误删 文件 怎么恢复 .nfs文件怎么删除_NFS卸载定义数据

       上图的算法读者可以自定研究,其实也不是很复杂,这里读者可以参考AVL二叉树算法,这样在查找时效率很高,用AVL树+Hash效率是最高的,千万不要傻到用遍历思想去做,不管做哪方面的软件开发工作,算法思想一定要具备。自定义文件系统按照常规操作是不能对接标准文件系统,所以在内核态驱动将自定义文件系统对接到标准文件系统,然后按照标准做法挂载nfs网络文件系统。我通过NFS映射自定义文件系统访问SSD磁盘显示如下所示。

nfs 误删 文件 怎么恢复 .nfs文件怎么删除_NFS共享_02

        在windos界面我们看到了SSD磁盘上自定义的文件系统,在这里支持数据卸载,删除,重命名,查看文件属性等操作,这里不支持编辑操作,因为对于大数据存储来说编辑功能没得实际意义,如果客户有需要也是可以实现编辑功能。千兆网数据卸载速率为85MB/s,如果通过上位机卸载磁盘数据,TCP协议下数据卸载速率可以到达105MB/s,这些数据都是作者实测数据(千兆网速度计算1Gb=1000*1000*1000/8/1024/1024=119MB/s,抛开协议开销,理论值可以到达113MB),windos网络共享方式访问磁盘优点确实很多,这种方式自定义文件系统实现难度,作者最开始研究这个功能是在Vxworks平台,反正折腾了大半个月才搞定,后期作者在linux平台也完成了该功能。

       同样也可以自定义上位机软件进行数据卸载,上位机还可以实现常规的人机交互,上位机参考界面如下如所示。

nfs 误删 文件 怎么恢复 .nfs文件怎么删除_NFS共享_03

        自定文件系统只有在存储领域才会有应用场景,所以网上资料比较少,读者可以研究linux vfs文件系统结构,在vfs下构造假的文件系统接口就可以实现自定义数据到标准文件系统的转换,读者可以深入了解一下linux内核文件系统,内存管理模块和驱动模块,这几个模块的算法比较经典,对于写其他软件有很大的参考价值。现在linux5.x内核版本已经开始支持PCIe Switch P2P模式了,所以说linux内核是真的强大,真的是学无止境。

这里分享一种简易式的文件系统,我们整个磁盘空间最小单位是扇区。它以512字节为单位划分为虚拟的块。第一块的序号为0。

nfs 误删 文件 怎么恢复 .nfs文件怎么删除_nfs 误删 文件 怎么恢复_04

 超级块映射到block0,存储结构如下所示。

struct sb{     
     long fs_size; //size of file system, in blocks  
     long first_blk; //first block of root directory                                       
     long bitmap; //size of bitmap, in blocks                                                               
};

大小

名字

描述

4

大小

文件系统的大小,以块为单位

4

根目录

根目录的起始块的序号

4

位图块

位图块的数量,以块为单位

500

位图块:

位图块的每一位,标记文件系统某一块的使用与否。如果被使用,设为1,否则为0。

位图块的第0字节第0位标识块0,依次类推。

位图块的数量 = 文件系统的块数/ (512字节*8)

数据块:存放数据(目录或文件)

struct u_fs_disk_block {

   size_t size;     // how many bytes are being used in this block
   long nNextBlock; //The next disk block, if needed. This is the              
                       //next pointer in the linked allocation list
     char data[MAX_DATA_IN_BLOCK];//And all the rest of the space in                         

};

数据块的结构:

大小

名字

描述

4

大小

此数据块被使用的字节。

4

下一块

文件的下一数据块的序号。若无,则设为-1

504

数据

存放数据。

目录:对于目录所在的数据块,在数据部分会存储一连串的u_fs_directory记录。记录条数不限。

struct u_fs_file_directory {

char fname[MAX_FILENAME + 1];  //filename (plus space for nul)

char fext[MAX_EXTENSION + 1];  //extension (plus space for nul)

size_t fsize;                 //file size

long nStartBlock;             //where the first block is on disk

int flag;

//indicate type of file. 0:for unused; 1:for file; 2:for directory

};