๋ณ๋์ ๋ ผ๋ฆฌ ๋ณผ๋ฅจ(LV)์ ๋ ๊ฐ์ ๋๋ผ์ด๋ธ๊ฐ ์๋ LVM์ KVM ๊ฐ์ ๋จธ์ ์ด ์์ต๋๋ค.
borg๋ก ๋ฐฑ์ ์ ์์ํ ๋ ๋จผ์ ์ค๋ ์ท์ ์์ฑํด์ผ ํฉ๋๋ค.
bash ์คํฌ๋ฆฝํธ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น?
๋จผ์ ๋๋ผ์ด๋ธ 1์ ์ค๋ ์ท์ ๋ง๋ญ๋๋ค. ๋ณด๊ทธ ๋ฐฑ์ ๋ณด๋ค. ์ค๋ ์ท ๋๋ผ์ด๋ธ 1์ ์ญ์ ํฉ๋๋ค.
๋ ๋ฒ์งธ ๋๋ผ์ด๋ธ 2์ ์ค๋ ์ท์ ๋ง๋ญ๋๋ค. ๋ณด๊ทธ ๋ฐฑ์ ๋ณด๋ค. ์ค๋ ์ท ๋๋ผ์ด๋ธ 2๋ฅผ ์ญ์ ํฉ๋๋ค.
์คํฌ๋ฆฝํธ ๋.
๋ค์ ์์์ ์ค๋ ์ท์ ๋ชจ๋ borg๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์ ์ด์ ์ ์์ฑ๋๊ณ ์ดํ์ ์ญ์ ๋ฉ๋๋ค.
๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์(๋๋ ์ ์ผํ ๋ฐฉ๋ฒ) ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๊ฐ์ฌ ํด์
๋จ์ ์ด๋ฆ
#!/bin/bash
echo "Backup `hostname`"
REPOSITORY=/media/vmbackup/server1/
LVPATH=/dev/vg_vmimages/
LVNAME=`lvs --noheadings -o lv_name | tr -d ' '`
#remove old snapshots
for VM in $LVNAME;
do
lvremove -f /dev/vg_vmimages/$VM-snapshot
echo "old snapshots deleted"
done
#create snapshots
for VM in $LVNAME;
do
lvcreate --size 5120M --snapshot --name "$VM-snapshot" $LVPATH$VM
echo "Snapshots created"
done
#create lvdisplay.txt
lvdisplay > lvdisplay.txt
echo "lvdisplay created"
#create borg backup
borg create --progress --info --list --stats --compress lz4 --read-special \
$REPOSITORY::`hostname`-`date +%Y-%m-%d` lvdisplay.txt $LVPATH*-snapshot
#remove lvdisplay.txt
rm -f lvdisplay.txt
echo "lvdisplay.txt deleted"
#remove snapshots
for VM in $LVNAME;
do
lvremove -f /dev/vg_vmimages/$VM-snapshot
echo "Snapshots deleted"
done
#delete all files which do not meet "keep-conditions"
borg prune --info --list $REPOSITORY --prefix `hostname`- \
--keep-daily=7 --keep-weekly=4 --keep-monthly=3
๊ธ์, ๋น์ ์ (ํ ์คํธ๋์ง ์์) ๋ผ์ธ์ ๋ฐ๋ผ ๋ญ๊ฐ๋ฅผ ํ ์ ์์ต๋๋ค
echo "Backup `hostname`"
REPOSITORY=/media/vmbackup/server1/
LVPATH=/dev/vg_vmimages/
LVNAME=`lvs --noheadings -o lv_name | tr -d ' '`
backup_LV() {
echo "Backing up LV $1"
echo " => Creating snapshot $1-snapshot"
lvcreate --size 5120M --snapshot --name "$1-snapshot" $LVPATH$1
echo " => Creating archive"
SNAPSHOT=$LVPATH$1-snapshot
borg create -svp --list -C lz4 --read-special \
$REPOSITORY::`hostname`-`date +%Y-%m-%d` lvdisplay.txt $SNAPSHOT
# ^- can also use https://borgbackup.rtfd.io/en/latest/usage.html#borg-help-placeholders
echo " => Deleting snapshot"
lvremove -f $SNAPSHOT
echo "Done with LV $1"
}
for VM in $LVNAME;
do
backup_LV $VM
done
#delete all files which do not meet "keep-conditions"
borg prune --info --list $REPOSITORY --prefix `hostname`- \
--keep-daily=7 --keep-weekly=4 --keep-monthly=3
FWIW๋ KVM libvirt
๊ด๋ฆฌ๋๋ VM์ด โโ์คํ๋๋ ๋์ ๋ฐฑ์
ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ค๋
์ท์ด ํ์ํ์ง ์์ต๋๋ค. QEMU์ copy-on-write ์ด๋ฏธ์ง ์ ํ์ ์ฌ์ฉํ์ฌ ์คํ ์ค์ธ ์ด๋ฏธ์ง๋ฅผ ํซ์ค์ํฉ๋๋ค.
https://gist.github.com/milkey-mouse/b8cb865910b4d574d9f63ffcd8db09f5
์์ ๋ด์ฉ์ด ์ด๋ฏธ ์กด์ฌํ๋ ํญ๋ชฉ์ ์ถ๊ฐ๋์ด ์๋์ง ๋ชจ๋ ์ฌ๋์ด ํ์ธํ ์ ์์ต๋๋ค.
https://github.com/borgbackup/community/
๊ทธ๋ ๋ค๋ฉด ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค.
์ ๋ Python์์ ํด๋น ์คํฌ๋ฆฝํธ์ ๋ณด๋ค ๊ฐ๋ ฅํ ๋ฒ์ ์ ์์ ์ค์ ๋๋ค(libvirt ๋ฐ borg API๋ฅผ ์ง์ ์ฌ์ฉ). ์๋ฃ๋๋ฉด ์ปค๋ฎค๋ํฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธ์, ๋น์ ์ (ํ ์คํธ๋์ง ์์) ๋ผ์ธ์ ๋ฐ๋ผ ๋ญ๊ฐ๋ฅผ ํ ์ ์์ต๋๋ค