LINUX.ORG.RU
ФорумAdmin

Перенос файлов и меток создания файлов

 , , ctime,


0

1

Комрады, неожиданным открытием стали трудности с переносом файлов с меткой их создания.

Бизнес-кейс: перенести бухгалтерские файлы со старой виртуалки (lxc, ext4) на новую. Бэк на пхп просто показывает их в html таблице и использует для их сортировки дату создания файлов.

При переносе с помощью cp естественно файлы создались заново и у них у всех одинаковое время создания (оно же копирования). Я думал хитрые опции tar или rsync помогут, но реальность оказалась страшнее. Чатгпт рисует невразумительные скрипты с debugfs.

Я всё ещё надеюсь на простое решение, плюс файлы с правильными метками еще лежат в старых виртуалках.

Коллективный разум, подскажи как это реализовать?

★★★★
Ответ на: комментарий от sin_a

Реальность. Birth time не копируется и не задаётся каким-то конвенциональными средствами.

Тут надо чинить подход. Например, хранить даты в расширенных атрибутах или вообще отдельно где-то.

anonymous
()
Ответ на: комментарий от skyman
alex@ip3 ~/0/Screens $ stat date_ym.py 
  File: date_ym.py
  Size: 979             Blocks: 0          IO Block: 4096   regular file
Device: 40h/64d Inode: 8404        Links: 1
Access: (0700/-rwx------)  Uid: ( 1000/    alex)   Gid: ( 1001/    alex)
Access: 2025-07-18 16:23:58.903324620 +0700
Modify: 2023-08-23 15:31:59.000000000 +0700
Change: 2023-09-21 03:33:05.970271879 +0700
 Birth: -
alex@ip3 ~/0/Screens $ cp -p date_ym.py test.py
alex@ip3 ~/0/Screens $ stat test.py 
  File: test.py
  Size: 979             Blocks: 0          IO Block: 4096   regular file
Device: 40h/64d Inode: 8416        Links: 1
Access: (0700/-rwx------)  Uid: ( 1000/    alex)   Gid: ( 1001/    alex)
Access: 2025-07-18 16:25:08.176885422 +0700
Modify: 2023-08-23 15:31:59.000000000 +0700
Change: 2025-07-18 16:25:08.170552961 +0700
 Birth: -
alex@ip3 ~/0/Screens $ 

Modify сохраняется, а тебе Change надо?

FreeWebber
()
Ответ на: комментарий от sin_a

Бэк на пхп просто показывает их в html таблице и использует для их сортировки дату создания файлов.

А он никак не может использовать access time или modification time?

Нет, ибо они меняются, а пользователям надо сортировать именно по времени создания. Ну и плюс мне уже самому интересно разобраться с этой темой :)

skyman ★★★★
() автор топика
Ответ на: комментарий от skyman

Если у ФС нет механизма записи времени создания то это в любом случае не разбираться а изобретать костыли. Можно ещё посмотреть на другие ФС.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Думаю это самый простой способ. Учитывая, что задача разовая и административная, штатный красивый путь можно и не придумывать.

Хотя, в фрибсдшном мане указано что utimensat() ставит birthtime = mtime если второй старше текущего birthtime. В линуксовом про это нет, это забыли упомянуть или не реализовано не знаю. Если сисколлы трогать сложно/страшно то команда touch их представляет на уровне шелла.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)

Бэк на пхп просто показывает их в html таблице и использует для их сортировки дату создания файлов.

Это очень странно, что бэк на пхп так сделан. Это может спервоначалу показаться изящным архитектурным решением, если не знать, насколько трудно изменять birth time. Но нюанс в том, что на некоторых фс birth time вообще нет. По-моему, его не было на ext3. Его в принципе нет на tmpfs.

Как разработчики бекэнда тестировали свою опердень? Они же должны заподозрить неладное, когда тестовый набор данных из тарбола переставал сортироваться.

legolegs ★★★★★
()

man 7 inode:

File creation (birth) timestamp (btime)
    (not returned in the stat structure); statx.stx_btime
    The file's creation timestamp. This is set on file creation and not changed subsequently.
    The btime timestamp was not historically present on UNIX systems and is not currently supported by most Linux filesystems.
anonymous
()
Ответ на: комментарий от firkax

Думаю это самый простой способ. Учитывая, что задача разовая и административная, штатный красивый путь можно и не придумывать.

Скорее всего так и сделаю.

touch \ cp \tar\ rsync этого не могут; с debugfs это сложно реализовать (надо отмонтировать фс, примонтировать со специальными флагами и тд).

skyman ★★★★
() автор топика
Ответ на: комментарий от legolegs

Это очень странно, что бэк на пхп так сделан. Это может спервоначалу показаться изящным архитектурным решением, если не знать, насколько трудно изменять birth time. Но нюанс в том, что на некоторых фс birth time вообще нет. По-моему, его не было на ext3. Его в принципе нет на tmpfs.

Как разработчики бекэнда тестировали свою опердень? Они же должны заподозрить неладное, когда тестовый набор данных из тарбола переставал сортироваться.

