我使用的是 24/7 运行的树莓派,并创建了一个 crontask,定期将完整的 SD 卡备份到我的 NAS。我通过将其复制回 SD 卡来检查这样的备份,效果非常好。到目前为止,一切都很好。尽管如此,我还是很担心。由于这样的备份需要在我的网络上花费数小时,因此对我来说显然这不是某个特定时刻的快照,而是来自不同时刻的文件的混合,因为卡上的某些数据在复制时被修改。例如,如果安装了数据库或其他正在运行的软件会定期更改某些文件的内容。甚至更改系统文件。我可以想象,这可能会在备份副本中造成不一致,根据我的看法,在最坏的情况下,可能会创建无法用于恢复的损坏备份。在最坏的情况下,它甚至可能在恢复后无法启动...这是一个真正的风险还是我误解了这个 dd 命令的工作方式?
答案1
您强调了一个真正的风险。如果您正在复制实时文件系统的底层结构,则无法保证您复制的内容可用。
即使在文件系统中副本安装成功并且看起来不错,您也无法保证您复制的块对应于为特定文件分配的块。 (您可能有一个文件的目录条目,其大小似乎为 x MB,但其分配的块内只有不完整的数据。)
这可以作为从 SD 卡的开头到结尾进行串行复制的示例来显示。大约在备份过程中,考虑为新文件创建一个目录条目,并将文件的内容写入磁盘。元数据可能会被捕获,因为它被写入物理上位于 SD 卡末尾的目录中,因此该文件似乎存在于备份中。但是,文件内容可能已写入您已处理过的磁盘的较早部分,因此请勿将其放入备份中。
不要这样做。
最好的选择是复制快照(请参阅 LVM、可快照文件系统和商业软件)。
次佳方法是执行基于文件的备份(请参阅rsync
和rsnapshot
);这仍然受到竞争条件的影响,其中两个或多个文件最终可能在备份中不同步,因此不适合连续更改的文件(例如数据库的文件),但大多数文件都会成功且正确地复制。如果您需要在这种情况下备份数据库,请考虑使用本机数据库备份工具,然后使用rsync
/rsnapshot
复制生成的备份文件。您还需要单独并显式地复制磁盘分区表和非文件系统分区,例如启动过程中涉及的分区(dd
如果您谨慎处理,可以成为您的朋友)。
答案2
您的假设是正确的:如果您只是使用 dd 拍摄快照,则生成的保存数据可能会不一致。此外,从 SD 卡读取时可能会出现错误,以及传输错误(这种情况很少见但有可能)。
您可以尝试停止所有写入守护进程/应用程序,重新挂载所有文件系统 RO,然后制作 dd 快照 - 这将保证数据一致性,但不会防止读取/传输错误。
为了最大程度的安全:
- 创建一个单独的分区来备份数据。
- 备份两次并比较哈希值 - 它们必须匹配。
- 使用 par2 备份数据并在创建时验证 par2 卷。
答案3
是的,用于dd
备份已安装文件系统存在一定的风险。正如这里的其他人所说,“如果你幸运的话,你会在备份后很快发现问题;如果你不幸的话,你会在很晚之后才发现它们。”
我认为您没有使用正确的工具来完成这项工作。既然你有一个 Raspberry Pi(并且如果您正在运行 RPi OS Buster),您可以使用image-utils
.它使用rsync
而不是dd
,因此文件损坏的风险非常低。它还创建了一个图像rufus
文件作为备份 - 使用或轻松闪存到 SD 卡etcher
,并且比创建的映像文件小得多dd
。
您可以选择更新现有映像备份或创建新映像备份。无论哪种情况,备份都很快 - 在我的 RPi 上,“完整”备份大约需要 15 分钟。
image-utils
是可以在这里下载在 Raspberry Pi 组织的论坛中。作者在同一位置提供支持,而且似乎很受欢迎。我没有任何隶属关系,但我确实发现它非常有用。
编辑@2021-06-07
这个问题已被宣布为复制,也许这是从 Linux & Unix 的总体角度来看的准确评估。但是,我想提请注意这样一个事实:有(至少一个)有效的备份解决方案独特地使用 Raspberry Pi 操作系统:image-utils
。
提出了有关备份的各种问题树莓派SE有时,对于那些在寻找解决方案时来到这里的人来说,有一个更详细那里有答案。