我正在嘗試了解我在 debian 存盤庫中找到的 VZDump 的源代碼。創建快照及其壓縮正是我想要的。但是,我找不到創建它們的代碼。
我在這里看到:https ://sources.debian.org/src/vzdump/1.2.6-5/VZDump.pm/#L913 正在$plugin->snapshot被呼叫,所以我希望這部分代碼是程式接下來要執行的地方:https ://sources.debian.org/src/vzdump/1.2.6-5/Plugin.pm/#L119 。但是有帶有注釋的 die 命令,# implement in subclass我找不到創建快照的實際程序或子類的位置。
您能否向我解釋一下,在這種情況下發生了什么?創建快照的代碼在哪里?
uj5u.com熱心網友回復:
創建快照的代碼位于OpenVZ.pm 的第 277-306 行。OpenVZ.pm 是 Plugin.pm 的子類。snapshot()殼出lvcreate實際創建快照的命令。$self->cmdinsnapshot()方法呼叫 Plugin 的cmd()方法,該方法呼叫run_command()VZDump.pm,它從IPC::Open3 呼叫 open3。
當呼叫子類的方法時,Perl 會首先嘗試呼叫派生方法。如果子類中沒有同名的方法,則呼叫超類的方法。如果那個類沒有方法,那么 Perl 就會檢查超類的超類,以此類推。如果 Perl 到達基類并且沒有找到程式試圖呼叫的方法,那么它會給出一個錯誤。因為OpenVZ.pm定義了一個snapshot方法,所以Plugin的snapshot方法只是呼叫了die就永遠不會執行。
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}");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464654.html
