如何用脚本自动恢复系统快照?

wen 实用脚本 2

本文目录导读:

如何用脚本自动恢复系统快照?

  1. 使用 Time Machine(macOS)
  2. 使用 Windows 系统还原点(Windows)
  3. 使用 Linux LVM 快照(推荐)
  4. 使用 ZFS 快照(FreeBSD/Linux)
  5. 使用虚拟化快照(VMware/VirtualBox)
  6. 使用磁盘镜像备份(dd / Clonezilla)
  7. 通用建议(安全第一)

要自动恢复系统快照,需要根据你使用的操作系统和快照工具来选择不同的脚本方案,以下列出最常见的几种场景及对应的自动化脚本方法:

使用 Time Machine(macOS)

macOS 的 tmutil 命令行工具可以恢复快照,但无法直接通过脚本触发“恢复整个系统”(恢复系统需重启进入恢复模式),你可以自动恢复单个文件或文件夹

#!/bin/bash
# 恢复 ~/Documents 目录到最新快照
tmutil restore /Volumes/BackupDrive/Backups.backupdb/MacName/Latest/Documents ~/Documents

注意:恢复整个系统盘需进入 Recovery Mode 后手动操作,无法完全自动化。

使用 Windows 系统还原点(Windows)

Windows 支持通过 powershellwmic 恢复系统还原点,但需要管理员权限,且会重启电脑。

脚本(PowerShell):

# 以管理员身份运行
$restorePoint = Get-ComputerRestorePoint | Sort-Object CreationTime -Descending | Select-Object -First 1
if ($restorePoint) {
    Restore-Computer -RestorePoint $restorePoint.SequenceNumber -Restart
}

或使用旧版 wmic:

wmic.exe /namespace:\\root\default path SystemRestore call CreateRestorePoint "AutoRestore", 100, 12
wmic.exe /namespace:\\root\default path SystemRestore call Restore "%SystemDrive%\System Volume Information\_restore{...}\RP1\snapshot\registry"

注意:恢复完成后系统自动重启,用户需确认恢复操作(交互式弹窗无法完全绕过安全策略)。

使用 Linux LVM 快照(推荐)

如果系统使用 LVM(逻辑卷管理),可以自动从快照恢复:

#!/bin/bash
# 恢复根目录逻辑卷到快照
lvconvert --merge /dev/vg_main/root_snapshot
# 恢复到快照时的状态(需重启)
reboot

注意:此操作会删除当前数据并恢复快照点,执行前需确保快照存在且未过期。

使用 ZFS 快照(FreeBSD/Linux)

ZFS 文件系统支持极其简单的快照恢复:

#!/bin/bash
# 回滚到快照
zfs rollback -r zpool/data@autobackup_2024-01-01
# -r 表示同时删除该快照之后的更多新快照(可选)

注意:ZFS 回滚是原子的,但会丢失回滚点之后的所有数据,需谨慎。

使用虚拟化快照(VMware/VirtualBox)

如果你在虚拟机中运行系统,可以通过宿主机脚本自动恢复快照:

VMware CLI(vmrun):

#!/bin/bash
VM_PATH="/path/to/your.vmx"
SNAPSHOT_NAME="clean_state"
vmrun revertToSnapshot "$VM_PATH" "$SNAPSHOT_NAME"
# 然后启动虚拟机
vmrun start "$VM_PATH"

VirtualBox(VBoxManage):

#!/bin/bash
VM_NAME="YourVM"
SNAPSHOT_NAME="BaseInstall"
VBoxManage snapshot "$VM_NAME" restore "$SNAPSHOT_NAME"
# 然后启动
VBoxManage startvm "$VM_NAME" --type headless

使用磁盘镜像备份(dd / Clonezilla)

如果快照是完整的磁盘镜像(如 .img 文件),可以用 dd 恢复:

#!/bin/bash
# 警告:会完全覆盖目标磁盘
dd if=/path/to/snapshot.img of=/dev/sda bs=4M status=progress
sync
reboot

注意:这是最暴力的方法,目标磁盘必须与快照完全一致(包括分区表)。


通用建议(安全第一)

  • 不要在生产环境自动执行:恢复快照通常会丢失当前所有未保存数据。
  • 添加安全检查:例如确认当前时间、磁盘空间、快照是否存在等。
  • 记录日志:将脚本输出重定向到日志文件便于回溯。
  • 条件触发:只有特定错误或维护窗口才执行,
#!/bin/bash
if [ "$(date +%H)" -eq "03" ] && [ "$(uptime -s | cut -d' ' -f1)" != "2024-01-01" ]; then
    # 凌晨3点执行,且仅在不是今天已恢复过的情况下
    lvconvert --merge /dev/vg_main/root_snapshot && reboot
fi

如果需要更具体的脚本(明确的操作系统和快照类型),请补充说明后我可以帮你定制。

抱歉,评论功能暂时关闭!