Search
Write a publication
Pull to refresh

Как я делаю бекапы домашней системы Linux: простой пример инкрементального rsync + btrfs с zstd сжатием

Level of difficultyMedium
Reading time3 min
Views8.9K

Бекапы делать важно - пожалуйста делайте бекапы, иначе потеряете данные. Многие люди уже потеряли данные, а вы будьте умнее.

Мой скрипт:

# Start this script from the git folder of this script
# This script accept path to the partition to backup (mounted)
# Use this script NOT from the system you want to backup - boot from another system

if [ -z "$1" ]; then
	echo "Missing path of the source (what to backup)"
	exit 1
fi

BEFORE=$(df -h)

STARTED=$(date)

DATE=`date "+%Y-%m-%d"`

p=$(pwd)

cd $1
# Because rsync --exclude-from accepts only relative pathes, not absolute

rsync --archive --acls --xattrs --delete --progress --verbose --exclude-from=$p/exclude.txt --filter=':- .gitignore' --link-dest=$p/last --mkpath $1 $p/$DATE

ln --symbolic --force --no-dereference $DATE last

echo "Started at:   " $STARTED
echo "Current time: " $(date)

echo "Before:

$BEFORE

Now:
"

df -h

cd -

# How to restore:
#
# rsync --archive --acls --xattrs --progress --verbose <from> <to>
# /etc/fstab: alter UUID
# grub install (if new SSD) https://wiki.gentoo.org/wiki/Grub:
#     grub-install
# Note that if SSD is more than 2 GB - you cannot use MBR, only GPT with EFI partition (Thinkpag T430 supports UEFI boot)
# emerge-webrsync
# emerge --sync guru


# Documentation:
# https://jumpcloud.com/blog/how-to-backup-linux-system-rsync
# https://wiki.archlinux.org/title/rsync

Тут не просто копирование (с атрибутами - исполняемый файл или нет, чтение/запись) но и использование хардлинков с предыдущего бекапа - если файл не изменился - места в новом бекапе он не займёт - то есть в папке нового бекапа будут все файлы, но часть из них может быть хардлинками предыдущего бекапа. Хардлинки выглядят как обычные файлы. Это и имеется в виду под словом "инкрементально".

Из man:

--link-dest=DIR          hardlink to files in DIR when unchanged

Для экономии места и скорости - мы не хотим бекапить кеш и прочие ненужные файлы, мой exclude.txt:

dev/*
proc/*
sys/*
run/*
# Если всё-же запустили на рабочей системе, раньше я так делал

var/db/repos/gentoo
var/db/repos/guru
var/cache/distfiles/

tmp/*
var/tmp

lost+found
mnt/*

home/vitaly/.npm/
home/vitaly/.cache/

home/vitaly/.zoom/

home/vitaly/.mozilla/firefox/*/storage
home/vitaly/.config/google-chrome/
home/vitaly/.config/chromium/
home/vitaly/.config/Microsoft/Microsoft Teams/
home/vitaly/.config/teams-for-linux/
home/vitaly/.config/Slack/
home/vitaly/.thumbnails/

home/vitaly/.cache/
home/vitaly/.local/share/TelegramDesktop/tdata/user_data/cache/
home/vitaly/.local/share/TelegramDesktop/tdata/user_data/media_cache/
home/vitaly/.local/share/Steam/
home/vitaly/.googleearth/Cache/
home/vitaly/.local/share/OMaps/
home/vitaly/.config/Audius/Cache/
home/vitaly/.config/YandexMusic/Cache/
home/vitaly/.config/vesktop/sessionData/Cache/
home/vitaly/.config/bilibili/Cache/
home/vitaly/.local/share/Trash/

home/vitaly/go/pkg/mod/cache/
home/vitaly/.cargo/registry/

home/vitaly/record/out/

home/vitaly/Desktop/unreal-5-4-4/

Также игнорируются файлы из .gitignore каждой папки.

Скрипт показывает df -h до и после - чтобы увидеть сколько места занял бекап.

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

Бекаплю на отдельный старый HDD отформатированный в BTRFS - чтобы использовать ZSTD сжатие.

sudo apt install btrfs-progs -y
# https://details.nl/install-and-use-btrfs-on-ubuntu-20-04-lts

sudo mkfs.btrfs /dev/sdX
# Partitions are not needed

sudo mount -o compress-force=zstd:15 /dev/sdX /mnt
# Max compression level is 15
# Дефолтное сжатие можно добавить в fstab

После бекапа можно увидеть как хорошо сжалось:

sudo apt install btrfs-compsize
sudo compsize /mnt

Пример вывода:

   Processed 54036 files, 42027 regular extents (42028 refs), 27150 inline.
   Type       Perc     Disk Usage   Uncompressed Referenced
   TOTAL       73%      211G         289G         289G
   zstd        28%       42M         148M         148M
   none       100%      174G         174G         174G

Главное тут Perc - чем ниже этот процент тем лучше.

Для каждой папки с конфигами я использую git репозиторий - и вот такой подход для бекапа всей системы. Знаю есть много инструментов для бекапа, но у меня пока так просто - инкрементальный бекап через rsync в btrfs с максимальным сжатием.

Only registered users can participate in poll. Log in, please.
Хорошее решение для бекапа всей системы?
73.08% Хорошее решение19
26.92% Плохое решение (пишите в коментарии как можно лучше)7
26 users voted. 19 users abstained.
Tags:
Hubs:
+2
Comments26

Articles