#1 08.03.2015 03:56:45

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

Здравствуйте дорогие дяди и тёти. Сегодня мы поговорим о времени.

Итак, что такое время — все и так знают. Также многие догадываются, что время измеряют часами.

Но мы о компьютерах. В компьютерах у нас 2штуки часов:

1. "Железные" часы. Это самые обычные электронные часы, только без циферблата. Работают они от обычной батарейки

сами часы — восьминогая микросхема справа, а ещё правее — кварцевый резонатор, что-бы частота была стабильной, ровно 32768 тактов в секунду. Эти часы делят частоту 15 раз на два, и получается ровно 1Hz, далее эти секунды считаются в минутах, часах, и т.д.

Установить железные часы можно из меню BIOS, а можно прямо из системы, командой
[console]# hwclock --systohc[/console]
С временем не шутят, потому установка времени разрешена исключительно администратору (root'у).

2. Системные часы. А вот эти часы — часть операционной системы. Именно по ним и производится отсчёт времени.

При загрузке время из железных часов копируется в системные, а при выключении — системные копируются в железные.

Все манипуляции с временем производятся с системными, а НЕ с железными часами (исключение — hwclock. Вероятно и в sysеmd имеется свой "манипулятор").

Часовые пояса

Как известно, Земля круглая, и вертится. Потому, если у нас сейчас день, у кого-то в другом месте — ночь. Что-бы это учесть, придумали часовые пояса, в каждом поясе своё, собственное местное время (local time).

Все пояса отсчитываются от условного нуля, который территориально находится в Гринвиче (Grenewic), что в Лондоне. Сокращённо, время "по Гринвичу" называется GMT. До 1972го года от него и считали время, но затем требования к синхронности процессов возросли, и ввели новое, "стандартное" время UTC (GMT является астрономическим временем, а наша планета не слишком равномерно вращается, потому для эталона Земля не подходит). Впрочем, разница между GMT и UTC не слишком большая, не больше секунды (если становится больше, то в одну из минут добавляют 61ю секунду, т.ч. в принципе секунд может быть 61. Планета замедляется, потому убавлять секунды не нужно).

Системные часы всегда идут по UTC. Но перед тем как показать время, оно практически всегда переводится из UTC в локальное (local time)
[console]$ date
Вс мар 8 05:33:57 MSK 2015
[/console]
Как видите, у меня пояс MSK. Для смены часового пояса не нужны права root'а. Т.о. пользователь может всегда поменять свой часовой пояс, однако не может поменять само время.

Timezone (часовой пояс) меняется в bash переменной $TZ, а что-бы её узнать, нужно запустить
[console]$ tzselect[/console]
ну и ответить на пару вопросов. Затем можно экспортировать TZ, и она будет действовать на все утилиты в этой консоли. А можно только для одной команды:
[console]$ TZ='Africa/Algiers' date
Вс мар 8 03:44:21 CET 2015
[/console]
Если переменная TZ не установлена, часовой пояс берётся из /etc/localtime (это по историческим причинам бинарный файл, и редактировать его не нужно. Он ставится с операционной системой, а затем его необходимо обновлять, т.к. разница UTC и вашего локального времени вообще говоря определяется правительством вашего государства, e.g. государственной думой для РФ). Также в этом файле записано, куда и когда (не)нужно переводить стрелки часов с летнего на зимнее время, и обратно. Важно отметить, что содержимое системных часов НЕ меняется при переходах на зимнее/летнее время. Меняется лишь значение разницы с UTC.

Установка железных часов.

Linux проектировался и создавался в первую очередь для серверов. Хоть сервера обычно и не являются мобильными, но вполне обыденной является ситуация, когда пользователи сервера находятся в других часовых поясах. По этой причине, время в железных часах Linux-серверов всегда выставляется по UTC, Однако, время в десктопных OS (e.g. Windows™) "по просьбам трудящихся" ставится в localtime (очевидно предполагается, что все пользователи маздая — тупые). Утилита hwclock умеет переводить время из UTC (в котором считается системное время) в местное, и записывать в железные часы "правильное" местное время с ключом --localtime. Но выставлять "железное" время в localtime не нужно!


Точнее сказать — уже не нужно, т.к. Windows7™ наконец-то научилась считать время по человечески (по UTC), а не как обычно. Но при dual-boot'е с WindowsXP™ видимо придётся ставить localtime. Других причин использовать localtime в железных часах — нет.

Time Protocol (NTP)

В Linux существует возможность устанавливать время из интернета. Время можно синхронизировать с каким-то определённым сервером, но лучше с пулом. Вот эта команда синхронизирует время в Европе:
[console]# ntpdate europe.pool.ntp.org[/console]
Также существует демон ntpd, который поставляется уже в настроенном виде, в том смысле, что он умеет синхронизироваться сам(однако man 1 ntpd и man 5 ntp.conf нужно изучить). Следует помнить, что демон ntpd умеет корректировать только небольшое расхождение(несколько минут максимум), потому вышеприведённая команда полезна даже при наличие демона.

Настраивать ntpd необходимо только в том случае, если у вас есть локальная сеть, и вы хотите, что-бы все компьютеры в вашей сети синхронизировались с вашим сервером времени (это полезно например в случае, если Интернет отсутствует). Впрочем, настройка там довольно простая.

В таких средах как KDE4, включение синхронизации осуществляется установкой соотв. галки в настройках.

Команды для работы со временем.

Само по себе время довольно бесполезно, если не уметь с ним работать. Для начала конечно необходимо упомянуть команду
[console]$ date
Вс мар 8 06:12:17 MSK 2015
[/console]
Эта команда не только умеет показывать текущее время, но и устанавливать системные часы (для этого потребуются привилегии root'а). Команда поддерживает множество форматов как ввода, так и вывода времени. Без прав root'а время не поставить, но можно его перевести в нужный формат:
[console]$ date --date="10:00:00"
Вс мар 8 10:00:00 MSK 2015
$ date --date="2000-12-31 10:00:00"
Вс дек 31 10:00:00 MSK 2000
$ date --date="2000-12-31 10:00:00 UTC" # с указанием часового пояса
Вс дек 31 13:00:00 MSK 2000
$ date --date="next day" # завтра
Пн мар 9 06:17:59 MSK 2015
$ date --date="last year" # прошлый год
Сб мар 8 06:18:19 MSK 2014[/console]
выходных форматов команды date великое множество, e.g.
[console]$ date +%d^%m^%y # день-месяц-год
08^03^15
[/console]
(полный список см. в man 1 date)
Для вычисления разницы времени и прочего удобен формат UNIX TIME
[console]$ date +%s
1425785052
[/console]
(Это число секунд с 1970-01-01, естественно в UTC)

Время и файлы.

Важно: как и системное время, временные метки в Linux хранятся всегда в UTC.
Однако, многие команды (ls, find, etc…) могут переводить время и/в local time для удобства администратора(а могут и не переводить, как мне ниже подсказывают, rsyncd в логе пишет время по UTC). Однако, если перевод не требуется, то он и не производится. Пример: команда
[console]$ tar --update[/console]
добавляет в архив только новые файлы (т.е. файл в архив добавляется тогда, и только тогда, когда он более новый, чем копия в архиве или копии в архиве нет). При этом время в архиве хранится в UTC, как и время в FS Linux.

Каждый файл в Linux имеет как минимум 3 временные метки:

1. дата последней модификации mtime. Именно это время выводится файловыми менеджерами и командой ls (кстати команда ls -t сортирует файлы по времени mtime).

2. дата изменения атрибутов ctime (имя файла НЕ входит в атрибуты, имя файла — одна запись в каталоге, в котором находится файл, потому при переименовании меняется mtime каталога).

3. atime — дата последнего доступа(в т.ч. на чтение). Этот временной штамп любят отключать юзеры SSD, но делают это совершенно зря, т.к. уже много лет по умолчанию relatime, которое НЕ изнашивает SSD.

Все эти атрибуты показывает команда stat
[console]$ stat /
Файл: «/»
Размер: 4096 Блоков: 8 Блок В/В: 4096 каталог
Устройство: 803h/2051d Inode: 2 Ссылки: 22
Доступ: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Доступ: 2015-03-08 04:53:12.949345617 +0300
Модифицирован: 2015-03-04 10:03:45.436767032 +0300
Изменён: 2015-03-08 04:53:05.919433503 +0300
Создан: -
$ stat -c'%y' / # mtime по-человечески
2015-03-04 10:03:45.436767032 +0300
$ stat -c'%Y' / # mtime в секундах
1425452625
[/console]
Их(временные метки mtime и atime) можно заменить командой touch.

День рождения файла (Birth aka crtime)

Изначально такого атрибута в Linux не было. Однако, в EXT4 его таки запилили, и сейчас он существует. Но вот команду stat ещё не доделали к сожалению. Здесь рекомендуют такой способ:
[console]$ ll -id /etc/profile
262254 -rw-r--r-- 1 root root 2,2K фев 28 23:20 /etc/profile
$ /sbin/debugfs -R 'stat <262254>' /dev/sda3
debugfs 1.42.8 (20-Jun-2013)
Inode: 262254 Type: regular Mode: 0644 Flags: 0x80000
Generation: 3402836088 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 2215
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x54f222f9:ad72e99c -- Sat Feb 28 23:20:09 2015
atime: 0x54fcc531:ae2345ac -- Mon Mar 9 00:54:57 2015
mtime: 0x54f222f7:ed59a7ec -- Sat Feb 28 23:20:07 2015
crtime: 0x54f222f7:ed59a7ec -- Sat Feb 28 23:20:07 2015
Size of extra inode fields: 28
EXTENTS:
(0):1433617
[/console]

Поиск файлов по времени

Утилита find умеет искать файлы основываясь на времени.

1. чаще всего требуется найти файлы, которые были изменены ПОСЛЕ изменения какого-то файла filename
[console]$ find -newer filename[/console]

2.
[console]$ find -mtime n[/console]
ищет файлы изменившиеся за последние n*24 часа назад (дробная часть игнорируется, потому -mtime -1 ищет изменившиеся файлы за последние ДВА дня).
[console]$ find -mmin n[/console]
тоже самое за n минут

3.
find -newerXY позволяет сравнивать любые(имеющие смысл) комбинации временных штампов, и задавать время непосредственно, к примеру
[console]$ find -newermt 'last day' # файлы за последний день[/console]

#2 08.03.2015 12:24:08

mvt
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 6 467
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

Да здорово написал.
Док, название темы - класс :) А у меня есть и бумажная книжка :)
Цитату убрал, так как по сути на неё нет ответа, а текста много.

