[pve-devel] [RFC pve-container 5/6] vzdump: lxc find/mp update 2: archive

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Sep 15 10:07:21 CEST 2015


To void at least some weird quoting issues, and since tar
has a --one-file-system option, always skips sockets and
also supports exclusion by pattern we now simply use tar
directly instead of passing files listed by 'find'.
---
 src/PVE/VZDump/LXC.pm | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm
index 047f998..83e2ab7 100644
--- a/src/PVE/VZDump/LXC.pm
+++ b/src/PVE/VZDump/LXC.pm
@@ -263,16 +263,11 @@ sub archive {
 	$task->{snapdir} = $rootdir;
     }
 
-    my $findexcl = $self->{vzdump}->{findexcl};
-    push @$findexcl, "'('", '-path', "./etc/vzdump", "-prune", "')'", '-o';
-
-    my $findargs = join (' ', @$findexcl) . ' -print0';
     my $opts = $self->{vzdump}->{opts};
-
     my $snapdir = $task->{snapdir};
     my $tmpdir = $task->{tmpdir};
 
-    my $taropts = "--totals --sparse --numeric-owner --no-recursion --xattrs --one-file-system";
+    my $taropts = "--totals --sparse --numeric-owner --xattrs --one-file-system";
 
     # note: --remove-files does not work because we do not 
     # backup all files (filters). tar complains:
@@ -282,25 +277,31 @@ sub archive {
     #       $taropts .= " --remove-files"; # try to save space
     #}
 
-    my $cmd = "(";
-
-    $cmd .= "cd $snapdir;find . $findargs|sed 's/\\\\/\\\\\\\\/g'|";
-    $cmd .= "tar cpf - $taropts ";
+    my $cmd = "tar cpf - $taropts ";
     # The directory parameter can give a alternative directory as source.
     # the second parameter gives the structure in the tar.
     $cmd .= "--directory=$tmpdir ./etc/vzdump/pct.conf ";
-    $cmd .= "--directory=$snapdir --null -T -";
+    $cmd .= "--directory=$snapdir";
+
+    foreach my $exclude (@{$self->{vzdump}->{findexcl}}) {
+	$cmd .= " --exclude=.$exclude";
+    }
+
+    # add every enabled mountpoint (since we use --one-file-system)
+    my $disks = $task->{disks};
+    # mp already starts with a / so we only need to add the dot
+    foreach my $disk (@$disks) {
+	$cmd .= " .$disk->{mp}";
+    }
 
     my $bwl = $opts->{bwlimit}*1024; # bandwidth limit for cstream
     $cmd .= "|cstream -t $bwl" if $opts->{bwlimit};
     $cmd .= "|$comp" if $comp;
 
-    $cmd .= ")";
-
     if ($opts->{stdout}) {
 	$self->cmd ($cmd, output => ">&" . fileno($opts->{stdout}));
     } else {
-	$self->cmd ("$cmd >$filename");
+	$self->cmd ("$cmd >" . PVE::Tools::shellquote($filename));
     }
 }
 
-- 
2.1.4




More information about the pve-devel mailing list