如何修改ext文件系统的超级块,以便设置字段wtime (最后一次写入时间)?
我尝试过使用调试器:
debugfs 1.42.9 (4-Feb-2014)
debugfs: open /dev/sdd2 -w
debugfs: ssv wtime "@0x64000000"
debugfs: show_super_stats -h
debugfs: close当我关闭文件系统时,wtime被设置为当前的系统时间。
显然,我不想更改系统时间,以便在文件系统关闭时设置wtime,然后恢复我的系统时间。
我的第二个想法是,我可以用十六进制编辑器来修改它,但我几乎可以肯定,超级块有一个校验和,该校验和是在超级块上计算并验证的。
发布于 2014-09-19 07:39:40
在我读过彼得·霍瓦斯的答案之后。我查看了源代码,正如他所指出的,这里 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设置为current_time。
发布于 2014-09-18 14:06:48
挖掘我们软件的源代码不是来自魔鬼。我对他们进行了一些研究,发现了以下结果:
ext2_close_free(),这已经在libext2fs源代码这里中了。ext2fs_close_free() calls ext2fs_close2(),它调用ext2fs_close(),后者调用ext2fs_flush2(),后者调用ext2fs_flush()。wtime字段将始终被更新。也不例外。但是:您可以很容易地在源代码中禁用该功能。如果你再来这里,我会解释给你听。
附注:是的,在ext2超级块中有一个校验和,它是由crc32c生成的,这是一个复杂的算法。
发布于 2014-09-18 13:16:10
嗯,可能是用户空间是解决方案,您可以尝试fuse-ext2 2。
主页:http://view-os.sourceforge.net
https://serverfault.com/questions/629526
复制相似问题