我使用FUSE实现了basic filesystem,实现了所有可预见的POSIX功能[自然我甚至还没有进行过分析;)].目前我能够在常规文件(st_mode & S_IFREG)
上运行文件系统,但开发的下一步是将其托管在实际的块设备上.按原样运行我的代码,在设备上调用fstat
后立即读取st_size失败.当然我不希望问题停在那里:
>与常规文件相比,在块设备上运行需要进行哪些更改?
>在性能,限制,特殊功能等方面,我需要做些哪些特殊考虑?
>有没有处理块特殊文件的教程和参考?谷歌搜索已经变得非常有用;我只有背景知识(具有讽刺意味的是,在我黑暗的过去,来自MSDN)以及联机帮助页中的一些信息.
Update0
>我已经通过“常规文件”指出了我的意思.
>我不想专注于获取设备大小,我想要了解常规文件和设备文件之间在性能和使用方面的差异的一般指导原则.
解决方法:
Currently I’m able to run the
filesystem on a regularly file, but
the next step in development is to
host it on an actual block device
我不完全理解你的意思 – 我假设你说“你目前将文件系统数据保存到正常安装的文件系统上的普通文件中 – 但现在希望使用原始块设备进行数据存储”.
如果是这样 – 做了几次 – 我会建议如下:
>永远不要为文件系统使用“实际”块设备.始终使用分区.您可以使用几种很少使用的分区类型来表示这样的文件系统可能是您的文件系统类型,并且文件系统可以检查并安装它(如果是这样).因此,您将永远不会在“/ dev / sdb”之类的东西上运行,而是将数据存储在/ dev / sdb1之类的数据上,并为其分配一些分区类型.这具有明显的优势,例如允许您的文件系统作为另一个文件系统共存于单个物理磁盘上,等等.
>如果要在文件系统中实现任何缓存(例如Linux使用页面缓存),请使用O_DIRECT对块设备执行所有I / O操作.这要求您传递页面全部内存以执行所有I / O,并要求请求扇区/块对齐 – 但将删除数据副本,否则当数据从块设备移动到页面缓存时需要该数据副本,然后从页面缓存到用户空间[filesystem]阅读器.
fstat“失败”是什么意思?这是一个尝试确定块设备长度的fstat?你收到错误了吗?它是什么?