在struct inode中存储一些数据

时间:2012-03-05 13:33:12

标签: linux filesystems linux-kernel kernel inode

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

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

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

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

我还在考虑利用修改时间。我可以救一个 修改时间。如果较旧的修改时间在那之前,那么只有 创建副本,否则我不会做任何事情。我试着使用inode.i_mtime 为此,即使在调用write之前,它也是修改过的时间 应用程序可以修改该时间。

所以我想在磁盘上的inode中存储一些值来表示它 备份是否已创建。那可能吗?任何其他建议或 方法很受欢迎。

2 个答案:

答案 0 :(得分:0)

您实际上是在说要进行写时复制虚拟文件系统层。

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

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

如果你真的坚持在内核中做这些事情,你将会有更多的工作,因为从内核模式访问元数据需要花费更多的精力(你很可能想要模拟自己的数据库)使用内存映射文件,以便最大限度地减少“userland(样式)”所需的工作量,并使相对容易以确保原子性和可靠性 1


1 How Everybody Gets File IO Wrong: see also here

答案 1 :(得分:0)

您可以使用atime代替mtime。在这种情况下,在inode上设置S_NOATIME标志会阻止它更新(请参阅touch_atime()处的inode.c函数)。您唯一需要的是使用noatime选项挂载文件系统。