Поиск по сайту:

Объяснение временных меток файлов Linux: atime, mtime и ctime


Когда «измененный» не означает «модифицированный»? Когда мы говорим о временных метках файлов Linux. В этом руководстве мы объясним, как система их обновляет и как изменить их самостоятельно.

Разница между atime, mtime и ctime

Каждый файл Linux имеет три отметки времени: отметку времени доступа (atime), отметку времени изменения (mtime) и отметку времени изменения (ctime).

Временная метка доступа — время последнего чтения файла. Это означает, что кто-то использовал программу для отображения содержимого файла или чтения из него некоторых значений. В файле ничего не редактировалось и не добавлялось. Данные были указаны, но не изменились.

Измененная метка времени означает, что содержимое файла было изменено в последний раз. Программа или процесс редактировали или манипулировали файлом. «Измененный» означает, что что-то внутри файла было изменено или удалено, или были добавлены новые данные.

Измененные метки времени не относятся к изменениям, внесенным в содержимое файла. Скорее, это время, когда метаданные, относящиеся к файлу, были изменены. Изменения прав доступа к файлам, например, обновят измененную временную метку.

Стандартная файловая система ext4 Linux также выделяет место для отметки времени создания файла в своих внутренних структурах файловой системы, но это еще не реализовано. Иногда эта отметка времени заполняется, но вы не можете зависеть от значений в ней.

Анатомия временной метки

Временные метки Linux содержат число, а не дату и время. Это число представляет собой количество секунд, прошедших с эпохи Unix, которая наступила в полночь (00:00:00) 1 января 1970 года по всемирному координированному времени (UTC). Високосные секунды игнорируются в метках времени Linux, поэтому они не аналогичны реальному времени.

Когда Linux нужно отобразить метку времени, он переводит количество секунд в дату и время. Это облегчает понимание людей. Местоположение и часовой пояс, в котором находится компьютер, просматривающий файл, определяют преобразование количества секунд в дату и время. Это также гарантирует, что месяц будет на правильном языке.

Итак, сколько секунд можно хранить в метке времени? Много — 2 147 483 647, если быть точным. Это большое число, но достаточно ли этого? Если вы добавите это к эпохе Unix, а затем переведете в дату и время, вы получите вторник, 19 января 2038 года, 03:14:07. Однако до этого нам понадобится другая схема для временных меток.

Просмотр временных меток

Когда вы используете параметр -l (длинный список) с ls, как показано ниже, вы можете увидеть измененную метку времени:

ls -l dp.c

Если вы хотите увидеть отметку времени доступа, используйте параметр -lu (время доступа) следующим образом:

ls -lu dp.c

И, наконец, чтобы увидеть отметку времени изменения, вы можете использовать параметр -lc (время изменения); введите следующее:

ls -lc dp.c

Временные метки выше показывают, что содержимое файла в последний раз изменялось 21 апреля 2019 г. Временные метки доступа и изменения идентичны, поскольку файл был скопирован с другого компьютера на этот 20 января 2020 г., и обе временные метки были обновлены в это время.

Чтобы увидеть все метки времени одновременно, используйте команду stat следующим образом:

stat dp.c

Часовые пояса перечислены в нижней части дисплея. Как видите, они имеют очень точную составляющую, составляющую доли секунды. В конце каждой метки времени вы также видите -0500 или -0400 .

Это смещение часовых поясов. Файловая система записывает метки времени в формате UTC и преобразует их в местный часовой пояс при отображении с помощью stat. Компьютер, который мы использовали для исследования этой статьи, настроен так, как если бы он находился в зоне восточного стандартного времени (EST) США.

Этот часовой пояс на пять часов отстает от UTC, когда действует EST. Тем не менее, это на четыре часа меньше UTC, когда действует восточное летнее время (EDT). В апреле 2019 года, когда измененная отметка времени была изменена, действовало EDT. Вот почему две из временных меток имеют пятичасовое смещение, а измененное имеет четырехчасовое смещение.

Смещения и часовые пояса нигде не сохраняются. Нет ни индексного дескриптора, ни места в файловой системе, предназначенного для хранения этих значений. Вы должны рассчитать их на лету, используя отметку времени (которая всегда указана в формате UTC), местный часовой пояс компьютера, на котором отображается файл, и действовало ли летнее время.

Вы также видите временную метку «Рождение», которая зарезервирована для даты создания файла. Это не реализовано, и вы видите дефис «-» вместо метки времени.

Изменение временных меток

Если вы хотите, вы можете изменить временные метки в файле. Вы можете использовать команду touch, чтобы изменить временные метки доступа или изменения, или и то, и другое:

touch -a dp.c

Чтобы установить новую временную метку доступа, используйте параметр -a (время доступа). Эта команда устанавливает отметку времени доступа к текущему времени компьютера:

stat dp.c

