Filesystems
如何修改 ext 文件系統的 wtime
如何修改 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,然後恢復我的系統時間。
我的第二個想法是我可以用 hexeditor 更改它,但我幾乎可以肯定超級塊有一個校驗和,它是在超級塊上計算並驗證的。
在我閱讀了 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 設置為您的current_time。
探勘我們軟體的原始碼並非來自魔鬼。我對他們進行了一些研究,發現了以下結果:
- Debugfs 在包 e2fsprogs 中。
- E2fsprogs 還包含 libext2 庫,它也是處理所有 ext2 操作操作的通用庫。
- 當我們看到e2fsprogs 的原始碼時,使用一些 grep 我們可以很容易地找到其中的close_filesys命令的要點。
- 我們可以看到,這個呼叫總是呼叫
ext2_close_free()
,它已經在 libext2fs 原始碼中,here。- 在命名函式中我們可以看到wtime 的更新:
ext2fs_close_free()
呼叫ext2fs_close2()
,呼叫ext2fs_close()
,呼叫ext2fs_flush2()
,呼叫ext2fs_flush()
。- 正如我們在這個函式中看到的那樣,該
wtime
欄位將始終更新。也不例外。但是:您可以在原始碼中輕鬆禁用它。如果你再來這裡,我會解釋你,怎麼做。
Ps 是的,ext2 超級塊中有一個校驗和,它是由 crc32c 生成的,這是一個複雜的算法。