您好我是内核编程的新手。我正在编写一个小内核模块 这是基于wrapfs模板来实现备份机制。这是 纯粹是为了学习的基础。
我正在扩展wrapfs,以便在写入调用时使wrapfs透明 在单独的目录中创建该文件的副本,然后执行写入 在文件上。但我不希望我为每次写入调用创建一个副本。
一种天真的方法可能是我检查该目录中是否存在文件。但 我认为对于每次通话检查,这可能是一个严重的惩罚。
我还可以检查第一次写入调用,然后为其存储一个值 使用private_data属性的特定文件。但那不会存储 磁盘。所以我需要再次检查一下。
我还在考虑利用修改时间。我可以救一个 修改时间。如果较旧的修改时间在那之前,那么只有 创建副本,否则我不会做任何事情。我试着使用inode.i_mtime 为此,即使在调用write之前,它也是修改过的时间 应用程序可以修改该时间。
所以我想在磁盘上的inode中存储一些值来表示它 备份是否已创建。那可能吗?任何其他建议或 方法很受欢迎。
答案 0 :(得分:0)
您实际上是在说要进行写时复制虚拟文件系统层。
IMO,其中一些已经完成,并且在用户空间(使用libfuse和保险丝模块,例如)实现这些将更容易。这样,您就可以成为城堡的王者,并以您认为合适的方式添加元数据:
如果你真的坚持在内核中做这些事情,你将会有更多的工作,因为从内核模式访问元数据需要花费更多的精力(你很可能想要模拟自己的数据库)使用内存映射文件,以便最大限度地减少“userland(样式)”所需的工作量,并使相对容易以确保原子性和可靠性 1 。
答案 1 :(得分:0)
您可以使用atime
代替mtime
。在这种情况下,在inode上设置S_NOATIME
标志会阻止它更新(请参阅touch_atime()
处的inode.c
函数)。您唯一需要的是使用noatime
选项挂载文件系统。