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}");
}
我正在尝试了解 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}");
}