Отметка времени доступа изменилась, как и ожидалось. Однако измененная временная метка также была обновлена; это нормально.

Чтобы изменить измененную отметку времени, вы можете использовать параметр -m (измененное время):

touch -m dp.c
stat dp.c

На этот раз измененные и измененные временные метки были обновлены.

Вы можете использовать параметр -d (дата), если хотите одновременно изменить временные метки доступа и изменения. Вы также можете указать время и дату — вы не ограничены в изменении временных меток на настоящее время.

Мы будем использовать следующую команду, чтобы установить временные метки доступа и изменения на 10:30:45 15 января 2020 года:

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

Теперь мы установили временные метки доступа и изменения на дату в прошлом. Измененная метка времени также была обновлена до текущего времени компьютера.

Вы также можете использовать параметр -r (ссылка), как показано ниже, если вы хотите установить метки времени одного файла в значения меток времени другого:

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

И затем мы почти вернулись к тому, с чего начали, со смесью временных меток -0400 и -0500.

Давайте сделаем что-нибудь, что повлияет только на измененную метку времени. Мы будем использовать команду chmod, чтобы предоставить исполняемым файлам права на выполнение для всех пользователей:

chmod +x dp
stat dp

Измененная временная метка была единственной, которая обновлялась. Это потому, что сам файл не был изменен — к нему не обращались и не модифицировали. Однако метаданные о файле были изменены.

Как файловая система обновляет метки времени

Когда файловая система смонтирована, вы можете использовать параметры, чтобы указать, как эта файловая система должна работать или обрабатываться. Они хранятся в файле /etc/fstab, который читается и обрабатывается во время загрузки. Вы также можете установить параметры, определяющие схему, которую они должны использовать для обновления временной метки доступа.

Ниже приведены некоторые из наиболее распространенных вариантов:

  • strictatime (strict atime): этот параметр обновляет отметку времени доступа к файлам каждый раз, когда к ним обращаются. С этим подходом связаны накладные расходы, но некоторые серверы могут извлечь выгоду из этой схемы. На настольном компьютере или ноутбуке от него мало пользы.
  • noatime (no atime): этот параметр полностью отключает обновление меток времени доступа к файлам и каталогам. Однако измененные временные метки все равно будут обновляться.
  • nodiratime (no dir atime): этот параметр позволяет обновлять метки времени доступа для файлов, но отключает его для каталогов.
  • относительное время (относительное время): эта опция обновляет временную метку доступа, только если она была старше 24 часов или предыдущая была старше текущих измененных или измененных временных меток. Это обеспечивает хороший баланс между слишком частым обновлением временных меток доступа или отсутствием обновления вообще.

Давайте посмотрим на файл /etc/fstab для этого компьютера и посмотрим, какие параметры установлены:

less /etc/fstab

Файл /etc/fstab отображается для нас, как показано ниже.

Вот содержимое файла без переноса:

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

Всего две записи, и одна из них — файл подкачки, который мы можем игнорировать. Другой монтируется в корень файловой системы ( / ) и находился на устройстве /dev/sda1 во время установки. Это первый раздел на первом жестком диске, и он содержит файловую систему ext4.

Единственная передаваемая ей опция – errors=remount-ro, которая указывает операционной системе перемонтировать эту файловую систему как доступную только для чтения, если возникают ошибки при попытке подключить ее как файловую систему для чтения и записи. .

Таким образом, нет упоминания о том, как будет обрабатываться метка времени доступа. Давайте копнем глубже и посмотрим, что может нам сказать /proc/mounts. Мы направим вывод из /proc/mounts через grep. Наша строка поиска будет «sda», идентификатор жесткого диска.

Набираем следующее:

cat /proc/mounts | grep "sda"

Теперь мы видим следующие варианты:

  • rw: файловая система будет смонтирована как файловая система для чтения и записи.
  • относительное время: файловая система будет использовать схему «относительное время» для обновления меток времени доступа.

Откуда это пришло? Схема relatime используется в следующих ситуациях:

  • При использовании параметра по умолчанию /etc/fstab.
  • При использовании параметра relatime /etc/fstab.
  • Если в /etc/fstab не используются параметры временной метки доступа и используется ядро Linux версии 2.6.30 или новее.

В нашей записи /etc/fstab для файловой системы ext4 не указаны параметры обновления метки времени доступа, поэтому Linux сделал разумный выбор и использовал relatime.

Временные метки важны

Временные метки дают нам простой способ увидеть, когда к файлу обращались, модифицировали или изменяли. Но, что более важно, они предоставляют способ резервного копирования и синхронизации программного обеспечения, чтобы определить, какие файлы необходимо резервировать.

Возможность манипулировать отметками времени окажется полезной всякий раз, когда вам нужно принудительно убедить программу включить или проигнорировать файл или набор файлов.

RELATED: Best Linux Laptops for Developers and Enthusiasts