Как стать автором
Обновить

Резервное копирование во FreeNas

Время на прочтение3 мин
Количество просмотров17K
Здравствуйте, хабраузеры!

Хочу поделиться с вами опытом организации резервного копирования стандартными средствами 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 файла, нечто БД, куда заношу все содержимое папки. Далее я все перебрасываю в массив. Далее, чтобы сравнить числа, мне необходимо удалить из название буквы, ну а там уже сраниваю числа и удаляю старые. Жду объективное критики!
Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань