4

我已经使用 FUSE 实现了一个基本的文件系统,实现了所有可预见的 POSIX 功能[当然我什至还没有分析过;)]。目前我能够在常规文件上运行文件系统(st_mode & S_IFREG),但下一步开发是将其托管在实际的块设备上。按原样运行我的代码,st_size在调用fstat设备后立即读取失败。当然,我不希望问题就此止步:

  • 与常规文件相比,在块设备上操作需要哪些更改?
  • 关于性能、限制、特殊功能等,我需要做哪些特别考虑?
  • 是否有处理块特殊文件的教程和参考资料?谷歌搜索几乎没有用处。我只有背景知识(讽刺的是,在我黑暗的过去来自 MSDN)和联机帮助页中的一些少量信息。

更新0

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

2 回答 2

4

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

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

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

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

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

于 2010-12-21T02:43:48.470 回答
2

块设备的行为与文件非常相似—— dd 等工具无需任何特殊处理即可对其进行操作。但是,fstat 返回有关特殊文件节点的信息,而不是它所指的 blockdev。您可能想使用 BLKGETSIZE64 ioctl 来读取大小。

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

于 2010-12-21T06:24:16.987 回答