5

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

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

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

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

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

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

4

2 回答 2

0

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

于 2012-03-05T20:26:46.783 回答
0

您实际上是在说您想做一个 Copy-On-Write 虚拟文件系统层。

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

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

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


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

于 2012-03-05T14:06:01.837 回答