Thank you for reading this post, don't forget to subscribe!
Данный скрипт написан на bash под управлением операционной системы семейства Linux. Он будет работать по следующему сценарию:
- Ежедневная актуализация данных в каталоге резервный копий daily.
- Еженедельная актуализация данных в каталоге резервный копий weekly.
- Создание полного архива с данными раз в 30 дней.
- Старые архивы (которым более 370 дней) будут удаляться.
Приступим.
Пример скрипта
Скрипт будет сравнивать файлы в рабочем каталоге и папке резервного копирования с помощью rsync. Это позволит нам сэкономить на времени выполнения задания. Долго будет выполняться только задание создания архива с помощью tar.
Создаем каталог для скриптов и сам скрипт:
mkdir /scripts
vi /scripts/samba_backup.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/bin/bash PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin source="/data" destination_root="/backup" fdate=$(date +%Y-%m-%d) # Clean old archives find ${destination_root}/archive -type f -name "*.tar.gz" -ctime +370 -exec rm -R {} \; 2>&1 # Daily rsync -a --delete-after ${source}/ ${destination_root}/daily/ # Weekly if [[ $(date +%u) -eq 0 ]] then rsync -a --delete-after ${source}/ ${destination_root}/weekly/ fi # Archive count_last_archives=$(find ${destination_root}/archive/ -name "*.tar.gz" -mtime -30 | wc -l) if [[ $count_last_archives -eq 0 ]] then cd ${source} tar zcf ${destination_root}/archive/samba_${fdate}.tar.gz ./* 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:
- daily — ежедневные копии. Для быстрого восстановления.
- weekly — еженедельные. На случай, если ежедневный бэкап успел стереть важные данные.
- archive — архивы на крайний случай.
Наша система готова к созданию резервных копий.
Сохранение данных на удаленном компьютере
Резервные копии необходимо создавать на удаленном компьютере или внешнем диске, чтобы они были доступны при выходе из строя сервера. Предположим, у нас используется общая папка на удаленном сервере, в которой будут размещаться файлы с backup.
Чтобы упростить процесс монтирования сетевой папки, откроем на редактирование следующий файл:
vi /etc/fstab
и добавим в него строчку:
1 2 |
//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: пароль. Само собой, в вашем случае указываются свои данные.
Теперь введите следующую команду:
mount /mnt
Должна примонтировать сетевая папка //192.168.0.1/backup. Это можно проверить следующей командой:
mount
Автоматический запуск по расписанию
Создадим правило в cron для автоматического запуска нашего скрипта. Выполняем команду:
crontab -e
И добавляем строку:
0 3 * * * /scripts/samba_backup.sh
* в данном примере мы будем запускать резервирование каждый день в 3 часа ночи.