Filesystems

如何修改 ext 文件系統的 wtime

  • September 19, 2014

如何修改 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

探勘我們軟體的原始碼並非來自魔鬼。我對他們進行了一些研究,發現了以下結果:

  1. Debugfs 在包 e2fsprogs 中。
  2. E2fsprogs 還包含 libext2 庫,它也是處理所有 ext2 操作操作的通用庫。
  3. 當我們看到e2fsprogs 的原始碼時,使用一些 grep 我們可以很容易地找到其中的close_filesys命令的要點。
  4. 我們可以看到,這個呼叫總是呼叫ext2_close_free(),它已經在 libext2fs 原始碼中,here
  5. 在命名函式中我們可以看到wtime 的更新ext2fs_close_free()呼叫ext2fs_close2(),呼叫ext2fs_close(),呼叫ext2fs_flush2(),呼叫ext2fs_flush()
  6. 正如我們在這個函式中看到的那樣,該wtime欄位將始終更新。也不例外。

但是:您可以在原始碼中輕鬆禁用它。如果你再來這裡,我會解釋你,怎麼做。

Ps 是的,ext2 超級塊中有一個校驗和,它是由 crc32c 生成的,這是一個複雜的算法。

引用自:https://serverfault.com/questions/629526