VZDump 包中的子程序代码在哪里?

Where is the code of subroutine in the VZDump package?

我正在尝试了解 I found on debian repository 的 VZDump 源代码。创建快照及其压缩正是我想要的。但是,我找不到创建它们的代码。

我在这里看到了:https://sources.debian.org/src/vzdump/1.2.6-5/VZDump.pm/#L913 is $plugin->snapshot being called so I expect, that this part of the code is where program goes to next: https://sources.debian.org/src/vzdump/1.2.6-5/Plugin.pm/#L119。但是有带有注释 # implement in subclass 的 die 命令,我找不到创建快照的实际过程在哪里或子类位于何处。

你能给我解释一下,这种情况下发生了什么吗?创建快照的代码位于何处?

创建快照的代码位于Line 277-306 of OpenVZ.pm. OpenVZ.pm is the subclass of Plugin.pm. snapshot() shells out to the lvcreate command for actually creating the snapshots. $self->cmd in snapshot() method calls Plugin's cmd() method, which calls run_command() in VZDump.pm, which calls open3 from IPC::Open3

在子class 上调用方法时,Perl 尝试首先调用派生方法。如果 subclass 中没有该名称的方法,那么它会调用 superclass 的方法。如果 class 没有方法,那么 Perl 会检查 superclass 的 superclass,等等。如果 Perl 到达基址 class 并且没有找到程序试图调用的方法,那么它会报错。因为OpenVZ.pm定义了一个snapshot方法,Plugin只调用die的snapshot方法是永远不会执行的。

OpenVZ.pm

的第 277-306 行
sub snapshot {
    my ($self, $task) = @_;

    my $opts = $self->{vzdump}->{opts};

    my $di = $task->{diskinfo};

    mkpath $di->{mountpoint}; # create mount point for lvm snapshot

    if (-b $di->{snapdev}) {
    $self->loginfo ("trying to remove stale snapshot '$di->{snapdev}'");
        
    $self->cmd_noerr ("umount $di->{mountpoint}");
        
    $self->cmd_noerr ("lvremove -f $di->{snapdev}");
    }

    $self->loginfo ("creating lvm snapshot of $di->{srcdev} ('$di->{snapdev}')");

    $task->{cleanup}->{lvm_snapshot} = 1;
    
    $self->cmd ("lvcreate --size $opts->{size}M --snapshot" .
        " --name $di->{snapname} /dev/$di->{lvmvg}/$di->{lvmlv}");

    my $mopts = $di->{fstype} eq 'xfs' ? "-o nouuid" : '';

    $task->{cleanup}->{snapshot_mount} = 1;

    $self->cmd ("mount -t $di->{fstype} $mopts $di->{snapdev} $di->{mountpoint}");
}