restic version
restic 0.9.3 compiled with go1.11.1 on linux/amd64
有一个restic backup
选项表示“从所有备份文件的路径中去除这个前导路径”会很有帮助。 例如, --backup-root /some/path
。 这将产生以下影响:
/some/path/to/file
将作为/to/file
存储在快照中。/to/file
执行元数据检查。restic backup
。(我认为这可能与#1376有关。)
我们的备份脚本之一运行在具有许多无法停止的正在运行的服务的系统上。 这些服务保证可以从特定时间点进行恢复(例如,它们执行足够的日志记录以在断电后将数据恢复到一致状态)。 然而,静态备份不是原子的; 因此,静态备份破坏了服务的恢复保证。
为了解决这个问题,我们:
/
的 LVM 快照。 快照是整个卷的原子块级副本。/mnt/backup-snapshot
下挂载 LVM 快照。/mnt/backup-snapshot
运行静态备份。这使备份成为真正的时间点,并保证恢复的备份有效地处于一致状态。
不幸的是,这也会导致文件以(无用的)前缀/mnt/backup-snapshot
存储在我们的 restic 存储库中。 这会使恢复工作复杂化,而且如果您不知道备份创建方式的详细信息,也会有点混乱。
我能想到的唯一可行的解决方法是在 chroot 中运行备份。 虽然不是世界末日,但对于 restic 来说,提供一个从文件中删除一些前导前缀的选项可能会更好。
这是我发现的这个请求的旧化身:#555
+1
我也认为这将是一个非常有用的功能。
所以,让我总结一下:你正在运行restic backup /mnt/backup-snapshot
,所以文件/mnt/backup-snapshot/foo
/mnt/backup-snapshot/foo
在快照中是/foo
. 那是对的吗?
您可以通过更改当前目录来使用 restic > 0.9.0 实现这一点,只需运行cd /mnt/backup-snapshot
,然后运行restic backup .
。
那对你有用吗?
更改cwd
有效,但我注意到如果将文件用于包含/排除会产生令人不快的副作用。 似乎如果将绝对路径放在那里,那么在更改cwd
时它们将被跳过。 我也更愿意使用绝对路径 - 现在我可能会沿着 chroot 路径前进,但我同意在tar
类似于-C
标志的东西会更好.
我认为这个假的 root 选项将是一个有用的功能。 我很想像 cdhowie 一样,但在 macOS 上使用 apfs 快照。 要访问只读 apfs 快照,它们需要安装在某处。 但是当恢复时,我希望“原始”路径是存储在快照中的规范路径。
不幸的是,cd 技巧不是最佳的,因为我从 StdExclusions.plist(macOS 标准备份排除列表)收集了大量 (125) 绝对路径,并且 mdfind 可以使用 com_apple_backup_excludeItem 属性集找到所有文件和文件夹。
如果您将 /mnt 放入忽略文件并从 /mnt/fs-snapshot 开始备份,则会留下问题,它将排除自身。
加上 cd $path && restic backup 。 在快照概览中仍然给出 $path,而快照中的路径是基于 / 的。
我找到了一个使用 proot 的解决方法。
我还想找到一种删除路径前缀的方法。 我的用例略有不同 - 我正在创建一个 zfs 快照( fs@$(date +%s)
)并且想要备份它而不必安装它( /path/to/mount/.zfs/snapshots/${TS}
) - 这样希望我没有担心快照不会卸载,然后在崩溃的情况下永远挂在那里。
restic forget
输出让我认为不同路径的快照不会按照计划(每天/每周/等)被遗忘。
来自@blurayne的proot
评论是一个不错的起点,我想我得出了相同的结论:
$snap_path="/path/to/where/snapshot/is/accessible"
$orig_fs="/path/to/filesystem"
proot -b "${snap_path}":"${orig_fs}" restic backup "${orig_fs}"
这很好用,现在所有快照都具有相同的路径,不需要cd
或pushd
。 此外,proot 在用户空间中可用,所以如果备份不是以 root 身份完成的,它仍然是可能的。
我的用例:将数据库数据转储到临时目录中,例如 /tmp/tmpzmn28r02(通过 mktemp 或 python 的 mkdtemp() 获得),然后将其备份。
此方法会将 2 个快照之间的所有文件标记为不同。 所以我需要一种方法来告诉 restic 完全忽略临时目录前缀。
另一个可能的用例:今天我将所有图片放入“/mnt/something/pictures”但明天,相同的内容将位于“/mnt/external/pictures-from-home”下(不同的分区方案/无论如何)
此外,如果您想在同一次运行中使用 restic 和备份多个目录,为了使用相同的快照,这会变得更加复杂。
在修复完成之前,我将使用“proot”提案 - 谢谢@blurayne和@whi-tw
你好! 我有类似的情况。 例如我有文件夹
/srv/my/long/server1/path/data (with many subfolders and dozen of files)
/path/to/dump.sql
/path/certbot.tar.gz
所以我想得到备份
/data
/dump.sql
/certbot.tar.gz
并通过不同的路径(相对)在其他服务器上恢复(我不知道以前的文件夹结构)。
我没有解决这个微不足道的任务的想法。 Restic 是一个了不起的工具,但是......为什么它对最终用户来说如此困难?
我正在预定义的备份文件夹 (/backup) 中复制我需要的所有内容,并在那里运行 Restic 备份(通过 cd)。 但此解决方案仅适用于少量数据。
在模板(或包括此掩码)之后立即使用 --include 子文件夹恢复能力会很棒。 前任。:
restic restore --include data --target /my/new/path
并得到结果/my/new/path/data
感谢@whi-tw 提供proot -b /path/i/wanted:./path_in_repo restic backup .
解决方案 - 它对我有用。
我的用例是将快照从其他备份解决方案迁移到 Restic(在我的案例中为 Time Machine 和磁盘映像)。
我从我挂载图像的位置或由 TM 创建的快照的子目录迁移它们,这可能会变得很长,例如/Volumes/TimeMachine-Backups/Backups.backupdb/MacBook Pro/2019-05-22-185113/Macintosh SSD/
。
cd
解决方案在使用restic mount
和restic restore
,但是当我运行restic snapshots
时会列出原始快照的绝对路径。
由于它是一个迁移的快照,我希望它也是原始快照的获取路径。 除此之外,由于路径很长,它也使restic snapshots
的输出有点嘈杂。
设置替代前缀的标志对我来说也是理想的。
这很好用,现在所有快照都具有相同的路径,不需要
cd
或pushd
。 此外,proot 在用户空间中可用,所以如果备份不是以 root 身份完成的,它仍然是可能的。
这本来是一个不错的解决方法,但proot
在 macOS 上不可用,而且似乎不会很快出现(大多数代码专门针对 Linux 编写): PRoot 在 MacOSX 上工作吗?
有没有想到的另一种解决方法?
我的用例:将数据库数据转储到临时目录中,例如 /tmp/tmpzmn28r02(通过 mktemp 或 python 的 mkdtemp() 获得),然后将其备份。
此方法会将 2 个快照之间的所有文件标记为不同。
请注意,无论如何,这些文件可能_are_ 不同; 数据库备份通常在前几行包含时间戳。
您可以调整数据库转储命令以排除动态注释并按主键排序,但使缓慢变化的数据真正可重复使用
我试过proot
。 它似乎打破了以非 root 身份运行 restic 的能力,并具有附加功能(https://restic.readthedocs.io/en/stable/080_examples.html#full-backup-without-root); 至少我在没有proot
情况下运行 restic 时没有遇到scan: Open: open /.pulse: permission denied
错误。
bwrap
有同样的问题。
所以对我来说,在 restic 本身中剥离路径前缀似乎仍然有用。
这个缺失的功能使得备份虚拟机变得比需要的更难。
我的 VM 快照最终位于一个临时文件夹中,然后由 Restic 进行备份。
这导致以下结果:
ID Time Host Tags Paths
--------------------------------------------------------------------------------------
02c536db 2020-04-10 14:28:27 resolver-02 /tmp/tmp.vOFFxxly9O/config.xml
c5709aed 2020-04-10 14:28:29 resolver-02 /tmp/tmp.vOFFxxly9O/sdb.img
a88cc1e7 2020-04-10 14:36:22 resolver-02 /tmp/tmp.FoY1j5JPIZ/config.xml
7c44e6ee 2020-04-10 14:36:24 resolver-02 /tmp/tmp.FoY1j5JPIZ/sdb.img
65456111 2020-04-10 14:37:48 resolver-02 /tmp/tmp.vjtI9JE3Iz/config.xml
eaced756 2020-04-10 14:37:49 resolver-02 /tmp/tmp.vjtI9JE3Iz/sdb.img
8eccec2c 2020-04-10 16:04:30 resolver-02 /tmp/tmp.YtLYRd0rNI/config.xml
34c897e1 2020-04-10 16:04:31 resolver-02 /tmp/tmp.YtLYRd0rNI/sdb.img
99b67b97 2020-04-10 16:07:53 resolver-02 /tmp/tmp.aWaEDqAaTq/config.xml
cad2c9d8 2020-04-10 16:07:54 resolver-02 /tmp/tmp.aWaEDqAaTq/sdb.img
--------------------------------------------------------------------------------------
这会破坏restic forget
因为它无法识别出它是同一个文件并为每个实例保留一个快照。 如果有办法删除已知前缀或仅存储相对路径,而不是绝对路径,我更喜欢。
我已经在临时文件夹中使用相对路径和 ching 调用了 restic。 可悲的是没有帮助,我宁愿不必为此使用绑定安装。
这会破坏
restic forget
因为它无法识别出它是同一个文件并为每个实例保留一个快照。
我们也遇到了这个问题,但解决方案非常简单:根据要备份的文件标记每个备份。
例如,您可以在此处使用标签config.xml
和sdb.img
。 然后在运行restic forget
时添加--group-by host,tags
restic forget
。
是什么让这个功能如此难以实现? 它不是对快照元数据进行相同的基本字符串过滤吗? 它带来的价值是巨大的。 是的,您可以使用标记解决方法,但是有一个路径字段,它可能可用...
是什么让这个功能如此难以实现?
我自己作为开发人员说话(不是restic,而是其他开源项目):通常不是功能的复杂性阻止实现它,而是平凡的事情,比如缺乏时间、动力或仅仅是“现实生活”......
当然,我的目的不是挑剔,而是真正想为潜在贡献者绘制复杂性
大家好,我已经开始致力于实现这个“自定义根”功能。 实现本身看起来很简单,尽管我之前只知道 C# 必须学习 golang ......无论如何,我正在尝试衡量这个问题仍然有什么样的支持,因为这源于 2018 年,2 年前. 如果有人想帮助我使用 golang 😅,我将很快承诺https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix 。 希望不久之后,我会在这里提出拉取请求。
@TheRealVincentVanGogh我不打算学习 Go,但我仍然渴望这个功能并且有大量备份我仍然想移植到 restic 但对于这个问题。 一旦你有一些看起来可以工作的东西,打开一个 PR 并在这里发布链接,我会借一些重的测试
@TheRealVincentVanGogh您计划的实施与 PR #2010 有何关系?
@TheRealVincentVanGogh您计划的实施与 PR #2010 有何关系?
@MichaelEischer哦,拍! 看起来已经有人打败了我。 是的,PR #2010 正是我正在......重新完成......该死的。 也许@cdhowie可以将 PR #2010 与这个问题联系起来,以帮助避免未来的混淆? 谢谢!
@themightychris这是该PR的链接。 看起来 dev 也在 2018 年退学了……很好奇。
从快照文件 VS 中删除路径前缀之间似乎存在一些歧义。 从每个文件结构 + 快照文件中删除路径前缀。 看起来 PR #2010 只针对前者。 由于 OP 正在寻找“从所有备份文件的路径中去除此前导路径我必须收回我所说的将 PR #2010 链接到此问题的内容。 抱歉提到cdhowie!
尽管如此! @MichaelEischer我的意图一直是在
PS 我现在很忙,所以工作可能会有点慢; 当然,当我认为我有一些值得与大家分享的东西时,我会发布 PR! 大家注意安全! 😄
最有用的评论
大家好,我已经开始致力于实现这个“自定义根”功能。 实现本身看起来很简单,尽管我之前只知道 C# 必须学习 golang ......无论如何,我正在尝试衡量这个问题仍然有什么样的支持,因为这源于 2018 年,2 年前. 如果有人想帮助我使用 golang 😅,我将很快承诺https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix 。 希望不久之后,我会在这里提出拉取请求。