Резервное копирование данных — важная часть любой IT-инфраструктуры. В данной статье мы разберем, как настроить автоматическое резервное копирование файлов с Windows сервера на Linux сервер. Я предоставлю рабочий скрипт и подробно объясню его параметры, чтобы вы могли адаптировать его под свои нужды.
- Подготовка к работе
- Алгоритм работы скрипта
- Скрипт для резервного копирования
- Объяснение параметров
- Как использовать
- Заключение
В обслуживании у меня имеется Windows сервер, где с помощью программы Cobian Backup настроен локальный бекап внутренней CRM и рабочих файлов пользователей. Файлы сохраняются на том же сервере, только на другой физический диск. Описанным ниже скриптом, мы будем забирать локальные бекапы и сохранять их на linux сервере с ОС Debian. Если у вас еще не установлен сервер с Debian, рекомендую воспользоваться статьей на сайте Установка Debian 12 в качестве сервера. Подробный алгоритм работы скрипта будет описан далее.
Подготовка к работе
На Windows сервере создайте пользователя (например backup) под которым будете подключаться к нему и расшарьте папку с бекапами только для этого пользователя.
Далее проверьте, что на Linux сервере установлены утилиты cifs-utils (для работы с CIFS/SMB) и rsync (для синхронизации файлов).
Чтобы проверить, установлен ли пакет cifs-utils
на вашей системе, выполните команду ниже:
dpkg -l | grep cifs-utils
Если пакет установлен, вы увидите строку с его информацией, примерно как на картинке ниже

Если строка отсутствует, пакет не установлен, установите его командой:
sudo apt update
sudo apt install cifs-utils
Чтобы проверить, установлен ли rsync
на вашей системе, выполните команду ниже:
dpkg -l | grep rsync
Если пакет установлен, вы увидите строку с его информацией, примерно как на картинке ниже

