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

Обновлено Обновлено: Опубликовано Опубликовано:

Данный скрипт написан на bash под управлением операционной системы семейства Linux. Он будет работать по следующему сценарию:

  • Ежедневная актуализация данных в каталоге резервный копий daily.
  • Еженедельная актуализация данных в каталоге резервный копий weekly.
  • Создание полного архива с данными раз в 30 дней.
  • Старые архивы (которым более 370 дней) будут удаляться.

Приступим.

Пример скрипта

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

Создаем каталог для скриптов и сам скрипт:

mkdir /scripts

vi /scripts/samba_backup.sh

  1. #!/bin/bash
  2. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  3.  
  4. source="/data"
  5. destination_root="/backup"
  6. fdate=$(date +%Y-%m-%d)
  7.  
  8. # Clean old archives
  9. find ${destination_root}/archive -type f -name "*.tar.gz" -ctime +370 -exec rm -R {} \; 2>&1
  10.  
  11. # Daily
  12. rsync -a --partial --inplace --append --delete-after ${source}/ ${destination_root}/daily/
  13.  
  14. # Weekly
  15. if [[ $(date +%u) -eq 0 ]]
  16. then
  17.   rsync -a --partial --inplace --append --delete-after ${source}/ ${destination_root}/weekly/
  18. fi
  19.  
  20. # Archive
  21. count_last_archives=$(find ${destination_root}/archive/ -name "*.tar.gz" -mtime -30 | wc -l)
  22. if [[ $count_last_archives -eq 0 ]]
  23. then
  24.   cd ${source}
  25.   tar zcf ${destination_root}/archive/samba_${fdate}.tar.gz ./*
  26. fi

Задаем права скрипту на выполнение:

chmod +x /scripts/samba_backup.sh

Скрипт готов к работе.

Описание скрипта

Опишем значимые строки нашего скрипта:

1 Указываем на путь к интерпретатору.
2 Задаем системные переменные, чтобы не пришлось в скрипте прописывать полные пути до исполняемых файлов.
4 - 6 Задаем переменные.
4 Каталог и рабочими данными, которые нужно резервировать.
5 Корневая папка, где нужно хранить резервные копии.
6 Дата, когда запускается скрипт. Используется для 
9 Поиск и удаление всех архивов, которым более 370 дней.
11 - 18 Синхронизация данных с помощью rsync
12 Выполнение синхронизации данных в каталог daily.
15 Задаем условие. Номер дня недели должен равняться 0 (воскресенье). Если это так, то будет выполнена строка 17.
17 Выполнение синхронизации данных в каталог weekly.
20 - 26 Создание архива.
21 Получим количество файлов с архивами, которым меньше 30 дней и сохраним результат в переменную count_last_archives.
22 Проверяем условие, равна ли переменная count_last_archives нулю. На практике это значит, что за последние 30 дней у нас нет ни одного архива. Если это так, то выполняем строки 24 - 25.
24 Переходим внутрь каталога с рабочими данными. Это нужно для того, чтобы наш архив создавался относительно не корня, а рабочего каталога. Так удобнее при восстановлении данных.
25 С помощью утилиты tar мы архивируем все данные и создаем архив в каталоге archive. В название архива добавляем дату его создания.

Подготовка системы

Создаем каталоги, в которых будут храниться резервные копии:

mkdir -p /backup/{daily,weekly,archive}

В нашем примере, это три каталога, относительно, папки /backup:

  1. daily — ежедневные копии. Для быстрого восстановления.
  2. weekly — еженедельные. На случай, если ежедневный бэкап успел стереть важные данные.
  3. archive — архивы на крайний случай.

Наша система готова к созданию резервных копий.

Сохранение данных на удаленном компьютере

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

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

vi /etc/fstab

и добавим в него строчку:

//192.168.0.1/backup /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0

* в данном примере выполняется монтирование общей папки backup на сервере с IP-адресом 192.168.0.1 в каталог /mnt. В качестве сетевой файловой системы используется cifs (протокол SMB: сервер samba или общая папка Windows). Параметры для подключения — user: позволяет выполнить монтирование любому пользователю, rw: с правом на чтение и запись, noauto: не монтировать автоматически при старте системы, credentials: файл, в котором написаны логин и пароль для подключения к общей папке.

Теперь создадим файл с логином и паролем:

vi /root/.smbclient

и приведем его к следующему виду:

username=backup
password=backup

* где username: имя пользователя, password: пароль. Само собой, в вашем случае указываются свои данные.

Устанавливаем пакет cifs-utils, позволяющий в Linux монтировать smb-шары. В зависимости от типа Linux, команды будут немного различаться.

а) Deb (Ubuntu / Debian, Astra Linux):

apt install cifs-utils

б) RPM (Rocky Linux / РЕД ОС / CentOS):

yum install cifs-utils

Теперь введите следующую команду:

mount /mnt

Должна примонтировать сетевая папка //192.168.0.1/backup. Это можно проверить следующей командой:

mount

Подробнее про монтирование сетевых папок читайте в инструкции Как в Linux монтировать шару CIFS.

Автоматический запуск по расписанию

Создадим правило в cron для автоматического запуска нашего скрипта. Выполняем команду:

crontab -e

И добавляем строку:

0 3 * * * /scripts/samba_backup.sh

* в данном примере мы будем запускать резервирование каждый день в 3 часа ночи.

# Linux # Резервное копирование
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет