1 (09.03.2015 02:25:02 отредактировано drBatty)

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

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

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

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

1. "Железные" часы. Это самые обычные электронные часы, только без циферблата. Работают они от обычной батарейки
http://www.znaikak.ru/design/pic/visred/%D0%B1%D0%B0%D1%82%D0%B0%D1%80%D1%83%D0%B9%D0%BA%D0%B0.jpg
сами часы — восьминогая микросхема справа, а ещё правее — кварцевый резонатор, что-бы частота была стабильной, ровно 32768 тактов в секунду. Эти часы делят частоту 15 раз на два, и получается ровно 1Hz, далее эти секунды считаются в минутах, часах, и т.д.

Установить железные часы можно из меню BIOS, а можно прямо из системы, командой

Консоль
# hwclock --systohc

С временем не шутят, потому установка времени разрешена исключительно администратору (root'у).

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

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

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

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

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

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

Системные часы всегда идут по UTC. Но перед тем как показать время, оно практически всегда переводится из UTC в локальное (local time)

Консоль
$ date
Вс мар  8 05:33:57 MSK 2015

Как видите, у меня пояс MSK. Для смены часового пояса не нужны права root'а. Т.о. пользователь может всегда поменять свой часовой пояс, однако не может поменять само время.

Timezone (часовой пояс) меняется в bash переменной $TZ, а что-бы её узнать, нужно запустить

Консоль
$ tzselect

ну и ответить на пару вопросов. Затем можно экспортировать TZ, и она будет действовать на все утилиты в этой консоли. А можно только для одной команды:
Консоль
$ TZ='Africa/Algiers' date
Вс мар  8 03:44:21 CET 2015

Если переменная TZ не установлена, часовой пояс берётся из /etc/localtime (это по историческим причинам бинарный файл, и редактировать его не нужно. Он ставится с операционной системой, а затем его необходимо обновлять, т.к. разница UTC и вашего локального времени вообще говоря определяется правительством вашего государства, e.g. государственной думой для РФ). Также в этом файле записано, куда и когда (не)нужно переводить стрелки часов с летнего на зимнее время, и обратно. Важно отметить, что содержимое системных часов НЕ меняется при переходах на зимнее/летнее время. Меняется лишь значение разницы с UTC.

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

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

+ открыть спойлер

LOCAL vs UTC
       Keeping  the  Hardware  Clock  in  a  local timescale causes inconsistent daylight saving time
       results:

       · If Linux is running during a daylight saving time change, the time written to  the  Hardware
         Clock will be adjusted for the change.

       · If  Linux  is NOT running during a daylight saving time change, the time read from the Hard‐
         ware Clock will NOT be adjusted for the change.

       The Hardware Clock on an ISA compatible system keeps only a date and time, it has  no  concept
       of  timezone nor daylight saving. Therefore, when hwclock is told that it is in local time, it
       assumes it is in the 'correct' local time and makes no adjustments to the time read from it.

       Linux handles daylight saving time changes transparently only when the Hardware Clock is  kept
       in  the  UTC  timescale. Doing so is made easy for system administrators as hwclock uses local
       time for its output and as the argument to the --date option.

       POSIX systems, like Linux, are designed to have the System Clock operate in the UTC timescale.
       The  Hardware  Clock's  purpose  is  to initialize the System Clock, so also keeping it in UTC
       makes sense.

       Linux does, however, attempt to accommodate the Hardware Clock being in the  local  timescale.
       This  is  primarily for dual-booting with older versions of MS Windows. From Windows 7 on, the
       RealTimeIsUniversal registry key is supposed to be working properly so that its Hardware Clock
       can be kept in UTC.

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

Time Protocol (NTP)

В Linux существует возможность устанавливать время из интернета. Время можно синхронизировать с каким-то определённым сервером, но лучше с пулом. Вот эта команда синхронизирует время в Европе:

Консоль
# ntpdate europe.pool.ntp.org

Также существует демон ntpd, который поставляется уже в настроенном виде, в том смысле, что он умеет синхронизироваться сам(однако man 1 ntpd и man 5 ntp.conf нужно изучить). Следует помнить, что демон ntpd умеет корректировать только небольшое расхождение(несколько минут максимум), потому вышеприведённая команда полезна даже при наличие демона.

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

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

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

Само по себе время довольно бесполезно, если не уметь с ним работать. Для начала конечно необходимо упомянуть команду

Консоль
$ date
Вс мар  8 06:12:17 MSK 2015

Эта команда не только умеет показывать текущее время, но и устанавливать системные часы (для этого потребуются привилегии root'а). Команда поддерживает множество форматов как ввода, так и вывода времени. Без прав root'а время не поставить, но можно его перевести в нужный формат:
Консоль
$ 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

выходных форматов команды date великое множество, e.g.
Консоль
$ date +%d^%m^%y # день-месяц-год
08^03^15

(полный список см. в man 1 date)
Для вычисления разницы времени и прочего удобен формат UNIX TIME
Консоль
$ date +%s
1425785052

(Это число секунд с 1970-01-01, естественно в UTC)

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

Важно: как и системное время, временные метки в Linux хранятся всегда в UTC.
Однако, многие команды (ls, find, etc…) могут переводить время и/в local time для удобства администратора(а могут и не переводить, как мне ниже подсказывают, rsyncd в логе пишет время по UTC). Однако, если перевод не требуется, то он и не производится. Пример: команда

Консоль
$ tar --update

добавляет в архив только новые файлы (т.е. файл в архив добавляется тогда, и только тогда, когда он более новый, чем копия в архиве или копии в архиве нет). При этом время в архиве хранится в UTC, как и время в FS Linux.

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

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

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

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

Все эти атрибуты показывает команда stat

Консоль
$ 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

Их(временные метки mtime и atime) можно заменить командой touch.

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

Изначально такого атрибута в Linux не было. Однако, в EXT4 его таки запилили, и сейчас он существует. Но вот команду stat ещё не доделали к сожалению. Здесь рекомендуют такой способ:

Консоль
$ 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

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

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

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

Консоль
$ find -newer filename

2.

Консоль
$ find -mtime n

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

тоже самое за n минут

3.
find -newerXY позволяет сравнивать любые(имеющие смысл) комбинации временных штампов, и задавать время непосредственно, к примеру

Консоль
$ find -newermt 'last day' # файлы за последний день

2 (08.03.2015 15:24:08 отредактировано mvt)

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

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

// Rizado

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

3

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

mvt пишет

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

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

4

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

drBatty пишет

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

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

5

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

Cruiser78 пишет

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

drBatty пишет

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

drBatty пишет

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

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

Cruiser78 пишет

Я то понимаю

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

6

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

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