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 的影子备份
你们的叶哥哥之前有一篇详尽的文章是讲 SM 的自动备份的,但这家伙没说自己是在 MAC 上开虚拟机跑 SM 的。差异在于真实的 windows 环境下, supermemo 一开,它的文件就不可复制不可备份了。症状是出现如下红色感叹号:
万恶的 windows 给出的解决办法叫 vss(Volume Snapshot Service 或者说“影子拷贝”)
Kopia 的官方文档中提到,并给出了备份时的使用方法:
步骤如下:
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 ++++++ ”分界的点,然后从上往下检查问题所在。
手动修复我也不太会。检查了一下,不明白它在干嘛,所以我们干脆去抓水母吧