Как я могу изменить 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.
Копаться в исходном коде нашего программного обеспечения не от дьявола. Я исследовал их немного и нашел следующие результаты:
- Debugfs находится в пакете e2fsprogs.
- E2fsprogs также содержит библиотеку libext2, которая также является общей библиотекой для обработки всех операций с ext2.
- Когда мы видим исходный код e2fsprogs, с некоторыми greps мы можем очень легко найти в нем точку команды close_filesys.
- Мы видим, что этот звонок всегда
ext2_close_free()
, который уже находится в исходном коде libext2fs, здесь. - В названной функции мы можем видеть обновления wtime:
ext2fs_close_free()
звонкиext2fs_close2()
, который вызываетext2fs_close()
, который вызываетext2fs_flush2()
, который вызываетext2fs_flush()
, - Как мы видим в этой функции,
wtime
поле будет всегда обновляться. Здесь нет исключений.
Но: вы можете легко отключить это в исходном коде. Если вы придете сюда снова, я объясню вам, как.
Да, есть контрольная сумма в суперблоке ext2, и она генерируется crc32c, который является сложным алгоритмом.
Ну, возможно, пользовательское пространство - это решение, вы можете попробовать fuse-ext2
Домашняя страница: http://view-os.sourceforge.net/