使用块特殊文件/设备来实现文件系统

时间:2010-09-02 15:32:33

标签: c linux filesystems fuse block-device

我使用FUSE实现了basic filesystem,实现了所有可预见的POSIX功能[自然我甚至还没有进行过分析;)]。目前我能够在常规文件(st_mode & S_IFREG)上运行文件系统,但开发的下一步是将其托管在实际的块设备上。按原样运行我的代码,在设备上调用fstat后立即无法读取st_size。当然,我不认为问题会在那里停止:

  • 与普通文件相比,对块设备进行哪些操作需要进行哪些更改?
  • 在性能,限制,特殊功能等方面我需要做些哪些特殊考虑?
  • 是否有处理块特殊文件的教程和参考?谷歌搜索已经变得非常有用;我只有背景知识(具有讽刺意味的是,在我黑暗的过去,来自MSDN)以及联机帮助页中的一些信息。

Update0

  • 我已经用“常规文件”指出了我的意思。
  • 我不想专注于获取设备大小,我想要了解常规文件和设备文件在性能和使用方面的差异的一般指导原则。

2 个答案:

答案 0 :(得分:4)

  

目前我可以运行了   文件系统在常规文件上,但是   开发的下一步是   将其托管在实际的块设备上

我不完全理解你的意思 - 我假设你说“你目前将文件系统数据保存到正常安装的文件系统上的普通文件中 - 但现在希望使用原始块设备进行数据存储”

如果是这样 - 做了几次 - 我会建议如下:

  • 永远不要为您的文件系统使用“实际”块设备。始终使用分区。您可以使用几种很少使用的分区类型来表示这样的文件系统可能是您的文件系统类型,并且文件系统可以检查并安装它(如果是这样的话)。因此,您将永远不会在“/ dev / sdb”之类的东西上运行,而是将数据存储在/ dev / sdb1之类的数据上,并为其分配一些分区类型。这具有明显的优势,例如允许您的文件系统与另一个文件系统共存在一个物理磁盘上,等等。
  • 如果要在文件系统中实现任何缓存(例如Linux使用页面缓存),请使用O_DIRECT对块设备执行所有I / O操作。这要求您传递页面全部内存以执行所有I / O,并要求请求扇区/块对齐 - 但将删除数据副本,否则当数据从块设备移动到页面缓存时需要该数据副本,然后从页面缓存到用户空间[文件系统]阅读器。

fstat“失败”是什么意思?这是一个尝试确定块设备长度的fstat?你收到错误了吗?它是什么?

答案 1 :(得分:2)

块设备的行为与文件非常相似 - 像dd这样的工具可以对它们进行操作而无需任何特殊处理。但是,fstat返回有关特殊文件节点的信息,而不是它引用的blockdev。你可能想用BLKGETSIZE64 ioctl读取大小。

没有特别的理由在原始设备上使用分区,但是blockdev是一个blockdev。假设您的工作负载不会产生重复访问,O_DIRECT也很好。不要将它与确保文件系统的持久性和原子性的真实协议混淆(fsync,barrier等)。