Логи в одном времени, cron в другом, сертификат «ещё не действует». Разбираем timedatectl на живом сервере: пояс, синхронизация и проверка часов.

Бэкап «в три ночи» проходит в какое-то странное время, в журнале события идут не в том порядке, а apt вдруг заявляет, что репозиторий «ещё не действует». Почти всегда причина одна: часовой пояс сервера не тот, что вы думаете, или часы уехали. Разберём, как это увидеть и исправить командой timedatectl.

Коротко. timedatectl без аргументов показывает местное время, UTC, часовой пояс и главное: System clock synchronized: yes. Пояс меняет sudo timedatectl set-timezone Europe/Berlin, список имён даёт timedatectl list-timezones. Для серверов, которые обслуживают людей из разных стран, удобнее держать UTC. Точность обеспечивает служба синхронизации, на Ubuntu это systemd-timesyncd, и её проверяет timedatectl timesync-status.

Что показывает timedatectl

Это штатная утилита systemd для времени: она читает и меняет часовой пояс, включает синхронизацию и ничего не требует ставить отдельно. Запустите её без аргументов (права администратора для чтения не нужны):

timedatectl

Вот реальный вывод с сервера на Ubuntu 24.04:

Читаем по строкам:

  • Local time - время в поясе сервера. Именно по нему работают date, расписание cron и подписи в большинстве программ.
  • Universal time - то же мгновение в UTC, мировом времени без сезонных переводов. Разница с местным - смещение пояса: здесь три часа (+0300).
  • RTC time - часы на материнской плате (у виртуальной машины они эмулируются). RTC in local TZ: no означает, что в них хранится UTC, и это правильный вариант для Linux.
  • System clock synchronized: yes - часы сверены с серверами точного времени. Если здесь no, остальное можно не читать: сначала чините синхронизацию.
  • NTP service: active - служба, которая эту сверку делает, запущена.

Как узнать часовой пояс сервера

Из вывода выше он виден в строке Time zone. Если нужна только эта строка, например для скрипта, спросите у системы напрямую:

timedatectl show -p Timezone --value

За этим именем стоит обычная ссылка. Пояс в Ubuntu и Debian задаёт файл /etc/localtime, который указывает на запись в базе часовых поясов:

ls -l /etc/localtime && cat /etc/timezone

На нашем сервере получилось так:

Ссылка и /etc/timezone обычно совпадают. Если у вас они расходятся, руководствуйтесь ссылкой: её читает большинство программ.

Как поменять часовой пояс

Сначала найдите точное имя. Пояса называются «Континент/Город», а не «МСК» или «GMT+3»: так база помнит и сдвиг, и даты перехода на летнее время. Отфильтруйте список по нужному региону:

timedatectl list-timezones | grep Europe/

В списке сотни строк, из них пригодятся буквально две-три: Europe/Berlin, Europe/Helsinki, Europe/Amsterdam и так далее. Выбрав имя, поменяйте пояс (эта команда требует прав администратора):

sudo timedatectl set-timezone Europe/Berlin

Без sudo обычный пользователь увидит отказ: Failed to set time zone: Interactive authentication required. Это не ошибка в имени, а нехватка прав. После смены проверьте результат повторным timedatectl и перезапустите cron, чтобы задачи точно пошли по новому времени: sudo systemctl restart cron.

UTC или местное время

Короткий совет: если сервером пользуется одна команда в одной стране, ставьте её пояс, и расписание читается без пересчётов. Если логи читают люди из разных мест, сервер обслуживает клиентов в нескольких странах или вы собираетесь собирать журналы с нескольких машин в одно место, держите UTC. Главное преимущество - в UTC не бывает перевода часов: осенью час не повторяется дважды, весной не пропадает, а задача по расписанию не запускается дважды или ни разу.

Посмотреть время в любом поясе, не меняя системный, можно одной переменной окружения:

TZ=America/New_York date; TZ=UTC date

Переменная TZ действует только на эту команду. Удобно, когда нужно быстро понять, сколько сейчас у партнёра, не трогая настройки сервера.

Часы не должны уходить: синхронизация времени

Даже верный пояс не поможет, если сами часы врут. У виртуальной машины они уходят: хост занят, процесс остановился, снимок диска восстановили. Поэтому серверу нужна служба, которая раз в десятки минут сверяется с серверами точного времени по протоколу NTP (Network Time Protocol). Спросите у неё, как идут дела:

timedatectl timesync-status

