eth0.pro

Linux is working. The future is open.



В Proxmox'е мне очень нравится резервное копирование OpenVZ контейнеров, которые потом очень просто восстановить или перенести. Только легко и быстро это работает, когда контейнеры маленькие, содержат только необходимую конфигурацию с набором нужного софта. Но когда дело доходит до больших объемов (например музыка или картинки для web-сервера), все резервное копирование замедляется и теряет смысл.

В такой ситуации я предпочитаю выносить объемные данные на другой сервер по NFS и оттуда их бекапить взрослой системой резервного копирования инкрементально. Но, действуя по наитию и монтируя каталог по NFS в CT, встречаемся с такой проблемой:

# mount server:/remote/dir /local/dir
mount: unknown filesystem type 'nfs'
# modprobe nfs
libkmod: ERROR ../libkmod/libkmod.c:554 kmod_search_moddep: could not open moddep file '/lib/modules/2.6.32-20-pve/modules.dep.bin'
# depmod -a
ERROR: could not open directory /lib/modules/2.6.32-20-pve: No such file or directory
FATAL: could not search modules: No such file or directory

И это логично, т.к. ядро то у нас общее на все CT, несуществующее физически в контейнерах, являющееся как бы "read-only", и одним контейнером мы не можем влиять на ядро всей системы (условно). Документация к Proxmox и OpenVZ гласит, что удаленный каталог нужно монтировать в хостовой системе в каталог (внутрь) контейнера.

# mount
...
server:/remote/dir on /var/lib/vz/root/102/local/dir type nfs (...)
...

Вроде разобрались, сделать это не сложно. Остался последний вопрос, как это автоматизировать при перезапуске контейнера. На хостовой машине (т.е. на самом Proxmox'е) переходим в папку /etc/pve/openvz. Там лежат конфиги CT контейнеров, созданные интерфейсом управления Proxmox'а. Здесь можно создавать дополнительные файлы (скрипты), которые будут выполняться при старте и остановке контейнера:

(Взято с http://habrahabr.ru/company/alawar/blog/178429/, цитата)

При старте контейнера vzctl пытается выполнить следующий набор скриптов (при их наличии):

  • /etc/pve/openvz/vps.premount
  • /etc/pve/openvz/CTID.premount
  • /etc/pve/openvz/vps.mount
  • /etc/pve/openvz/CTID.mount
  • /etc/pve/openvz/CTID.start

При остановке выполняются следующие скрипты:

  • /etc/pve/openvz/CTID.stop
  • /etc/pve/openvz/CTID.umount
  • /etc/pve/openvz/vps.umount
  • /etc/pve/openvz/CTID.postumount
  • /etc/pve/openvz/vps.postumount

, где "CTID" — это номер контейнера. Скрипты "vps.*" выполняются при операциях с любым контейнером. Скрипты "*.start" и "*.stop" выполняются в контексте контейнера, все остальные — в контексте хоста.

(Конец цитаты)

Воспользовавшись этим, мы можем создать исполняемый файл CTID.mount, в котормо прописать команды для монтирования.

Итак, допустим, что ID контейнера (CTID) у нас 102. Создаем файл:

touch 102.mount

Заполняем его следующей болванкой:

#!/bin/bash

. /etc/vz/vz.conf
. ${VE_CONFFILE}

# Внутри контейнера создаем каталог, в который будем монтировать удаленный ресурс, и производим само монтирование:
mkdir -p ${VE_ROOT}/local/dir
mount server:/remote/dir ${VE_ROOT}/local/dir

# Повторяем процедуру еще раз, если нам нужно более одной такой точки монтирования:
mkdir -p ${VE_ROOT}/local/dir2
mount server:/remote/dir2 ${VE_ROOT}/local/dir2

Похожее делаем для отмонтирования каталогов при остановке контейнера:

touch 102.umount

#!/bin/bash
. /etc/vz/vz.conf
. ${VE_CONFFILE}

if mountpoint -q "${VE_ROOT}/local/dir" ; then
        umount ${VE_ROOT}/local/dir
fi

if mountpoint -q "${VE_ROOT}/local/dir2" ; then
        umount ${VE_ROOT}/local/dir2
fi

Всё, перезапускаем контейнер и проверяем.

P. S.: Не забудьте поменять CTID и пути на свои!

18 июл 2013 г. | Теги: Proxmox