在struct inode中存储一些数据
Posted
技术标签:
【中文标题】在struct inode中存储一些数据【英文标题】:store some data in the struct inode 【发布时间】:2012-03-22 23:25:04 【问题描述】:您好,我是内核编程的新手。我正在写一个小内核模块 即基于 wrapfs 模板来实现备份机制。这是 纯粹作为学习基础。
我正在扩展 wrapfs,以便在进行 write 调用时透明地进行 wrapfs 在单独的目录中复制该文件,然后执行写入 文件上。但我不想为每个写调用创建一个副本。
一种天真的方法可能是我检查该目录中是否存在文件。但 我认为对于每个呼叫检查,这可能是一个严重的惩罚。
我还可以检查第一次写入调用,然后为它存储一个值 使用 private_data 属性的特定文件。但这不会存储在 磁盘。所以我需要再次检查。
我也在考虑利用修改时间。我可以保存一个 修改时间。如果旧的修改时间在那个时间之前,那么只有 创建一个副本,否则我不会做任何事情。我尝试使用 inode.i_mtime 为此,但它甚至是在调用 write 之前的修改时间,也是 应用程序可以修改该时间。
所以我正在考虑在磁盘上的 inode 中存储一些值,以表明它的 备份是否已创建。那可能吗?任何其他建议或 欢迎使用方法。
【问题讨论】:
格式化您的 blob 对让您的问题阅读大有帮助。 【参考方案1】:您实际上是在说您想做一个 Copy-On-Write 虚拟文件系统层。
IMO,其中一些已经完成,并且在用户空间中实现这些会更容易(例如使用 libfuse 和 fuse 模块)。这样,您就可以成为城堡之王,并以您认为合适的任何方式添加元数据:
只需向每个目录添加(隐藏)元数据文件 使用扩展的 POSIX 属性(setfattr 和朋友) 哎呀,你甚至可以使用 sqlite 数据库如果你真的坚持在内核中做这些事情,你将需要做更多的工作,因为从内核模式访问元数据会花费更多的精力(你很可能想要模拟自己的数据库使用内存映射文件以最大限度地减少所需的“用户空间(样式)”工作量,并使相对容易获得正确的原子性和可靠性1。
1 在How Everybody Gets File IO Wrong: see also here
【讨论】:
感谢您的回复。我会看看使用保险丝。但实际上我已经开始使用 wrapfs。我已将取消链接代码更改为调用重命名而不是取消链接,所以如果我可以做一些事情,比如操作任何结构 inode 属性以满足我的需要【参考方案2】:您可以使用atime
代替mtime
。在这种情况下,在 inode 上设置 S_NOATIME
标志会阻止它更新(请参阅 inode.c
处的 touch_atime()
函数)。您唯一需要做的就是使用 noatime
选项挂载文件系统。
【讨论】:
@liya : 为什么我不能使用 mtime ?但是使用 atime 的问题是,如果文件被读取,它会被修改,所以这将是这种方法的问题。 @gaurav:使用noatime
挂载选项没有atime
访问更新。
哦,我看到了不错的选择,但我不明白为什么 atime 有效而 mtime 无效。 FS较低的时间也不会改变吗?以上是关于在struct inode中存储一些数据的主要内容,如果未能解决你的问题,请参考以下文章