Если rsync
не установлен, его можно установить следующей командой:
sudo apt update
sudo apt install rsync
Алгоритм работы скрипта
Скрипт выполняет следующие шаги:
- Проверка точек монтирования и директорий:
- Проверяется существование точки монтирования для общей папки Windows сервера.
- Проверяется наличие директории для хранения файлов, изменённых за последние два дня. При отсутствии директории они создаются.
- Монтирование общей папки Windows:
- С использованием
mount
и протокола CIFS подключается общая папка Windows сервера к локальной точке монтирования на Linux сервере.
- С использованием
- Резервное копирование с помощью rsync:
- Команда
rsync
синхронизирует содержимое общей папки Windows с локальной резервной директорией. - Все изменения фиксируются в логах, включая количество файлов, общий объём данных и объём переданных данных.
- Команда
- Фильтрация файлов по дате:
- Все файлы, изменённые за последние два дня, копируются в отдельную директорию для краткосрочного хранения, заданную в переменной TWO_DAYS_DIR. Если файлы уже существуют, они не копируются повторно.
- Удаление старых файлов:
- Из директории для краткосрочного хранения удаляются файлы, которые были созданы более семи дней назад.
- Размонтирование общей папки Windows:
- Общая папка размонтируется после завершения операций резервного копирования и фильтрации.
- Логирование:
- Все этапы работы скрипта, включая успешные операции и ошибки, записываются в лог-файл.
Скрипт для резервного копирования
Ниже приведен полный текст скрипта:
#!/bin/bash
# Конфигурация
WINDOWS_SHARE="//WINDOWS-SERVER/Arhive" # Сетевой путь до расшаренной папки Windows
MOUNT_POINT="/mnt/windows_server" # Точка монтирования на Debian
BACKUP_DIR="/mnt/Backup/SERVER" # Локальная папка для сохранения бекапов
TWO_DAYS_DIR="/mnt/Backup/Days_WINDOWS-SERVER" # Папка для копирования файлов не старше двух дней
LOG_FILE="/var/log/backup/WINDOWS-SERVER/WINDOWS-SERVER.log" # Путь до файла логов
USERNAME="backup" # Имя пользователя для подключения к Windows
PASSWORD="password" # Пароль для подключения к Windows
# Функция записи логов
log_message() {
local STATUS="$1"
local MESSAGE="$2"
echo "$(date "+%Y-%m-%d %H:%M:%S") [${STATUS}] ${MESSAGE}" >> "$LOG_FILE"
}
# Проверка существования точки монтирования
if [ ! -d "$MOUNT_POINT" ]; then
mkdir -p "$MOUNT_POINT"
if [ $? -ne 0 ]; then
log_message "ERROR" "Не удалось создать точку монтирования $MOUNT_POINT."
exit 1
fi
fi
# Проверка существования папки для файлов за два дня
if [ ! -d "$TWO_DAYS_DIR" ]; then
mkdir -p "$TWO_DAYS_DIR"
if [ $? -ne 0 ]; then
log_message "ERROR" "Не удалось создать папку $TWO_DAYS_DIR."
exit 1
fi
fi
# Монтирование расшаренной папки Windows
mount -t cifs "$WINDOWS_SHARE" "$MOUNT_POINT" -o username="$USERNAME",password="$PASSWORD"
if [ $? -ne 0 ]; then
log_message "ERROR" "Не удалось смонтировать $WINDOWS_SHARE."
exit 1
else
log_message "INFO" "Папка $WINDOWS_SHARE успешно смонтирована."
fi
# Копирование файлов с расшаренной папки
rsync -av --delete "$MOUNT_POINT/" "$BACKUP_DIR/" > /tmp/rsync_output.log
if [ $? -ne 0 ]; then
log_message "ERROR" "Ошибка копирования файлов из $WINDOWS_SHARE в $BACKUP_DIR."
umount "$MOUNT_POINT"
exit 1
else
# Анализ вывода rsync
FILE_COUNT=$(grep -E "^[^ ]" /tmp/rsync_output.log | grep -vE "^(deleting|sent |total size is|speedup is|sending incremental file list|\./)" | wc -l)
TOTAL_SIZE_BYTES=$(grep "total size is" /tmp/rsync_output.log | awk '{print $4}' | tr -d '.')
SENT_BYTES=$(grep "sent " /tmp/rsync_output.log | awk '{print $2}' | tr -d '.')
if [ -z "$TOTAL_SIZE_BYTES" ]; then
TOTAL_SIZE_GB="0.00"
else
TOTAL_SIZE_GB=$(echo "scale=2; $TOTAL_SIZE_BYTES / 1073741824" | bc)
fi
if [ -z "$SENT_BYTES" ]; then
SENT_SIZE_GB="0.00"
else
SENT_SIZE_GB=$(echo "scale=2; $SENT_BYTES / 1073741824" | bc)
fi
log_message "INFO" "Файлы из $WINDOWS_SHARE успешно скопированы в $BACKUP_DIR. Количество файлов: $FILE_COUNT. Общий объем: ${TOTAL_SIZE_GB} ГБ. Передано данных: ${SENT_SIZE_GB} ГБ."
fi
# Копирование файлов не старше двух дней в папку заданную в переменной TWO_DAYS_DIR
find "$BACKUP_DIR" -type f -mtime -2 -print0 | while IFS= read -r -d '' file; do
dest="$TWO_DAYS_DIR/${file#$BACKUP_DIR/}"
if [ -f "$dest" ]; then
log_message "INFO" "Файл $file уже существует в $dest. Пропуск копирования."
continue
fi
mkdir -p "$(dirname "$dest")" && cp "$file" "$dest"
if [ $? -ne 0 ]; then
log_message "ERROR" "Ошибка копирования файла $file в $dest."
else
log_message "INFO" "Файл $file успешно скопирован в $dest."
fi
done
# Удаление файлов старше 7 дней из папки заданной в переменной TWO_DAYS_DIR
if [ ! -d "$TWO_DAYS_DIR" ]; then
log_message "ERROR" "Папка $TWO_DAYS_DIR не существует. Пропуск удаления старых файлов."
else
OLD_FILES_COUNT=$(find "$TWO_DAYS_DIR" -type f -mtime +7 | wc -l)
find "$TWO_DAYS_DIR" -type f -mtime +7 -exec rm -f {} \;
if [ $? -ne 0 ]; then
log_message "ERROR" "Ошибка удаления файлов старше 7 дней из папки $TWO_DAYS_DIR."
else
log_message "INFO" "Файлы старше 7 дней успешно удалены из папки $TWO_DAYS_DIR. Количество удаленных файлов: $OLD_FILES_COUNT."
fi
fi
# Размонтирование папки Windows
umount "$MOUNT_POINT"
if [ $? -ne 0 ]; then
log_message "ERROR" "Не удалось размонтировать $MOUNT_POINT."
exit 1
else
log_message "INFO" "$MOUNT_POINT успешно размонтирована."
fi
exit 0
Объяснение параметров
- WINDOWS_SHARE — путь к общей папке на Windows сервере. Указывается в формате
//SERVER/SHARE
. - MOUNT_POINT — локальная точка монтирования для Windows-папки.
- BACKUP_DIR — папка, куда сохраняются резервные копии.
- TWO_DAYS_DIR — папка для файлов, измененных за последние два дня.
- LOG_FILE — файл для записи логов.
- USERNAME и PASSWORD — учетные данные для подключения к Windows серверу.
Как использовать
Скопируйте скрипт в файл (например, /usr/local/bin/backup.sh
).
Сделайте файл исполняемым:
chmod +x /usr/local/bin/backup.sh
Настройте расписание выполнения с помощью Cron:
crontab -e
Добавьте строку ниже:
0 2 * * * /usr/local/bin/backup.sh
Должно получиться примерно как на картинке ниже

С такими параметрами скрипт backup.sh
будет выполняться каждый день в 02:00 утра.
Заключение
Автоматическое резервное копирование данных с Windows на Linux сервер — важный элемент надежности IT-инфраструктуры. Этот процесс позволяет минимизировать риски потери информации и ускорить восстановление данных при сбоях. Настроив соответствующий скрипт, вы получите эффективный инструмент для регулярной синхронизации и архивирования файлов. Использование утилит rsync
и cifs
обеспечивает гибкость и контроль над процессом, а система логирования позволяет оперативно отслеживать состояние резервного копирования. В общем, это решение, которое я рекомендую внедрить каждому, кто ценит безопасность и стабильность своей инфраструктуры.
Помогла статья? Подписывайся на Telegram канал автора.
Анонсы всех статей, много другой полезной и интересной информации, которая не попадает на сайт.
Если у вас имеются вопросы, задавайте их в комментариях.