LINUX.ORG.RU

LVM: разница между несколькими снимками одного тома.


0

2

Вот у меня есть lvm, я сделал несколько снимков. Один неделю назад, второй только что. Оба снимка использовались (и будут использоваться) в режиме «только чтение».

Могу ли я получить разницу между ними? Например, сохранив эту разницу на внешний носитель и удалив старый снимок, я бы мог при желании восстановить состояние системы…

В наборе команд для работы с lvm я подходящей не нашёл… Такая работа невозможна, или просто ненужна? Или ещё что-то?

Я чего-то не понимаю?

★★★★★

Странно, но я думал что снимок и есть разница между хранимым и текущим состоянием тома.

Видимо я тоже чего-то не понимаю. Подпишусь на темку...

valich ★★★
()

Технически возможно, но врядли кому-то нужно. LVM снапшоты, не для версионности, а для «заморозки» файловой системы на (короткое) время бэкапа.

sdio ★★★★★
()
Ответ на: комментарий от sdio

вот меня и удивляет, почему это никому не нужно.

Имея lvm-снапшоты, можно было бы сохранять именно изменившиеся блоки. Все эти rdiff и пр. оказались бы просто ненужными.

Для меня потерять в два раза в скорости записи не проблема, но вот как это сделать технически, я что-то не понимаю. Глубоких знаний устройства LVM ведь нет.

anarquista ★★★★★
() автор топика

По типу такого что ли?

% zfs list -t snapshot -r poolname
NAME                           USED  AVAIL  REFER  MOUNTPOINT
poolname@201201152006             79,4M      -   153M  -
poolname/usr@201201152006          150M      -   206M  -
poolname/usr/local@base           2,68M      -   102M  -
poolname/usr/local@201201151834      1K      -  2,08G  -
poolname/var/db/pkg@base           970K      -  1,89M  -
poolname/var/db/pkg@201201151834  20,1M      -  41,6M  -
% zfs diff poolname/usr/local@base poolname/usr/local@201201151834
M	/usr/local/
M	/usr/local/bin
M	/usr/local/etc
M	/usr/local/etc/pam.d
M	/usr/local/etc/rc.d
M	/usr/local/include
M	/usr/local/include/X11
M	/usr/local/info
M	/usr/local/lib
M	/usr/local/lib/X11
M	/usr/local/lib/X11/app-defaults
M	/usr/local/lib/X11/fonts
M	/usr/local/libdata
M	/usr/local/libdata/ldconfig
M	/usr/local/libdata/ldconfig32
M	/usr/local/libdata/pkgconfig
M	/usr/local/libexec
M	/usr/local/man
M	/usr/local/man/ja/man1
M	/usr/local/man/man1
M	/usr/local/man/man3
M	/usr/local/man/man4
M	/usr/local/man/man5
M	/usr/local/man/man6
M	/usr/local/man/man7
M	/usr/local/man/man8
M	/usr/local/sbin
M	/usr/local/share
M	/usr/local/share/aclocal
M	/usr/local/share/doc
M	/usr/local/share/emacs/site-lisp
M	/usr/local/share/examples
M	/usr/local/share/java
M	/usr/local/share/java/classes
M	/usr/local/share/locale
M	/usr/local/share/locale/af/LC_MESSAGES
M	/usr/local/share/locale/am/LC_MESSAGES
M	/usr/local/share/locale/zh_TW
M	/usr/local/share/locale/zh_TW/LC_MESSAGES
M	/usr/local/share/pixmaps
M	/usr/local/share/sgml
M	/usr/local/share/xml
M	/usr/local/share/licenses
M	/usr/local/info/dir
-	/usr/local/lib/libcharset.so.1
-	/usr/local/lib/libcharset.so
-	/usr/local/lib/libcharset.la
-	/usr/local/lib/libcharset.a
-	/usr/local/libdata/charset.alias
-	/usr/local/include/libcharset.h
-	/usr/local/include/localcharset.h
-	/usr/local/lib/libiconv.so.3
-	/usr/local/lib/libiconv.so
-	/usr/local/lib/libiconv.la
-	/usr/local/lib/libiconv.a
-	/usr/local/bin/iconv
-	/usr/local/include/iconv.h
-	/usr/local/share/doc/libiconv
-	/usr/local/share/doc/libiconv/iconv.1.html
-	/usr/local/share/doc/libiconv/iconv.3.html
-	/usr/local/share/doc/libiconv/iconv_close.3.html
-	/usr/local/share/doc/libiconv/iconv_open.3.html
-	/usr/local/share/doc/libiconv/iconv_open_into.3.html
-	/usr/local/share/doc/libiconv/iconvctl.3.html
-	/usr/local/man/man1/iconv.1.gz
-	/usr/local/man/man3/iconv.3.gz
-	/usr/local/man/man3/iconv_open.3.gz
-	/usr/local/man/man3/iconv_open_into.3.gz
-	/usr/local/man/man3/iconv_close.3.gz
-	/usr/local/man/man3/iconvctl.3.gz
M	/usr/local/share/locale/en@quot/LC_MESSAGES
M	/usr/local/share/locale/en@boldquot/LC_MESSAGES
M	/usr/local/share/locale/zh_HK/LC_MESSAGES
-	/usr/local/lib/charset.alias
M	/usr/local/lib/perl5/5.14.2/mach
M	/usr/local/lib/perl5/site_perl/5.14.2
M	/usr/local/lib/perl5/site_perl/5.14.2/mach
M	/usr/local/lib/perl5/5.14.2/perl/man
M	/usr/local/lib/perl5/site_perl/5.14.2/mach/auto
M	/usr/local/lib/perl5/5.14.2/man
M	/usr/local/lib/perl5/5.14.2/man/man3
-	/usr/local/lib/compat
+	/usr/local/bin/libtoolize
iZEN ★★★★★
()
Ответ на: комментарий от anonymous

