Linux скрипт резервного копирования папки

Простые инкрементальные бэкапы в Linux с помощью TAR и GPG

Обожаю UNIX-way, тут бэкапы можно делать значительно более гибкими.

Для бэкапа home директории я использую обычный tar с инкрементацией и шифрую его своим gpg ключом.

Для других файлов, например, для бэкапов моих видео, которые я записываю для ютуба я использую rsync. RSYNC более рационально использовать, когда не критична синхронизация большого количества файлов

#!/bin/bash NOW=$(date +%Y%m%d%H%M) MNOW=$(date +%Y%m) BACKUP_HOME="/tmp/home/" EMAIL="devpew" ARCHIVES_DIR="/tmp/backup/" DOW=`date +%a` # Day of the week e.g. Mon DOM=`date +%d` # Date of the Month e.g. 27 DM=`date +%d%b` # Date and Month e.g. 27Sep if [[ ! -d $$ ]] then mkdir $$ else echo &>/dev/null fi tar --exclude-from=/home/dm/mybin/.backup.excludes -v -z --create --file $$/$.tar.gz --listed-incremental=$$/$.snar $BACKUP_HOME &> $$/$.log if [ $(ls -d $$/*.tar.gz 2> /dev/null | wc -l) != "0" ] then gpg -r $EMAIL --encrypt-files $$/*.tar.gz \ && rm -rf $$/*.tar.gz fi scp $$/$.tar.gz.gpg $$/$.snar dm@192.168.0.152:/home/dm/backup/$

Если нужен более гибкий инкремент второго уровня, например, по неделям, то можно использовать такие условия

DOW=`date +%a` # Day of the week e.g. Mon DOM=`date +%d` # Date of the Month e.g. 27 DM=`date +%d%b` # Date and Month e.g. 27Sep if [ $DOM = "01" ]; then echo 'this is monthly backup' fi if [ $DOW = "Sun" ]; then echo 'this is weekly backup' else echo 'this is daily backup' fi 

How it works

Теперь, коротко о том, что делает этот скрипт

Скрипт перейдет в указанную директорию для бекапов и создаст в ней директорию с именем года и месяца в формате “202205” если сейчас май 2022 года.

Далее все бэкапы за май будут находиться в этой папке.

Далее если в папке нет файла с инкрементом (например, мы впервые запустили скрипт или начался новый месяц) то у нас создастся полный бекап всей системы.

В дальнейшем при запуске этого скрипта будут создаваться инкременты от текущего полного бекапа

Кроме того появится файл с логом

После того как у нас сделался бекап, он у нас зашифруется нашим GPG ключом а файл TAR удалится.

После этого мы скопируем наш бэкап к нам на сервер

Exclude

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

➜ mybin cat /home/dm/mybin/.backup.excludes /tmp/home/Nextcloud /tmp/home/.cache /tmp/home/youtube-videos

Кроме того, ничего не будет работать, если вы поставите слэш в конце.

Читайте также:  Команда чтобы узнать версию linux

Например строка /tmp/home/Nextcloud будет работать, а вот строка /tmp/home/Nextcloud/ работать уже не будет. Так что будьте аккуратны

Если нужно распаковать

У нас делаются инкрементальные бекапы и шифруются. Если нам нужно получить данные, то для начала нам нужно расшифровать файл

Расшифровать можно командой

gpg --output 202205122134.tar.gz --decrypt 202205122134.tar.gz.gpg

После этого, начнем распаковывать tar начиная с самого первого. Для начала распаковываем архив от первого числа.

tar --extract --verbose --listed-incremental=/dev/null --file=202205010101.tar.gz

И после этого распаковываем остальные инкременты, если нужно восстановить состояние системы, например, на 11 число, то нужно последовательно распаковать tar-архивы со 2 по 11 в ту же папку

Если это кажется слишком долгим процессом и вы часто восстанавливаете данные, то можно добавить инкремент второго уровня, например, недельный.

Или если вручную для вас это кажется слишком длительным процессом, можете накидать небольшой скрипт для распаковки. В простейшем случае так:

tar --extract --incremental --file file0.tar tar --extract --incremental --file file1.tar tar --extract --incremental --file file2.tar
for i in *.tbz2; do tar -xjGf "$i"; done;

Если нужно извлечь только конкретные каталоги из архива:

tar -xjGf levelX.tar --wildcards 'example/foo*' 'example/bar*'

Autorun