Это моя личная легаси опердень:), предназначенная для небольшого круга пользователей и с требованием по минимальному сроку разработки и скорейшему внедрению. Знал бы про такое неинтуитивное поведение с birth time, и что возникнут такие сложности - решал бы по-другому.

А так классический кейс - бизнесу надо решать задачи, а не ждать идеального, масштабируемого, протестированного, работающего на всех платформах и ОС решения.

skyman ★★★★
() автор топика
Ответ на: комментарий от sin_a

Если пользователи не создают файлы непосредственно (хотя я догадываюсь что там самбовая шара) то можно в название добавить нужную дату.

Имена файлов генерятся этим же скриптом, так что в следующей итерации будем просто включать дату создания в имя файла и записывать в бд.

skyman ★★★★
() автор топика

Обычно за дату создания принимают дату модификации файлы, она при копировании со сохранением атрибутов не меняется. А дата создания обычно игнорируется, потому что задаётся по времени появления файла в ФС.

Можно попробовать в качестве костыля их как-то приравнять, но у меня «touch -r» вообще никак не трогает поля Change и Birth.

По уму надо «Бэк на пхп» поправить, чтобы поля правильные брал.

Radjah ★★★★★
()

Костыльные подходы:

  • Не трогать VM, а расширить, добавить драйверов, мигрировать на новый гипервизор, обмазать внешним фаерволлом или vlan без Интернет. И любые другие схожие методы, чтобы решить проблему из которой родился твой бизнес-кейс.
  • Прикрепить диск от этой VM к новой VM, но использовать его исключительно как диск с данными.

Правильный подход:

  • Отправить бизнес с его кейсами к разработчику, написавшему эту дичь. Пусть возвращаются после фикса кода.
BOOBLIK ★★★★
()

Бэк на пхп просто показывает их в html таблице и использует для их сортировки дату создания файлов.

Найти макак, начистить лицо.

anc ★★★★★
()

Хм, да, rsync под гентой говорит что опция --crtimes не поддерживается на данной платформе.

В домашней папке(у меня там gocryptfs) вообще stat не кажет birth time, только ctime. Впрочем для файлов на ext4 birth time с ctime он показывает одинаковые.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

На ext4 поддержку btime можно включить. Но cделать это можно только при создании ФС (см. ext4(5):

       extra_isize
              This ext4 feature reserves a specific amount of space in each inode for extended metadata such as nanosecond timestamps and file creation time,  even  if the current kernel does not currently need to reserve this much space.  Without this feature, the kernel will reserve the amount of space for features it currently needs, and the rest may be consumed by extended attributes.

              For this feature to be useful the inode size must be 256 bytes in size or larger.
yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 4)

копируй затем по элементный

touch -rСтарыйПутьУзелДерева НовыйПутьУзелДерева

ну и цикленуть для всего ПодДерева

чисто как костыль

всяко обязано быть полное копирование - в бэкаперах каких

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

Нет системного вызова, чтобы менять crtime (btime). Только менять системное время на момент создания файла. А чтобы другие процессы в этот момент не сходили с ума от изменений системного времени, нужно чтобы они не выполнялись, то есть, либо SIGSTOP, либо SCHED_FIFO.

Да, подобный вариант «touch» писать — это не php бэк предолить...

mky ★★★★★
()
Ответ на: комментарий от skyman

С терминологией тоже мутки

Ну, дак они возникли по схеме вашего стартового поста. Все стали сокращать creation time как ctime (а не как crtime). А ctime — это change time, давно и всегда.

Пришлось изобретать birth time, чтобы btime не путалось с остальными временными метками.

mky ★★★★★
()

старой виртуалки (lxc, ext4)

Вы уверены что там есть именно «дата создания»? В Linux ФС даты создания никогда не было, это недавние доработки и не во всех ФС работающие, тем более по умолчанию.

anonymous
()
Ответ на: комментарий от anonymous

недавние доработки

Ну, да, с точки зрения существования галактики, всё в линуксе — это недавние доработки. А так crtime существует в ext4 лет 15+ (примерно с 2.6.27-rc3). В 2017 году в ядро 4.11 добавили syscall statx(). В 2018 в glibc-2.28 добавили поддержку этого syscall'а. За эти 7 лет народилось новое поколение линуксойдов, которые и не в курсе, что раньше не было crtime...

mky ★★★★★
()
Ответ на: комментарий от mky

Ну, дак они возникли по схеме вашего стартового поста. Все стали сокращать creation time как ctime (а не как crtime). А ctime — это change time, давно и всегда.

Пришлось изобретать birth time, чтобы btime не путалось с остальными временными метками.

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

skyman ★★★★
() автор топика
Ответ на: комментарий от futurama

для этого контейнера выделяли отдельный раздел (lv) под ФС (ext4)

если да, то перенести раздел (dd)

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

skyman ★★★★
() автор топика
Ответ на: комментарий от vtVitus

Поменяй на дату модификации и будет всё ок. Она вроде как есть везде и её можно восстанавливать из бекапа.

Дата модификации и дата создания - две разные сущности, и несут разную смысловую нагрузку. Нужно видеть и то и другое.

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

skyman ★★★★
() автор топика