Мануал: Скрипт полного бэкапа системы Linux (Tar на NTFS)

📄 Мануал: Скрипт полного бэкапа системы Linux (Tar на NTFS)
Этот Bash-скрипт автоматизирует процесс создания полного бэкапа корневой файловой системы Linux в сжатый архив (.tar.gz). Ключевое преимущество этого метода в том, что он сохраняет все необходимые метаданные Linux (права доступа, владельцев и символические ссылки) внутри архива, который затем может быть безопасно сохранен на диске с файловой системой NTFS, несовместимой с POSIX-правами.
После завершения скрипт отправляет уведомление о результате (успех/ошибка/предупреждение) в Telegram.
⚙️ Полный код скрипта
#!/bin/bash
# Настройки Telegram
TELEGRAM_BOT_TOKEN="ВашТокен"
TELEGRAM_CHAT_ID="АйдиВашегоЧата"
TELEGRAM_API_URL="https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage"
# Функция для корректного форматирования даты (ГГГГ.ММ.ДД_ЧЧ_ММ)
get_formatted_date() {
date "+%Y.%m.%d_%H_%M"
}
# Функция отправки в Telegram
send_telegram_message() {
local message="$1"
curl -s -X POST "$TELEGRAM_API_URL" \
-d "chat_id=$TELEGRAM_CHAT_ID" \
-d "text=$message" \
-d "parse_mode=Markdown" > /dev/null
}
### ███████████████████ НАСТРОЙКИ TAR БЭКАПА ███████████████████
start_time=$(get_formatted_date)
LOG_FILE="/var/log/tar_system_backup.log"
# Папка назначения на NTFS-диске
DEST_DIR="/media/test/"
# Имя файла архива с датой
BACKUP_NAME="system_root_$(get_formatted_date).tar.gz"
DESTINATION_PATH="${DEST_DIR}${BACKUP_NAME}"
SYSTEM_NAME="ubuntu_root" # Имя системы для уведомления
echo "[$(date)] Начало полного бэкапа системы Tar..."
mkdir -p "$DEST_DIR"
# Список системных каталогов, которые НЕ ДОЛЖНЫ быть включены в бэкап
EXCLUDE_ARGS=(
--exclude=/proc
--exclude=/sys
--exclude=/dev
--exclude=/tmp
--exclude=/mnt
--exclude=/media
--exclude=/var/cache
--exclude=/var/tmp
--exclude=${DEST_DIR}
--exclude=/lost+found
--exclude=/boot/efi
)
### ███████████████████ Запуск TAR и сжатие ███████████████████
# -p: сохранить права доступа, владельцев и группу (КЛЮЧЕВОЙ ФЛАГ для NTFS!)
if /bin/tar -czpvf "${DESTINATION_PATH}" "${EXCLUDE_ARGS[@]}" / 2>&1 | tee "$LOG_FILE"; then
TAR_EXIT_CODE=$?
if [[ $TAR_EXIT_CODE -eq 0 ]]; then
end_time=$(get_formatted_date)
FILE_SIZE=$(du -h "${DESTINATION_PATH}" | awk '{print $1}')
echo "[$(date)] Tar бэкап успешно завершён (код $TAR_EXIT_CODE)."
message="✅ *Tar Backup успешно завершен* Система: \`${SYSTEM_NAME}\`
Размер: \`${FILE_SIZE}\`
Начало: \`${start_time}\`
Окончание: \`${end_time}\`
Файл: \`${BACKUP_NAME}\`"
send_telegram_message "$message"
else
end_time=$(get_formatted_date)
echo "[$(date)] Tar бэкап завершён с предупреждением (код $TAR_EXIT_CODE). Проверьте лог."
message="⚠️ *Tar Backup завершен с предупреждением (Code ${TAR_EXIT_CODE})* Система: \`${SYSTEM_NAME}\`
Начало: \`${start_time}\`
Проверьте лог: \`${LOG_FILE}\`"
send_telegram_message "$message"
fi
else
TAR_EXIT_CODE=$?
end_time=$(get_formatted_date)
echo "[$(date)] Ошибка Tar бэкапа! (код $TAR_EXIT_CODE)"
message="❌ *Tar Backup завершен с ошибкой (Code ${TAR_EXIT_CODE})* Система: \`${SYSTEM_NAME}\`
Начало: \`${start_time}\`
Проверьте лог: \`${LOG_FILE}\`"
send_telegram_message "$message"
exit $TAR_EXIT_CODE
fi
# ----------------------------------------------------------------------
### ███████████████████ Очистка старых бэкапов (>30 дней) ███████████████████
echo "[$(date)] Удаление старых бэкапов..."
/usr/bin/find "$DEST_DIR" -type f -name '*.tar.gz' -mtime +30 -exec rm -f {} \;
echo "Готово!"
🔍 Подробная расшифровка скрипта
1. Настройки Telegram и функции
Этот блок определяет, куда и как отправлять уведомления.
| Элемент | Назначение | Описание |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Настройка | Уникальный токен вашего бота. |
get_formatted_date() |
Функция | Возвращает текущую дату/время в формате ГГГГ.ММ.ДД_ЧЧ_ММ для уникальности имени файла. |
send_telegram_message() |
Функция | Использует curl для отправки сообщения в указанный чат Telegram с поддержкой Markdown. |
2. Настройки бэкапа и инициализация
Определяются основные пути и создается папка для бэкапов на NTFS-диске.
| Переменная | Значение | Назначение |
|---|---|---|
DEST_DIR |
/media/test/ |
Целевой каталог на NTFS-диске. |
BACKUP_NAME |
system_root_$(get_formatted_date).tar.gz |
Имя файла архива, включающее дату. |
mkdir -p "$DEST_DIR" |
Команда | Гарантирует, что целевой каталог создан. Флаг -p предотвращает ошибку, если каталог уже существует. |
3. Список исключений (EXCLUDE_ARGS)
Массив EXCLUDE_ARGS содержит каталоги, которые необходимо исключить из бэкапа. Это предотвращает копирование временных, виртуальных или циклических файловых систем.
| Исключаемый каталог | Причина исключения |
|---|---|
/proc, /sys, /dev |
Виртуальные ФС. Создаются ядром при загрузке. Их нельзя копировать. |
/tmp, /var/cache, /var/tmp |
Временные файлы и кэши. Необязательны для восстановления системы. |
/mnt, /media |
Точки монтирования. Содержат внешние диски, не являющиеся частью корневой системы. |
${DEST_DIR} |
Папка назначения. Исключается, чтобы tar не пытался архивировать сам себя (избегание бесконечного цикла). |
4. Запуск команды Tar
Основная команда, создающая архив.
/bin/tar -czpvf "${DESTINATION_PATH}" "${EXCLUDE_ARGS[@]}" / 2>&1 | tee "$LOG_FILE"
| Опция | Назначение | Важность |
|---|---|---|
-c, -z, -f |
Создание и сжатие | Создать (c), сжать с помощью Gzip (z) и указать имя файла (f). |
-p |
Preserve Permissions | Ключевой флаг. Сохраняет права доступа (chmod), владельцев и группы (chown/chgrp) внутри архива. Это решает проблему NTFS. |
-v |
Verbose | Выводит подробный список обрабатываемых файлов. |
/ |
Источник | Указывает tar начать архивацию с корневого каталога. |
2>&1 | tee "$LOG_FILE" |
Логгирование | Перенаправляет весь вывод (включая ошибки) одновременно на экран (tee) и в файл лога. |
5. Обработка ошибок и очистка
Секция проверяет код выхода tar и отправляет уведомление.
- Если код
0: Отправляется уведомление Успех (✅). - Если код
1–127: Отправляется Предупреждение (⚠️) или Ошибка (❌), и предлагается проверить лог.
Очистка: В конце скрипта команда find ищет все файлы *.tar.gz в папке $DEST_DIR, которые были изменены более 30 дней назад (-mtime +30), и удаляет их.
💡 Инструкция по восстановлению
Для восстановления системы необходимо загрузиться с LiveCD/LiveUSB (например, Ubuntu Live), чтобы корневой раздел был неактивен.
- Загрузитесь с LiveCD/LiveUSB.
- Примонтируйте целевой раздел, куда нужно восстановить систему (например, в
/mnt). - Примонтируйте NTFS-диск с бэкапом (например, в
/media/backup). - Выполните команду распаковки:
tar -xzvpf /media/backup/system_tar_backups/ВАШ_ФАЙЛ.tar.gz -C /mnt --numeric-ownerФлаг
--numeric-ownerкритически важен, так как он гарантирует, что владельцы и группы восстановятся по их числовым ID, а не по именам, что исключает ошибки. - Переустановите загрузчик GRUB (например, через chroot).
Вернуться 28-10-2025, 08:06 Просмотров: 6 Автор: xlop