Три строки важнее остальных:

  • Server - с кем сверяются. По умолчанию на Ubuntu это ntp.ubuntu.com.
  • Offset - на сколько часы расходились с сервером при последней сверке. -639us - минус 0,6 миллисекунды. Для сервера любого сайта это идеально; тревожиться стоит, когда значение приближается к секундам.
  • Poll interval - как часто идёт сверка. 34 минуты - потолок: служба решила, что часы ведут себя ровно, и перестала дёргать сервер без нужды.

Если синхронизация выключена, включите её и снова загляните в timedatectl:

sudo timedatectl set-ntp true

На Ubuntu работу делает systemd-timesyncd, лёгкая служба из состава systemd. Для сайта, бота и обычного сервера её точности хватает с запасом. Отдельный пакет chrony нужен там, где счёт идёт на доли миллисекунд или сервер сам раздаёт время другим машинам. Одновременно держать обе службы не нужно: при установке chrony пакет systemd-timesyncd обычно удаляется сам.

Что ломается, если время неверное

Сбои из-за часов выглядят как проблемы совсем в других местах, поэтому их долго ищут не там:

Что видите

Что на самом деле

Что делать

apt update пишет «Release file ... is not valid yet»

Часы отстают от репозитория

Проверить timedatectl, включить синхронизацию

Браузер или curl жалуется «certificate is not yet valid» или «expired»

Сертификат проверяется по часам сервера

Сверить время и только потом смотреть на сам сертификат

Коды двухфакторной защиты (TOTP) не подходят

Код живёт 30 секунд, и расхождение больше этого срока его ломает

Проверить Offset в timesync-status

Бэкап запускается «не в то время»

Пояс сервера не тот, что в голове

Посмотреть Time zone и пересчитать расписание

Записи в журналах разных серверов идут вразнобой

У машин разные пояса или часы

Привести всё к UTC и включить NTP везде

Проверка за минуту

Есть простой способ убедиться, что часы не врут, не доверяя самой службе: сравнить время сервера с заголовком Date, который присылает любой сайт по HTTPS. Запросите только заголовки и сравните с date -u:

date -u; curl -sI https://www.ubuntu.com | grep -i "^date"

Расхождение в секунду-две нормально, потому что команды выполняются не в один и тот же миг. Если разница в минуты и часы, ищите причину: отключённая синхронизация, заблокированный порт 123 в фаерволе (NTP работает по UDP) или неверный пояс, который вы приняли за дрейф часов. Журнал службы подскажет подробности, о чём мы писали в статье про journalctl: достаточно sudo journalctl -u systemd-timesyncd.

Частые вопросы

Как узнать часовой пояс сервера в Linux?

Выполните timedatectl и найдите строку Time zone. Коротко: timedatectl show -p Timezone --value выведет только имя пояса, например Europe/Berlin.

Как изменить часовой пояс в Ubuntu?

Найдите имя через timedatectl list-timezones | grep Город и выполните sudo timedatectl set-timezone Континент/Город. Затем проверьте результат повторным timedatectl.

Какой часовой пояс ставить на сервере: UTC или местный?

Для одной команды в одной стране подойдёт местный. Если сервис обслуживает разные страны или вы собираете логи с нескольких серверов, ставьте UTC: в нём нет перехода на летнее время и путаницы при разборе журналов.

Почему timedatectl показывает «System clock synchronized: no»?

Служба синхронизации выключена, не может достучаться до серверов времени или только что запустилась и ещё не успела сверить часы. Включите её через sudo timedatectl set-ntp true, проверьте, не закрыт ли исходящий UDP-порт 123, и подождите минуту.

Что лучше: chrony или systemd-timesyncd?

Для обычного сервера хватает systemd-timesyncd, он уже стоит в Ubuntu. chrony берут, когда нужна точность выше миллисекунд, когда сервер сам раздаёт время или когда сеть нестабильна.

Итог

  • timedatectl - главная команда: показывает местное время, UTC, пояс и состояние синхронизации.
  • Часовой пояс задаётся именем «Континент/Город» через sudo timedatectl set-timezone, а сам выбор делайте исходя из того, кто читает логи.
  • Для серверов с разными пользователями и несколькими машинами удобнее UTC.
  • Точность держит systemd-timesyncd; смотрите на Offset и System clock synchronized.
  • Неверное время маскируется под ошибки сертификатов, apt, двухфакторной защиты и cron.

🎁 -40% на первый месяц нового VPS. Промокод GUIDE40
Нужен сервер под ваши задачи? Первый месяц со скидкой.
Введите GUIDE40 при оформлении заказа. Работает один раз на клиента.
Выбрать VPS и забрать скидку →