Вот это совсем не то… Зачем мне что-то монтировать? Я хочу видеть именно измененные сектора, ведь эта разница уже есть. Мне всё равно, какие файлы там изменились или не изменились.

anarquista ★★★★★
() автор топика
Ответ на: комментарий от anarquista

Можно использовать rdiff применимо к блочным устройствам

В LVM такого нету, сам snapshot по своей сути уже разница. И при внесении изменений в логический том LVM с которого сделан снимок, снимок растёт (т. е. место отведенное под снимок заканчивается). Коме того производительность при записи в логический том падает пропорционально количеству снимков с него сделанных.

Я для описанных вами целей использую примерно такой подход, скрипт запускаю на backup-сервере, он утягивет разницу с основного и актуализирует резервную копию:

rdiff signature /mnt/backup/Full_copy.bin | pbzip2 -9 -c | pv -i 10 -c -N "Передача сигнатуры на основной сервер" |  \
  ssh root@$main-server-ip "pbzip2 -d -c | rdiff delta - /dev/vg/SnapShot-of-main-data-lv - | \
  pbzip2 -c -9 "  | pv -i 10 -c -N "Передача разницы на backup сервер" | pbzip2 -d -c | \
  rdiff patch /mnt/backup/Full_copy.bin - /mnt/backup/Full_copy.bin.new.bkp

echo -n "      Проверка целосности резервной копии с помощью md5: "
md5_sum_drive=$(ssh root@$main-server-ip "cat /dev/vg/SnapShot-of-main-data-lv | md5sum -b - ")
md5_sum_dcopy=$(cat /mnt/backup/Full_copy.bin.new.bkp | md5sum -b - )

echo -n " Образ диска: $md5_sum_drive, копия $md5_sum_dcopy, "
    if test "$md5_sum_drive" = "$md5_sum_dcopy";
    then
        echo результат: Копирование завершилось успешно! Переименовываем копию в full
        mv /mnt/backup/Full_copy.bin.new.{bkp,full}
    else
        echo результат: Копирование завершилось с ошибкой! Переименовываем копию в fail
        mv /mnt/backup/Full_copy.bin.new.{bkp,fail}
    fi

как видите в процессе резервного копирования создается сигнатура одного блочного устройства, передается на основной сервер через ssh там высчитывается разница между блочными устройством от которого создана сигнатура и вторым блочным устройством, передается назад на backup сервер через тот-же ssh а на backup-сервере разница применяется первому блочному устройству и результат записывается в файл.

не трудно догадаться, что можно в файл записать и саму разницу, таким-же образом.

процесс долгий, т.к. для создания сигнатуры требуется полностью прочитать файл резервной копии, и для создания разницы прочитать основное блочное устройство.

Второй подход состоит в использовании http://code.google.com/p/archfs/. Тут можно создать виртуальную файловую систему в режиме ro, в которой содержимое файлов будет представлять из себя по-секторную копию (если так можно сказать) логического тома lvm. Ну, а к файловой системе, не мудрствуя лукаво, можно применить rdiff-backup.

riv1329
()

Могу ли я получить разницу между ними? Например, сохранив эту разницу на внешний носитель и удалив старый снимок, я бы мог при желании восстановить состояние системы…

time xdelta3 -s /dev/mapper/vg0-snaptest /dev/mapper/vg0-test /tmp/fstest.xdelta3

real	0m25.545s
user	0m2.540s
sys	0m2.416s

ls -lh /tmp/fstest.xdelta3
 ... 1.8M ... /tmp/fstest.xdelta3

df -h | grep test
/dev/mapper/vg0-test       1008M   45M  913M   5% /mnt 
/dev/mapper/vg0-snaptest 1008M   43M  915M   5% /mntsnap

    докинул 2М файлов в /mnt после создания снапшота

Я бы не рискнул, но в принципе можно этим xdelta3 откатиться до состояния перед снапшотом, естественно в оффлайне.

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.