Как установить время создания файла в ZFS?

Я только что получил NAS с ZFS, и я хотел бы сохранить время создания при передаче файлов в него. И linux/ext4 (где сейчас находятся данные), и zfs хранят время создания или время рождения. В случае zfs об этом сообщает даже команда stat. Но я не смог понять, как установить время создания файла, чтобы оно отражало время создания в исходной файловой системе. В отличие от передачи ext4->ext4, где я могу передать debugfs скрипт для установки времени создания файла.

Есть ли инструмент, похожий на debugfs для ZFS?

PS. Чтобы лучше объяснить:

  • У меня есть USB-накопитель, подключенный к ноутбуку Ubuntu 14.04. Он содержит файловую систему, в которой мне важна дата создания (дата рождения) отдельных файлов. Я часто обращаюсь к этим отметкам времени создания, используя сценарий, основанный на debugfs, который сообщает об этом как crtime.

  • Я хочу переместить данные в NAS-сервер с ZFS, но известные мне методы (scp -p -r, rsync -a и tar, среди прочих, которые я пробовал) сохраняют время модификации, но не время создания.

  • Если бы я переходил на другую файловую систему ext4, я бы решил проблему с помощью фантастического инструмента debugfs. В частности, я могу составить список пар (имя файла, crtime) в исходной файловой системе (файловой системе), а затем использовать debugfs -w в целевой файловой системе для чтения сценария со строками формы

    set_inode_field filename crtime <value>

Я проверил это, и это работает просто отлично.

  • Но моя целевая fs не ext4 а ZFS и хотя debugfs работает на целевой машине, она там совершенно бесполезна. Он даже фс не распознает. Другой инструмент отладки, который позволяет вам изменять временные метки, напрямую редактируя индексный дескриптор, — это fsdb; он тоже работает на целевой машине, но опять же я не могу заставить его распознать файловую систему ZFS.

  • Люди, которые продали мне коробку NAS, сказали мне, что debugfs и fsdb не предназначены для файловых систем ZFS, но они не смогли придумать эквивалент. Итак, после долгих поисков и проб я, наконец, решил сегодня опубликовать здесь вопрос, надеясь, что у кого-то может быть ответ.

Я удивлен тем, насколько это тяжело. Вопрос о том, как реплицировать набор данных, чтобы все временные метки были идентичными, кажется вполне естественным с точки зрения архивирования.


person Silvio Levy    schedule 27.04.2015    source источник
comment
Не понимаю, почему это не относится к ошибке сервера.   -  person Jay Kominek    schedule 04.05.2015
comment
Привет Джей, спасибо. Вы предлагаете мне перенести вопрос на serverfault? Если да, то должен ли я дождаться истечения срока вознаграждения, удалить вопрос и опубликовать его на сервере? Я не профессиональный системный администратор, я просто управляю 5 Linux-боксами в своем доме, поэтому задавать вопросы для меня это новая территория.   -  person Silvio Levy    schedule 05.05.2015
comment
Если вы можете удалить его сейчас, я предлагаю сделать это. (Я ожидаю, что вы привлекаете отрицательные голоса вместо близких голосов, поскольку люди не могут голосовать за закрытие, пока есть награда.) Затем попробуйте опубликовать там; Ваш вопрос кажется хорошо сформулированным, и тема должна иметь отношение к их интересам.   -  person Jay Kominek    schedule 05.05.2015
comment
Спасибо. Итак, вы говорите, что отрицательные голоса вызваны тем, что вопрос не по теме. что я бы не догадался из многих других заданных вопросов. На других сайтах SE я принадлежу тому, кто отрицает вопрос, оставляя комментарий, чтобы объяснить, почему, если только вопрос не является полным мусором. Спасибо за вашу помощь.   -  person Silvio Levy    schedule 05.05.2015
comment
Что бы это ни стоило, если решение будет включать сценарии, stackoverflow по-прежнему является подходящим местом для его публикации. +1   -  person too    schedule 06.05.2015
comment
Сохраняет ли rsync -t crtime полей? Я предполагаю, что rsync -a является флагом для архивного сохранения всего возможного (например, pax -pe), поэтому, вероятно, вы исследовали этот путь.   -  person G. Cito    schedule 07.05.2015
comment
Если бы. На странице руководства написано -t: сохранить время модификации. Да, -a для архива и сохраняет mtime (не ctime, atime или crtime), а также разрешения и иерархию. Это супер удобно.   -  person Silvio Levy    schedule 07.05.2015
comment
Можно ли экспортировать файловую систему как общий сетевой ресурс, где поддерживается поле crtime, а затем просто скопировать во FreeBSD и ZFS? ... хм, ой, подождите: похоже, что утилиты FreeBSD (cp, tar, и т. д.) не поддерживают сохранение crtime.   -  person G. Cito    schedule 08.05.2015
comment
Привет Сильвио. Удачи в решении этого? Я предполагаю, что вы недавно прокомментировали это сообщение: cmynhier.blogspot .sk/2007/01/zfs-stores-file-creation-time.html или вы давно пытаетесь решить эту проблему :-) Возможно, будет полезно задать вопрос в < href="https://lists.freebsd.org/mailman/listinfo/freebsd-fs" rel="nofollow noreferrer">список рассылки файловой системы FreeBSD об этом. Несмотря на то, что проблема, по-видимому, больше связана с поддержкой инструментов пользовательского пространства для сохранения поля, а не с самой файловой системой, могут быть люди, которые могут предложить обходные пути.   -  person G. Cito    schedule 14.05.2015
comment
Да, этот комментарий в блоге Чада Миньера был моим; к сожалению нет ответа. Если я найду решение, я обязательно опубликую его здесь. Мне пришлось отвлечься от этих поисков, чтобы заняться срочными проектами.   -  person Silvio Levy    schedule 15.05.2015


