Резервное копирование сделано таким образом, что все директории подразделений сжимаются в свои .7z архивы с непрерывным сжатием в режиме добавления инкрементальных бэкапов. При этом, даже имея дубликаты файлов в разных директориях, результирующий архив не увеличивается существенно, а если бОльшая часть файлов в директории неизменна, а меняется или добавляется только небольшая часть, инкрементальное приращение архива имеет не существенный размер. Внутри архива информация представлена в виде директорий, содержащих даты, время бэкапов и имя резервируемых директорий отделов.
Настройка скрипта резервного копирования.
$base — базовый путь к директориям отделов;
$bk_to — путь к месту хранения бэкапов;
$path — путь к месту хранения скрипта (рекомендуется хранить и бэкапить скрипт аналогично директориям отделов);
$excl_file — файл с масками исключений, которые считаются неважными и резервироваться в архивы не будут ;
$excl_path — фрагмент bash-скрипта, описывающий исключаемые из архивирования директории одного уровня с директориями отделов (в данном случае — файлопомойка common, директория с бэкапами и tmp-диск;
$tmp_path — временная рабочая директория скрипта (надо создать её).
В данной настройке скрипт делает бэкап всех директорий отделов, расположенных в /shares/user кроме common, bk и disk_t в файлы {ИМЯ_ДИРЕКТОРИИ_ОТДЕЛА}.7z. Внутри архива будут директории с именами в формате ГГГГ-ММ-ДД-ЧЧ-ММ-СС-ИМЯ_ДИРЕКТОРИИ_ОТДЕЛА, где ГГГГ-ММ-ДД-ЧЧ-ММ-СС — время начала создания архива.
Скрипт имеет защиту от повторного запуска (по расписанию), если предыдущая копия ещё не отработала.
Чтобы архивирование не пожирало 100% ресурсов процессора, приоритет запуска архиватора снижен до +17.
/shares/user/backup/backup.pl:
#!/usr/bin/perl if (`ps ax|grep 7z|grep -v grep` eq ""){ $base="/shares/user"; $bk_to="$base/bk"; $path="/shares/user/backup"; $excl_file="$path/exclude.ext"; $excl_path="|grep -v common|grep -v bk|grep -v disk_t"; $tmp_path="$path/bk"; # Отмонтируем директории, если остались примонтированные при падении/прерывании предыдущих архиваций $a=`ls $tmp_path/`; @b=split /\n/,$a; foreach $name(@b){ `umount -f $tmp_path/$name`; `rmdir $tmp_path/$name`; } # Читаем список архивируемых директорий $a=`ls $base/$excl_path`; @b=split /\n/,$a; foreach $name(@b){ # Читаем текущую дату ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $year+=1900; $min="0".$min if $min<10; $hour="0".$hour if $hour<10; $mday="0".$mday if $mday<10; $mon="0".$mon if $mon<10; $current="$year-$mon-$mday-$hour-$min"; print "\nСегодня $current\n"; $newname="$current-$name"; `mkdir $tmp_path/$newname`; `mount -o bind $base/$name $tmp_path/$newname`; `rm -f $bk_to/*.tmp`; print "Делается архив: $name\n"; `nice --adjustment=17 7z a $bk_to/$name.7z -ms=on -ssc -mx=5 -w$bk_to/ -y -x\@$excl_file $tmp_path/*>$bk_to/$name.log`; `umount -f $tmp_path/$newname`; `rmdir $tmp_path/$newname`; } }
Замечания, комментарии?