Действительно, ни fsdb
, ни debugfs
вряд ли подходят для использования с ZFS. Вместо этого вам может понадобиться найти формат архива, который сохранит поле crtime
, которое предположительно уже установлено для файлов на вашем файловом сервере. Если для вашей системы существует версия pax
или другого инструмента архивации, возможно, может это сделать (ср. флаг -pe
"сохранить все" для pax
, который, как кажется, в текущих версиях не сохраняет "все" - то есть не сохраняет crtime
/время_рождения). Скорее всего, вы добьетесь большего успеха, найдя приложение для архивирования, которое «crtime
осведомлено», чем пытаться установить время создания, взломав систему FreeBSD на основе ZFS с помощью того, что, вероятно, будет элементарными инструментами.
Вы можете найти более продвинутые инструменты в системах на базе OpenSolaris, таких как Illumos или SmartOS (например, mdb
). Можно ли перенести ваши данные в набор данных ZFS на одной из этих платформ, а затем, комбинируя имеющиеся у них инструменты, скажем, dtrace
для того, чтобы переписать поля crtime
, является скорее теоретическим вопросом. Если бы это сработало, вы могли бы экспортировать пул и его наборы данных во FreeBSD — экспорт пула, похоже, сохраняет временные метки crtime
. Если вы можете сохранить crtime
при сбросе файловой системы ext4 в набор данных ZFSonLinux на том же хосте (примечание: я не проверял это), вы можете использовать zfs send
для переноса всей файловой системы на ваш NAS.
Этот отчет об ошибках основных утилит может пролить свет о состоянии инструментов уровня пользователя и операционной системы в Linux. Возможно, поле crtime
уровня файловой системы индексного дескриптора должно измениться с трудом. В то время как ZFS в FreeBSD "поддерживает" crtime
, состояние низкоуровневых инструментов отладки файловой системы во FreeBSD могло отставать от более ранних выпусков (c.f. zdb
страницу руководства). Вы уверены, что хотите «установить» (или сбросить) время создания inode? Или вы хотите сохранить их после того, как они были установлены в системе, которая их уже поддерживает?
В системе FreeBSD, если вы stat
храните файл в наборе данных ZFS, вы часто будете замечать, что поле crtime
файла установлено на то же время, что и поле ctime
. Вероятно, это связано с тем, что приложение, создавшее файл, не имело доступа к библиотеке и функциям ядра, необходимым для установки crtime
, во время «рождения» файла и создания его записей inode. Есть примеры приложений/библиотек, которые пытаются сохранить crtime
на уровне приложения, например libarchive(3)
(см. также: archive_entry_atime(3)
) и корректно обрабатывать создание inode если архив восстанавливается на файловой системе, не поддерживающей поле crtime
. Но это может быть неактуально в вашем случае.
Как вы можете себе представить, существует множество приложений, которые записывают файлы в файловые системы... особенно в системах Unix/POSIX, где "все является файлом". Я не уверен, нужно ли модифицировать или перекомпилировать старые приложения для поддержки этих полей, или они будут прозрачно извлекать их из библиотек C хост-системы. Приложения, используемые в более старых выпусках FreeBSD или в системе Linux без ext4, можно заставить работать в режиме совместимости, например, с обновленной ОС, но будут ли они правильно обрабатывать поля времени — хороший вопрос.
Для меня запуск этого небольшого скрипта как sh birthtime_test
подтверждает, что время создания файлов «включено» в моих системах FreeBSD (все из которых используют сообщение ZFS v28
т.е. с флагами функций):
#!/bin/sh
#birthtime_test
uname -r
if [ -f new_born ] ; then rm -f new_born ; fi
touch new_born
sleep 3
touch -a new_born
sleep 3
echo "Hello from new_born at:" >> new_born
echo `date` >> new_born
sleep 3
chmod o+w new_born
stat -f "Name:%t%N
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm
Change:%t%Sc" new_born
cat new_born
Вывод:
9.2-RELEASE-p10
Name: new_born
Born: May 7 12:38:35 2015
Access: May 7 12:38:38 2015
Modify: May 7 12:38:41 2015
Change: May 7 12:38:44 2015
Hello from new_born at:
Thu May 7 12:38:41 EDT 2015
(Примечание: операция chmod
"изменяет", но не "модифицирует" содержимое файла - это то, что делает команда echo
, добавляя содержимое в файл. См. справочную страницу touch
для объяснения флагов -m
и -a
).
Это самый старый выпуск FreeBSD, к которому у меня есть доступ прямо сейчас. Мне было бы любопытно узнать, насколько далеко назад в цикле выпуска FreeBSD может справиться с этим (в файловых системах ZFS или UFS2). Я почти уверен, что эта функция существует уже довольно давно. Существуют также версии ZFS для OSX и Linux, о которых было бы полезно знать в отношении этой функции.
Еще кое-что...
Вот особенно приятная функция для простой «криминалистики». Скажем, мы хотим отправить наш файл new_born
в то время, когда началось время, назад в високосную секунду, которой никогда не было, и когда - в момент вневременного времени - родился Unix... :-) 1 сильный>. Мы можем просто изменить дату, используя touch -d
, и все будут думать, что new_born
старый и мудрый, верно?
Нет:
~/ % touch -d "1970-01-01T00:00:01" new_born
~/ % stat -f "Name:%t%N
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm
Change:%t%Sc" new_born
Name: new_born
Born: May 7 12:38:35 2015
Access: Jan 1 00:00:01 1970
Modify: Jan 1 00:00:01 1970
Change: May 7 13:29:37 2015
Всегда правдивее быть настолько молодым, насколько ты выглядишь :-)
Время и Unix — тема и практическая, и поэтическая: в конце концов, что такое «изменение»; и что значит "изменить" или "создать" что-то? Спасибо за ваш отличный пост, Сильвио - я надеюсь, что он будет жить и собирать полезные ответы.
Вы можете улучшить и обобщить свой вопрос, если сможете более конкретно указать свои требования к сохранению, настройке и архивации полей временных меток файлов. Не поймите меня неправильно: это очень хороший вопрос, и он еще долго будет собирать голоса.
Вы можете взглянуть на презентацию Дилана Ли Криминалистический анализ меток времени ZFS или даже свяжитесь с Диланом, чтобы узнать, как получить доступ к crftime
информации.
[1] В начале существовала легенда, которая утверждала, что количество секунд с тех пор, как давным-давно (SSL) назад, никогда не было меньше date -u -j -f "%Y-%m-%d:%T" "1970-01-01:00:00:01" "+%s"
из-за високосной секунды...
person
G. Cito
schedule
05.05.2015
rsync -t
crtime
полей? Я предполагаю, чтоrsync -a
является флагом для архивного сохранения всего возможного (например,pax -pe
), поэтому, вероятно, вы исследовали этот путь. - person G. Cito   schedule 07.05.2015crtime
, а затем просто скопировать во FreeBSD и ZFS? ... хм, ой, подождите: похоже, что утилиты FreeBSD (cp
,tar
, и т. д.) не поддерживают сохранениеcrtime
. - person G. Cito   schedule 08.05.2015