Здравствуйте дорогие дяди и тёти. Сегодня мы поговорим о времени.
Итак, что такое время — все и так знают. Также многие догадываются, что время измеряют часами.
Но мы о компьютерах. В компьютерах у нас 2штуки часов:
1. "Железные" часы. Это самые обычные электронные часы, только без циферблата. Работают они от обычной батарейки
сами часы — восьминогая микросхема справа, а ещё правее — кварцевый резонатор, что-бы частота была стабильной, ровно 32768 тактов в секунду. Эти часы делят частоту 15 раз на два, и получается ровно 1Hz, далее эти секунды считаются в минутах, часах, и т.д.
Установить железные часы можно из меню BIOS, а можно прямо из системы, командой
С временем не шутят, потому установка времени разрешена исключительно администратору (root'у).
2. Системные часы. А вот эти часы — часть операционной системы. Именно по ним и производится отсчёт времени.
При загрузке время из железных часов копируется в системные, а при выключении — системные копируются в железные.
Все манипуляции с временем производятся с системными, а НЕ с железными часами (исключение — hwclock. Вероятно и в sysеmd имеется свой "манипулятор").
Часовые пояса
Как известно, Земля круглая, и вертится. Потому, если у нас сейчас день, у кого-то в другом месте — ночь. Что-бы это учесть, придумали часовые пояса, в каждом поясе своё, собственное местное время (local time).
Все пояса отсчитываются от условного нуля, который территориально находится в Гринвиче (Grenewic), что в Лондоне. Сокращённо, время "по Гринвичу" называется GMT. До 1972го года от него и считали время, но затем требования к синхронности процессов возросли, и ввели новое, "стандартное" время UTC (GMT является астрономическим временем, а наша планета не слишком равномерно вращается, потому для эталона Земля не подходит). Впрочем, разница между GMT и UTC не слишком большая, не больше секунды (если становится больше, то в одну из минут добавляют 61ю секунду, т.ч. в принципе секунд может быть 61. Планета замедляется, потому убавлять секунды не нужно).
Системные часы всегда идут по UTC. Но перед тем как показать время, оно практически всегда переводится из UTC в локальное (local time)
Вс мар 8 05:33:57 MSK 2015
Как видите, у меня пояс MSK. Для смены часового пояса не нужны права root'а. Т.о. пользователь может всегда поменять свой часовой пояс, однако не может поменять само время.
Timezone (часовой пояс) меняется в bash переменной $TZ, а что-бы её узнать, нужно запустить
ну и ответить на пару вопросов. Затем можно экспортировать TZ, и она будет действовать на все утилиты в этой консоли. А можно только для одной команды:
Вс мар 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 существует возможность устанавливать время из интернета. Время можно синхронизировать с каким-то определённым сервером, но лучше с пулом. Вот эта команда синхронизирует время в Европе:
Также существует демон ntpd, который поставляется уже в настроенном виде, в том смысле, что он умеет синхронизироваться сам(однако man 1 ntpd и man 5 ntp.conf нужно изучить). Следует помнить, что демон ntpd умеет корректировать только небольшое расхождение(несколько минут максимум), потому вышеприведённая команда полезна даже при наличие демона.
Настраивать ntpd необходимо только в том случае, если у вас есть локальная сеть, и вы хотите, что-бы все компьютеры в вашей сети синхронизировались с вашим сервером времени (это полезно например в случае, если Интернет отсутствует). Впрочем, настройка там довольно простая.
В таких средах как KDE4, включение синхронизации осуществляется установкой соотв. галки в настройках.
Команды для работы со временем.
Само по себе время довольно бесполезно, если не уметь с ним работать. Для начала конечно необходимо упомянуть команду
Вс мар 8 06:12:17 MSK 2015
Эта команда не только умеет показывать текущее время, но и устанавливать системные часы (для этого потребуются привилегии root'а). Команда поддерживает множество форматов как ввода, так и вывода времени. Без прав root'а время не поставить, но можно его перевести в нужный формат:
Вс мар 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.
08^03^15
(полный список см. в man 1 date)
Для вычисления разницы времени и прочего удобен формат UNIX TIME
1425785052
(Это число секунд с 1970-01-01, естественно в UTC)
Время и файлы.
Важно: как и системное время, временные метки в Linux хранятся всегда в UTC.
Однако, многие команды (ls, find, etc…) могут переводить время и/в local time для удобства администратора(а могут и не переводить, как мне ниже подсказывают, rsyncd в логе пишет время по UTC). Однако, если перевод не требуется, то он и не производится. Пример: команда
добавляет в архив только новые файлы (т.е. файл в архив добавляется тогда, и только тогда, когда он более новый, чем копия в архиве или копии в архиве нет). При этом время в архиве хранится в UTC, как и время в FS Linux.
Каждый файл в Linux имеет как минимум 3 временные метки:
1. дата последней модификации mtime. Именно это время выводится файловыми менеджерами и командой ls (кстати команда ls -t сортирует файлы по времени mtime).
2. дата изменения атрибутов ctime (имя файла НЕ входит в атрибуты, имя файла — одна запись в каталоге, в котором находится файл, потому при переименовании меняется mtime каталога).
3. atime — дата последнего доступа(в т.ч. на чтение). Этот временной штамп любят отключать юзеры SSD, но делают это совершенно зря, т.к. уже много лет по умолчанию relatime, которое НЕ изнашивает SSD.
Все эти атрибуты показывает команда 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 ещё не доделали к сожалению. Здесь рекомендуют такой способ:
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
2.
ищет файлы изменившиеся за последние n*24 часа назад (дробная часть игнорируется, потому -mtime -1 ищет изменившиеся файлы за последние ДВА дня).
тоже самое за n минут
3.
find -newerXY позволяет сравнивать любые(имеющие смысл) комбинации временных штампов, и задавать время непосредственно, к примеру
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)