Ошибка при бэкапе виртуальной машины OpenVZ при помощи команды vzdump —suspend

Бэкап OpenVZКогда то давным давно я решил перевести все свои сайты и некоторые службы в виртуальную среду.

В качестве таковой я выбрал OpenVZ, всё было отлично, все работало. Но постоянно вылезала одна проблема, на которую я в принципе особо сильно не обращал внимания, это разностный бэкап через команду —suspend.

Я просто пользовался бэкапом OpenVZ машин с остановкой:

vzdump --compress --stop 103

А вот такая команда:

vzdump --compress --suspend 103

Выдавала примерно такой вывод и соответственно ошибку в конце:

INFO: Total file size: 752965594 bytes
INFO: Total transferred file size: 749767751 bytes
INFO: Literal data: 749767751 bytes
INFO: Matched data: 0 bytes
INFO: File list size: 1264651
INFO: File list generation time: 0.019 seconds
INFO: File list transfer time: 0.000 seconds
INFO: Total bytes sent: 752879781
INFO: Total bytes received: 806474
INFO: sent 752879781 bytes received 806474 bytes 6053704.86 bytes/sec
INFO: total size is 752965594 speedup is 1.00
INFO: first sync finished (125 seconds)
INFO: suspend vm
INFO: Setting up checkpoint...
INFO: suspend...
INFO: Can not suspend container: Device or resource busy
INFO: Error: task 1800/8940 (ntpd) uses posix timers
INFO: Checkpointing failed
ERROR: Backup of VM 103 failed - command 'vzctl --skiplock chkpnt 103 --suspend' failed with exit code 16

Изначально, не вчитываясь в документацию OpenVZ я подумал что дело в отсутствие у меня LVM, и благополучно забил.

Но из за возросшей посещаемости сайта, а так же из за размещения еще нескольких проектов на данной машине, бэкапы стали более заметно сказываться на работе. Яндекс метрика, Google Analytics, и некоторые другие сервисы, во время бэкапов буквально закидывали меня сообщениями о сбое.

Длительность офлайна машины стала превышать разумные пределы (по 20 минут машина была в офлайне), и я стал искать причину, дабы все же воспользоваться прелестями разностного бэкапа vzdump —suspend.

Все оказалось и просто и странно. Затык был в этой строчке:

INFO: Error: task 1800/8940 (ntpd) uses posix timers

При более подробных изысканиях оказалось, что эта ошибка вылетает из за стоящего на виртуальной машине NTP сервера.

С одной стороны гостевая система получает время от хост системы, с другой стороны это совершенно не мешает иметь на виртуальной машине NTP сервер отдающий время другими (если конечно убрать привязку к локальным часам), а вот каким образом это влияет на бэкап…в общем то непонятно.

Получается зачем то запрашивается время гостевой системы и сравнивается со временем хост системы, или как то так…

В общем, не влезая в дебри скажу, для того что бы все работало, надо перед бэкапом или остановить NTP сервер, или совсем удалить его из виртуальной машины.

Смотрите так же:

Ошибка при бэкапе виртуальной машины OpenVZ при помощи команды vzdump —suspend: 4 комментария

  1. А вот и объяснение такого поведения. Контейнер не имеет прямого доступа к системным часам. Делаю предположение что как один из вариантов также можно через vzctl set —capability sys_time:on
    дать доступ конейнеру на изменение времени и тогда штатную ntpd службу можно выключить, т.е время хоста гипервизора будет синхронизироваться посредством ntpd контейнера. Правда это если не предполагается миграция этого контейнера на другой хост.
    Time inside VE is not virtualized and all VEs uses the same clocksource taken from HN. If you are sure that you want to allow to change system time from inside VE, you can allow CAP_SYS_TIME capability via «vzctl set —capability sys_time:on», IMHO it should be enough for make ntpd working.

    1. Тут ситуация какая… у меня ntp стоял в контейнере и раздавал время наружу, я участвую в ntp пуле http://www.pool.ntp.org/scores/178.169.70.84

      Надо поэкспериментировать, может это изолирует гостевуху от хоста, а может всего лишь сделает поправку на часовой пояс.

  2. Интересная проблема. Решил разобраться, наткнулся на обсуждение этой проблемы на забугорном форуме. Пишут вот что…
    Error: task 3842/621(ntpd) uses posix timers
    do you run ntpd inside a container? why? remove it.
    Выходит так как вы сказали : )

    1. )) выходит. Только если сильно хочется, можно не удалять, а просто остановить демона, сбэкапить, и запустить заново.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.