Linux 在结构索引节点中存储一些数据

Linux 在结构索引节点中存储一些数据,linux,filesystems,linux-kernel,kernel,inode,Linux,Filesystems,Linux Kernel,Kernel,Inode,你好,我是内核编程的新手。我正在写一个小的内核模块 即基于wrapfs模板实现一种备份机制。这是 纯粹是为了学习基础 我正在扩展wrapfs,以便在写入调用时wrapfs是透明的 在单独的目录中创建该文件的副本,然后执行写操作 在档案上。但我不想为每次写呼叫创建一个副本 一种简单的方法是检查该目录中是否存在文件。但是 我认为每次打电话检查都会受到严厉的惩罚 我还可以检查第一次写调用,然后为其存储一个值 使用私有数据属性的特定文件。但这不会存储在计算机上 磁盘。所以我需要再检查一遍 我也在考虑利用

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

我正在扩展wrapfs,以便在写入调用时wrapfs是透明的 在单独的目录中创建该文件的副本,然后执行写操作 在档案上。但我不想为每次写呼叫创建一个副本

一种简单的方法是检查该目录中是否存在文件。但是 我认为每次打电话检查都会受到严厉的惩罚

我还可以检查第一次写调用,然后为其存储一个值 使用私有数据属性的特定文件。但这不会存储在计算机上 磁盘。所以我需要再检查一遍

我也在考虑利用修改时间。我可以省下一笔钱 修改时间。如果较旧的修改时间早于该时间,则仅 创建一个副本,否则我什么都不做。我试图使用inode.I\u mtime 对于这一点,但即使在调用write之前,也是经过修改的时间 应用程序可以修改该时间

所以我想在磁盘上的inode中存储一些值,以指示其 备份是否已创建。可能吗?还有其他建议或建议吗
这种方法是受欢迎的。

您实际上是说您希望在写虚拟文件系统层上进行复制

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

  • 只需将(隐藏的)元数据文件添加到每个目录
  • 使用扩展POSIX属性(setfattr和friends)
  • 见鬼,你甚至可以使用sqlite数据库
如果您真的坚持在内核中执行这些操作,那么您将有更多的工作要做,因为从内核模式访问元数据将花费更多的精力(您很可能希望使用内存映射文件模拟您自己的数据库,以便将“userland(style)”的数量降至最低“所需的工作,并使其相对容易获得原子性和可靠性的权利1


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

格式化您的blob有助于让您的问题被阅读。谢谢您的回答。我会看看使用fuse。但实际上我是从使用wrapfs开始的。我已将取消链接的代码更改为调用rename而不是unlink,因此如果有什么我可以像操纵任何struct inode属性一样来满足我的需求needs@liya:为什么我不能使用mtime?但使用atime的问题是,如果读取文件,它将被修改,因此这将是这种方法的一个问题。@gaurav:我明白了,但我不明白为什么atime有效而mtime无效。低FS的atime也不会改变吗?