]> git.proxmox.com Git - pve-container.git/commitdiff
fix #1808: readonly mount source disk
authorDavid Limbeck <d.limbeck@proxmox.com>
Tue, 30 Oct 2018 12:06:38 +0000 (13:06 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Fri, 9 Nov 2018 13:10:55 +0000 (14:10 +0100)
Always readonly mount the source disk so a full clone still works with
an immutable base disk. Applies to every disk copy.

Signed-off-by: David Limbeck <d.limbeck@proxmox.com>
src/PVE/LXC.pm

index 0f2aa5cf0c9cdd552a0f5b05e2a345ff2a098e2b..1e47faf7461fc8078439271515d9ea7a19eef39e 100644 (file)
@@ -1200,7 +1200,7 @@ sub query_loopdev {
 # The loop device is always detached afterwards (or set to autoclear).
 # Returns the loop device.
 sub run_with_loopdev {
-    my ($func, $file) = @_;
+    my ($func, $file, $readonly) = @_;
     my $device = query_loopdev($file);
     # Try to reuse an existing device
     if ($device) {
@@ -1216,7 +1216,14 @@ sub run_with_loopdev {
            $device = $1;
        }
     };
-    PVE::Tools::run_command(['losetup', '--show', '-f', $file], outfunc => $parser);
+    my $losetup_cmd = [
+       'losetup',
+       '--show',
+       '-f',
+       $file,
+    ];
+    push @$losetup_cmd, '-r' if $readonly;
+    PVE::Tools::run_command($losetup_cmd, outfunc => $parser);
     die "failed to setup loop device for $file\n" if !$device;
     eval { &$func($device); };
     my $err = $@;
@@ -1462,7 +1469,7 @@ sub mountpoint_mount {
            };
            my $use_loopdev = 0;
            if ($scfg->{path}) {
-               $mounted_dev = run_with_loopdev($domount, $path);
+               $mounted_dev = run_with_loopdev($domount, $path, $readonly);
                $use_loopdev = 1;
            } elsif ($scfg->{type} eq 'drbd' || $scfg->{type} eq 'lvm' ||
                     $scfg->{type} eq 'rbd' || $scfg->{type} eq 'lvmthin') {
@@ -1825,10 +1832,10 @@ sub run_unshared {
 my $copy_volume = sub {
     my ($src_volid, $src, $dst_volid, $dest, $storage_cfg, $snapname) = @_;
 
-    my $src_mp = { volume => $src_volid, mp => '/' };
+    my $src_mp = { volume => $src_volid, mp => '/', ro => 1 };
     $src_mp->{type} = PVE::LXC::Config->classify_mountpoint($src_volid);
 
-    my $dst_mp = { volume => $dst_volid, mp => '/' };
+    my $dst_mp = { volume => $dst_volid, mp => '/', ro => 0 };
     $dst_mp->{type} = PVE::LXC::Config->classify_mountpoint($dst_volid);
 
     my @mounted;