one
one copied to clipboard
Thin LVM - incremental backups
Background resources
- lvmthin(7)
- https://wiki.gentoo.org/wiki/LVM/en#Thin_provisioning
- Specifically for incrementals, some tools which can be of inspiration: https://github.com/mpalmer/lvmsync, https://github.com/davidbartonau/lvm-thin-sendrcv.
Process overview
Naïve way: set metadata to RO (not good because it blocks ALL disks using the pool):
lvchange -an <todos los volumenes en el pool onepool1>
lvchange -an vg-one-0/onepool1
lvchange -y -ay vg-one-0/onepool1_tmeta # activate component LV in read-only mode
thin_ls /dev/mapper/vg--one--0-onepool1_tmeta
A better way (live system, using thin-provisioning-tools)
Get LVM snapshot IDs:
lvs -a -o lv_name,thin_id
(lvs --noheadings -o thin_id volg/thin_volume_snap4, for scripting)
Make metadata snapshot and extract deltas:
dmsetup message /dev/mapper/vg--one--0-onepool1-tpool 0 reserve_metadata_snap
thin_delta -m --thin1 1 --snap2 2 /dev/mapper/vg--one--0-onepool1_tmeta > out
dmsetup message /dev/mapper/vg--one--0-onepool1-tpool 0 release_metadata_snap
(Just for fun, metadata snapshot ID can be queried like this:)
dmsetup status /dev/mapper/vg--one--0-onepool1-tpool | cut -f 7 -d " "
Now, the thin_delta output is something like this:
<superblock uuid="" time="1" transaction="2" data_block_size="128" nr_data_blocks="0">
<diff left="1" right="2">
<different>
<range begin="0" left_data_begin="3520" right_data_begin="3521" length="1"/>
</different>
<same>
<range begin="1" data_begin="1028" length="39"/>
</same>
<different>
<range begin="40" left_data_begin="4172" right_data_begin="1067" length="1"/>
<range begin="41" left_data_begin="3524" right_data_begin="3527" length="2"/>
</different>
<same>
<range begin="43" data_begin="1078" length="511"/>
</same>
...
So, in theory, we should be able to iterate over different blocks and copy them using good old dd. TODO test this approach...