|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Pavel Gulchouck 2:463/68 29 Apr 2005 21:26:26 To : Eugene B. Berdnikov Subject : Unux Backup -------------------------------------------------------------------------------- 22 Apr 05, Eugene B. Berdnikov ==> Pavel Gulchouck: PG>> Я делаю так: PG>> бэкап нужных каталогов rsync-ом, перед этим делаю rotate имеющихся PG>> бэкапов и создание новой копии, состоящей из hardlink-ов PG>> предыдущего. EBB> Чем, самодельным скриптом? Можете поделиться? IMHO такие скрипты проще под себя писать, чем чужие использовать. Hа машине, которую надо забэкапить, запускаю cd / /usr/local/bin/rsync --rsh="ssh -x -T -i /root/id_backup" \ -aqHxR --delete --delete-excluded \ ... \ backup@backups.itpark.ua:\ где "..." - это правила include/exclude, что нужно бэкапить. Hа бэкапящей машине из ~backup/.ssh/authorized_keys по ключу по безпарольному sudo запускается такой скрипт: === #! /usr/bin/perl $host{"193.109.240.5"} = "puma"; $host{"193.109.240.7"} = "racoon"; $host{"193.109.240.8"} = "irbis"; [...] $backupdir = "/backups/archives"; $rsync = "/usr/bin/rsync"; $rm = "/bin/rm"; $ndaily=2; $nweekly=2; $nmonthly=2; die "Backup from unknown host $ARGV[0]!\n" if !defined($host{$ARGV[0]}); $host=$host{$ARGV[0]}; $dirname="$backupdir/$host"; # Need rotate? $suffix=""; $time=time(); if (-d $dirname && $time-(stat($dirname))[9]>=2*3600 && $ndaily) { $suffix=".tmp"; linkdir($dirname, "$dirname$suffix"); } # Do rsync $rc=system("$rsync --server -lHogDtprRx --delete-excluded . $dirname$suffix"); if ($rc) { if ($rc == -1) { $reason = "Can't execute rsync: $!"; } else { $reason = "rsync retcode $rc"; } system("$rm -rf $dirname$suffix") if $suffix; die "$reason\n"; } utime($time, $time, "$dirname$suffix"); exit 0 unless $suffix; # Rotate if ($suffix) { system("$rm -rf $dirname.$ndaily"); for ($i=$ndaily-1; $i>0; $i--) { rename("$dirname.$i", "$dirname.".($i+1)); } rename($dirname, "$dirname.1"); rename("$dirname$suffix", $dirname); } ($a,$a,$a,$mday,$a,$a,$wday, $yday) = localtime($time); if ($wday==0 && $nweekly) { unless (-d "$dirname.weekly" && (localtime((stat("$dirname.weekly"))[9]))[7]==$yday) { # rotate weekly backups system("$rm -rf $dirname.$nweekly.weekly"); for ($i=$nweekly-1; $i>0; $i--) { rename("$dirname.$i.weekly", "$dirname.".($i+1).".weekly"); } linkdir($dirname, "$dirname.1.weekly"); } } if ($mday==1 && $nmonthly) { unless (-d "$dirname.monthly" && (localtime((stat("$dirname.monthly"))[9]))[7]==$yday) { # rotate monthly backups system("$rm -rf $dirname.$nmonthly.monthly"); for ($i=$nmonthly-1; $i>0; $i--) { rename("$dirname.$i.monthly", "$dirname.".($i+1).".monthly"); } linkdir($dirname, "$dirname.1.monthly"); } } exit(0); sub linkdir { my ($src, $dst) = @_; my ($mode, $uid, $gid, $atime, $mtime) = (stat($src))[2,4,5,8,9]; linkdir2($src, $dst, $mode, $uid, $gid, $aime, $mtime); system("$rsync -aqH --delete $src/ $dst"); utime($atime, $mtime, $dst); } use Fcntl ':mode'; sub linkdir2 { my ($src, $dst, $mode, $uid, $gid, $atime, $mtime) = @_; my ($file, @files, $at, $mt); local (*DIR); mkdir($dst); chmod($mode & 07777, $dst); chown($uid, $gid, $dst); opendir(DIR, $src); @files = readdir(DIR); closedir(DIR); foreach $file (@files) { next if $file =~ /^\.\.?$/; ($mode, $uid, $gid, $at, $mt) = (stat("$src/$file"))[2,4,5,8,9]; if (S_ISDIR($mode)) { linkdir2("$src/$file", "$dst/$file", $mode, $uid, $gid, $at, $mt); } elsif (S_ISREG($mode)) { link("$src/$file", "$dst/$file"); } } utime($atime, $mtime, $dst); } === PG>> Таким образом, получаю бэкапы за несколько последних PG>> дней/недель/месяцев (зависит от настроек ротейта), где одинаковые PG>> файлы представлены хардлинками и много места не занимают. Еще PG>> плюсы: простой доступ к бэкапной информации (не нужно PG>> растаривать), большая скорость бэкапа (передаются только PG>> изменившиеся файлы). Минусы: снижение секьюрности по сравнению с PG>> бэкапами в парольных архивах, необходимость монтировать раздел с PG>> бэкапами как noexec,nodev (ну это не сильный недостаток), EBB> Да уж... :))) PG>> иногда может искажаться информация о владельце (если такого юзера PG>> на бэкапящей машине нет, а такой uid есть и занят другим), PG>> хранение некомпрессированого бэкапа (это окупается за счет PG>> использования хардлинков и простоты доступа). Я храню бэкапы за PG>> последние два дня, последние две недели и последние два месяца, PG>> всего 6 бэкапов. Btw, тот же tar AFAIU потеряет информацию о PG>> хардлинках на сохраняемом разделе, в отличие от rsync. EBB> Hет, tar нынче хардлинки восстанавливает, во всяком случае в линуксе. EBB> А с rsync'ом есть две шероховатости: 1. память кушает при -H, EBB> 2. всегда обновляет atime. Второе нельзя побороть как-нибудь? Да, обновление atime несколько напрягает, особенно для /var/mail/. Как побороть, не знаю. :( PG>> Кроме того, раз в час (ну или кому сколько надо) проверяется PG>> список критичных текстовых файлов (всякие конфиги), изменения PG>> шлются по почте, и эти файлы хранятся под cvs. EBB> Hечаевское произведение? :) Да нет, свое. Может, у Hетча и у многих других есть аналогичные, это ж не бином Hьютона. ;-) Lucky carrier, Паша aka gul@gul.kiev.ua --- GoldED+/LNX 1.1.5 * Origin: Компьютер без Windows как рыба без велосипеда. (2:463/68) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/147942728081.html, оценка из 5, голосов 10
|