Если бы в убунте или дебиане, то вам нужно запускать этот скрпит через крон. В арче нет крона и автозапуск делается иначе. В этом примере будем запускать наш скрипт каждый день в 03:30

sudo nvim /usr/lib/systemd/system/backup.service
[Unit] Description=backup [Service] Type=simple ExecStart=/home/dm/mybin/backup
sudo nvim /usr/lib/systemd/system/backup.timer
[Unit] Description=my backup [Timer] OnCalendar=*-*-* 03:30:00 [Install] WantedBy=multi-user.target

После этого можем запустить наш сервис

sudo systemctl start backup.timer sudo systemctl enable backup.timer

После этого проверим добавился ли он командой

sudo systemctl list-timers --all
sudo systemctl status backup.timer

Remove old backups

Кроме того, что мы постоянно создаем бэкапы, нам нужно удалять старые для того чтобы не забить все место на диске. Если у вас есть скрипт для этого поделитесь, а я опубликую сюда ваше решение.

Источник

Bash скрипт резервного копирования директорий системы Linux

Одним из самых простых способов резервного копирования системы является использование сценария оболочки. Например, с помощью сценария можно настроить, какие каталоги следует резервировать, и передать эти каталоги в качестве аргументов утилите tar, которая создает архивный файл. Затем архивный файл можно переместить или скопировать в другое место. Архив также может быть создан на удаленной файловой системе, например, на монтируемой системе NFS.

backup

Утилита tar создает один архивный файл из многих файлов или каталогов. tar также может фильтровать файлы с помощью утилит сжатия, тем самым уменьшая размер архивного файла.

Простой сценарий оболочки

Следующий сценарий оболочки использует tar для создания архивного файла на удаленно смонтированной файловой системе NFS. Имя архивного файла определяется с помощью дополнительных утилит командной строки.

