Настройка времени на Linux сервере CentOS

 14 апреля 2014      
 Linux - CentOS      
 Комментариев еще нет

Покупая, а точнее арендуя, сервер за границей (у зарубежного хостинг-провайдера), Вы наверняка сталкивались с ситуацией, что время на нем не совпадает с вашим. Особенно если вы не устанавливали операционную систему самостоятельно, а развертывали ее из предлагаемого хостером образа. Как правило оно идет по времени дата-центра или по гринвичу. По-совести говоря не принципиально в каком часовом поясе сервер, и что показывают часы. Их показания всегда можно скорректировать. Но, согласитесь, что гораздо приятней, когда сервер находится в вашей временной зоне и/или в зоне большинства посетителей вашего сайта.
В этой статье на примере 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. Теперь системные и аппаратные часы вашего сервера будут автоматически синхронизироваться с эталонными серверами и всегда показывать точное время.

При написании статьи были использованы следующие источники и литература

  1. Change Timezone in CentOS
  2. Автозапуск сервисов в CentOS/RHEL
  3. Время в linux. UTC или localtime?
  4. Настройка времени в Bitrix VM (CentOS)

 Метки:  

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Технический блог © 2016
SQL - 39 | 0,186 сек. | 7.7 МБ