Skip to content

Повреждение дисков виртуальной машины при миграции в Proxmox, часть 2

Первоначально я решил проблему простым патчем:

--- /usr/share/perl5/PVE/Storage/LVMPlugin.pm.bak       2018-12-14 14:21:48.000000000 +0300
+++ /usr/share/perl5/PVE/Storage/LVMPlugin.pm   2019-01-10 12:35:44.665242759 +0300
@@ -601,7 +601,7 @@
        }
        my $file = $class->path($scfg, $volname, $storeid)
            or die "internal error: failed to get path to newly allocated volume $volname\n";
-       run_command(['dd', "of=$file", 'conv=sparse', 'bs=64k'],
+       run_command(['dd', "of=$file", 'bs=64k'],
                    input => '<&'.fileno($fh));
     };
     if (my $err = $@) {

Но оказалось, что патч не совсем корректный - исправляет LVM, но ломает LVM Thin. Так как LvmThinPlugin наследуется от LVMPlugin, он использует ту же командную строку для запуска dd. В результате удаления аргумента conv=sparse диск после миграции начинает занимать свой полный объем, становится не разреженным. Один из разработчиков предложил корректное исправление вот здесь: https://pve.proxmox.com/pipermail/pve-devel/2019-January/035313.html

 PVE/Storage/LVMPlugin.pm     | 10 ++++++++--
 PVE/Storage/LvmThinPlugin.pm |  7 +++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/PVE/Storage/LVMPlugin.pm b/PVE/Storage/LVMPlugin.pm
index 72d7464..9ad7979 100644
--- a/PVE/Storage/LVMPlugin.pm
+++ b/PVE/Storage/LVMPlugin.pm
@@ -620,8 +620,8 @@ sub volume_import {
     }
     my $file = $class->path($scfg, $volname, $storeid)
         or die "internal error: failed to get path to newly allocated volume $volname\n";
-    run_command(['dd', "of=$file", 'conv=sparse', 'bs=64k'],
-                input => '<&'.fileno($fh));
+
+    $class->volume_import_write($fh, $file);
     };
     if (my $err = $@) {
     eval { $class->free_image($storeid, $scfg, $volname, 0) };
@@ -630,4 +630,10 @@ sub volume_import {
     }
 }
 
+sub volume_import_write {
+    my ($class, $input_fh, $output_file) = @_;
+    run_command(['dd', "of=$output_file", 'bs=64k'],
+    input => '<&'.fileno($input_fh));
+}
+
 1;
diff --git a/PVE/Storage/LvmThinPlugin.pm b/PVE/Storage/LvmThinPlugin.pm
index 122fb37..aafc202 100644
--- a/PVE/Storage/LvmThinPlugin.pm
+++ b/PVE/Storage/LvmThinPlugin.pm
@@ -374,4 +374,11 @@ sub volume_has_feature {
     return undef;
 }
 
+# used in LVMPlugin->volume_import
+sub volume_import_write {
+    my ($class, $input_fh, $output_file) = @_;
+    run_command(['dd', "of=$output_file", 'conv=sparse', 'bs=64k'],
+    input => '<&'.fileno($input_fh));
+}
+
 1;
-- 
2.11.0