Linux notes #15 — Как сделать скрипт для бэкапа в Linux

Возьмем для примера папку home

Определим ее размер

du -sh /home/sysadmin

Если нужно узнать точное количество файлов и папок

find /home/sysadmin -type f | wc -l
find /home/sysadmin -type d | wc -l

Добавим директорию в архив и посмотрим получившийся объем

tar -cf /tmp/sysadmin.tar /home/sysadmin 

du -h /tmp/sysadmin.tar

Чтобы извлечь архив

tar -xf sysadmin.tar

Чтобы извлечь в определенную папку

tar -xf /tmp/sysadmin.tar -C /home/sysadmin/backup

В нашем случае архив занимает немного, но в рабочей среде желательно использовать сжатие

gzip -k /tmp/sysadmin.tar  // -k сохранит оригинал
или
bzip2 -k /tmp/sysadmin.tar
du -h /tmp/sysadmin.tar.gz
du -h /tmp/sysadmin.tar.bz2

В моем случае с 6.8M архив удалось сжать до 1.3 и 1.2

Совместим архивацию и сжатие

tar -czf /tmp/sysadmin.tar.gz -C /home/sysadmin .  // точка в конце для того, чтобы в архив попало содержимое /home/sysadmin, а не весь путь. Другими словами, если вы распакуете архив, содержимое будет извлечено в текущую директорию, а не в подкаталог /home/sysadmin

Теперь создадим директорию для бэкапа, доработаем скрипт, добавив в него дату и хранение 5 последних копий и добавим в cron

mkdir /backup

nano backupscript

#!/bin/bash

DIR=backup/
DATE=$(date +'%d.%m.%Y_%H.%M' ) // внимательно с '
FILE=$DIR/$(hostname)+$DATE

find backup/ -mtime +4 -delete
tar -czvf $FILE.tar.gz -C /home/sysadmin . &> $FILE.log
chmod +x backupscript
./backupscript

du -h backup/
cat backup/*name*.log 

Посмотрим время и добавим в cron

date

crontab -e

23 15 * * * /home/sysadmin/backupscript

Ждем, проверяем и видим, что создан новый бэкап

Теперь сделаем наш бэкап инкрементальным. Инкрементальный бэкап включает только изменившиеся с момента последнего бэкапа файлы. Это позволяет экономить время и дисковое пространство, а также снижает нагрузку на сеть, так как не нужно каждый раз делать полную копию всех данных. 

cd Documents

touch file{1..10}

for i in {1..10}; do dd if=/dev/urandom of=file${i}.dat bs=1M count=10; done

cd ..
tar -czf Documents.tar.gz -g Documents.snar -C Documents/ .

Выполним

du -h Documents.*
4.0K    Documents.snar
101M    Documents.tar.gz

Еще раз

tar -czf Documents2.tar.gz -g Documents.snar -C Documents/ .

du -h   Documents2.*
4.0K     Documents2.tar.gz

 tar -tf Documents2.tar.gz -g /dev/null -vv

Добавим и удалим файлы

for i in {11..15}; do dd if=/dev/urandom of=file${i}.dat bs=1M count=5; done
rm file10.dat file5.dat file6.dat

tar -czf Documents3.tar.gz -g Documents.snar -C Documents/ .

du -h Documents3.tar.gz 
26M     Documents3.tar.gz
tar -tf Documents3.tar.gz 
./
./Documents.snar
./Documents3.tar.gz
./file11.dat
./file12.dat
./file13.dat
./file14.dat
./file15.dat

Теперь процесс восстановления таких бэкапов

Восстанавливать нужно в определенном порядке

 tar -xf Documents.tar.gz -g /dev/null -C Documents/ -v

 tar -xf Documents3.tar.gz -g /dev/null -C Documents/ -v

du -h Documents*

96M     Documents
4.0K    Documents2.tar.gz
26M     Documents3.tar.gz
4.0K    Documents.snar
101M    Documents.tar.gz

Самостоятельно можно доработать скрипт выше, добавив в него инкрементальные бэкапы. В продакшн среде лучше использовать профессиональные средства резервного копирования, но для общего понимания, знать информацию выше необходимо.