¿Cuándo «cambiado» no significa «modificado»? Cuando hablamos de marcas de tiempo de archivos de Linux. En esta guía, explicaremos cómo el sistema los actualiza y cómo editarlos usted mismo.
La diferencia entre atime, mtime y ctime
Cada archivo de Linux tiene tres marcas de tiempo: la marca de tiempo de acceso (atime), la marca de tiempo modificada (mtime) y la marca de tiempo modificada (ctime).
La marca de tiempo de acceso es la última vez que se leyó un archivo. Esto significa que alguien usó un programa para mostrar el contenido del archivo o leer algunos valores de él. No se editó ni se agregó nada al archivo. Se hizo referencia a los datos, pero no se modificaron.
Una marca de tiempo modificada significa la última vez que se modificó el contenido de un archivo. Un programa o procedimiento editó o manipuló el archivo. “Modificado” significa que algo dentro del archivo se modificó o eliminó, o se agregaron nuevos datos.
Las marcas de tiempo modificadas no se refieren a cambios realizados en el contenido de un archivo. Más bien, es el momento en el que se cambiaron los metadatos relacionados con el archivo. Los cambios en los permisos de archivo, a modo de ejemplo, actualizarán la marca de tiempo modificada.
El sistema de archivos estándar ext4 Linux además asigna espacio para una marca de tiempo de creación de archivos en sus estructuras internas del sistema de archivos, pero esto aún no se ha implementado. A veces, esta marca de tiempo se completa, pero no puede depender de los valores que contiene.
La anatomía de una marca de tiempo
Las marcas de tiempo de Linux contienen un número en lugar de una fecha y hora. Este número es el número de segundos desde que Época Unix, que fue la medianoche (00:00:00) del 1 de enero de 1970, en Hora universal coordinada (UTC). Los segundos intercalares se ignoran en las marcas de tiempo de Linux, por lo que no son análogos al tiempo real.
Cuando Linux necesita mostrar una marca de tiempo, traduce la cantidad de segundos en una fecha y una hora. Esto hace que sea más fácil de comprender para los humanos. La ubicación y la zona horaria en la que se encuentra la computadora que ve el archivo guía la conversión del número de segundos a una fecha y hora. Además asegura que el mes esté en el idioma correcto.
Entonces, ¿cuántos segundos se pueden almacenar en una marca de tiempo? Mucho, 2.147.483.647, para ser precisos. Esa es una gran cantidad, pero ¿es suficiente? Si agrega eso a la época de Unix y después lo traduce a una fecha y hora, obtendrá el martes 19 de enero de 2038 a las 03:14:07 am. Necesitaremos un esquema distinto para las marcas de tiempo antes de esa fecha.
Visualización de marcas de tiempo
Cuando utiliza el -l
(lista larga) opción con ls
, Como se muestra abajo, puedes ver la marca de tiempo modificada:
ls -l dp.c
Si desea ver la marca de tiempo de acceso, use el -lu
(tiempo de acceso) opción así:
ls -lu dp.c
Y por último, para ver la marca de tiempo del cambio, puede utilizar el -lc
opción (cambiar hora); escriba lo siguiente:
ls -lc dp.c
Las marcas de tiempo anteriores muestran que el contenido del archivo se modificó por última vez el 21 de abril de 2019. El acceso y las marcas de tiempo modificadas son idénticas debido a que el archivo se copió de otra computadora a esta el 20 de enero de 2020, y ambas marcas de tiempo se actualizaron en ese momento.
Para ver todas las marcas de tiempo simultáneamente, usar el stat
comando de la próxima manera:
stat dp.c
Las zonas horarias se enumeran en la parte inferior de la pantalla. Como puede ver, disponen un componente de fracciones de segundo muy preciso. Al final de cada marca de tiempo, además verá un -0500
o -0400
.
Estos son compensaciones de zona horaria. El sistema de archivos registra las marcas de tiempo en UTC y las convierte a la zona horaria local cuando las muestra stat
. La computadora que usamos para investigar este post está configurada como si estuviera en la zona de la hora estándar del este (EST) de los EE. UU.
Esa zona horaria está cinco horas por detrás de UTC cuando EST está en vigor. A pesar de esto, está cuatro horas por detrás de UTC cuando está en vigor el horario de verano del este (EDT). En abril de 2019, cuando se cambió la marca de tiempo modificada, EDT estaba en vigor. Es es por ello que que dos de las marcas de tiempo disponen una compensación de cinco horas, pero la modificada dispone de una compensación de cuatro horas.
Las compensaciones y las zonas horarias no se almacenan en ningún lugar. No hay un inodo ni un espacio de sistema de archivos dedicado a mantener estos valores. Debe calcularlos sobre la marcha usando la marca de tiempo (que siempre está en hora UTC), la zona horaria local de la computadora que muestra el archivo y si el horario de verano estaba vigente.
Además verá una marca de tiempo de «Nacimiento», que está reservada para la fecha de creación del archivo. Esto no está implementado y verá un guión «-
”En lugar de una marca de tiempo.
RELACIONADO: Todo lo que siempre quiso saber sobre los inodos en Linux
Cambio de marcas de tiempo
Si lo desea, puede cambiar las marcas de tiempo de un archivo. Puedes utilizar el touch
comando para cambiar el acceso o las marcas de tiempo modificadas, o ambos:
touch -a dp.c
Para determinar una nueva marca de tiempo de acceso, usaría la -a
(tiempo de acceso) opción. Este comando establece la marca de tiempo de acceso a la hora actual de la computadora:
stat dp.c
La marca de tiempo de acceso cambió, como se esperaba. A pesar de esto, la marca de tiempo modificada además se actualizó; esto es normal.
Para cambiar la marca de tiempo modificada, puede utilizar el -m
(hora de modificación) opción:
touch -m dp.c
stat dp.c
Esta vez, se actualizaron las marcas de tiempo modificadas y cambiadas.
Puedes utilizar el -d
(fecha) si desea cambiar simultáneamente las marcas de tiempo de acceso y modificadas. Además puede especificar una hora y una fecha; no está restringido a cambiar las marcas de tiempo al presente.
Usaremos el siguiente comando para determinar el acceso y las marcas de tiempo modificadas a las 10:30:45 del 15 de enero de 2020:
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Ahora hemos establecido el acceso y las marcas de tiempo modificadas a una fecha en el pasado. La marca de tiempo modificada además se actualizó a la hora actual de la computadora.
Además puede usar el -r
(referencia) opción, como se muestra a continuación, si desea determinar las marcas de tiempo de un archivo en los valores de marca de tiempo de otro:
touch dp.c -r dice_words.sl3
stat dp.c
Y después, estamos prácticamente de vuelta donde empezamos, con una mezcla de -0400
y -0500
marcas de tiempo.
Hagamos algo que solo afecte a la marca de tiempo modificada. Usaremos el chmod
comando para dar un archivo ejecutable ejecutar permisos para todos los usuarios:
chmod +x dp
stat dp
La marca de tiempo modificada fue la única que se actualizó. Esto se debe a que el archivo en sí no se modificó, no se accedió ni se modificó. A pesar de esto, los metadatos sobre el archivo era cambió.
RELACIONADO: Cómo utilizar el comando chmod en Linux
Cómo el sistema de archivos actualiza las marcas de tiempo
Cuando se monta un sistema de archivos, hay opciones que puede usar para especificar cómo debe funcionar o tratarse ese sistema de archivos. Estos se almacenan en el /etc/fstab
archivo, que se lee y procesa en el momento del arranque. Además puede configurar opciones para dictar el esquema que deben utilizar para actualizar la marca de tiempo de acceso.
Las siguientes son algunas de las alternativas más comunes:
- strictatime (horario estricto): Esta opción actualiza la marca de tiempo de acceso de los archivos cada vez que se accede a ellos. Hay una sobrecarga adjunta con este enfoque, pero algunos servidores pueden beneficiarse de este esquema. Tiene poco mérito en una computadora de escritorio o portátil.
- noatime (sin una hora): Esta opción deshabilita por completo la actualización de las marcas de tiempo de acceso para archivos y directorios. A pesar de esto, las marcas de tiempo modificadas seguirán actualizándose.
- nodiratime (sin dir atime): Esta opción habilita las marcas de tiempo de acceso para que los archivos se actualicen, pero la deshabilita para los directorios.
- relatime (atime relativo): Esta opción actualiza la marca de tiempo de acceso solo si tenía más de 24 horas de antigüedad o si la anterior era más antigua que las marcas de tiempo modificadas o modificadas en este momento. Esto logra un buen equilibrio entre las marcas de tiempo de acceso que se actualizan con demasiada frecuencia o que no se actualizan en absoluto.
Echemos un vistazo al /etc/fstab
archivo para esta computadora y vea qué opciones están configuradas:
less /etc/fstab
los /etc/fstab
El archivo se muestra para nosotros, como se muestra a continuación.
Aquí está el contenido del archivo sin la envoltura:
# /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). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda1 during installation UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0
Solo hay dos entradas, y una de ellas es un archivo de intercambio, que podemos ignorar. El otro se monta en la raíz del sistema de archivos ( /
) y estaba en el dispositivo /dev/sda1
en el momento de la instalación. Esa es la primera partición en el primer disco duro, y resulta que contiene una ext4
sistema de archivos.
La única opción que se le pasa es errors=remount-ro
, que le dice al sistema operativo que vuelva a montar este sistema de archivos como de solo lectura si hay errores al intentar montarlo como un sistema de archivos de lectura y escritura.
Por eso, no se menciona cómo se manejará la marca de tiempo de acceso. Profundicemos y veamos qué /proc/mounts
puede decirnos. Canalizaremos la salida de /proc/mounts
a través de grep
. Nuestra cadena de búsqueda será «sda», el identificador del disco duro.
Escribimos lo siguiente:
cat /proc/mounts | grep "sda"
Ahora vemos las siguientes opciones:
- rw: El sistema de archivos se montará como un sistema de archivos de lectura y escritura.
- relatiempo: El sistema de archivos utilizará el esquema de «tiempo relativo» para actualizar las marcas de tiempo de acceso.
De donde vino eso? Bueno el relatime
El esquema se utiliza en las siguientes situaciones:
- Cuando el valores predeterminados
/etc/fstab
se utiliza la opción. - Cuando el relatiempo
/etc/fstab
se utiliza la opción. - Cuando no se usan opciones de marca de tiempo de acceso en
/etc/fstab
y está usando el kernel de Linux 2.6.30 o más reciente.
Nuestro /etc/fstab
entrada para el ext4
el sistema de archivos no especificó ninguna opción de actualización de la marca de tiempo de acceso, por lo que Linux tomó la decisión sensata y usó relatime
.
RELACIONADO: Cómo escribir un archivo fstab en Linux
Las marcas de tiempo son importantes
Las marcas de tiempo nos brindan una manera fácil de ver cuándo se accedió, se modificó o se cambió un archivo. Pero, lo que es más importante, proporcionan una forma de realizar una copia de seguridad y sincronizar el software para establecer qué archivos deben respaldarse.
La capacidad de manipular marcas de tiempo resultará útil siempre que necesite convencer por la fuerza a un programa para que incluya o ignore un archivo o un conjunto de archivos.