// Rizado

Rizado
А и зря. Мы здесь не только Linux занимаемся. Общее развитие - это уже не важно? :)
http://lib.ru/SIMAK/dant2.txt
:)

#3 08.03.2015 12:40:26

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

Quote by mvt
А у меня есть и бумажная книжка

угу, у меня тоже где-то была.

#4 08.03.2015 15:03:24

Cruiser78
Administrator
Зарегистрирован: 22.02.2010
Сообщений: 2 391
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

Сегодня мы поговорим о времени.
..............


Ну,коль пошла такая пьянка, то осталось только выяснить, почему rsyncd при приеме файлов пишет логи не с локальным временем, а в GMT... И получается в регистрационном журнале очень веселые записи, что некий хост законнектился к нам в такое-то время, а затем закачал файл чеса на три раньше... Я то понимаю, что там время там мировое, по Гринвичу, но мозг немного сносит...

#5 08.03.2015 21:36:05

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

Quote by Cruiser78
Ну,коль пошла такая пьянка, то осталось только выяснить, почему rsyncd при приеме файлов пишет логи не с локальным временем, а в GMT...

Quote by drBatty
Системные часы всегда идут по UTC.

Quote by drBatty
время в железных часах Linux-серверов всегда выставляется по UTC

rsync нужна для синхронизации, и, ИМХО логично делать синхронизацию по единому времени UTC, а не по местному в вашей Усть Тимонихе.
Quote by Cruiser78
Я то понимаю

ну и хорошо. А блондинкам не показывайте. :D

#6 08.03.2015 22:59:47

diablopc
Administrator
Зарегистрирован: 17.09.2014
Сообщений: 1 032
IP-адрес

Что может быть проще времени? (настройка времени в Linux)

тему почистил

Board footer