echo"… $back3 — > $back4"; $mv −f "$back3" "$back4"
Другое полезное расширение в rotatelogs — сжатие всех архивированных файлов для экономии дискового пространства; для этого необходимо, чтобы сценарий распознавал и правильно обрабатывал сжатые файлы.
№ 51. Управление резервными копиями
Управление резервным копированием системы — задача, хорошо знакомая всем системным администраторам и очень неблагодарная. Никто никогда не скажет: «Резервное копирование мне здорово помогло — отличная работа!». Некоторые виды резервного копирования жизненно необходимы даже для систем Linux с единственным пользователем. К сожалению, ценность этой операции мы нередко осознаем только после потери данных и файлов. Одна из причин, почему пользователи Linux часто пренебрегают резервным копированием, — неудобство и сложность многих инструментов резервного копирования.
Сценарий командной оболочки может решить эту проблему! Сценарий в листинге 6.16 копирует указанный набор каталогов, инкрементально (то есть отбирая только файлы, изменившиеся после предыдущего резервного копирования) или целиком (копируя все файлы). В процессе производится сжатие, чтобы уменьшить потребление дискового пространства, и вывод сценария можно направить в файл, на ленточный накопитель, на смонтированный удаленный раздел NFS, в облачное хранилище (как будет показано далее в книге) и даже на DVD.
Листинг 6.16.Сценарий backup
#!/bin/bash
# backup — Создает полную или инкрементальную резервную копию набора
#·· каталогов в системе. По умолчанию выходной файл сжимается
#·· и сохраняется в /tmp, в файле с именем, содержащим время создания копии.
#·· При желании можно указать устройство для вывода (другой диск, съемное
#·· устройство хранения или что-то другое по вашему выбору).
compress="bzip2" # Измените, если предпочитаете другую программу сжатия.
inclist="/tmp/backup.inclist.$(date +%d%m%y)"
output="/tmp/backup.$(date +%d%m%y). bz2"
tsfile="$HOME/.backup.timestamp"
btype="incremental" # По умолчанию выполняется инкрементальное копирование.
noinc=0············ # Обновлять файл с отметкой времени.
trap "/bin/rm −f $inclist" EXIT
usageQuit()
{
··cat << "EOF" >&2
Usage: $0 [-o output] [-i|-f] [-n]
··-o lets you specify an alternative backup file/device,
··-i is an incremental, −f is a full backup, and −n prevents
··updating the timestamp when an incremental backup is done.
EOF
··exit 1
}
########## Основной сценарий ###########
while getopts "o: ifn" arg; do
··case "$opt" in
····o) output="$OPTARG";····;; # getopts автоматически изменяет OPTARG.
····i) btype="incremental";;;
····f) btype="full";········;;
····n) noinc=1;············;;
····?) usageQuit············;;
··esac
done
shift $(($OPTIND — 1))
echo "Doing $btype backup, saving output to $output"
timestamp="$(date +'%m%d%I%M')" # Получить текущие месяц, число, час, минуты.
································# Интересны форматы? "man strftime"
if ["$btype" = "incremental"]; then
··if [! -f $tsfile]; then
····echo "Error: can't do an incremental backup: no timestamp file" >&2
····exit 1
··fi
··find $HOME −depth −type f −newer $tsfile −user ${USER:-LOGNAME} | \
··pax −w — x tar | $compress > $output
··failure="$?"
else
··find $HOME −depth −type f −user ${USER:-LOGNAME} | \
··pax −w — x tar | $compress > $output
··failure="$?"
fi
if ["$noinc" = "0" −a "$failure" = "0"]; then
··touch −t $timestamp $tsfile
fi
exit 0
Собственно резервное копирование выполняется командой pax в строках
и
, вывод которой через конвейер передается программе сжатия (bzip2 по умолчанию) и затем направляется в выходной файл или устройство. Однако инкрементальное копирование требует некоторых ухищрений, потому что стандартная версия программы tar не позволяет проверять время изменения, в отличие от GNU-версии. С помощью команды find создается список файлов, изменившихся с момента предыдущего резервного копирования, и сохраняется во временном файле inclist. Для большей совместимости его формат имитирует формат вывода команды tar. Далее этот файл передается непосредственно команде pax.
Между программами резервного копирования нет согласия по поводу того, какое время принимать за время создания резервной копии, но обычно им считается момент, когда копирование завершено, а не когда начато. Такой выбор может вызвать проблемы, если в процессе резервного копирования какие-то файлы изменятся, что вполне вероятно, так как резервное копирование порой длится довольно долго. Поскольку в этом случае момент последнего изменения файла окажется более ранним, чем момент, принятый за время создания резервной копии, такой файл может не попасть в следующую инкрементальную резервную копию, что само по себе плохо.
Читать дальше