Программы
Настроим время в Linux, FreeBSD и прочих Unix

Настроим время в Linux, FreeBSD и прочих Unix

Как я уже говорил, тема времени — очень скользкая. Здесь нас поджидают сотни договорённостей, которые были приняты до нас. Однако, нам с этим жить. И, возможно, жить с этим под Linux и прочими Unix.

Как я уже говорил, тема времени — очень скользкая. Здесь нас поджидают сотни договорённостей, которые были приняты до нас. Однако, нам с этим жить. И, возможно, жить с этим под Linux и прочими Unix.

Изображение Шпаргалка по командам Linux, FreeBSD и MacOS

Установить и узнать время в Linux/Unix

Для начала установим дату:

$ sudo date +%Y%m%d -s "20170605"

И время:

$ sudo date +%T -s "22:38:00"

Но вот ведь не задача: мы же не указали, в какой временной зоне наше время… Linux выберет ту, которая установлена в системе (об этом ниже). Но если временная зона неизвестна — что делать?

Мы можем воспользоваться менее человеко-читаемым вариантом ввода времени. Однако, он удобнее в плане того, что не зависит от временных зон — Unix Time!

Unix Time — это ещё одна договорённость. Это просто количество секунд, которые прошли с 1-го января 1970-го года по Гринвичу. Вне зависимости от вашего часового пояса, количество секунд с того момента прошло одинаково.

$ sudo date +%s -s @1496679078

Посмотреть время можно с помощью той же утилиты date:

$ date
Пн июн  5 22:38:37 +05 2017

Или в unixtime:

$ date +%s
1496679078

Часы BIOS (аппаратные часы)

Да, если вам кажется, что мы настроили время, то вы заблуждаетесь. Да, мы установили время в системе… до первой перезагрузки! На самом деле, на время также хранится в маленьком чипе на материнской плате. Этот чип имеет свою батарейку, чтобы не зависеть от электросети, которая иногда пропадает. Время на нём также нужно устанавливать, ведь именно его использует операционная система при загрузке.

Итак, давайте посмотрим, который час «по-аппаратному»:

$ sudo hwclock --show
[sudo] пароль для gosha: 
Пн 05 июн 2017 22:37:58  .748508 seconds

и, если нас не устраивает, установим своё время:

$ sudo hwclock --set --date="2017-06-05 22:38:00" --localtime

Также можно ставить время в utc (вместо localtime) для любителей.

Теперь и после перезагрузки время будет идти «правильно».

Временные зоны

Ах, подождите! Но ведь мы установили время опять же в «человеческом» формате! А вдруг, у нас был не тот часовой пояс!? Давайте уже решим эту проблему и настроим временную зону в системе!

Установить временную зону можно опять же из консоли. Для этого сходим в папку /usr/share/zoneinfo/ и смотрим, что там есть. К примеру, я знаю, что моя временная зона — Екатеринбург, а он находится в Азии.

$ ls /usr/share/zoneinfo/
Africa      Egypt      Hongkong           Mexico      ROC
America     Eire       HST                MST         ROK
Antarctica  EST        Iceland            MST7MDT     Singapore
Arctic      EST5EDT    Indian             Navajo      SystemV
Asia        Etc        Iran               NZ          Turkey
Atlantic    Europe     iso3166.tab        NZ-CHAT     UCT
Australia   Factory    Israel             Pacific     Universal
Brazil      GB         Jamaica            Poland      US
Canada      GB-Eire    Japan              Portugal    UTC
CET         GMT        Kwajalein          posix       WET
Chile       GMT0       leap-seconds.list  posixrules  W-SU
CST6CDT     GMT-0      Libya              PRC         zone1970.tab
Cuba        GMT+0      localtime          PST8PDT     zone.tab
EET         Greenwich  MET                right       Zulu

К слову, внутри бинарная информация, но заглянуть внутрь мы всё же можем с помощью утилиты file:

$ file /usr/share/zoneinfo/Asia/Yekaterinburg 
/usr/share/zoneinfo/Asia/Yekaterinburg: timezone data, version 2, 12 gmt time flags, 12 std time flags, no leap seconds, 67 transition times, 12 abbreviation chars

Собственно, меня всё устраивает — устанавливаем временную зону:

$ sudo cp /usr/share/zoneinfo/Asia/Yekaterinburg  /etc/localtime

Установив временную зону, мы можем уже настроить автоматическое обновление настроек времени с помощью протокола NTP — Network Time Protocol — протокол сетевого времени.

Обновить время можно, например командой ntpdate. Не всегда она есть в системе, поэтому ставим (вариант для Ubuntu/Debian/Linux Mint):

sudo apt install ntpdate

после установки уже можно сделать:

$ sudo ntpdate 0.ru.pool.ntp.org
 5 Jun 22:54:33 ntpdate[31964]: adjust time server 195.208.218.66 offset 0.005950 sec

где 0.ru.pool.ntp.org — один из русских серверов ntp.

ntpdate сходила на удалённый сервер по протоколу ntp и установила полученное с сервера время нам в систему.

Также можно указать сервера в файле /etc/ntp.conf, чтобы ntpd автоматически обновлял время из сети:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

Однако, чтобы использовать именно ntpd для настройки времени, его надо будет поставить(вариант для Ubuntu/Debian/Linux Mint):

sudo apt install ntp

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

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

Цените время!