Резервное копирование и восстановление по расписанию

LinuxBeginner
Практиковаться сейчас

Введение

Полезная резервная копия — это не просто команда архивации. Необходимо знать, что в ней содержится, убедиться, что архив можно прочитать, восстановить нужный файл и обеспечить наблюдаемость автоматических запусков.

В этой лабораторной работе вы создадите резервную копию небольшой рабочей области приложения на основе манифеста, восстановите один выбранный файл, превратите этот процесс в скрипт с временными метками и установите расписание Cron. Все автоматизированные пути будут абсолютными, поэтому задание не будет зависеть от текущего каталога интерактивной оболочки.

Определение области резервного копирования с помощью манифеста

На этом шаге вы создадите манифест — обычный текстовый список путей, который делает область резервного копирования наглядной и удобной для проверки.

Перейдите в рабочую область:

cd /home/labex/project/backup-lab

Создайте манифест с путями относительно каталога data:

cat > backup-manifest.txt <<'EOF'
config/app.conf
documents/runbook.txt
EOF

Пронумеруйте записи, чтобы их было проще проверять:

nl -ba backup-manifest.txt

Убедитесь, что каждый указанный источник существует, используя цикл while. Перед запуском ознакомьтесь с его структурой:

  • IFS= не позволяет оболочке удалять пробелы в начале или конце строки;
  • read -r item считывает всю строку в переменную item, не обрабатывая обратные косые черты особым образом;
  • do ... done содержит команду, которая выполняется для каждой строки;
  • < backup-manifest.txt передаёт манифест на вход цикла;
  • test -f проверяет, является ли соответствующий путь обычным файлом, а && выводит ready только при успешной проверке.
while IFS= read -r item; do
  test -f "data/$item" && echo "ready: $item"
done < backup-manifest.txt

Файл documents/scratch.txt, не включённый в список, намеренно исключён из управляемой резервной копии.

Создание архива на основе манифеста

На этом шаге вы воспользуетесь tar -T, чтобы прочитать имена файлов из манифеста. Параметр -C data позволяет сохранить в архиве короткие относительные пути.

tar -czf backups/manual-backup.tar.gz -C data -T backup-manifest.txt

Параметры означают следующее:

  • -c: создать архив;
  • -z: сжать его с помощью gzip;
  • -f: использовать указанное далее имя архива;
  • -C data: выполнять операции относительно каталога data;
  • -T backup-manifest.txt: прочитать включаемые в резервную копию элементы из манифеста.

Проверьте созданный файл:

ls -lh backups/manual-backup.tar.gz

Сравните его временную метку и размер с исходными файлами:

stat -c '%n size=%s modified=%y' backups/manual-backup.tar.gz data/config/app.conf data/documents/runbook.txt

Проверка архива без распаковки

На этом шаге вы проверите архив, прежде чем полагаться на него. Сначала проверьте поток gzip:

gzip -t backups/manual-backup.tar.gz

Отсутствие вывода означает, что сжатый поток успешно прошёл проверку целостности. Теперь выведите список элементов tar-архива, не распаковывая его:

tar -tzf backups/manual-backup.tar.gz | tee archive-contents.txt

Сравните сохранённый список с манифестом:

diff -u backup-manifest.txt archive-contents.txt

Команда не должна показать различий. Убедитесь, что неуправляемый временный файл отсутствует:

if tar -tzf backups/manual-backup.tar.gz | grep -qx 'documents/scratch.txt'; then
  echo "Unexpected scratch file found"
else
  echo "Archive scope is correct"
fi

Восстановление одного выбранного файла

На этом шаге вы восстановите только один выбранный файл, чтобы не перезаписать несвязанные данные. Имитируйте случайное удаление конфигурации:

rm data/config/app.conf
test -e data/config/app.conf || echo "app.conf is missing"

Распакуйте только config/app.conf в отдельный каталог восстановления:

