Большой Воронежский Форум
» UNIX и дериваты>Вопрос про backup?
Hip-Hop 13:14 17.03.2011
Здравствуйте. Живу в Москве. Учусь в одном из колледжей по компьютерной тематике.

Возник вопрос такого характера. Я использую утилиту fsarchiver для мои маленьких backup,но она не умеет делать инкрементальный бэкап. Как сделать на основе fsarchiver подобие инкрементальныx бэкап? Сейчас я использую в cron такой набор команд:

Код:
#!/bin/bash

back_prog=/usr/sbin/fsarchiver
back_dir=/backup/
today=`/bin/date +%F-%T` 
back_log=/var/log/

$back_prog savefs $back_dir/debian-1-$today  /dev/sda[!2] -j2 -A -d

sleep 10

/usr/bin/find $log_dir/ -type f -name "fsarchiver_*" | xargs /bin/tar --gzip -c -v --remove-files -f $log_dir/debian-1.$today.tar.gz
[Ответ]
Hip-Hop 21:48 17.03.2011
Ни у кого нет идей? Ну, у меня есть примитивный способ через сверку контрольных сумм и архивирование заново Есть ещё идеи?

работает как-то так :

md5deep -r /etc/* > etc.md5
md5sum -c --quiet etc.md5 > md5.c # файл md5.c будет иметь не нулевой размер если сумма изменилась.

далее проверка. что-то типа:

if [ -s ./md5.c ]
then fsarchiver savedir etc.fsa /etc/
else echo "Стоп"
fi
[Ответ]
Hip-Hop 23:48 17.03.2011
Тут надо ещё подумать. К примеру, формат файла md5.c имеет след вид:

/etc/group
/etc/group-
/etc/gshadow
/etc/gshadow-
и т.д # суммы которые не совпали после сверки.

a=`sed -e'1!d' md5.c` # выбираем из файла первую строчку и передаем её в переменную.

Чтобы добавить заменить изменённую контрольную сумму в etc.md5

Помещаем новые суммы (взятые из md5.c) в etc.md5 и делаем файл md5.c = 0. Если не использовать другую проверку.

Но это очень примитивно и такой вариант едва ли подходить для чего-то кроме /etc/ /boot/ и т.д Для /var/ оно уже не подходит.
[Ответ]
Hip-Hop 00:52 18.03.2011
X0R, Я не знаю о чем вы.

Собственно. В переменную надо помешать 'дерево' каталогов всех в md5.c через цикл и awk

И я нашёл топорный способ через diff patch. Как-то так a=`sed -e'1!d' md5.c`; md5sum $a > tmp.md5

И самое интересное
diff tmp.md5 etc.md5 > patchfile.patch; patch tmp.md5 -i patchfile.patch -o etc.md5 [Ответ]
Hip-Hop 12:47 19.03.2011
Возник вопрос про sed.

есть две переменные $a и $b. a = old_sum_md5 $b= new_sum_md5.

Выглядит так: (если выводить через echo "$a")
3dc26e11d09be50c161d84659fee1ea6
6304b44a7e6cec1334fda6011ff9b60b
ect

Конструкция sed "s/$b/$a/g" file_md5 не работает, но работает если в переменной одно значение суммы.

Почему? Или sed так не умеет?

Короче, как мне перебрать и заменить все значения в переменной через sed? [Ответ]
Oleg R 12:54 19.03.2011
Hip-Hop, перезагружаться пробовал? [Ответ]
Hip-Hop 04:35 20.03.2011
Oleg R, я делаю так. простой набор команд.

md5deep -r /etc/* > etc.md5 - определяем суммы для все файлов в etc.
md5sum --quiet -c etc.md5 > etc.check - находим различия в суммах и записываем в файл.

etc.check имеет такой вид:

/etc/adduser.conf: ПОВРЕЖДЁН
/etc/wgetrc: ПОВРЕЖДЁН

и т.д.

a=`awk -F":" '{ print $1 }' etc.check` - вынимаю из etc.check имена файлов и определяю переменную.

b=`grep "$a" etc.md5 | awk -F" " '{ print $1 }'` # old_md5 - в переменной $b старые суммы изменившихся файлов.

потом я нахожу новые суммы для этих файлов и пытаюсь стравить это в sed, но не получается

Конструкция sed "/$b/$c/g" etc.md5 призвана заменить значение в $b на значение в $c, но не работает в моём варианте.

Imho, собака порылась в том как 'раскрываются' эти переменные и возможно в зарезервированных символах в этих переменных.

Или в sed нельзя так перебрать и заменить все значения? А жаль
[Ответ]
Hip-Hop 05:25 20.03.2011
Ну, интуитивно мне казалось чё такая работа sed возможна, но с другой стороны возможно и невозможна

Наверное лучше будет брать из этих переменных по строке и стравливать sed'y. Оформив это в цикле for.

Я изучаю linux всего второй месяц. Не корите меня сильно
[Ответ]
Hip-Hop 18:38 20.03.2011
Катя., Я не очень понимаю в чем дело.

смотри. я использую такую конструкцию

while read line
do
sed -e "/$line/d" etc.md5 > tmp.md5

done < tmp

Я читаю из файла по строке и на каждой итерации в $line новая строка? Но почему-то не работает. [Ответ]
Hip-Hop 15:27 21.03.2011
Xelas, задача простая. из файла tmp нужно прочитать все строки и удалить их из etc.md5. На выходе мы должны получить файл без строк в tmp.

Цикл в моем посте записывает в файл только последнюю итерацию. Оно и понятно, но надо чтобы все строки из tmp были убраны из etc.md5. Есть и более простой способ. Просто пересчитывать контрольную сумму каждый раз после её нарушения, но эт как-то плохо

Вот простой способ:

md5sum --quiet -c $back_dir/etc.md5 > $back_dir/etc.check

if [ -s $back_dir/etc.check ]
then $back_prog savedir -o -A -d --exclude=$excl $back_dir/incremental/$increm.$today.fsa /etc/ && rm $back_dir/etc.check && md5deep -r /etc/* > $back_dir/etc.md5
else echo "Стоп"
fi
А в переменной $excl должно быть все кроме того чья сумма изменилась перед очередной проверкой.
[Ответ]
Hip-Hop 15:59 22.03.2011
Xelas, вопрос решается очень просто Что б цикл работал правильно (как хотелось бы). - Удалял строки из tmp в etc.md5. Нужно добавить ключик -i к sed. Тогда все операции будут производиться непосредственно над файлом. И мы не получим каждый раз перезаписанный файл и последнюю итерацию в этоге.

вот так:

while read line
do
sed -e -i "/$line/d" etc.md5
done < tmp

Но так же можно включить в цикл проверку и управление циклом
[Ответ]
Hip-Hop 16:43 22.03.2011
В самом простом варианте такая работа будет выглядеть так:

md5deep -r /etc/* > etc.md5 # считает контрольные суммы. Один раз

md5sum --quiet -c etc.md5 > etc.check # Проверяет их.

if [ -s etc.check ] # если он не равен нулю.
then
a=`awk -F":" '{print $1}' etc.check` # файлы которые претерпели изменения.
b=`grep "$a" etc.md5 | awk -F" " '{ print $1 }'`# старые суммы этих файлов.
echo $b > tmp # Старые суммы
while read line
do
sed -e -i "/$line/d" etc.md5
done < tmp
md5sum $a > tmp # Новые суммы.
cat tmp >> etc.md5
rm etc.check
else echo "Суммы не изменились"
fi.

Как-то так
Но надо ещё учесть поведение при УДАЛЕНИИ файлов и при ДОБАВЛЕНИИ в etc.
И написать скрип для восстановления. И что если это будет не только etc?
[Ответ]
Hip-Hop 17:25 22.03.2011
mishel13,
VitohA, я в знаком с linux всего три месяца (до этого был заядлый виндос ), но уже почувствовал его поистине безграничные возможности.

этот замечательный цикл с чтением строк можно использовать в куче задач.

ещё пример:

if [ -f /etc/firewall/black_url ] ;
then
cat < /etc/firewall/black_url | sed 's/^[ \t]*//;s/[ \t]*$//;/./!d' > /tmp/firewall.tmp # удаляем все пробелы, табуляцию и пустые строки
rm /etc/firewall/black_url
mv /tmp/firewall.tmp /etc/firewall/black_url
cat /etc/firewall/black_url | while read line
do
$IPT -A INPUT -m string --string "$line" --algo kmp --to 65535 -j DROP
done
fi

используем iptables для запрещения доступа к сайтам по блэк-листу
[Ответ]
bdot 20:40 22.03.2011
Судя по всему тема потертая (подозреваю что здесь жутко глумились).

По существу: используй rdiff-backup и не заморачивайся всякими циклами. KISS [Ответ]
Hip-Hop 22:02 22.03.2011

Сообщение от bdot:
Судя по всему тема потертая (подозреваю что здесь жутко глумились).

Да, тут глумились всякие тролли. Которые не смогли внести ни капли полезного в топик.

Сообщение от bdot:
По существу: используй rdiff-backup и не заморачивайся всякими циклами. KISS

Это оффтопик Да, я знаю про tar и про rsync. Знаю про drbd о_О и т.д. Но вопрос в решении задачи топика. [Ответ]
Вверх