KOPIA 开启影子备份以及 SUPERMEMO 18 的数据修护方法

色彩科学/间隔学习

25 👍 / 24 💬

2024.04.18 根据评论区提示,目前kopia已经内置影子备份。只需要

kopia policy set D:\Applications\sm18 --enable-volume-shadow-copy when-availables

就可以在需要时启用。D:\Applications\sm18 替换成自己的目录。
本文写于 2022 年,影子备份部分已经不再是优秀方案了。

感谢@向晚Ava 提示。一切荣耀归于水流一般生生不息的群众。

一、Supermemo 的影子备份 Issues implementing documented VSS snapshots with actions · Issue #1456 · kopia/kopia一、Supermemo 的影子备份

叶峻峣:SuperMemo 自动备份

你们的叶哥哥之前有一篇详尽的文章是讲 SM 的自动备份的,但这家伙没说自己是在 MAC 上开虚拟机跑 SM 的。差异在于真实的 windows 环境下, supermemo 一开,它的文件就不可复制不可备份了。症状是出现如下红色感叹号:

万恶的 windows 给出的解决办法叫 vss(Volume Snapshot Service 或者说“影子拷贝”)

Kopia 的官方文档中提到,并给出了备份时的使用方法:

kopia.io/docs/advanced/...

步骤如下:

1、首先确保你的 powershell 是可用的,其次找到 KopiaUI\resources\server\kopia.exe

2、原地新建如下三个文件,

并分别复制粘贴如下内容:

after.ps1:

if ($args.Length -eq 0) {
    $kopiaSnapshotId = $env:KOPIA_SNAPSHOT_ID
} else {
    $kopiaSnapshotId = $args[0]
}

if (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    $mountPoint = Get-Item "${PSScriptRoot}\${kopiaSnapshotId}"
    $mountedVolume = $mountPoint.Target

    cmd /c rmdir $mountPoint
    Get-CimInstance -ClassName Win32_ShadowCopy | Where-Object { "$($_.DeviceObject)\" -eq "\\?\${mountedVolume}" } | Remove-CimInstance
} else {
    Start-Process 'powershell' '-f', $MyInvocation.MyCommand.Path, $kopiaSnapshotId -Verb RunAs -WindowStyle Hidden -Wait
    if ($proc.ExitCode) {
        exit $proc.ExitCode
    }
}

before.ps1

if ($args.Length -eq 0) {
    $kopiaSnapshotId = $env:KOPIA_SNAPSHOT_ID
    $kopiaSourcePath = $env:KOPIA_SOURCE_PATH
} else {
    $kopiaSnapshotId = $args[0]
    $kopiaSourcePath = $args[1]
}

$sourceDrive = Split-Path -Qualifier $kopiaSourcePath
$sourcePath = Split-Path -NoQualifier $kopiaSourcePath
# use Kopia snapshot ID as mount point name for extra caution for duplication
$mountPoint = "${PSScriptRoot}\${kopiaSnapshotId}"

if (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    $shadowId = (Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{ Volume = "${sourceDrive}\" }).ShadowID
    $shadowDevice = (Get-CimInstance -ClassName Win32_ShadowCopy | Where-Object { $_.ID -eq $shadowId }).DeviceObject
    if (-not $shadowDevice) {
        # fail the Kopia snapshot early if shadow copy was not created
        exit 1
    }

    cmd /c mklink /d $mountPoint "${shadowDevice}\"
} else {
    $proc = Start-Process 'powershell' '-f', $MyInvocation.MyCommand.Path, $kopiaSnapshotId, $kopiaSourcePath -PassThru -Verb RunAs -WindowStyle Hidden -Wait
    if ($proc.ExitCode) {
        exit $proc.ExitCode
    }
}

Write-Output "KOPIA_SNAPSHOT_PATH=${mountPoint}${sourcePath}"

installaction.bat

kopia policy set C:\ra2\SuperMemo --before-folder-action "powershell -WindowStyle Hidden AABB\before.ps1"
kopia policy set C:\ra2\SuperMemo --after-folder-action  "powershell -WindowStyle Hidden AABB\after.ps1"
pause

3、现在,将 installaction.bat 中的C:\ra2\supermemo 替换成 你的仓库地址,保证和 Kopia UI 上的仓库地址一致,并将上面的“AABB”替换成 kopia.exe 所在的路径。

4、运行 installaction.bat

稍微验证一下:

a- 打开Kopia UI,并进入 Policies\Edit

检查 Json 是否类似如下:

b-打开supermemo,一边刷一边等,看看它有没有出现红色感叹号。

因为万恶的权限问题,到这一步时仍然不一定确保能达成目的,但会比之前好一些。过两天再更。

心急的可以看 github.com/kopia/kopia/...

二、Supermemo的数据检查和修复

既然谈了备份,顺便说说sm的数据安全性。它在数据方面 bug 有不少,因此没事儿最好 repair 一下

时机:sm 长时间开启,或者大范围的编辑后

方法如下:

1、ctrl+F12 打开修复界面并点 Detailed,这一项会打开所有修复相关的功能(除了 lexicon )

2、点击 OK

3、等。

结束后会自动弹出日志,你可以检查它做了哪些事情。

最下方可以看到它检查出了几个 Error,比如此时我的 sm 数据库有 2 个错误,并尝试进行了修复。

如果有 Error 的话,二话不说,再跑一趟,检查它有没有自动修复成功。

第二遍后若没有 Error 那岁月静好,但我二跑的结果仍有一个是无法自修的,需要手动修复

手动拖到最上方,找到以 “+++++++ ERROR #1 ++++++ ”分界的点,然后从上往下检查问题所在。

手动修复我也不太会。检查了一下,不明白它在干嘛,所以我们干脆去抓水母吧


专栏:SuperMemo—渐进学习最前沿!