Ответы (1)


Действительно, ни 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
comment
Спасибо. Я попытаюсь связаться с Диланом Ли. В то время как чтение crtime легко в ZFS (статистика сообщает об этом), задача состоит в том, чтобы установить его. - person Silvio Levy; 06.05.2015
comment
Да. FreeBSD имеет время рождения/crtime в течение долгого времени (на UFS2, как я полагаю), так что stat покажет это. Вы заметите, что чаще всего crtime совпадает с ctime, потому что приложения, создающие файлы, не всегда могут получить доступ к функциям библиотеки и ядра, необходимым для установки crtime во время рождения индекса. - person G. Cito; 07.05.2015
comment
Спасибо Г. Цито за ваш развернутый ответ. У меня еще нет решения, но я присудил награду. (Извините, что это скупо - я новичок в этой группе, и в то время у меня было только 99 баллов, потому что кто-то на самом деле проголосовал за вопрос!) - person Silvio Levy; 07.05.2015
comment
Вау, спасибо - я думал, что срок действия награды истек. Ваше здоровье. - person G. Cito; 07.05.2015
comment
Cito - вы можете изменить 1-й абзац своего ответа, потому что pax -pe не сохраняет время рождения или время изменения. (man pax говорит: «Сохранить все», идентификатор пользователя, идентификатор группы, биты режима файла, время доступа к файлу и время модификации файла.) Тем не менее, спасибо за знакомство с pax. (Я мог бы также указать на маленькую опечатку: это ср., а не ср. — оно происходит от одного латинского слова confer, означающего сравнение.) - person Silvio Levy; 08.05.2015
comment
Ага. Я надеялся, что может быть обновленная/современная/расширенная версия pax (или даже cpio), где -e означает все, что может хранить хост-система. Из состояния стандартных gnu-coreutils (и в некоторой степени инструментов BSD) можно сделать вывод, что намерение состоит в том, чтобы оставить поле crtime скрытым, за исключением специальных инструментов отладки файловой системы. - person G. Cito; 08.05.2015
comment
Относительно вашего вопроса «Вы уверены»: то, что я хочу, в значительной степени соответствует тому, о чем говорится в вопросе: передать файл с сохранением crtime. В поисках инструмента для установки crtime я просто признаю тот факт, что ни один из известных мне инструментов репликации не предлагает возможность сохранения crtime. Они всегда оставляют файл, как будто только что созданный. - person Silvio Levy; 08.05.2015
comment
@Silvio: Да, изменение даты рождения существующего файла возможно. Должно быть, потому что сценарий начинается с его создания, поэтому он действует на существующий файл. - person GTeley; 03.11.2015
comment
Были ли какие-либо обновления по этому поводу спустя 5 лет? Веб-поиски, похоже, показывают старые результаты, и как будто никто больше не спрашивает об этом. Тем не менее, я не мог найти рабочего решения. - person Sam Sirry; 02.12.2020