2012-07-12

Онлайн бэкап OpenVZ ploop контейнеров

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 устройством можно:
  • В версии 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 устройство с файлом образа.
  • В версии 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 

5 комментариев:

  1. В ploop 1.5 нет директории /dev/ploop/

    http://wiki.openvz.org/Download/ploop/1.5
    switch from old /dev/ploop/ symlink-based to new in-kernel cookie registration

    Подскажите как теперь установить связь между контейнером OpenVZ и ploop устройством?

    ОтветитьУдалить
  2. ploop list теперь

    http://forum.openvz.org/index.php?t=msg&goto=48663

    ОтветитьУдалить
  3. Адаптировал под свежие весии

    ОтветитьУдалить
  4. Stealth, привет.
    https://bugzilla.openvz.org/show_bug.cgi?id=2538 - рекомендую почитать.
    ploop snapshot -d (делать опасно)

    ОтветитьУдалить
  5. Спасибо что обратили внимание, перепишу в ближайшее время.

    ОтветитьУдалить