Mestre os carimbos de data/hora em arquivos Linux: atime, mtime e ctime explicados

Quando nos referimos a “alteração” no contexto de arquivos no Linux, não estamos necessariamente falando de “modificação”. Este artigo visa esclarecer como o sistema atualiza os carimbos de data/hora de arquivos e como você pode manipulá-los.

Diferenças entre atime, mtime e ctime

Cada arquivo no Linux possui três carimbos de data/hora distintos: o de acesso (atime), o de modificação (mtime) e o de alteração (ctime).

O carimbo de data/hora de acesso registra o último momento em que um arquivo foi lido. Isso acontece quando um programa exibe o conteúdo do arquivo ou acessa dados específicos, sem alterá-los. Em resumo, os dados foram referenciados, mas não modificados.

O carimbo de data/hora de modificação, por sua vez, indica quando o conteúdo de um arquivo foi alterado. Isso ocorre quando um programa ou processo edita, manipula ou adiciona novos dados ao arquivo. “Modificado” implica que algo dentro do arquivo foi corrigido, excluído ou enriquecido com novas informações.

O carimbo de data/hora de alteração não se relaciona diretamente com mudanças no conteúdo do arquivo, mas sim com as alterações nos metadados do arquivo. Mudanças nas permissões de um arquivo, por exemplo, atualizam este carimbo.

O sistema de arquivos ext4, padrão no Linux, reserva espaço para um carimbo de data/hora de criação, mas essa funcionalidade ainda não está plenamente implementada, e não é recomendável confiar em seus valores.

Entendendo a Estrutura de um Carimbo de Data/Hora

Os carimbos de data/hora do Linux são representados por um número, e não por uma data e hora formatada. Este número indica a quantidade de segundos transcorridos desde a Era Unix, que corresponde à meia-noite (00:00:00) de 1º de janeiro de 1970, em Tempo Universal Coordenado (UTC). É importante notar que os segundos bissextos não são considerados nos carimbos de data/hora do Linux.

Para exibir um carimbo de data/hora, o Linux converte esse número de segundos em uma data e hora compreensíveis para os humanos. A conversão leva em consideração a localização e o fuso horário do computador que está acessando o arquivo, garantindo que o mês e a data sejam exibidos corretamente.

Quanto espaço é alocado para o armazenamento desses segundos? Exatos 2.147.483.647. Este valor, se adicionado à Era Unix e convertido em data e hora, resultaria em terça-feira, 19 de janeiro de 2038, às 03:14:07. Portanto, será necessário um novo esquema de armazenamento antes dessa data.

Exibindo Carimbos de Data/Hora

Ao usar o comando `ls` com a opção `-l`, você pode visualizar o carimbo de data/hora de modificação:

ls -l nome_do_arquivo

Para visualizar o carimbo de data/hora de acesso, use a opção `-lu`:

ls -lu nome_do_arquivo

E para ver o carimbo de data/hora de alteração, utilize a opção `-lc`:

ls -lc nome_do_arquivo

O comando `stat` oferece uma visão geral de todos os carimbos de data/hora simultaneamente:

stat nome_do_arquivo

Os carimbos de data/hora exibidos com `stat` incluem frações de segundo e o deslocamento do fuso horário. Os carimbos são armazenados em UTC pelo sistema de arquivos e convertidos para o fuso horário local no momento da exibição. O exemplo acima mostra que o computador está configurado para o fuso horário EST (Eastern Standard Time) dos EUA.

O fuso horário EST tem uma diferença de cinco horas em relação ao UTC. No entanto, essa diferença é de quatro horas durante o horário de verão (EDT). Os deslocamentos e fusos horários não são armazenados como dados separados, mas são calculados dinamicamente com base no timestamp UTC e nas configurações do sistema.

O carimbo de data/hora de “Nascimento” é reservado para indicar a data de criação do arquivo, mas geralmente não é implementado e mostra um hífen (-).

Alterando os Carimbos de Data/Hora

Você pode usar o comando `touch` para alterar os carimbos de data/hora de acesso e modificação:

touch -a nome_do_arquivo

