108.1 Урок 1
Сертифікат: |
LPIC-1 (102) |
---|---|
Версія: |
5.0 |
Розділ: |
108 Основні системні служби |
Тема: |
108.1 Підтримка системного часу |
Урок: |
1 з 2 |
Вступ
Точний відлік часу є надзвичайно важливим для сучасної комп’ютерної техніки. Однак реалізація підтримки часу є напрочуд складною. Практика ведення часу здається кінцевому користувачеві тривіальною, але система повинна вміти розумно справлятися з багатьма особливостями та граничними випадками. Майте на увазі, що часові пояси не є статичними, а можуть бути змінені адміністративним чи політичним рішенням. Країна може відмовитися від переходу на літній час. Будь-яка програма повинна вміти логічно обробляти ці зміни. На щастя для системних адміністраторів, рішення для обліку часу в операційній системі Linux є зрілими, надійними і зазвичай працюють без особливих перешкод.
Коли комп’ютер Linux завантажується, він починає відраховувати час. Ми називаємо це системним годинником, оскільки він оновлюється операційною системою. Крім того, сучасні комп’ютери також мають апаратний або годинник реального часу. Цей апаратний годинник часто є функцією материнської плати і зберігає час незалежно від того, працює комп’ютер чи ні. Під час завантаження системний час встановлюється з апаратного годинника, але здебільшого ці два годинники працюють незалежно один від одного. У цьому уроці ми обговоримо методи взаємодії як із системним, так і з апаратним годинниками.
У більшості сучасних систем Linux системний і апаратний час синхронізуються з мережевим часом, який реалізується протоколом мережевого часу (NTP). У переважній більшості випадків єдина конфігурація, яку потребує звичайний користувач, це встановити свій часовий пояс, а NTP подбає про все інше. Однак ми розглянемо деякі способи роботи з часом вручну, а особливості налаштування мережевого часу будуть розглянуті в наступному уроці.
Місцевий та всесвітній час
Системний годинник налаштовано на всесвітній координований час (UTC), який є місцевим часом у Гринвічі, Великобританія. Зазвичай користувач хоче знати свій місцевий час. Місцевий час обчислюється шляхом використання часу UTC і застосування зміщення на основі часового поясу та літнього часу. Таким чином можна уникнути багатьох складнощів.
Системний годинник можна встановити на час UTC або місцевий час, але рекомендується також налаштувати час UTC.
Дата
date
— основна утиліта, яка просто друкує місцевий час:
$ date Sun Nov 17 12:55:06 EST 2019
Зміна параметрів команди date
змінить формат виведення.
Наприклад, користувач може використовувати date -u
, щоб переглянути поточний час UTC.
$ date -u Sun Nov 17 18:02:51 UTC 2019
Деякі інші параметри, що часто використовуються, повертають місцевий час у форматі, який відповідає прийнятому формату RFC:
-I
-
Дата/час у форматі ISO 8601. Додавання
date
(-Idate
) обмежить вихідні дані лише датою. Інші формати:hours
,minutes
,seconds
таns
для наносекунд. -R
-
Повертає дату й час у форматі RFC 5322.
--rfc-3339
-
Повертає дату й час у форматі RFC 3339.
Формат date
може бути налаштований користувачем за допомогою послідовностей, указаних на man-сторінці. Наприклад, поточний час можна відформатувати як час Unix таким чином:
$ date +%s 1574014515
З man-сторінки date
ми бачимо, що %s
відноситься до часу Unix.
Час Unix використовується в більшості Unix-подібних систем. Він зберігає час UTC як кількість секунд після Epoch, яка була визначена як 1 січня 1970 року.
Note
|
Кількість бітів, необхідних для зберігання часу Unix на даний момент, становить 32 біти. У майбутньому виникне проблема, коли 32 біти стануть недостатніми, щоб містити поточний час у форматі Unix. Це спричинить серйозні проблеми для будь-якої 32-розрядної системи Linux. На щастя, це станеться не раніше 19 січня 2038 року. |
Використовуючи ці послідовності, ми можемо відформатувати дату й час майже в будь-якому форматі, який вимагає будь-яка програма. Звичайно, у більшості випадків набагато краще дотримуватися прийнятого стандарту.
Крім того, date --date
можна використовувати для форматування часу, який не є поточним. У цьому сценарії користувач може вказати дату, яка буде застосована до системи, використовуючи, наприклад, час Unix:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
Використання параметра --debug
може бути дуже корисним для забезпечення успішного аналізу дати. Подивіться, що відбувається, коли команді передано дійсну дату:
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Це може бути зручним інструментом під час усунення несправностей програми, яка генерує дату.
Апаратний годинник
Користувач може запустити команду hwclock
, щоб переглянути час, який підтримується на годиннику реального часу. Для цієї команди будуть потрібні підвищені привілеї, тому в цьому випадку ми використаємо sudo
для виклику команди:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
Використання параметра --verbose
поверне більше результатів, які можуть бути корисними для усунення несправностей:
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Зверніть увагу на Calculated Hardware Clock drift
(розраховане відхилення апаратного годинника). Ці вихідні дані можуть повідомити вам, чи системний час і апаратний час відрізняються один від одного.
timedatectl
timedatectl
— це команда, яку можна використовувати для перевірки загального стану часу та дати, включно з тим, чи синхронізовано мережевий час (протокол мережевого часу буде розглянуто в наступному уроці).
За умовчанням timedatectl
повертає інформацію, подібну до date
, але з додаванням RTC (апаратного) часу, а також статусу служби NTP:
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Встановлення часу за допомогою timedatectl
Якщо NTP недоступний, для встановлення часу рекомендується використовувати timedatectl
замість date
або hwclock
:
# timedatectl set-time '2011-11-25 14:00:00'
Процес подібний до date
. Користувач також може встановити час незалежно від дати, використовуючи формат HH:MM:SS.
Встановлення часового поясу за допомогою timedatectl
timedatectl
є кращим способом встановлення місцевого часового поясу в системах Linux на основі systemd
, коли немає графічного інтерфейсу користувача. timedatectl
перелічить можливі часові пояси, а потім часовий пояс можна встановити, використовуючи один із них як аргумент.
Спочатку ми виведемо перелік можливих часових поясів:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
Список можливих часових поясів довгий, тому в цьому випадку рекомендується використовувати команду grep
.
Далі ми можемо встановити часовий пояс за допомогою одного з елементів списку, який було повернуто:
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Майте на увазі, що назва часового поясу має бути точною. Наприклад, Africa/Cairo
змінить часовий пояс, а cairo
або africa/cairo
- ні.
Вимкнення NTP за допомогою timedatectl
У деяких випадках може знадобитися відключити NTP. Це можна зробити за допомогою systemctl
, але ми продемонструємо це за допомогою timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Налаштування часового поясу без timedatectl
Встановлення інформації про часовий пояс є стандартним кроком під час встановлення Linux на нову машину. Якщо є графічний процес інсталяції, це, швидше за все, буде виконано без участі користувача.
Каталог /usr/share/zoneinfo
містить інформацію про різні можливі часові пояси. У каталозі zoneinfo
є підкаталоги, які містять назви континентів, а також інші символьні посилання. Рекомендовано шукати інформацію про зону вашого регіону, починаючи з вашого континенту.
Файли zoneinfo
містять правила, необхідні для розрахунку зміщення місцевого часу відносно UTC, і вони також важливі, якщо у вашому регіоні дотримуються літнього часу. Вміст /etc/localtime
буде прочитано, коли Linux потрібно буде визначити місцевий часовий пояс. Щоб установити часовий пояс без використання графічного інтерфейсу користувача, користувач повинен створити символьне посилання для свого місцезнаходження з /usr/share/zoneinfo
на /etc/localtime
. Наприклад:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Після встановлення правильного часового поясу часто рекомендується виконати:
# hwclock --systohc
Це встановить апаратний годинник із системного годинника (тобто годинник реального часу буде встановлено на той самий час, що й за допомогою команди date
). Будь ласка, зверніть увагу, що ця команда виконується з правами root, у цьому випадку, якщо ви ввійшли в систему як root.
/etc/timezone
схожий на /etc/localtime
. Це представлення даних місцевого часового поясу, і його можна прочитати за допомогою cat
:
$ cat /etc/timezone America/Toronto
Зауважте, що цей файл використовується не всіма дистрибутивами Linux.
Встановлення дати й часу без timedatectl
Note
|
Більшість сучасних систем Linux використовують |
Використання дати
date
має опцію для встановлення системного часу. Використовуйте --set
або -s
, щоб встановити дату та час. Ви також можете використовувати --debug
, щоб перевірити правильність аналізу команди:
# date --set="11 Nov 2011 11:11:11"
Зверніть увагу, що для встановлення дати тут потрібні права root. Ми також можемо змінити час або дату окремо:
# date +%Y%m%d -s "20111125"
Тут ми повинні вказати послідовності, щоб наш рядок аналізувався належним чином. Наприклад, %Y
стосується року, тому перші чотири цифри 2011
будуть інтерпретуватися як 2011 рік. Подібним чином, %T
— це послідовність часу, і це демонструється тут за допомогою встановлення часу:
# date +%T -s "13:11:00"
Після зміни системного часу рекомендується також налаштувати апаратний годинник, щоб системний і апаратний годинник були синхронізовані:
# hwclock --systohc
systohc
означає “системний годинник для апаратного годинника”.
Використання hwclock
Замість того, щоб налаштовувати системний годинник і оновлювати апаратний годинник, ви можете змінити процес у зворотному напрямку. Ми почнемо з налаштування апаратного годинника:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Зауважте, що за замовчуванням hwclock
очікує часу UTC, але за замовчуванням повертає місцевий час.
Після встановлення апаратного годинника нам потрібно буде оновити системний годинник з нього. hctosys
можна розуміти як “апаратний годинник для системного годинника”.
# hwclock --hctosys
Вправи до посібника
-
Укажіть, чи наступні команди відображають або змінюють системний час або апаратний час:
Команда(и) Системний час Апаратний час Обидва варіанти date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Зверніть увагу на наведені нижче вихідні дані, а потім виправте формат аргументу, щоб команда була успішною:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Використовуйте команду
date
і послідовності, щоб місяцем системи було встановлено лютий. Залиште решту дати й часу без змін. -
Якщо припустити, що попередня команда виконана успішно, використовуйте
hwclock
, щоб встановити апаратний годинник із системного годинника. -
Є місце під назвою
eucla
. До складу якого материка воно входить? Використовуйте командуgrep
, щоб дізнатися. -
Встановіть поточний часовий пояс для
eucla
.
Дослідницькі вправи
-
Який спосіб встановлення часу є оптимальним? За якого сценарію бажаний метод може бути неможливим?
-
Чому, на вашу думку, існує так багато методів, щоб виконати одну й ту саму дію, наприклад встановити системний час?
-
Після 19 січня 2038 року системний час Linux потребуватиме для зберігання 64-розрядного числа. Однак можливо, що ми могли б просто вибрати “New Epoch” (Нову Епоху). Наприклад, опівночі 1 січня 2038 року можна встановити час нової епохи
0
. Чому, на вашу думку, це рішення не стало кращим?
Підсумки
На цьому уроці ви вивчили:
-
Як відображати час у різних форматах з командного рядка.
-
Різницю між системним годинником і апаратним годинником у Linux.
-
Як вручну встановити системний годинник.
-
Як вручну встановити апаратний годинник.
-
Як змінити часовий пояс системи.
Команди, які використовуються в цьому уроці:
date
-
Відображає або змінює час системного годинника. Інші варіанти:
-u
-
Відображає час UTC.
+%s
-
Використовує послідовність для відображення часу епохи.
--date=
-
Вказує конкретний час для відображення на відміну від поточного часу.
--debug
-
Відображає повідомлення налагодження під час аналізу дати, введеної користувачем.
-s
-
Налаштовує системний годинник вручну.
hwclock
-
Відображає або змінює час апаратного годинника.
--systohc
-
Використовує системний годинник, щоб установити апаратний годинник.
--hctosys
-
Використовує апаратний годинник для встановлення системного годинника.
--set --date
-
Налаштовує апаратний годинник вручну.
timedatectl
-
Відображає системний і апаратний годинники, а також конфігурації NTP у системах Linux на основі systemd.
set-time
-
Встановлює час вручну.
list-timezones
-
Перелічує можливі часові пояси.
set-timezone
-
Встановлює часові зони вручну.
set-ntp
-
Вмикає/вимикає NTP.
Відповіді до вправ посібника
-
Укажіть, чи наступні команди відображають або змінюють системний час або апаратний час:
Команда(и) Системний час Апаратний час Обидва варіанти date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Зверніть увагу на наведені нижче вихідні дані, а потім виправте формат аргументу, щоб команда була успішною:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Використовуйте команду
date
і послідовності, щоб місяцем системи було встановлено лютий. Залиште решту дати й часу без змін.date +%m -s "2"
-
Якщо припустити, що попередня команда виконана успішно, використовуйте
hwclock
, щоб встановити апаратний годинник із системного годинника.hwclock -systohc
-
Є місце під назвою
eucla
. До складу якого материка воно входить? Використовуйте командуgrep
, щоб дізнатися.timedatectl list-timezones \| grep -i eucla
АБО
grep -ri eucla /usr/share/zoneinfo
-
Встановіть поточний часовий пояс для
eucla
.timedatectl set-timezone 'Australia/Eucla'
або
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Відповіді до дослідницьких вправ
-
Який спосіб встановлення часу є оптимальним? За якого сценарію бажаний метод може бути неможливим?
У більшості дистрибутивів Linux NTP увімкнено за замовчуванням і його слід залишити для встановлення системного часу без втручання. Однак, якщо є система Linux, яка не підключена до Інтернету, NTP буде недоступний. Наприклад, вбудована система Linux, яка працює на промисловому обладнанні, може не мати підключення до мережі.
-
Чому, на вашу думку, існує так багато методів, щоб виконати одну й ту саму дію, наприклад встановити системний час?
Оскільки встановлення часу було вимогою для всіх систем *nix протягом десятиліть, існує багато застарілих методів встановлення часу, які досі підтримуються.
-
Після 19 січня 2038 року системний час Linux потребуватиме для зберігання 64-розрядного числа. Однак можливо, що ми могли б просто вибрати “New Epoch” (Нову Епоху). Наприклад, опівночі 1 січня 2038 року можна встановити час нової епохи
0
. Чому, на вашу думку, це рішення не стало кращим?До 2038 року переважна більшість комп’ютерів уже працюватиме з 64-розрядними процесорами, і використання 64-розрядного числа не призведе до істотного зниження продуктивності. Однак оцінити ризики “перезавантаження” епохального часу таким чином було б неможливо. Це може вплинути на багато застарілого програмного забезпечення. Банки та великі підприємства, наприклад, часто мають велику кількість старих програм для внутрішнього використання. Тож цей сценарій, як і багато інших, є дослідженням компромісів. На будь-які 32-розрядні системи, які все ще працюють у 2038 році, вплине переповнення Epoch Time, але на застаріле програмне забезпечення вплине зміна значення Epoch.