середа, 16 жовтня 2013 р.

Синхронізація часу в віртуальних машинах

Є одна проблема з підтримкою точного часу на віртуальних машинах (ВМ).
Все добре, поки ВМ знаходиться в активному стані та за точністю часу на ній слідкує демон ntpd [1]. Проблема виникає тоді, коли сервер-носія має бути перезавантажений, або вимкнений на деякий час. За звичай під час завершення роботи носія всі ВМ, що знаходяться на ньому, переводяться в "сплячий" режим (suspended), під час якого їх поточний стан (повний вміст оперативної пам’яті) зберігається на диску носія. Коли носій завантажується і відновлює свою роботу, ВМ відтворюють свій збережений стан на момент, що передував вимкненню носія (resumed).
Між моментами переходу ВМ у сплячий режим та відновлення їх стану проходить певний час. Але ВМ після відновлення роботи "перебувають у минулому", тобто вважають за поточний той час, в який відбувся перехід до сплячого режиму. Виникає різниця між поточним власним часом ВМ та дійсним поточним часом. Ця різниця дорівнює принаймні часу перезавантаження носія, що для сучасних серверів становить 5-10 хвилин. Різниця може бути і більшою, якщо носій якийсь час був вимкнений.
Відновити точний час на ВМ покликаний  демон ntpd. Проте, якщо різниця перебільшує певне порогове значення (panic threshold), яке типово складає 1000 секунд [2], ntpd аварійно завершить роботу.
Рішенням може стати періодичний контроль наявності на ВМ працюючого демона ntpd, та запуск йогоу разі відсутності. Також доречно контролювати різницю між поточним часом ВМ та дійсним часом. У разі, якщо ця різниця значна (ознакою цього є те, що демон ntpd перебуває в несінхронізованому стані), варто зупинити ntpd, встановити правильний час за допомогою утіліти ntpdate, після чого знову запустити ntpd.
Пропоную вашій увазі нескладний скрипт для Linux (див. нижче), який виконує означені дії. Розмістіть його в каталозі /etc/cron.d для щогодинного запуску.

Джерела:
  1. ntpd - Network Time Protocol (NTP) Daemon
  2. Manual Reference Pages  - NTP.CONF (5)

#!/bin/sh

LOCK="/var/lock/ntpwatch/ntpwatch.lock"

mkdir -p `dirname $LOCK`
(
  if ( ! flock -nx 200 ); then
    echo "Cannot obtain lock (other instance may be running)"
    exit 1
  fi

  if ( ! service ntpd status ); then
    echo "ntpd is not running, starting"
    service ntpdate start
    service ntpd start
  fi

  echo "Waiting up to 300 sec until ntpd is synchronized"
  ( while ! ntpstat;do sleep 5;done ) || sleep 300

) 200>$LOCK
rm -f $LOCK

Немає коментарів:

Дописати коментар