#!/bin/bash #################################### # Резервное копирование в NFS. #################################### # Что нужно копировать. backup_files="/home /var/spool/mail /etc /root /boot /opt" # Куда создать резервную копию. dest="/mnt/backup" # Создание имя файла архива. day=$(date +%A) hostname=$(hostname -s) archive_file="$hostname-$day.tgz" # Выведите сообщение о состоянии запуска. echo "Backing up $backup_files to $dest/$archive_file" date echo # Резервное копирование файлов с помощью tar. tar czf $dest/$archive_file $backup_files # Выведите сообщение о завершении работы. echo echo "Backup finished" date # Длинный список файлов в $dest для проверки размеров файлов. ls -lh $dest
  • $backup_files: переменная, в которой перечислены каталоги, резервные копии которых вы хотите создать. Список должен быть настроен в соответствии с вашими потребностями.
  • $day: переменная, содержащая день недели (понедельник, вторник, среда и т.д.). Это используется для создания архивного файла для каждого дня недели, что дает историю резервного копирования за семь дней. Есть и другие способы добиться этого, включая использование утилиты date.
  • $hostname: переменная, содержащая короткое имя хоста системы. Использование имени хоста в имени архивного файла дает возможность размещать ежедневные архивные файлы из нескольких систем в одном каталоге.
  • $archive_file: полное имя архивного файла.
  • $dest: место назначения архивного файла. Каталог должен быть создан и в данном случае смонтирован перед выполнением сценария резервного копирования. Подробности использования NFS см. в разделе .
  • сообщения о состоянии: необязательные сообщения, выводимые на консоль с помощью утилиты echo.
  • tar czf $dest/$archive_file $backup_files: команда tar, используемая для создания архивного файла.
    • c: создает архив.
    • z: фильтрация архива через утилиту gzip, сжимающую архив.
    • f: вывод в архивный файл. В противном случае вывод tar будет отправлен в STDOUT.

    Это простой пример сценария оболочки резервного копирования; однако существует множество опций, которые можно включить в такой сценарий.

    Выполнение сценария

    Выполнение из терминала

    Самый простой способ выполнения приведенного выше сценария резервного копирования — скопировать и вставить его содержимое в файл. Например, backup.sh. Файл необходимо сделать исполняемым:

    Затем из приглашения терминала:

    Это отличный способ протестировать сценарий, чтобы убедиться, что все работает так, как ожидалось.

    Выполнение с помощью cron

    Для автоматизации выполнения скрипта можно использовать утилиту cron. Демон cron позволяет выполнять скрипты или команды в указанное время и дату.

    cron настраивается с помощью записей в файле crontab. файлы crontab разделены на поля:

    • m: минута, в течение которой выполняется команда, от 0 до 59.
    • h: час, в который выполняется команда, от 0 до 23.
    • dom: день месяца, в который выполняется команда.
    • mon: месяц, в котором выполняется команда, от 1 до 12.
    • dow: день недели, в который выполняется команда, от 0 до 7. Воскресенье может быть указано с помощью 0 или 7, оба значения действительны.
    • command: команда для выполнения.

    Для добавления или изменения записей в файле crontab следует использовать команду crontab -e. Кроме того, содержимое файла crontab можно просмотреть с помощью команды crontab -l.

    Чтобы выполнить приведенный выше сценарий backup.sh с помощью cron. Введите в терминале следующую команду:

    Использование sudo с командой crontab -e редактирует кронтаб пользователя root. Это необходимо, если вы создаете резервные копии каталогов, доступ к которым имеет только пользователь root.

    Добавьте следующую запись в файл crontab:

    0 0 * * * bash /usr/local/bin/backup.sh

    Теперь сценарий backup.sh будет выполняться каждый день в 12:00 дня.

    Сценарий backup.sh необходимо скопировать в каталог /usr/local/bin/, чтобы эта запись выполнялась правильно. Сценарий может находиться в любом месте файловой системы, просто измените путь к сценарию соответствующим образом.

    Восстановление из архива

    После создания архива важно протестировать его. Архив можно протестировать, перечислив содержащиеся в нем файлы, но лучшим тестом будет восстановление файла из архива.

    Чтобы просмотреть список содержимого архива. В терминале введите:

    tar -tzvf /mnt/backup/host-Monday.tgz

    Чтобы восстановить файл из архива в другой каталог, введите:

    tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts

    Опция -C в tar перенаправляет извлеченные файлы в указанный каталог. В приведенном выше примере файл /etc/hosts будет извлечен в /tmp/etc/hosts. tar воссоздает структуру каталогов, в которых он находится.

    Также обратите внимание, что в пути к восстанавливаемому файлу отсутствует лидирующий символ «/».

    Чтобы восстановить все файлы в архиве, выполните следующие действия:

    cd / sudo tar -xzvf /mnt/backup/host-Monday.tgz

    Это приведет к перезаписи файлов, находящихся в настоящее время в файловой системе.

    Источник

    Резервное копирование каталога в Ubuntu/Debian по расписанию

    Для того, чтобы настроить простое резервное копирование содержимого директории в Linux (Ubuntu, Debian) необходимо выполнить несколько простых действий. Предположим, что нам необходимо делать резервную копию фалов, загружаемых на сайт, который. Файлы, которые будем копировать находятся в директории /var/www/mysite/files, директория, в которую будем копировать файлы: /mnt/backup_device/mysite_data.

    Напишем простой sh скрипт (назовем его backupdata.sh, он будет лежать в директории /home), который будет копировать все файлы из одной директории в другую:

    #!/bin/sh cp -R /var/www/mysite/files/* /mnt/backup_device/mysite_data/

    Для того, чтобы запускать скрипт по расписанию воспользуемся программой cron. Предположим, необходимо копировать файлы каждый день в 5 часов утра. Задание будет выглядеть следующим образом:

    0 5 * * * sh /home/backupdata.sh

    Так же можно упаковывать копируемые файлы в архив. Перепишем backupdata.sh таким образом, чтобы при каждом резервном копировании создавался новый архив директории с датой резервного копирования:

    #!/bin/sh tar -cvzf /mnt/backup_device/mysite_data/backup-$(date +"%d.%m.%y").tar.gz /var/www/mysite/files

    Таким образом, каждый день в 5 часов утра в директории /mnt/backup_device/mysite_data будет создаваться архив директоии /var/www/mysite/files с названием, например backup-14.07.17.tar.gz.

    Установка Webmin для Armbian (Orange Pi / Raspberry Pi)

    Установка webmin для операционной системы Armbian (Orange Pi / Raspberry Pi). Install webmin for armbian.

    Текстовое поле с выпадающими подсказками при вводе текста C# WPF XAML

    Простая реализация текстового поля с выпадающими подсказками (аналогично поиску у Яндекс и Google) при вводе текста на языке C# WPF. Реализация пользовательского элемента управления в C#/

    Yii2 advanced доступ из backend к frontend кэшу

    В заметке описан способ доступа к фронтэнд (frontend) кэшу (cache) advanced приложения из бэкэнда (backend) для php фреймворка Yii2.

    Источник

Оцените статью
Adblock
detector