top
logo


Резервное копирование во FreeNas PDF Печать E-mail
Автор: adm   
29.12.12 20:25

Хочу поделиться с вами опытом организации резервного копирования стандартными средствами FreeNas.

Для начала хотелось бы вас ввести в курс дела, чтобы читателю было легче ориентироваться в обстоятельствах моего дела, итак.

Мы имеем у нас в сети AD, со всему сопутствующими службами, много пользователей и файл-сервер, работающий на FreeNas (aka freeBSD), который дружит с доменом.

У самого FreeNas есть вариант перемещения удаленных файлов в скрытую папку .recycle Там лежат удаленные файлы, которые группируются по папкам, где название папки- %USERNAME% удалившего. Этого решения хватает, но что делать если пользователь не удаляет информацию, а изменяет?
В этом случае необходим откат самого файла, что наш файл-сервер в стандартных функциях делать не умеет.

Поэтому пишем скрипты, которые запускаем через cron.


Я решил скрипт для себя разбить на 2 части. Первая часть делает бэкап, вторая удаляет=) По второй объясню чуть ниже.

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

pax -wvzf /mnt/data/backup/Hartmann_backup/Hartmann-`date "+%Y%m%d"`.tar.gz /mnt/data/Users_data

Таким образом, у вас будут создавать архивы, пока не кончится свободное место. Это плохо, необходимо удалять самые старые копии архивов. Это уже вторая часть скрипта.

Но вот тут уже начинается нетривиальные решение.
Как мы выясним какой архив последний? Первое что идет на ум, это поглядеть свойство архива, взять оттуда дату и удалить самые старые. Но он будет сравнивать эту дату с системной датой FreeNas. Тоесть если на файл сервере вдруг время собьется, мы можем лишиться всех архивов, поэтому этот вариант не подходит.

Другой вариант, это брать имя архива и сравнивать из имен наибольшие числа… и оставлять, допустим, 3 самых больших чисел, тоесть оставить 3 самых свежих архива. Этот вариант нам подходит. Я это решения реализовал следюущим образом

#search_to_bd
filename=/mnt/data/backup/Hartmann_backup/bd.txt
filename2=/mnt/data/backup/Hartmann_backup/sort.txt
echo "" > $filename2
ls /mnt/data/backup/Hartmann_backup/ | grep .gz > $filename
declare -a array1
array1=( `cat "$filename" | tr '\n' ' '`)
#search_to_bd/

kolel=${#array1[*]}
var0=1

#Cut_name_to_bd
while [ "$var0" -lt "$kolel" ]
do
eval var$var0= echo ${array1[$var0]:9:8} >> $filename2
var=array1[$var0]
var0=`expr $var0 + 1`
done
#Cut_name_to_bd/ from_var0_to_kolel

#Take_sort_from_bd
ARRAY=( `cat "$filename2" | tr '\n' ' '`)
#Take_sort_from_bd/

#Comperison
maxi=0
for ((i=0; i < "${#ARRAY[@]}"; i++));do [ "0${ARRAY[i]}" -gt "0${ARRAY[maxi]}" ] && maxi=$i; done
maxi1=${ARRAY[maxi]}

ARRAY[maxi]=
maxi=0
for ((i=0; i < "${#ARRAY[@]}"; i++));do [ "0${ARRAY[i]}" -gt "0${ARRAY[maxi]}" ] && maxi=$i; done
maxi2=${ARRAY[maxi]}

ARRAY[maxi]=
maxi=0
for ((i=0; i < "${#ARRAY[@]}"; i++));do [ "0${ARRAY[i]}" -gt "0${ARRAY[maxi]}" ] && maxi=$i; done
maxi3=${ARRAY[maxi]}
#Comperison/
#shopt -s extglob
#rm !(@("backup/Hartmann_backup/Hartmann-$maxi1.tar.gz"|"backup/Hartmann_backup/Hartmann-#$maxi2.tar.gz"|"backup/Hartmann_backup/Hartmann-$maxi3.tar.gz"))
cd /mnt/data/backup/Hartmann_backup
ls -1 | egrep -v "(Hartmann-$maxi1.tar.gz|Hartmann-$maxi2.tar.gz|Hartmann-$maxi3.tar.gz)" | xargs rm


В 2х словах, я создаю 2 файла, нечто БД, куда заношу все содержимое папки. Далее я все перебрасываю в массив. Далее, чтобы сравнить числа, мне необходимо удалить из название буквы, ну а там уже сраниваю числа и удаляю старые. Жду объективное критики!

 

 

источник: http://habrahabr.ru/post/126496/

ссылка на материал: http://thin.kiev.ua/nas-server/78-freenas/713-backup-freenas.html

{jcomments on}

Последнее обновление 29.12.12 20:28
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика