¿Cuándo “cambiado” no significa “modificado”? Cuando hablamos de registros de tiempo de archivos de Linux. En esta guía, explicaremos cómo el sistema los actualiza y cómo modificarlos tú mismo.
La diferencia entre atime, mtime y ctime
Cada archivo de Linux tiene tres registros de tiempo: el registro tiempo de acceso (atime), el registro de tiempo modificado (mtime) y el registro tiempo cambiado (ctime).
El registro 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. Nada fue editado o agregado al archivo. Los datos fueron referenciados, pero sin cambios.
Un registro de tiempo modificado significa la última vez que se modificó el contenido de un archivo. Un programa o proceso editó o manipuló el archivo. “Modificado” significa que algo dentro del archivo se modificó o eliminó, o se agregaron nuevos datos.
El registro de tiempo cambiado no se refiere a los cambios realizados en el contenido de un archivo. Más bien, es el momento en que se cambiaron los metadatos relacionados con el archivo. Los cambios de permisos de archivo, por ejemplo, actualizarán el registro de tiempo modificado.
El sistema de archivos Linux ext4 estándar también asigna espacio para registro de tiempo de creación de archivos en sus estructuras internas del sistema de archivos. Empero esto aún no se ha implementado. A veces, esta ese registro de tiempo se rellena, pero no puede depender de los valores que contiene.
La anatomía de un registro de tiempo
Los registros 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 la época de Unix, que fue la medianoche (00:00:00) del 1 de enero de 1970, en el Tiempo Universal Coordinado (UTC). Los segundos bisiestos se ignoran en las marcas de tiempo de Linux, por lo que no son análogos al tiempo real.
Cuando Linux necesita mostrar un registro de tiempo, traduce el número de segundos en una fecha y hora. Esto facilita la comprensión de los humanos.
La ubicación y zona horaria en que se encuentra la computadora que ve el archivo guía la conversión de la cantidad de segundos a una fecha y hora. También asegura que el mes esté en el idioma correcto.
Entonces, ¿cuántos segundos se pueden almacenar en un registro de tiempo? Mucho, 2,147,483,647, para ser precisos. Esa es una gran cantidad, pero ¿es suficiente? Si agregas eso a la época de Unix y luego lo traduces a una fecha y hora, obtendrás el martes 19 de enero de 2038 a las 03:14:07 am. Sin embargo, necesitaremos un esquema diferente para los registros de tiempo.
Visualización de registros de tiempo
Cuando utilizas la opción –l (lista larga) con ls, como se muestra a continuación, puedes ver el registro de tiempo modificado:
ls -l dp.c
Si deseas ver el registro de tiempo de acceso, debes usar la opción –lu (tiempo de acceso) de esta manera:
ls -lu dp.c
Y finalmente, para ver el registro de tiempo de cambio, puedes usar la opción –lc (tiempo de cambio); escribe lo siguiente:
ls -lc dp.c
Los registros de tiempo anteriores muestran que el contenido del archivo se modificó por última vez el 21 de abril de 2019. El acceso y los registros de tiempo cambiados son idénticos porque el archivo se copió de otra computadora a esta el 20 de enero de 2020. Ambos registros de tiempo se actualizaron en ese momento.
Para ver todos los registros de tiempo simultáneamente, debes usar el comando stat de la siguiente manera:
stat dp.c
Las zonas horarias se enumeran en la parte inferior de la pantalla. Como puedes ver, tienen un componente de segundos fraccionales muy preciso. Al final de cada registro de tiempo, también verás un -0500 o –0400.
Estas son las compensaciones de zona horaria. El sistema de archivos registra los registros de tiempo en UTC y las convierte a la zona horaria local cuando se muestran por stat. La computadora que utilizamos para investigar este artículo está configurada como si estuviera en la zona de hora estándar del este (EST) de los EE. UU.
Zonas horarias
Esa zona horaria está cinco horas detrás de UTC cuando EST está en vigor. Sin embargo, son cuatro horas menos que UTC cuando el horario de verano (EDT) está en vigor.
En abril de 2019, cuando se modificó el registro tiempo cambiado, EDT estaba vigente. Es por eso que dos de los registros de tiempo tienen un desplazamiento de cinco horas, pero el modificado tiene un desplazamiento de cuatro horas.
Los desplazamientos 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. Debes calcularlos sobre la marcha utilizando el registro de tiempo (que siempre está en la hora UTC). La zona horaria local de la computadora que muestra el archivo y si DST estaba vigente.
También verás un registro de tiempo de “Nacimiento”, que está reservado para la fecha de creación del archivo. Esto no está implementado y ves un guión “-” en lugar de un registro de tiempo.
Cambio de registros de tiempo
Si lo deseas, puedes cambiar los registros de tiempo en un archivo. Puedes usar el comando touch para cambiar el acceso o los registros de tiempo modificados, o ambas:
touch -a dp.c
Para establecer un nuevo registro de tiempo de acceso, usarías la opción –a (tiempo de acceso). Este comando establece el registro de tiempo de acceso a la hora actual de la computadora:
stat dp.c
El registro tiempo de acceso cambió, como se esperaba. Sin embargo, el registro de tiempo cambiado también se actualizó; esto es normal.
Para cambiar el registro de tiempo modificado, puedes usar la opción –m (tiempo modificado):
touch -m dp.c
stat dp.c
Esta vez, se actualizaron los registros de tiempo modificados y cambiados.
Puedes usar la opción –d (fecha) si deseas cambiar el acceso y los registros de tiempo modificados simultáneamente. También puedes especificar una fecha y hora, no estás restringido a cambiar los registros de tiempo al presente.
Usaremos el siguiente comando para establecer el acceso y los registros de tiempo modificados a las 10:30:45 el 15 de enero de 2020:
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Ahora hemos establecido el acceso y los registros de tiempo modificados en una fecha anterior. El registro de tiempo cambiado también se actualizó a la hora actual de la computadora.
También puedes usar la opción –r (referencia), como se muestra a continuación, si deseas establecer los registros de tiempo de un archivo en los valores de registro de tiempo de otro:
touch dp.c -r dice_words.sl3
stat dp.c
Y luego, regresamos a donde empezamos, con una mezcla de -0400 y – 0500 registros de tiempo.
chmod
Hagamos algo que solo afecte el registro de tiempo cambiado. Usaremos el comando chmod para otorgar permisos de ejecución a un archivo ejecutable para todos los usuarios:
chmod +x dp
stat dp
El registro de tiempo cambiado fue el único que se actualizó. Esto se debe a que el archivo en sí no se modificó, ni se accedió ni se cambió. Sin embargo, los metadatos sobre el archivo se han cambiado.
Cómo actualiza el sistema de archivos los registros de tiempo
Cuando se monta un sistema de archivos, hay opciones que puedes usar para especificar cómo debe funcionar o ser tratado ese sistema de archivos. Estos se almacenan en el archivo /etc/fstab, que se lee y procesa en el momento del arranque. También puedes establecer opciones para dictar el esquema que deben usar para actualizar el registro de tiempo de acceso.
Las siguientes son algunas de las opciones más comunes:
- strictatime (tiempo estricto): esta opción actualiza el registro de tiempo de acceso de los archivos cada vez que se accede a ellos. Hay una sobrecarga asociada 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 atime): esta opción inhabilita por completo la actualización del registro de tiempo de acceso para archivos y directorios. Sin embargo, los registros de tiempo modificados se seguirán actualizando.
- nodiratime (sin dir atime): esta opción habilita los registros de tiempo de acceso para que los archivos se actualicen, pero la deshabilita para los directorios.
- relatime (tiempo relativo): esta opción actualiza el registro de tiempo de acceso solo si tenía más de 24 horas de antigüedad o si la anterior era anterior a los registros de tiempo cambiados o modificados actuales. Esto logra un buen equilibrio entre los registros de tiempo de acceso que se actualizan con demasiada frecuencia o que no se actualizan en absoluto.
Archivo fstab
Observemos el archivo /etc/fstab para esta computadora y veamos qué opciones están configuradas:
less /etc/fstab
El archivo /etc/fstab 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 está montando 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 un sistema de archivos ext4.
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. Esto si hay errores al intentar montarlo como un sistema de archivos de lectura y escritura.
Por lo tanto, no se menciona cómo se manejará el registro de tiempo de acceso. Profundicemos y veamos qué nos puede decir /proc/mounts.
Canalizando la salida
Canalizaremos la salida de /proc/mounts a través 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.
- relatime: el sistema de archivos usará el esquema de “tiempo relativo” para actualizar los registros de tiempo de acceso.
¿De dónde vino eso? Bueno, el esquema relatime se usa en las siguientes situaciones:
- Cuando se usa la opción defaults en /etc/fstab.
- Si se usa opción la relatime en /etc/fstab.
- Cuando no se utilizan opciones de registro de tiempo de acceso en /etc/fstab y estás utilizando el kernel de Linux 2.6.30 o posterior.
Nuestra entrada /etc/fstab para el sistema ext4 de archivos no especificó ninguna opción de actualización de registro de tiempo de acceso. Por lo tanto, Linux tomó la decisión correcta y usó relatime.
Los registros de tiempo son importantes
Los registros de tiempo nos dan una manera fácil de ver cuándo se accedió, modificó o cambió un archivo. Pero, lo que es más importante, proporcionan una forma de hacer una copia de seguridad y sincronizar el software. Esto para determinar qué archivos necesitan copia de seguridad.
La capacidad de manipular los registros de tiempo te resultará muy útil. Esto siempre que necesites convencer por la fuerza a un programa para que incluya o ignore un archivo o conjunto de archivos.