Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.6.2006
Репутация: нет Всего: нет
|
Здравствуйте. Столкнулся со следующей проблемой. 2 раза в неделю делается ПОЛНЫЙ бекап. Сделался и получил, например, номер 110 и 115 Если что-то на файловом сервере пропало, штатное восстановление backuppc отрабатывает отлично. Спустя некоторое время, на рейде заканчивается место, я переносил, например, каталог 110 в другое место и нормально. Спустя некоторое время понадобилось восстановить бекап 110, точнее часть инфы в нём. Соответственно в броузере номер архива не отображался. Я послез в закрома, переместил назад каталог 110 и... Дело в том, что его с помощью скрипта нужно разархивировать. Вот скрипт на всякий: Код | #!/usr/bin/perl #============================================================= -*-perl-*- # # BackupPC_zipCreate: create a zip archive of an existing dump # for restore on a client. # # DESCRIPTION # # Usage: BackupPC_zipCreate [options] files/directories... # # Flags: # Required options: # -h host host from which the zip archive is created # -n dumpNum dump number from which the zip archive is created # A negative number means relative to the end (eg -1 # means the most recent dump, -2 2nd most recent etc). # -s shareName share name from which the zip archive is created # # Other options: # -t print summary totals # -r pathRemove path prefix that will be replaced with pathAdd # -p pathAdd new path prefix # -c level compression level (default is 0, no compression) # -e charset charset for encoding file names (default: cp1252) # # The -h, -n and -s options specify which dump is used to generate # the zip archive. The -r and -p options can be used to relocate # the paths in the zip archive so extracted files can be placed # in a location different from their original location. # # AUTHOR # Guillaume Filion <[email protected]> # Based on Backup_tarCreate by Craig Barratt <[email protected]> # # COPYRIGHT # Copyright (C) 2002-2007 Craig Barratt and Guillaume Filion # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #======================================================================== # # Version 3.1.0, released 25 Nov 2007. # # See http://backuppc.sourceforge.net. # #========================================================================
use strict; no utf8; use lib "/usr/share/backuppc/lib"; use Archive::Zip qw(:ERROR_CODES); use File::Path; use Getopt::Std; use Encode qw/from_to/; use IO::Handle; use BackupPC::Lib; use BackupPC::Attrib qw(:all); use BackupPC::FileZIO; use BackupPC::Zip::FileMember; use BackupPC::View;
die("BackupPC::Lib->new failed\n") if ( !(my $bpc = BackupPC::Lib->new) ); my $TopDir = $bpc->TopDir(); my $BinDir = $bpc->BinDir(); my %Conf = $bpc->Conf();
my %opts;
if ( !getopts("te:h:n:p:r:s:c:", \%opts) || @ARGV < 1 ) { print STDERR <<EOF; usage: $0 [options] files/directories... Required options: -h host host from which the zip archive is created -n dumpNum dump number from which the tar archive is created A negative number means relative to the end (eg -1 means the most recent dump, -2 2nd most recent etc). -s shareName share name from which the zip archive is created
Other options: -t print summary totals -r pathRemove path prefix that will be replaced with pathAdd -p pathAdd new path prefix -c level compression level (default is 0, no compression) -e charset charset for encoding file names (default: cp1252) EOF exit(1); }
if ( $opts{h} !~ /^([\w\.\s-]+)$/ || $opts{h} =~ m{(^|/)\.\.(/|$)} ) { print(STDERR "$0: bad host name '$opts{h}'\n"); exit(1); } my $Host = $opts{h};
if ( $opts{n} !~ /^(-?\d+)$/ ) { print(STDERR "$0: bad dump number '$opts{n}'\n"); exit(1); } my $Num = $opts{n};
$opts{c} = 0 if ( $opts{c} eq "" ); if ( $opts{c} !~ /^(\d+)$/ ) { print(STDERR "$0: invalid compression level '$opts{c}'. 0=none, 9=max\n"); exit(1); } my $compLevel = $opts{c};
my @Backups = $bpc->BackupInfoRead($Host); my $FileCnt = 0; my $ByteCnt = 0; my $DirCnt = 0; my $SpecialCnt = 0; my $ErrorCnt = 0;
my $i; $Num = $Backups[@Backups + $Num]{num} if ( -@Backups <= $Num && $Num < 0 ); for ( $i = 0 ; $i < @Backups ; $i++ ) { last if ( $Backups[$i]{num} == $Num ); } if ( $i >= @Backups ) { print(STDERR "$0: bad backup number $Num for host $Host\n"); exit(1); }
my $Charset = "cp1252"; $Charset = $opts{e} if ( $opts{e} ne "" );
my $PathRemove = $1 if ( $opts{r} =~ /(.+)/ ); my $PathAdd = $1 if ( $opts{p} =~ /(.+)/ ); if ( $opts{s} =~ m{(^|/)\.\.(/|$)} ) { print(STDERR "$0: bad share name '$opts{s}'\n"); exit(1); } my $ShareName = $opts{s};
my $BufSize = 1048576; # 1MB or 2^20 my(%UidCache, %GidCache); #my $fh = *STDOUT; my $fh = new IO::Handle; $fh->fdopen(fileno(STDOUT),"w"); my $zipfh = Archive::Zip->new();
binmode(STDOUT); foreach my $dir ( @ARGV ) { archiveWrite($zipfh, $dir); }
sub archiveWrite { my($zipfh, $dir, $zipPathOverride) = @_;
my $view = BackupPC::View->new($bpc, $Host, \@Backups);
if ( $dir =~ m{(^|/)\.\.(/|$)} || $dir !~ /^(.*)$/ ) { print(STDERR "$0: bad directory '$dir'\n"); $ErrorCnt++; return; } $dir = "/" if ( $dir eq "." ); $view->find($Num, $ShareName, $dir, 0, \&ZipWriteFile, $zipfh, $zipPathOverride); }
# Create Zip file print STDERR "Can't write Zip file\n" unless $zipfh->writeToFileHandle($fh, 0) == Archive::Zip::AZ_OK;
# # print out totals if requested # if ( $opts{t} ) { print STDERR "Done: $FileCnt files, $ByteCnt bytes, $DirCnt dirs,", " $SpecialCnt specials ignored, $ErrorCnt errors\n"; } exit(0);
########################################################################### # Subroutines ###########################################################################
sub UidLookup { my($uid) = @_;
$UidCache{$uid} = (getpwuid($uid))[0] if ( !exists($UidCache{$uid}) ); return $UidCache{$uid}; }
sub GidLookup { my($gid) = @_;
$GidCache{$gid} = (getgrgid($gid))[0] if ( !exists($GidCache{$gid}) ); return $GidCache{$gid}; }
my $Attr; my $AttrDir;
sub ZipWriteFile { my($hdr, $zipfh, $zipPathOverride) = @_;
my $tarPath = $hdr->{relPath}; $tarPath = $zipPathOverride if ( defined($zipPathOverride) );
if ( defined($PathRemove) && substr($tarPath, 0, length($PathRemove)) eq $PathRemove ) { substr($tarPath, 0, length($PathRemove)) = $PathAdd; } $tarPath = $1 if ( $tarPath =~ m{^\.?/+(.*)} ); $tarPath =~ s{//+}{/}g; $hdr->{name} = $tarPath; return if ( $tarPath eq "." || $tarPath eq "./" || $tarPath eq "" );
my $zipmember; # Container to hold the file/directory to zip.
if ( $hdr->{type} == BPC_FTYPE_DIR ) { # # Directory: just write the header # $hdr->{name} .= "/" if ( $hdr->{name} !~ m{/$} ); from_to($hdr->{name}, "utf8", $Charset) if ( $Charset ne "" ); $zipmember = Archive::Zip::Member->newDirectoryNamed($hdr->{name}); $DirCnt++; } elsif ( $hdr->{type} == BPC_FTYPE_FILE ) { # # Regular file: write the header and file # from_to($hdr->{name}, "utf8", $Charset) if ( $Charset ne "" ); $zipmember = BackupPC::Zip::FileMember->newFromFileNamed( $hdr->{fullPath}, $hdr->{name}, $hdr->{size}, $hdr->{compress} ); $FileCnt++; $ByteCnt += $hdr->{size}; } elsif ( $hdr->{type} == BPC_FTYPE_HARDLINK ) { # # Hardlink file: not supported by Zip, so just make a copy # of the pointed-to file. # # Start by reading the contents of the link. # my $f = BackupPC::FileZIO->open($hdr->{fullPath}, 0, $hdr->{compress}); if ( !defined($f) ) { print(STDERR "Unable to open file $hdr->{fullPath}\n"); $ErrorCnt++; return; } my $data; while ( $f->read(\$data, $BufSize) > 0 ) { $hdr->{linkname} .= $data; } $f->close; # # Dump the original file. Just call the top-level # routine, so that we save the hassle of dealing with # mangling, merging and attributes. # archiveWrite($zipfh, $hdr->{linkname}, $hdr->{name}); } elsif ( $hdr->{type} == BPC_FTYPE_SYMLINK ) { # # Symlinks can't be Zipped. 8( # We could zip the pointed-to dir/file (just like hardlink), but we # have to avoid the infinite-loop case of a symlink pointed to a # directory above us. Ignore for now. Could be a comand-line # option later. # $SpecialCnt++; } elsif ( $hdr->{type} == BPC_FTYPE_CHARDEV || $hdr->{type} == BPC_FTYPE_BLOCKDEV || $hdr->{type} == BPC_FTYPE_FIFO ) { # # Special files can't be Zipped. 8( # $SpecialCnt++; } else { print(STDERR "Got unknown type $hdr->{type} for $hdr->{name}\n"); $ErrorCnt++; } return if ( !$zipmember ); # # Set the attributes and permissions. The standard zip file # header cannot handle dates prior to 1/1/1980, or 315561600 # unix seconds, so we round up the mtime. # my $mtime = $hdr->{mtime}; $mtime = 315561600 if ( $mtime < 315561600 ); $zipmember->setLastModFileDateTimeFromUnix($mtime); $zipmember->unixFileAttributes($hdr->{mode}); # Zip files don't accept uid and gid, so we put them in the comment field. $zipmember->fileComment("uid=".$hdr->{uid}." gid=".$hdr->{gid}) if ( $hdr->{uid} || $hdr->{gid} ); # Specify the compression level for this member $zipmember->desiredCompressionLevel($compLevel) if ($compLevel =~ /[0-9]/); # Finally Zip the member $zipfh->addMember($zipmember); }
|
Вот ман как нужно сделать - Код | BackupPC_zipCreate creates a zip file for any files or directories in a particular backup. Merging of incrementals is done automatically, so you don't need to worry about whether certain files appear in the incremental or full backup.
The usage is:
BackupPC_zipCreate [options] files/directories... Required options: -h host host from which the zip archive is created -n dumpNum dump number from which the tar archive is created A negative number means relative to the end (eg -1 means the most recent dump, -2 2nd most recent etc). -s shareName share name from which the zip archive is created Other options: -t print summary totals -r pathRemove path prefix that will be replaced with pathAdd -p pathAdd new path prefix -c level compression level (default is 0, no compression) -e charset charset for encoding file names (default: cp1252)
The command-line files and directories are relative to the specified shareName. The zip file is written to stdout. The -h, -n and -s options specify which dump is used to generate the zip archive. The -r and -p options can be used to relocate the paths in the zip archive so extracted files can be placed in a location different from their original location.
Each of these programs reside in __INSTALLDIR__/bin.
|
Как делаю я: Код | BackupPC_zipCreate -t -h backserver -n 110 -s /home/restore/ -r / -p home/restore/249/ . > /home/restore/249.tar
|
На это мне система отвечает: bad backup number 110 for host backserver. Может кто-нибудь подсказать как правильно надо делать?
|