在struct inode中存储一些数据

gau*_*rav 5 linux filesystems kernel inode linux-kernel

您好,我是内核编程的新手.我正在编写一个基于wrapfs模板的小内核模块来实现备份机制.这纯粹是为了学习的基础.

我正在扩展wrapfs,以便在进行write调用时,wrapfs透明地在单独的目录中创建该文件的副本,然后对该文件执行write.但我不希望我为每次写入调用创建一个副本.

一个天真的方法可能是我检查该目录中是否存在文件.但我认为,对于每次通话检查,这可能是一个严重的惩罚.

我还可以检查第一次写入调用,然后使用private_data属性存储该特定文件的值.但那不会存储在磁盘上.所以我需要再次检查一下.

我也在考虑利用修改时间.我可以节省修改时间.如果较旧的修改时间早于该时间,那么只创建一个副本,否则我将不会做任何事情.我尝试使用inode.i_mtime,但即使在调用write之前它也是修改过的时间,应用程序也可以修改那个时间.

所以我想在磁盘上的inode中存储一些值,表明它已经创建了备份.那可能吗?欢迎任何其他建议或方法.

seh*_*ehe 0

您实质上是在说您想要执行写入时复制虚拟文件系统层。

IMO,其中一些已经完成,并且在用户空间中实现这些会更容易(例如使用 libfuse 和熔丝模块)。这样,您就可以成为城堡之王,并以您认为合适的任何方式添加元数据:

  • 只需将(隐藏)元数据文件添加到每个目录
  • 使用扩展 POSIX 属性(setfattr 和朋友)
  • 哎呀,你甚至可以使用 sqlite 数据库

如果您真的坚持在内核中执行这些操作,那么您将需要做更多的工作,因为从内核模式访问元数据将花费更多的精力(您很可能希望使用内存映射来模拟您自己的数据库)文件,以最大限度地减少所需的“用户空间(样式)”工作量,并使其相对容易获得正确的原子性和可靠性1


1 关于每个人如何错误地获取文件 IO:另请参阅此处