Os carimbos de data / hora do arquivo Linux explicados: atime, mtime e ctime

Um laptop exibindo uma janela de terminal com janelas adicionais de terminal preenchidas com texto em segundo plano.
Fatmawati Achmad Zaenuri / Shutterstock

Quando “mudou” não significa “modificado”? Quando estamos falando sobre carimbos de data / hora de arquivos Linux. Neste guia, explicaremos como o sistema os atualiza e como alterá-los você mesmo.

A diferença entre atime, mtime e ctime

Cada arquivo Linux tem três timestamps:  o timestamp de acesso (atime), o timestamp modificado (mtime) e o timestamp alterado (ctime).

O carimbo de data / hora de acesso é a última vez que um arquivo foi lido. Isso significa que alguém usou um programa para exibir o conteúdo do arquivo ou ler alguns valores dele. Nada foi editado ou adicionado ao arquivo. Os dados foram referenciados, mas inalterados.

Um carimbo de data / hora modificado significa a última vez que o conteúdo de um arquivo foi modificado. Um programa ou processo editou ou manipulou o arquivo. “Modificado” significa que algo dentro do arquivo foi alterado ou excluído, ou novos dados foram adicionados.

Os carimbos de data / hora alterados não se referem às alterações feitas no conteúdo de um arquivo. Em vez disso, é a hora em que os metadados relacionados ao arquivo foram alterados. Mudanças na permissão do arquivo, por exemplo, irão atualizar o timestamp alterado.

O sistema de arquivos ext4 Linux padrão  também aloca espaço para um carimbo de data / hora de criação de arquivo em suas estruturas internas do sistema de arquivos, mas isso ainda não foi implementado. Às vezes, esse carimbo de data / hora é preenchido, mas você não pode depender dos valores nele.

A anatomia de um carimbo de data / hora

Os timestamps do Linux contêm um número em vez de uma data e hora. Esse número é o número de segundos desde a época do Unix , que era meia-noite (00:00:00) em 1 de janeiro de 1970, no Tempo Universal Coordenado (UTC) . Os segundos bissextos são ignorados nos carimbos de data / hora do Linux, portanto não são análogos ao tempo real.

Quando o Linux precisa exibir um carimbo de data / hora, ele converte o número de segundos em uma data e hora. Isso torna mais fácil para os humanos entenderem. O local e o fuso horário em que o computador que está visualizando o arquivo orienta a conversão do número de segundos em uma data e hora. Também garante que o mês esteja no idioma correto.

Então, quantos segundos podem ser armazenados em um carimbo de data / hora? Muito – 2.147.483.647, para ser preciso. É um número grande, mas é o suficiente? Se você adicionar isso à época do Unix e, em seguida, traduzir para uma data e hora, terá terça-feira, 19 de janeiro de 2038, às 03:14:07. Porém, precisaremos de um esquema diferente para carimbos de data / hora antes disso.

Recomendado:  Como abrir um conjunto específico de páginas da web ao iniciar o navegador

Ver carimbos de data / hora

Ao usar a opção -l(lista longa) com ls, conforme mostrado abaixo, você pode ver o carimbo de data / hora modificado :

ls -l dp.c

Se você quiser ver o carimbo de data / hora de acesso, use a opção -lu(tempo de acesso) assim:

ls -lu dp.c

E, finalmente, para ver a data e hora da mudança, você pode usar a opção -lc(hora da mudança); digite o seguinte:

ls -lc dp.c

Os comandos "ls -l dp.c" em uma janela de terminal.

Os carimbos de data / hora acima mostram que o conteúdo do arquivo foi modificado pela última vez em 21 de abril de 2019. O acesso e os carimbos de data / hora alterados são idênticos porque o arquivo foi copiado de outro computador para este em 20 de janeiro de 2020 e ambos os carimbos de data / hora foram atualizados naquele momento.

Para ver todos os carimbos de data / hora simultaneamente , use o statcomando da seguinte maneira:

stat dp.c

O comando "stat dp.c" em uma janela de terminal.

Os fusos horários são listados na parte inferior da tela. Como você pode ver, eles têm um componente de segundos fracionários muito preciso. No final de cada carimbo de data / hora, você também verá um -0500ou -0400 .

