Как я могу изменить wtime файловой системы ext

Как я могу изменить суперблок файловой системы 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

Когда я закрываю файловую систему, wtime устанавливается на текущее системное время.

Очевидно, что я не хочу изменять системное время, чтобы установить время wtime при закрытии файловой системы, а затем вернуть системное время.

Вторая мысль заключалась в том, что я могу изменить его с помощью hexeditor, но я почти уверен, что у суперблока есть контрольная сумма, которая рассчитывается по суперблоку и проверяется.

3 ответа

Решение

После того, как я прочитал ответ Питера Хорват. Я посмотрел в источниках и как он указал здесь 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, с некоторыми greps мы можем очень легко найти в нем точку команды close_filesys.
  4. Мы видим, что этот звонок всегда ext2_close_free(), который уже находится в исходном коде libext2fs, здесь.
  5. В названной функции мы можем видеть обновления wtime: ext2fs_close_free() звонки ext2fs_close2(), который вызывает ext2fs_close(), который вызывает ext2fs_flush2(), который вызывает ext2fs_flush(),
  6. Как мы видим в этой функции, wtime поле будет всегда обновляться. Здесь нет исключений.

Но: вы можете легко отключить это в исходном коде. Если вы придете сюда снова, я объясню вам, как.

Да, есть контрольная сумма в суперблоке ext2, и она генерируется crc32c, который является сложным алгоритмом.

Ну, возможно, пользовательское пространство - это решение, вы можете попробовать fuse-ext2

Домашняя страница: http://view-os.sourceforge.net/

Другие вопросы по тегам