Ploop устройства тема достаточно новая и на данный момент еще до конца не раскрытая, вот и я, начал таки понемножечку с ней разбираться. Подробнее про "что это такое" и для чего нужно лучше почитать в оригинальной документации Ploop , а я же опишу процесс бэкапа контейнеров на основе ploop.
Необходимые действия над ploop устройтвами:
1. Онлайн снэпшот контейнера
# ploop snapshot -d /dev/ploop1 ploop1-delta1.imag
В результате создастся delta-фаил, в который будут записываться все дальнейшие изменения в блочном устройстве ploop1
2. Объединение
# ploop merge -d /dev/ploop1 -l 0..1
В результате этого действия, все изменения из delta-файла будут перенесены в основной образ.
Подробнее можно прочесть в оригинальном мануале Getting_started
Итак, при старте OVZ контейнера создается новое устройство /dev/ploopX , где X некоторый порядковый номер, никак не связаный с id OVZ контейнера. Файл образа находится в private директории OVZ контейнера, в папчке root.hdd:
# ls -1 /vz/private/ploop/1000/root.hdd/
DiskDescriptor.xml
DiskDescriptor.xml.lck
root.hdd
root.hdd.mnt
там же находится и файл с метаданными описания image-файла( DiskDescriptor.xml ).
Установить связь между контейнером OpenVZ и ploop устройством можно:
Пример моего бэкап скрипта:
UPD Скрипт адаптирован для использования с версией ploop>1.5 , для ранних версий необходимо заменить кусок кода на приведенный ниже
Необходимые действия над ploop устройтвами:
1. Онлайн снэпшот контейнера
# ploop snapshot -d /dev/ploop1 ploop1-delta1.imag
2. Объединение
# ploop merge -d /dev/ploop1 -l 0..1
Подробнее можно прочесть в оригинальном мануале Getting_started
Итак, при старте OVZ контейнера создается новое устройство /dev/ploopX , где X некоторый порядковый номер, никак не связаный с id OVZ контейнера. Файл образа находится в private директории OVZ контейнера, в папчке root.hdd:
# ls -1 /vz/private/ploop/1000/root.hdd/
DiskDescriptor.xml
DiskDescriptor.xml.lck
root.hdd
root.hdd.mnt
Установить связь между контейнером OpenVZ и ploop устройством можно:
-
В версии ploop=<1.5
# ls -al /dev/ploop
::vz:private:ploop:1000:root.hdd:root.hdd -> ploop0
::vz:private:ploop:1010:root.hdd:root.hdd -> ploop1
- В версии ploop>1.5
# ploop list
ploop52058 /vz/private/ploop/1000/root.hdd/root.hdd
ploop28895 /vz/private/ploop/1010/root.hdd/root.hdd
Пример моего бэкап скрипта:
#!/bin/bash BACKUP_DIR=$(echo "$1" | sed -e "s/\/*$//") [[ -z "$BACKUP_DIR" ]] && { echo "Plz specify backup dir" 1>&2 exit 1 } [[ ! -d $BACKUP_DIR ]] && { echo "Backup dir does not exists: $BACKUP_DIR" 1>&2 exit 1 } function backup_ploop_ct { if [[ -z $1 || -z $2 ]];then echo "Wrong backup params: '$1', '$2'" 1>&2 return 1 fi; if [[ ! -b $1 ]];then echo "Ploop device doesn't exists: '$1'" 1>&2 return 1 fi; if [[ ! -f $2 ]];then echo "Image file doesn't exists: '$2'" 1>&2 return 1 fi; fname_delta="$2.delta" if [[ -f $fname_delta ]];then echo "Somethings wrong, delta image exists: $fname_delta" 1>&2 return 1 fi; echo "Take snapshot for $1 with delta image $fname_delta" ploop snapshot -d $1 $fname_delta if [ $? -ne 0 ];then echo "Snapshot faild for $1 with delta image $fname_delta" 1>&2 return 1 fi; echo -n "Copy " # get backup filename from original path and copy original file to backup dir cp -v $2 $BACKUP_DIR/$(date +%F).$(echo $2 | sed -e 's/.*ploop\///' -e 's/\/.*\//./') echo "Merge delta to original image" ploop merge -d $1 -l 0..1 if [ $? -ne 0 ];then echo "Merge snapshot faild for device $1" 1>&2 return 1 fi; rm -f $fname_delta } # get ploop mounts ploop list | while read line do # split string to variables IFS=" " set -- $line backup_ploop_ct /dev/$1 $2 done # and backup all metadata # /vz/private/ploop/*/root.hdd/DiskDescriptor.xml echo "Backup all metadata" echo /vz/private/ploop/*/root.hdd/DiskDescriptor.xml | sed 's/\/vz\/private\/ploop\///g' \ | xargs tar -czf $BACKUP_DIR/$(date +%F).meta.tar.gz -C /vz/private/ploop/
UPD Скрипт адаптирован для использования с версией ploop>1.5 , для ранних версий необходимо заменить кусок кода на приведенный ниже
# get ploop mounts stat /dev/ploop/* | grep File | sed -e 's/.*`\/dev\/ploop\/::\(.*\)'\'' -> `\(.*\)'\''/\/dev\/\2 \/\1/' -e 's/:/\//g' \ | while read line do # split string to variables IFS=" " set -- $line backup_ploop_ct $1 $2 done