Пояснення часових позначок файлу 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 ранку. Однак перед цим нам знадобиться інша схема для міток часу.

  Як використовувати плагін Chrome Flash у Firefox на Linux

Перегляд міток часу

Коли ви використовуєте параметр -l (довгий список) з ls, як показано нижче, ви можете побачити змінену позначку часу:

ls -l dp.c

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

ls -lu dp.c

І, нарешті, щоб побачити позначку часу зміни, ви можете використовувати параметр -lc (час зміни); введіть наступне:

ls -lc dp.c

The

Наведені вище позначки часу показують, що вміст файлу було востаннє змінено 21 квітня 2019 року. Позначки часу доступу та змінені ідентичні, оскільки файл було скопійовано з іншого комп’ютера на цей 20 січня 2020 року, і обидві позначки часу були оновлені в цей час.

До бачити всі позначки часу одночасно, використовуйте команду stat наступним чином:

stat dp.c

The

Часові пояси відображаються в нижній частині дисплея. Як бачите, вони мають дуже точну, часткову частину секунди. У кінці кожної позначки часу ви також бачите -0500 або -0400 .

Це зміщення часового поясу. Файлова система записує часові позначки в форматі UTC і перетворює їх у місцевий часовий пояс при відображенні stat. Комп’ютер, який ми використовували для дослідження цієї статті, налаштований так, ніби він перебуває в зоні східного стандартного часу (EST) США

Цей часовий пояс на п’ять годин відстає від UTC, коли діє EST. Однак, коли діє східний літній час (EDT), це чотири години позаду за UTC. У квітні 2019 року, коли змінена позначка часу була змінена, діяла EDT. Тому дві позначки часу мають п’ятигодинний зсув, а змінена – чотиригодинний.

Зміщення та часові пояси ніде не зберігаються. Немає ні inode, ні простору файлової системи, призначеного для зберігання цих значень. Ви повинні розрахувати їх на льоту, використовуючи позначку часу (яка завжди в часі UTC), місцевий часовий пояс комп’ютера, на якому відображається файл, і те, чи був літній час.

Ви також бачите мітку часу «Народження», яка зарезервована для дати створення файлу. Це не реалізовано, і ви бачите дефіс «-» замість позначки часу.

Зміна позначок часу

Якщо хочете, ви можете змінити часові позначки у файлі. Ви можете використовувати сенсорну команду, щоб змінити доступ або змінені позначки часу, або обидва:

touch -a dp.c

Щоб встановити нову позначку часу доступу, ви повинні використовувати параметр -a (час доступу). Ця команда встановлює мітку часу доступу до поточного часу комп’ютера:

stat dp.c

The

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

  Як отримати моніторинг мережі в реальному часі в Linux за допомогою Netdata

Щоб змінити змінену позначку часу, ви можете використовувати параметр -m (змінений час):

touch -m dp.c
stat dp.c

The

Цього разу змінені та змінені позначки часу були оновлені.

Ви можете використовувати параметр -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

The

А потім ми майже повернулися з того, що почали, із сумішшю міток часу -0400 і -0500.

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

chmod +x dp
stat dp

The

Змінена позначка часу була єдиною, яка оновилася. Це пов’язано з тим, що сам файл не був змінений — до нього не зверталися та не змінювалися. Проте метадані про файл були змінені.

Як файлова система оновлює позначки часу

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

Нижче наведено деякі з найбільш поширених варіантів:

strictatime (строгий час): цей параметр оновлює позначку часу доступу до файлів щоразу, коли до них звертаються. Цей підхід пов’язаний із накладними витратами, але деякі сервери можуть скористатися цією схемою. На настільному або портативному комп’ютері він не має переваг.
noatime (без часу): цей параметр повністю вимикає оновлення міток часу доступу до файлів і каталогів. Проте змінені часові позначки все одно оновлюватимуться.
nodiratime (без dir atime): цей параметр дозволяє оновлювати мітки часу доступу до файлів, але вимикає його для каталогів.
relatime (відносний час): цей параметр оновлює позначку часу доступу, лише якщо вона була понад 24 години, або попередня була старша за поточні змінені або змінені позначки часу. Це забезпечує гарний баланс між тим, що позначки часу доступу оновлюються занадто часто або не оновлюються взагалі.

  Як комфортно користуватися ПК з Linux вночі за допомогою диммера для робочого столу

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

less /etc/fstab

The

Нам буде показано файл /etc/fstab, як показано нижче.

The

Ось вміст файлу без обгортання:

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

Є лише два записи, і один з них є файлом підкачки, який ми можемо ігнорувати. Інший монтується в корені файлової системи ( / ) і був на пристрої /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.

Часові позначки важливі

Позначки часу дають нам простий спосіб побачити, коли файл був доступний, змінений чи змінений. Але, що ще важливіше, вони забезпечують спосіб резервного копіювання та синхронізації програмного забезпечення, щоб визначити, які файли потрібно створити резервну копію.

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