跳到主要内容

RestorePlanner Trait

RestorePlanner trait 从备份流或镜像文件恢复卷。实现可能使用基于流的接收(Btrfs receive、ZFS receive)或块级别写入(LVM、VSS)。破坏性后端需要计划中的 force: true。

Trait 定义​

pub trait RestorePlanner: Backend {
/// 根据给定计划执行恢复。
fn restore_volume(&self, plan: &RestorePlan) -> Result<()>;
}

关键类型​

RestorePlan​

恢复操作的完整规格:

pub struct RestorePlan {
pub source: BackupTarget, // 从哪里读取备份
pub destination: VolumeRef, // 要恢复到的目标卷
pub force: bool, // 允许破坏性覆盖
pub base_snapshot: Option<SnapshotRef>, // 增量恢复的基础
pub block_size: Option<usize>, // I/O 块大小(None = 4 MiB)
}

Force 标志​

块级别后端(LVM、VSS)用备份内容覆盖目标卷。这是破坏性的 -- 目标上的所有现有数据都会丢失。为防止意外数据丢失,这些后端检查 force 并在为 false 时返回 InvalidArgument 错误。

基于流的后端(Btrfs receive、ZFS receive)创建新子卷或数据集,不需要 force。

后端类型需要 force行为
Btrfs否从流创建新子卷
ZFS否从流创建新数据集
LVM是用块覆盖逻辑卷
VSS(Windows)是向目标卷写入块

使用示例​

use vpt_rs::{RestorePlanner, RestorePlan, BackupTarget, VolumeRef};
use std::path::PathBuf;

// 流式恢复(Btrfs)
let plan = RestorePlan {
source: BackupTarget::ImageFile(PathBuf::from("/backup/data.img")),
destination: VolumeRef::new("/mnt/restored"),
force: false,
base_snapshot: None,
block_size: None,
};
backend.restore_volume(&plan)?;

// 破坏性恢复(LVM,需要 force)
let plan = RestorePlan {
source: BackupTarget::ImageFile(PathBuf::from("/backup/data.img")),
destination: VolumeRef::new("/dev/vg0/data"),
force: true,
base_snapshot: None,
block_size: None,
};
backend.restore_volume(&plan)?;