Резервное копирование с Windows сервера на Linux сервер

Резервное копирование данных — важная часть любой 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

Алгоритм работы скрипта

Скрипт выполняет следующие шаги:

  1. Проверка точек монтирования и директорий:
    • Проверяется существование точки монтирования для общей папки Windows сервера.
    • Проверяется наличие директории для хранения файлов, изменённых за последние два дня. При отсутствии директории они создаются.
  2. Монтирование общей папки Windows:
    • С использованием mount и протокола CIFS подключается общая папка Windows сервера к локальной точке монтирования на Linux сервере.
  3. Резервное копирование с помощью rsync:
    • Команда rsync синхронизирует содержимое общей папки Windows с локальной резервной директорией.
    • Все изменения фиксируются в логах, включая количество файлов, общий объём данных и объём переданных данных.
  4. Фильтрация файлов по дате:
    • Все файлы, изменённые за последние два дня, копируются в отдельную директорию для краткосрочного хранения, заданную в переменной TWO_DAYS_DIR. Если файлы уже существуют, они не копируются повторно.
  5. Удаление старых файлов:
    • Из директории для краткосрочного хранения удаляются файлы, которые были созданы более семи дней назад.
  6. Размонтирование общей папки Windows:
    • Общая папка размонтируется после завершения операций резервного копирования и фильтрации.
  7. Логирование:
    • Все этапы работы скрипта, включая успешные операции и ошибки, записываются в лог-файл.

Скрипт для резервного копирования

Ниже приведен полный текст скрипта:

#!/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

Объяснение параметров

  1. WINDOWS_SHARE — путь к общей папке на Windows сервере. Указывается в формате //SERVER/SHARE.
  2. MOUNT_POINT — локальная точка монтирования для Windows-папки.
  3. BACKUP_DIR — папка, куда сохраняются резервные копии.
  4. TWO_DAYS_DIR — папка для файлов, измененных за последние два дня.
  5. LOG_FILE — файл для записи логов.
  6. 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 канал автора.

Анонсы всех статей, много другой полезной и интересной информации, которая не попадает на сайт.

Если у вас имеются вопросы, задавайте их в комментариях.

Оставьте комментарий