Назад | Перейти на главную страницу

Как я могу изменить 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

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

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

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

После того, как я прочитал ответ Питера Хорват. Я посмотрел в источниках и как он указал Вот 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 как свой Текущее время.

Копаться в исходном коде нашего программного обеспечения не от дьявола. Я немного исследовал их и нашел следующие результаты:

  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 поле всегда будет обновляться. Нет никаких исключений.

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

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

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

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