Estas são compensações de fuso horário . O sistema de arquivos registra os carimbos de data / hora em UTC e os converte para o fuso horário local quando exibido por stat. O computador que usamos para pesquisar este artigo está configurado como se estivesse na zona do horário padrão do leste (EST) dos EUA

Esse fuso horário está cinco horas atrás do UTC, quando EST está em vigor. No entanto, está quatro horas atrás do UTC quando o horário de verão do leste (EDT) está em vigor. Em abril de 2019, quando o carimbo de data / hora modificado foi alterado, o EDT estava em vigor. É por isso que dois dos carimbos de data / hora têm uma diferença de cinco horas, mas o modificado tem uma diferença de quatro horas.

Os deslocamentos e fusos horários não são armazenados em nenhum lugar. Não há um inode  nem um espaço do sistema de arquivos dedicado a manter esses valores. Você deve calculá-los em tempo real usando o carimbo de data / hora (que está sempre no horário UTC), o fuso horário local do computador que exibe o arquivo e se o DST estava em vigor.

Você também verá um carimbo de data / hora “Nascimento”, que é reservado para a data de criação do arquivo. Isso não está implementado e você verá um hífen “ -” em vez de um carimbo de data / hora.

Alteração de carimbos de data / hora

Se desejar, você pode alterar os carimbos de data / hora em um arquivo. Você pode usar  o touchcomando  para alterar o acesso ou os carimbos de data / hora modificados ou ambos:

touch -a dp.c

Para definir um novo carimbo de data / hora de acesso, você usaria a opção -a(tempo de acesso). Este comando define o carimbo de data / hora de acesso para a hora atual do computador:

stat dp.c

O comando "touch -a dp.c" em uma janela de terminal.

O carimbo de data / hora de acesso foi alterado, conforme o esperado. No entanto, o carimbo de data / hora alterado também foi atualizado; isto é normal.

Recomendado:  ChatGPT está chegando aos seus bate-papos do Discord

Para alterar o carimbo de data / hora modificado, você pode usar a opção -m(tempo modificado):

touch -m dp.c
stat dp.c

O comando "touch -m dp.c" em uma janela de terminal.

Desta vez, os timestamps modificados e alterados foram atualizados.

Você pode usar a -dopção (data) se quiser alterar o acesso e os carimbos de data / hora modificados simultaneamente. Você também pode especificar uma hora e data – você não está restrito a alterar os carimbos de data / hora para o presente.

Usaremos o seguinte comando para definir o acesso e os carimbos de data / hora modificados para 10:30:45 em 15 de janeiro de 2020:

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c

O comando "touch -d '2020-01-15 10:30:45' dp.c" em uma janela de terminal.

Agora definimos o acesso e os carimbos de data / hora modificados para uma data no passado. O carimbo de data / hora alterado também foi atualizado para a hora atual do computador.

Você também pode usar a -ropção (referência), conforme mostrado abaixo, se quiser definir os carimbos de data / hora de um arquivo para os valores de carimbo de data / hora de outro:

touch dp.c -r dice_words.sl3
stat dp.c

O comando "touch dp.c -r dice_words.sl3" em uma janela de terminal.

E então, estamos de volta ao ponto de partida, com uma mistura de -0400e -0500timestamps.

Vamos fazer algo que afeta apenas o timestamp alterado. Usaremos o chmodcomando para dar permissões de execução a um arquivo executável para todos os usuários :

chmod + x dp
stat dp

Os comandos "chmod + x dp" e "stat dp" em uma janela de terminal.

O carimbo de data / hora alterado foi o único atualizado. Isso ocorre porque o próprio arquivo não foi alterado – ele não foi acessado nem modificado. No entanto, os metadados sobre o arquivo foram alterados.

Como o sistema de arquivos atualiza os carimbos de data / hora

Quando um sistema de arquivos é montado, existem opções que você pode usar para especificar como esse sistema de arquivos deve operar ou ser tratado. Eles são armazenados no /etc/fstabarquivo, que é lido e processado no momento da inicialização. Você também pode definir opções para ditar o esquema que eles devem usar para atualizar o carimbo de data / hora de acesso.

