Покупая, а точнее арендуя, сервер за границей (у зарубежного хостинг-провайдера), Вы наверняка сталкивались с ситуацией, что время на нем не совпадает с вашим. Особенно если вы не устанавливали операционную систему самостоятельно, а развертывали ее из предлагаемого хостером образа. Как правило оно идет по времени дата-центра или по гринвичу. По-совести говоря не принципиально в каком часовом поясе сервер, и что показывают часы. Их показания всегда можно скорректировать. Но, согласитесь, что гораздо приятней, когда сервер находится в вашей временной зоне и/или в зоне большинства посетителей вашего сайта.
В этой статье на примере CentOS (red hat linux) будет показано как удаленно изменить время на сервере с операционной системой Linux. Она будет полезна всем кто администрирует Linux server.
Какие часы бывают в Linux
Немного теории. В любом компьютере есть два вида часов. Одни аппаратные (ЧРВ — часы реального времени или RTC — real time clock), которые работают даже при выключенном блоке питания, на это у них есть батарейка на материнской плате.
Другие программные, то есть часы операционной системы. Показания этих часов могут различаться. При этом программные часы опираются на показания аппаратных при старте операционной системы. А в дальнейшем могут синхронизироваться через интернет с эталонными и корректировать ход аппаратных.
В большинстве случаев если компьютер работает под управлением операционной системой Windows показания аппаратных и программных часов совпадают. В linux же чаще всего аппаратные часы настраивают по гринвичу (времени нулевого меридиана), а программные по необходимому смещению для часового пояса где расположен сервер.
Абсолютное большинство программ (приложений и сервисов) в своей работе опираются на показания системных (программных) часов.
Для чего нужно корректировать часы
- Чтобы избежать вчерашних новостей и публикаций завтрашнего дня. К примеру часы вашего сервера идут по времени Хабаровска, а основные посетители из Европы (разница UTC+11). В такой ситуации вечерний посетитель увидит «завтрашние» даты на сайте. Так как когда в Европе вечер, то в Хабаровске утро следующего дня.
- Чтобы было удобно настраивать задания Cron.
- Чтобы время создания файлов совпадало с фактическим и не вводило Вас в заблуждение.
Как настроить время вашего сервера
Проверим, что показывают аппаратные часы, для чего будем использовать три варианта команды hwclock:
# hwclock
Sun 09 Mar 2014 08:01:03 PM MSK -0.926999 seconds
# hwclock --localtime
Sun 09 Mar 2014 04:01:16 PM MSK -0.130659 seconds
# hwclock --utc
Sun 09 Mar 2014 08:01:25 PM MSK -0.411394 seconds
Приведенный пример для случая когда аппаратные часы идут по UTC, а сервер настроен на Московский часовой пояс. Особых пояснений требует опция —utc вывод времени производится (формируется) с условием, что аппаратные часы идут по времени UTC. То есть показания должны совпадать с желаемым временем на сервере. Опция же —localtime наоборот показывает время аппаратных часов без всяких поправок.
Несколько полезных команд установки времени аппаратных часов
Устанавливаем время аппаратных часов равное системному:
# hwclock --systohc
Устанавливаем время системных часов на основании ЧРВ:
# hwclock --hctosys
Устанавливаем время равное указанному:
# hwclock --set --date "09 Jan 2012 14:11"
Значение временной зоны
Данные временной зоны для аппаратных часов в Centos хранятся в файле /etc/sysconfig/clock.
Для московской временной зоны в случае когда аппаратные часы идут по UTC он имеет следующее содержимое:
ZONE="Europe/Moscow"
UTC=true
ARC=false
Где ZONE — это наш часовой пояс, UTC говорит о том, что аппаратные часы сервера идут по универсальному времени UTC, ARC в значении false — значит используется нормальное значение века (эпохи) UNIX.
Подробнее по конфигурации файла /etc/sysconfig/clock в CentOS можно почитать в официальной документации.
Системные часы операционной системы CentOS
Для системных (программных) часов CentOS используется команда date.
# date
Tue Mar 18 16:08:04 MSK 2014
# date --utc
Tue Mar 18 12:08:10 UTC 2014
Приведенный пример для случая когда операционная система использует Московский часовой пояс. Здесь опция —utc говорит, что необходимо показать время нулевого меридиана, то есть без поправок на часовой пояс.
Изменение временной зоны (часового пояса) в CentOS
Для изменения времени системных часов, если их показания не соответствуют необходимому региону, необходимо проделать следующие нехитрые операции.
В начале, сделаем резервную копию существующего файла временной зоны (часового пояса).
# mv /etc/localtime /etc/localtime.bak
Затем, создаем ссылку на необходимую временную зону.
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
где Europe/Moscow необходимая временная зона. Полный список доступных часовых поясов смотрим в каталоге /usr/share/zoneinfo/.
При необходимости можно установить значение времени вручную:
# date MMDDhhmm
где MM – месяц, DD – день, hh – час, mm – минуты.
То есть чтобы задать, к примеру, 18 марта 20 часов 15 минут, нужно ввести следующее:
# date 03182015
Более подробно о команде date, можно почитать в мануале, выполнив команду:
# man date
Настройка сервера времени ntp
Со временем часы могут убегать или отставать, поэтому время от времени их нужно синхронизировать с эталонными. Для этого в CentOS используется демон ntpd.
Установим демон ntpd если его нет в системе:
# yum install ntp
Однократно синхронизируем время:
# ntpdate pool.ntp.org
Если получили что-то вроде the NTP socket is in use, exiting — значит ntpd демон уже запущен. В этом случае остановим его:
# service stop ntpd
Настраиваем работу ЧРВ в BIOS на время по UTC:
# hwclock --systohc --utc
Этой командой мы присвоили значение времени аппаратных часов равным системному времени. Как вы помните, системные часы мы синхронизировали командами выше.
Проверим содержимое файла /etc/sysconfig/clock чтобы система после загрузки правильно выставляла местное время. Для Москвы он должен содержать следующее:
ZONE="Europe/Moscow"
UTC=true
ARC=false
Настраиваем демон ntpd на автозагрузку при старте операционной системы:
# chkconfig ntpd on
Запускаем демон синхронизации времени:
# service ntpd start
Проверяем системное время командой:
# date
Оно должно совпадать с реальным.
Проверим, синхронизируется ли системное время с серверами эталонного времени (ntp server) и все ли там в порядке командой ntpq -p:
# ntpq -p
remote | refid | st | t | when | poll | reach | delay | offset | jitter |
test.danzuck.ch | 162.23.41.56 | 2 | u | 1 | 64 | 1 | 12.280 | -23.298 | 0.031 |
fw.ams.nl.alexs | 82.197.221.30 | 4 | u | 2 | 64 | 1 | 2.086 | -19.002 | 0.000 |
ntp0.mediamatic | 193.0.0.229 | 2 | u | 1 | 64 | 1 | 0.998 | -19.938 | 0.000 |
elara.mysnip.de | .INIT. | 16 | u | - | 64 | 0 | 0.000 | 0.000 | 0.000 |
Демон ntpd включает в ядре Linux режим «11 minute mode». В этом режиме каждые 11 минут синхронизируются системные и аппаратные часы. По-умолчанию он (режим «11 minute mode») выключен и включается только когда какой-то сервис попросит включить этот режим. Демон ntpd как раз его и (режим «11 minute mode») включает. Так что дополнительно синхронизировать аппаратные часы по значению системных нет необходимости.
P.S. Теперь системные и аппаратные часы вашего сервера будут автоматически синхронизироваться с эталонными серверами и всегда показывать точное время.