Portál AbcLinuxu, 6. května 2025 11:32
Řešení dotazu:
rsync --link-dest
, nebo rsync + btrfs snapshoty.
Co záloha, to adresář pojmenovaný podle data zálohy. Deduplikace pak probíhá buď pomocí hardlinků (proti předchozí záloze), nebo pomocí snapshotů (rsync aktualizuje zapisovatelný adresář a toho se pak udělá snapshot).
Pokud by někdo měl tip na dobrý nástroj pro odstraňování starých záloh, sem s ním prosím. Už několik let se chystám ho napsat. :)
dela deduplikaci na urovni filesystemu (!!! tedy dosahuje tehoz efektu tim, ze na fs zavisly neni a ma nejaky vlastni format ulozeni dat v adresarich, ale vysledkem je deduplikace v ramci repository - a dela to fakt hodne dobre! protoze jsem zkousel deduplikacni fs a byly s tim ruzne potize a ruzne podminky, ale tohle tim netrpi!),To právě deduplikace na úrovni filesystému není. To je aplikační úroveň, tedy o úroveň výš. Kdyby to bylo na úrovni filesystému, tak vidíš všechny zálohy rovnou bez jakýchkoliv zvláštních nástrojů a připojování.
Tohle je asi tak nejtypičtější možný příklad na snapshoty v Btrfs nebo ZFS. Přírůstkové, čitelné, ba dokonce i zapisovatelné, atomické, postupně „ředitelné“, jak plyne čas, atd.
Žádný program na přírůstkové zálohy neexistuje a nikdy neexistoval (navzdory četným fámám o opaku), protože takové zálohy z principu nejsou atomické. Aby byla záloha atomická v rámci nějaké adresářové (pod)struktury nebo celého filesystému, je potřeba mít snapshoty na úrovni fileystému, tedy kernelu.
Algořiťmus pro zálohování mezi dvěma filesystémy (ideálně geograficky oddělenými, jak jinak):
#!/bin/bash mv /.snapshots_root/root/ /.snapshots_root/root-old mv /media/data/.snapshots_root_backup/root/ /media/data/.snapshots_root_backup/root-old btrfs subvolume snapshot -r / /.snapshots_root/root && sync btrfs send -p /.snapshots_root/root-old/ /.snapshots_root/root | btrfs receive /media/data/.snapshots_root_backup/ btrfs subvolume delete /.snapshots_root/root-old/ btrfs subvolume delete /media/data/.snapshots_root_backup/root-olda do ted jsem ten snapshot pomocí rsnapshot posílal přírůstkově na NAS a docela spokojenost. Jen postupem času začal adresář na NASu narůstat víc než se mi líbí. Tak hledám variantu
Já si napsal bash skript co posílá btrfs snapshoty (send/receive) přes SSH. Je to navržené na to, aby se to spouštělo automaticky vždy v 23:59. Všechny snapshoty jsou na cílovém zařízení normálně přístupné. Tak třeba se to bude hodit.
#!/bin/bash ################# ### Nastavení ### ################# #Adresáře k zálohování cesta_mistni="/srv" adresare=("http" "mysql" "nextcloud") cesta_snapshoty="/srv/.backup_increment" cesta_vzdalena="/srv/backup/" historie="30" server="***.***.***.***" klic="/root/BackupKey" ############## ### Funkce ### ############## #Vytvoření snapshotu vytvor_snapshot() { btrfs subvolume snapshot -r "${cesta_mistni}/$1" "${cesta_snapshoty}/$1_$datum" if [ $? == 0 ]; then return 0 else return 1 fi } #Odeslání snapshotu odesli_snapshot() { if [ -d "${cesta_snapshoty}/$1" ] && [ ssh "backup@${server}" -i "$klic" "[ -d ${cesta_vzdalena}/$1/$1_${datum_vcera} ]" ]; then btrfs send -p "${cesta_snapshoty}/$1" "${cesta_snapshoty}/$1_$datum" | ssh "backup@$server" -i "$klic" "sudo btrfs receive \"${cesta_vzdalena}/$1\" && \ sudo btrfs property set -ts \"${cesta_vzdalena}/$1/$1_$datum\" ro false && \ sudo touch -d \"$datum_touch\" \"${cesta_vzdalena}/$1/$1_$datum\" && \ sudo btrfs property set -ts \"${cesta_vzdalena}/$1/$1_$datum\" ro true" if [ $? == 0 ]; then return 0 else return 1 fi else if ssh "backup@$server" -i "$klic" "[ ! -d ${cesta_vzdalena}/$1 ]" then ssh "backup@$server" -i "$klic" "mkdir ${cesta_vzdalena}/$1" fi btrfs send "${cesta_snapshoty}/$1_$datum" | ssh "backup@$server" -i "$klic" "sudo btrfs receive \"${cesta_vzdalena}/$1\" && \ sudo btrfs property set -ts \"${cesta_vzdalena}/$1/$1_$datum\" ro false && \ sudo touch -d \"$datum_touch\" \"${cesta_vzdalena}/$1/$1_$datum\" && \ sudo btrfs property set -ts \"${cesta_vzdalena}/$1/$1_$datum\" ro true" if [ $? == 0 ]; then return 0 else return 1 fi fi } #Smazání snapshotu smaz_snapshot() { if [ -d "${cesta_snapshoty}/${1}_${datum_vcera}" ]; then btrfs subvolume delete "${cesta_snapshoty}/${1}_${datum_vcera}" fi if [ $? == 0 ]; then return 0 else return 1 fi } #Přejmenování snapshotu prejmenuj_snapshot() { mv "${cesta_snapshoty}/$1_$datum" "${cesta_snapshoty}/$1" if [ $? == 0 ]; then return 0 else return 1 fi } #Smazání starých záloh smaz_stare() { ssh "backup@$server" -i "$klic" "find \"${cesta_vzdalena}/$1\" -maxdepth 1 -type d -mtime \"+$((historie-1))\" -exec sudo btrfs subvolume delete {} \;" } ############## ### SKRIPT ### ############## #Aktuální datum datum="$(date '+%Y-%m-%d')" datum_vcera="$(date '+%Y-%m-%d' -d 'yesterday')" datum_touch="$(date '+%Y-%m-%d %H:%M' -d 'today 23:59')" #Vytvoření snapshotů pododdílů for adresar in ${adresare[@]} do vytvor_snapshot $adresar done #Odeslání snapshotů do zálohovacího zařízení přes SSH for adresar in ${adresare[@]} do odesli_snapshot $adresar done ##Smazání minulých snapshotů pododdílů for adresar in ${adresare[@]} do smaz_snapshot $adresar done #Přejmenování posledních snapshotů for adresar in ${adresare[@]} do prejmenuj_snapshot $adresar done ##Smazání starých vzdálených záloh for adresar in ${adresare[@]} do smaz_stare $adresar done exit 0
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.