Precisamos fazer backup dos carimbos de data/hora a/c/m de arquivos e diretórios e ter a capacidade de restaurá-los, se necessário.
Um exemplo de comando para fazer backup pode ser:
$ timestamp backup --all-stamps --incl-dir-stamps --recursive out.stampbak file.bin /dir/with/files/
E para restaurar poderia ser:
$ timestamp restore --all-stamps out.stampbak
Existe tal comando para alcançar os resultados que procuro? Precisão de nanossegundos seria preferível, ou qualquer outra coisa mais granular, embora eu acredite que a maioria dos sistemas de arquivos pare em nanossegundos. A conformidade com POSIX também é importante, pois precisamos que os timestamps nos sistemas BSD e GNU/Linux sejam apoiados/restaurados.
Editar: Para esclarecer algumas coisas, os sistemas de arquivos que listei estão, na maioria das vezes, mantendo arquivos por enquanto até que eu possa movê-los para um servidor ZFS mestre. Foi isso que nos fez considerar a possibilidade de preservar os timestamps antes de migrar os dados para o ZFS. Caso os carimbos sejam alterados durante o processo de transferência (usamos vários métodos como HTTP, FTP, SMB), queremos garantir que eles possam ser restaurados para o que deveriam ser. Mesmo após a transferência, seria benéfico manter os carimbos de data/hora como um pequeno backup, portanto, independentemente do fato de os arquivos terminarem no ZFS, a questão ainda é sobre backup/restauração de carimbos de data/hora apenas. Permissões e informações de grupo podem ser omitidas do backup.
Os sistemas operacionais usados para fazer backup de timestamps incluem macOS Mojave 10.14.6, Ubuntu Server 18.04.5 LTS, Debian 10.2/7.8, FreeBSD 12.2 e CentOS 8. A restauração será feita principalmente no FreeBSD (host do servidor ZFS), eu não t acho que será necessário em qualquer outro lugar. Se ajuda mencionar, tenho algumas unidades com arquivos em partições NTFS. É necessário executar uma pequena instância do Windows para fazer backup desses carimbos corretamente?
Além disso, fiquei com a impressão de que a maioria dos sistemas de arquivos usava atime, ctime e mtime, e nenhum outro (suponho que isso difere entre os sistemas de arquivos). Meu objetivo é salvar e restaurar todos eles, se possível.
Mencionei a conformidade com POSIX, pois a ferramenta pode ser usada em qualquer plataforma - peço desculpas se minha descrição anterior estava incorreta ou inadequada. Também pensei ctime = hora de criação/nascimento, agora vejo que é hora de mudança.
Os timestamps de maior importância a serem mantidos são o tempo de criação/nascimento e o tempo de modificação. O tempo de acesso também seria bom, o tempo de mudança é de menor importância, mas ainda ajudaria a ter. Novamente, peço desculpas pelo erro, ainda estou aprendendo.
Edit 2: Neste artigo eu aprendi isso:
não há registro de data e hora de criação de arquivo mantido na maioria dos sistemas de arquivos – o que significa que você não pode executar um comando como “mostre-me todos os arquivos criados em determinada data”. Dito isso, geralmente é possível deduzir o mesmo de ctime e mtime (se eles corresponderem – isso provavelmente significa que foi quando o arquivo foi criado).
Quando um novo arquivo ou diretório é criado, geralmente todas as três horas – atime, ctime e mtime – são configuradas para capturar a hora atual.
Como o sistema de arquivos de destino será ZFS, onde os carimbos de data e hora dos arquivos/diretórios serão restaurados, provavelmente é melhor salvar pelo menos atime, ctime, mtime, caso o sistema de arquivos do qual os carimbos de data e hora foram salvos não armazene uma hora de nascimento.
Se você tiver o GNU find e o Perl disponíveis, você pode montar algo com eles. A
-printf
ação tofind
pode imprimir os timestamps, e o Perl tem autime
função de modificá-los. Ou dois, o interno e um no módulo Time::HiRes, o último suporta precisão de subsegundos.Alguns arquivos para teste:
Salve os carimbos de data/hora em um arquivo:
Vamos descartar os timestamps:
e recarregue-os a partir do arquivo:
O arquivo simplesmente contém campos terminados em NUL com o atime, mtime e o nome do arquivo, e o snippet Perl chama
utime
cada conjunto de valores.Com NUL como terminador, ele deve ser capaz de lidar com nomes de arquivos arbitrários, mas observe que usei
\n
em vez de\0
para as impressões aqui, o que não funcionará com esse trecho de Perl, pois espera NUL e não nova linha.Além disso, ignorei completamente o ctime, pois até onde sei, ele não pode ser definido com
utime()
/ deutimensat()
qualquer maneira. O mesmo para qualquer carimbo de data/hora de nascimento.Como discutido anteriormente, a única maneira de definir
ctime
e semelhante é de dentro do kernel e as interfaces da área de usuário por um bom motivo não permitem definir carimbos de data e hora além deatime
emtime
. Se você gosta de manterctime
ecrtime
, isso pode ser feito comZFS/send
eZFS/receive
, mas isso requer que já tenha ZFS em ambos os lados.Então deixe-me repetir o que eu acredito que você gosta de fazer:
Copie um sistema de arquivos existente para outro local
Retenha
atime
emtime
, ao fazer isso, copie ou restaure os registros de data e hora por um programa diferente posteriormente.Você pode fazer isso executando qualquer método de backup/restauração seguido por outro programa que restaura os carimbos de data/hora ou executando um método de backup/restauração capaz de restaurar os carimbos de data/hora corretamente.
star
é uma ferramenta de backup madura, que pode ajudá-lo com ambos os métodos.Se você gosta de usar
star
para fazer backup e restaurar os sistemas de arquivos, incluindo os carimbos de hora, por favor, dê uma olhada na página man em: http://schilytools.sourceforge.net/man/man1/star.1.htmlSe você quiser salvar e restaurar os carimbos de data/hora separadamente, precisará salvar os carimbos de data/hora antes de executar o backup, pois o backup provavelmente afetará os
atime
valores de todos os arquivos.Para salvar todos os registros de data e hora de todos os arquivos de uma árvore de diretórios, basta executar:
Para restaurar todos os carimbos de data/hora para o novo local, execute:
O arquivo de arquivo criado pelo primeiro comando usa aprox. 1,5 kBytes por arquivo. O segundo comando restaurará todos os carimbos de data e hora de todos os arquivos no arquivo que já existem, mas não tocará no conteúdo do arquivo.
BTW: Eu sou o autor da estrela desde 39 anos.
O comando "ls --full-time" fornece um carimbo de data/hora completo para arquivos que podem ser formatados com "awk" e salvos em um arquivo nomeado com a hora atual usando "date":
Isso produz algo como:
Isso permitiria que você acompanhasse as alterações nos carimbos de data e hora dos arquivos ao longo do tempo. Claro que você pode formatar os timestamps como quiser.
Você também pode usar um repositório "git" para acompanhar as alterações do arquivo timestamp.output ao longo do tempo.