如何修改 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
挖掘我们软件的源代码并不是魔鬼的行为。我研究了一下他们,发现了以下结果:
- Debugfs 位于 e2fsprogs 包中。
- E2fsprogs 还包含 libext2 库,它是处理所有 ext2 操作的通用库。
- 当我们看到e2fsprogs 的源代码,通过一些 grep,我们可以很容易地找到关闭文件系统命令。
- 我们可以看到,这个调用会调用
ext2_close_free()
libext2fs 源代码中已有的 always ,这里。 - 在命名函数中我们可以看到wtime 的更新:
ext2fs_close_free()
呼叫ext2fs_close2()
,哪个呼叫ext2fs_close()
,哪个呼叫ext2fs_flush2()
,哪个呼叫ext2fs_flush()
。 - 我们在这个函数中可以看到,
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