rm -rf restore/*
tar -xzf backups/manual-backup.tar.gz -C restore config/app.conf

Просмотрите восстановленный файл, затем скопируйте его обратно в рабочее расположение:

cat restore/config/app.conf
cp restore/config/app.conf data/config/app.conf
cmp -s restore/config/app.conf data/config/app.conf && echo "Configuration restored"

Был извлечён только запрошенный элемент архива.

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

На этом шаге вы создадите скрипт резервного копирования с временной меткой. Cron запускает задания в ограниченном окружении, поэтому в автоматических скриптах следует использовать абсолютные пути.

Создайте backup.sh:

cat > backup.sh <<'EOF'
#!/bin/bash

source_dir=/home/labex/project/backup-lab/data
manifest=/home/labex/project/backup-lab/backup-manifest.txt
backup_dir=/home/labex/project/backup-lab/backups
timestamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/backup-$timestamp.tar.gz"

mkdir -p "$backup_dir"

if [ ! -d "$source_dir" ] || [ ! -f "$manifest" ]; then
  echo "Backup source or manifest is missing" >&2
  exit 1
fi

/bin/tar -czf "$archive" -C "$source_dir" -T "$manifest" || exit 1
/bin/tar -tzf "$archive" > "$archive.contents" || exit 1

echo "Created $archive"
exit 0
EOF

Сделайте скрипт исполняемым и протестируйте его сейчас, не дожидаясь запуска Cron:

chmod u+x backup.sh
./backup.sh | tee last-backup.txt
ls -1 backups

Временная метка создаёт для каждого запуска уникальное имя файла. Дополнительный файл .contents точно фиксирует содержимое архива.

Установка и проверка расписания Cron

На этом шаге вы установите и проверите персональное расписание Cron. Строка crontab начинается с пяти полей расписания, после которых указывается команда:

Позиция Поле Обычный диапазон
1 минута 059
2 час 023
3 день месяца 131
4 месяц 112
5 день недели 07, где воскресенье обозначается 0 или 7

Звёздочка * означает любое допустимое значение. Шаг, например */5, означает выполнение через каждые пять единиц в соответствующем поле.

minute hour day-of-month month day-of-week command

Например, */5 * * * * означает запуск каждые пять минут. 0 2 * * * означает запуск ежедневно в 02:00.

Команда crontab -e открывает персональный файл crontab в редакторе. Надёжный порядок действий — сначала подготовить и установить заведомо правильную запись, а затем внести небольшое интерактивное изменение. Создайте запись, использующую абсолютные пути и сохраняющую как стандартный вывод, так и стандартный поток ошибок:

cat > backup.crontab <<'EOF'
*/5 * * * * /home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
EOF

Проверьте и установите её:

cat backup.crontab
crontab backup.crontab

Теперь откройте установленный crontab в Nano:

EDITOR=nano crontab -e

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

## LabEx managed backup schedule

Нажмите Ctrl+O, затем Enter, чтобы сохранить изменения. Нажмите Ctrl+X, чтобы выйти из Nano и вернуться в оболочку. С помощью crontab -l проверьте, что именно будет читать Cron, и сохраните этот вывод:

crontab -l | tee installed-crontab.txt

В выводе должен находиться комментарий, за которым следует запись, выполняемая каждые пять минут. Проверка установленного результата позволяет найти ошибки редактирования до того, как вы начнёте полагаться на расписание.

Проверка журналирования и понимание экранирования символа процента

На этом шаге вы проверите журналирование резервного копирования и изучите особое правило Cron для символов процента. Сначала вручную выполните команду, используемую в расписании:

/home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
tail -n 5 logs/backup.log
find backups -maxdepth 1 -type f -name 'backup-*.tar.gz' -printf '%f\n' | sort

Временная метка создаётся внутри backup.sh, где обычные символы % безопасны. Однако Cron обрабатывает неэкранированный % в команде crontab особым образом. Если вставить date непосредственно в строку crontab, каждый символ процента необходимо экранировать обратной косой чертой.

Сохраните корректно экранированный пример для справки:

cat > cron-date-example.txt <<'EOF'
0 2 * * * /bin/echo "backup-$(/bin/date +\%Y\%m\%d-\%H\%M\%S)" >> /home/labex/project/backup-lab/logs/date-example.log 2>&1
EOF
cat cron-date-example.txt

Установленное задание остаётся более простым вариантом на основе скрипта. Оно использует абсолютные пути, присваивает каждому архиву временную метку и оставляет журнал, который можно проверить после автоматических запусков.

Итоги

Вы определили область резервного копирования в манифесте, создали архив с помощью tar -T, проверили его без распаковки и восстановили один выбранный файл. Затем вы написали скрипт резервного копирования с временными метками и абсолютными путями, установили и проверили расписание Cron, перенаправили вывод автоматических запусков в журнал и узнали, почему символы процента необходимо экранировать, когда date используется непосредственно в команде crontab.