A seguir estão algumas das opções mais comuns:

  • strictatime  (strict atime) : Esta opção atualiza o registro de data e hora de acesso dos arquivos sempre que eles são acessados. Há uma sobrecarga associada a essa abordagem, mas alguns servidores podem se beneficiar desse esquema. Tem pouco mérito em um computador desktop ou laptop.
  • noatime  (sem atime): Esta opção desativa totalmente os carimbos de data / hora de acesso para arquivos e diretórios de atualização. Os carimbos de data / hora modificados, no entanto, ainda serão atualizados.
  • nodiratime (sem dir atime):  Esta opção ativa os carimbos de data / hora para os arquivos a serem atualizados, mas desativa para os diretórios.
  • relatime (atime relativo):  Esta opção atualiza o carimbo de data / hora de acesso apenas se tiver mais de 24 horas ou se o anterior for mais antigo do que os carimbos de data / hora atuais modificados ou alterados. Isso proporciona um bom equilíbrio entre a atualização dos carimbos de data / hora de acesso com muita frequência ou nenhuma atualização.
Recomendado:  Como registrar seus impostos de 2019 online gratuitamente

Vamos examinar o  /etc/fstabarquivo deste computador e ver quais opções estão definidas:

menos / etc / fstab

O "menos / etc / fstab" em uma janela de terminal.

O /etc/fstabarquivo é exibido para nós, conforme mostrado abaixo.

O arquivo "/ etc / fstab" está em less em uma janela de terminal.

Este é o conteúdo do arquivo sem o contorno:

# / etc / fstab: informações estáticas do sistema de arquivos.
#
# Use 'blkid' para imprimir o identificador universalmente único para um
# dispositivo; isso pode ser usado com UUID = como uma forma mais robusta de nomear dispositivos
# que funciona mesmo se os discos forem adicionados e removidos. Consulte fstab (5).
#
# <sistema de arquivos> <ponto de montagem> <tipo> <opções> <dump> <pass>
# / estava em / dev / sda1 durante a instalação
UUID = 4a143d08-8695-475b-8243-b13b56050fc2 / ext4 erros = remount-ro 0 1
/ swapfile nenhum swap sw 0 0

Existem apenas duas entradas, e uma delas é um arquivo de troca, que podemos ignorar. O outro está sendo montado na raiz do sistema de arquivos ( /) e estava no dispositivo /dev/sda1no momento da instalação. Essa é a primeira partição do primeiro disco rígido e, por acaso, contém um  ext4sistema de arquivos.

A única opção passada para ele é  errors=remount-ro, que informa ao sistema operacional para remontar este sistema de arquivos como somente leitura se houver erros ao tentar montá-lo como um sistema de arquivos de leitura e gravação.

Portanto, não há menção de como o carimbo de data / hora de acesso será tratado. Vamos aprofundar e verificar o que /proc/mountspode nos dizer. Vamos canalizar a saída do /proc/mountsmeio grep. Nossa string de pesquisa será “sda” , o identificador do disco rígido.

Nós digitamos o seguinte:

cat / proc / mounts | grep "sda"

O comando "cat / proc / mounts | grep 'sda'" em uma janela de terminal.

Agora vemos as seguintes opções:

  • rw : O sistema de arquivos será montado como um sistema de arquivos de leitura e gravação.
  • relatime : O sistema de arquivos usará o esquema de “tempo relativo” para atualizar os carimbos de data / hora de acesso.

De onde veio isso? Bem, o  relatimeesquema é usado nas seguintes situações:

  • Quando a opção padrão /etc/fstab é usada.
  • Quando a opção relatime /etc/fstab é usada.
  • Quando nenhuma opção de carimbo de data / hora de acesso é usada em /etc/fstabe você está usando o kernel Linux 2.6.30 ou mais recente.

Nossa  /etc/fstabentrada para o  ext4sistema de arquivos não especificava nenhuma opção de atualização de timestamp de acesso, então o Linux fez a escolha sensata e a usou  relatime.

Timestamps são importantes

Os carimbos de data / hora nos fornecem uma maneira fácil de ver quando um arquivo foi acessado, modificado ou alterado. Mas, o mais importante, eles fornecem uma maneira de fazer backup e sincronizar o software para determinar quais arquivos precisam ser copiados.

A capacidade de manipular carimbos de data / hora será útil sempre que você precisar forçar um programa a incluir ou ignorar um arquivo ou conjunto de arquivos.