如何修改 ext 文件系统的 wtime

如何修改 ext 文件系统的 wtime

如何修改 ext 文件系统的超级块,以便设置字段wtime(上次写入时间)

我已经尝试过使用 debugfs:

debugfs 1.42.9 (4-Feb-2014)
debugfs:  open /dev/sdd2 -w
debugfs:  ssv wtime "@0x64000000"
debugfs:  show_super_stats -h
debugfs:  close

当我关闭文件系统时时间设置为当前系统时间。

显然我不想改变系统时间,以便时间在文件系统关闭时设置,然后恢复我的系统时间。

我的第二个想法是,我可以用十六进制编辑器来改变它,但我几乎可以肯定超级块有一个通过超级块计算并验证的校验和。

答案1

挖掘我们软件的源代码并不是魔鬼的行为。我研究了一下他们,发现了以下结果:

  1. Debugfs 位于 e2fsprogs 包中。
  2. E2fsprogs 还包含 libext2 库,它是处理所有 ext2 操作的通用库。
  3. 当我们看到e2fsprogs 的源代码,通过一些 grep,我们可以很容易地找到关闭文件系统命令。
  4. 我们可以看到,这个调用会调用ext2_close_free()libext2fs 源代码中已有的 always ,这里
  5. 在命名函数中我们可以看到wtime 的更新ext2fs_close_free()呼叫ext2fs_close2(),哪个呼叫ext2fs_close(),哪个呼叫ext2fs_flush2(),哪个呼叫ext2fs_flush()
  6. 我们在这个函数中可以看到,wtime字段会一直更新,没有例外。

但是:您可以在源代码中轻松禁用此功能。如果您再次来这里,我会向您解释如何操作。

Ps 是的,ext2 超级块中有一个校验和,它是由 crc32c 生成的,这是一个复杂的算法。

答案2

在我读了 Peter Horvath 的回答之后。我查看了资料来源,正如他指出的那样这里 ext2fs_flush2写入此字段,实际代码如下:

fs->super->s_wtime = fs->now ? fs->now : time(NULL);

我搜索了此问题的来源fs->now,发现它是由do_set_current_time。我以为我上次已经尝试过了,但我又试了一次。实际上,下面的代码完成了这项工作。

debugfs:  open /dev/sdb2 -w
debugfs:  ssv mtime "@0x64000000"
debugfs:  set_current_time "@0x64000000"
Setting current time to Thu Mar  2 01:46:40 2023

debugfs:  close

wtime编辑:如果你想要更新,你应该触摸超级块。你不能将 0 设置为你的当前时间

答案3

出色地,可能用户空间是解决方案,你可以尝试 fuse-ext2

主页:http://view-os.sourceforge.net

相关内容