O comando acima atualiza o carimbo de data/hora de acesso para o momento atual. O carimbo de data/hora de alteração também é atualizado automaticamente.

touch -m nome_do_arquivo

Este comando altera o carimbo de data/hora de modificação para o instante atual, e também atualiza o carimbo de data/hora de alteração.

Para alterar simultaneamente os carimbos de data/hora de acesso e modificação, use a opção `-d`, que permite especificar uma data e hora:

touch -d "2020-01-15 10:30:45" nome_do_arquivo

O comando acima define os carimbos de acesso e modificação para 15 de janeiro de 2020, às 10:30:45. O carimbo de alteração é atualizado com a data e hora atuais.

A opção `-r` permite que você utilize os carimbos de data/hora de um arquivo como referência para outro:

touch nome_do_arquivo -r outro_arquivo

Para alterar somente o carimbo de alteração, podemos utilizar o comando `chmod`, que permite modificar as permissões do arquivo:

chmod +x nome_do_arquivo

O comando `chmod` altera apenas os metadados, sem modificar o conteúdo do arquivo. Por isso, apenas o carimbo de alteração é atualizado.

Como o Sistema Atualiza os Carimbos de Data/Hora

O comportamento de atualização dos carimbos de data/hora pode ser configurado por meio de opções no arquivo `/etc/fstab`, que é lido durante a inicialização do sistema. Essas opções controlam como o sistema de arquivos trata os carimbos de acesso:

  • strictatime: Atualiza o carimbo de acesso a cada leitura do arquivo. Essa abordagem tem um alto custo de desempenho e não é recomendada para desktops ou laptops.
  • noatime: Desativa a atualização do carimbo de acesso para arquivos e diretórios. Os carimbos de modificação continuam sendo atualizados.
  • nodiratime: Atualiza o carimbo de acesso apenas para arquivos, desabilitando a atualização para diretórios.
  • relatime: Atualiza o carimbo de acesso apenas se ele tiver mais de 24 horas ou se for mais antigo do que os carimbos de modificação ou alteração. Esta opção oferece um bom equilíbrio entre a necessidade de atualização e o desempenho do sistema.

A seguir, mostramos um exemplo de como visualizar o arquivo `/etc/fstab`:

less /etc/fstab

O arquivo `/etc/fstab` contém informações sobre os sistemas de arquivos montados pelo sistema:

O conteúdo do arquivo de exemplo é mostrado abaixo:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

Neste exemplo, a única opção especificada para o sistema de arquivos ext4 na partição /dev/sda1 é `errors=remount-ro`. Como nenhuma opção de carimbo de acesso foi definida, o sistema irá usar o comportamento padrão.

Podemos usar o arquivo `/proc/mounts` para verificar as opções de montagem atuais:

cat /proc/mounts | grep "sda"

O resultado do comando acima mostra as seguintes opções:

  • rw: indica que o sistema de arquivos foi montado em modo de leitura e escrita.
  • relatime: indica que o sistema está usando o esquema “atime relativo” para atualizar os carimbos de acesso.

O esquema `relatime` é usado em três situações:

  • Quando a opção padrão de `/etc/fstab` é usada.
  • Quando a opção `relatime` é especificada em `/etc/fstab`.
  • Quando nenhuma opção de carimbo de acesso é definida em `/etc/fstab` e o kernel Linux 2.6.30 ou mais recente está sendo usado.

Portanto, como o nosso exemplo não define explicitamente uma opção para o carimbo de acesso no arquivo `/etc/fstab`, o Linux adota o comportamento `relatime`, que é uma escolha razoável.

A Importância dos Carimbos de Data/Hora

Os carimbos de data/hora são essenciais para rastrear quando um arquivo foi acessado, modificado ou alterado. Além disso, desempenham um papel fundamental nos softwares de backup e sincronização, permitindo que esses aplicativos determinem quais arquivos precisam ser armazenados ou sincronizados.

A capacidade de manipular os carimbos de data/hora também pode ser útil quando você precisa forçar um programa a incluir ou ignorar um arquivo ou um conjunto de arquivos.