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

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

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

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.