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

Quando “mudou” não significa “modificado”? Quando estamos falando sobre carimbos de data / hora de arquivos do 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 registro de data e hora de acesso é a última vez em 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 corrigido 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, é o momento 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 timestamp 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. Este número é o número de segundos desde o Época Unix, que era meia-noite (00:00:00) de 1º de janeiro de 1970, em 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. A localização 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, traduzi-lo para uma data e hora, você 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.

Exibindo carimbos de data / hora

Quando você usa a opção -l (lista longa) com ls, conforme mostrado abaixo, você pode ver o timestamp 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 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 comando stat da seguinte maneira:

stat dp.c

O

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á -0500 ou -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 o EST está em vigor. No entanto, é 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 imediatamente 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 comando de toque 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

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.

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

Desta vez, os timestamps modificados e alterados foram atualizados.

Você pode usar a opção -d (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

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 opção -r (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

E então, estamos de volta ao ponto de partida, com uma mistura de -0400 e -0500 carimbos de data / hora.

Vamos fazer algo que afeta apenas o timestamp alterado. Usaremos o comando chmod para fornecer um arquivo executável executar permissões para todos os usuários:

chmod +x dp
stat dp

O

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 arquivo / etc / fstab, 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 atinge um bom equilíbrio entre a atualização dos carimbos de data / hora de acesso com muita frequência ou nenhuma atualização.

Vamos dar uma olhada no arquivo / etc / fstab para este computador e ver quais opções estão definidas:

less /etc/fstab

O

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

O

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

# /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

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 / sda1 no momento da instalação. Essa é a primeira partição no primeiro disco rígido e, por acaso, contém um sistema de arquivos ext4.

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 cavar mais fundo e verificar o que / proc / mounts pode nos dizer. Vamos canalizar a saída de / proc / mounts por meio de grep. Nossa string de pesquisa será “sda”, o identificador do disco rígido.

Nós digitamos o seguinte:

cat /proc/mounts | grep "sda"

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 “atime relativo” para atualizar os carimbos de data / hora de acesso.

De onde veio isso? Bem, o esquema relatime é 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 / fstab e você está usando o kernel Linux 2.6.30 ou mais recente.

Nossa entrada / etc / fstab para o sistema de arquivos ext4 não especificava nenhuma opção de atualização de timestamp de acesso, então o Linux fez a escolha sensata e 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 software para determinar quais arquivos precisam ser armazenados em backup.

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.