DD 复制在终端上有效,但不通过 cron 进行

DD 复制在终端上有效,但不通过 cron 进行

在 RHEL5.4 系统上,我设置了一个脚本,每晚通过 cron 使用 dd 副本备份驱动器。我将 dd 输出吐出到日志文件和电子邮件中。它位于 /etc/crontab 和 /var/spool/cron/root 中,但我发现它甚至无法在 cron 下运行。

该脚本应该将 /dev/sda 复制到 /mnt/backup/sda.img(/mnt/backup 是已安装的 250gb 外部设备)。

当我在终端以 root 身份运行它时,它运行良好,我可以看到数据被写入磁盘并且 sda.img 变得越来越大。

但是,当以 cron 方式运行时,我从 dd 获得输出,表明它复制了 147gb,但找不到它将这 147gb 复制到哪里 - 它没有将其放在 sda.img 中。它不在文件系统的任何地方,因为上面只剩下 50gb。

它去哪儿了?我如何确保在 cron 中发生与在终端中发生的相同的事情。

我确实在备份之前和之后停止并启动了 crond,但是我的印象是 cron 启动了该作业,我将其关闭,它会备份,重新启动并继续正常运行。

谢谢。

编辑:抱歉,dd 行是
dd if=/dev/sda of=/mnt/backup/sda.img bs=400K

并且 cron 行是
01 0 * * * 2-6 /root/applog_backup.sh

当使用
mount -o loop,offset=32256 sda.img /mnt/restore时,我可以访问这些文件

我关闭了 cron,以防止每小时的作业在备份期间修改磁盘。我还关闭了其他服务和生产数据库,以尽量减少重要位置的磁盘写入。

答案1

您的“备份”脚本由 cron 执行……并且您在脚本中关闭了 cron,以防止 cron 作业在“备份”期间运行。您真的看不出问题出在哪里吗?您的脚本关闭了 crond,但 crond 正在运行您的脚本,因此,关闭 crond 将关闭连接到您的脚本的描述符,然后该脚本将因管道损坏或 crond 本身发出的中断信号而死亡。

由于脚本死了,crond 不会再重新启动。这就是我们所说的“搬起石头砸自己的脚”。

即使重新启动 crond,它也不会记录该作业已完成,因为它在执行期间被关闭和/或必须发出终止信号。无论是 crond 本身还是 anacron(取决于您使用的 cron 调度程序),它都必须再次运行该作业,可能会陷入无限循环。

您的问题很好地说明了如果您没有可靠性管理和灾难恢复方面的实际经验,那么发明自己的“备份”解决方案是错误的。更糟糕的是,您缺乏对系统如何运作的了解。

首先,也是最重要的,您没有在实时文件系统上进行原始磁盘转储文件系统的发明是为了让您不直接接触原始磁盘内容。您想保存存储在文件系统中的文件,这对您来说很重要。因此您必须访问它们通过文件系统,而不是存储在磁盘上的原始字节。如果分区已安装,则绝对不能保证您的数据确实存储在磁盘上,也不能保证磁盘在复制期间保持一致状态。

即使您可以以可恢复的方式对磁盘状态进行快照(例如突然断电,使用 ext3 等日志文件系统可以快速恢复),但热磁盘转储永远无法做到这一点。磁盘转储需要很长时间才能完成,转储开始和结束之间实际上有无限的中间状态,并且转储将包含这些状态的混合,即使使用日志文件系统也可能无法恢复。

我还没有提及原始磁盘转储备份的所有其他错误:

  • 已用空间和可用空间没有区别。无论您有一个 100 kB 的文件还是数万个文件中的 250 GB,所有内容都会被复制。这是非常低效的。只有在您需要磁盘的相同克隆时才使用此方法,并且磁盘未挂载
  • 您无法进行差异或增量备份。所有备份都必须是完整备份。各种低效率:
    1. 由于这会占用大量空间,因此您通常只会保留所有数据的一份副本。如果您的文件在备份之前被损坏或删除而您没有注意到,则损坏或删除的数据将覆盖之前的备份,从而使其变得毫无用处。
    2. 由于您是在以前的数据上执行此操作,如果您的系统在转储过程中发生故障(由于您要复制整个磁盘,因此需要更长的时间),则您的原始系统备份在一次射击中就丢失了。
    3. 如果自上次备份以来有 100 kB 的数据发生变化,您仍将转储整个磁盘。就您而言,这至少一百万次效率较低。
  • 您无法将此转储恢复到具有不同几何结构的磁盘。如果您的替换磁盘较小,则无需讨论;如果您的替换磁盘较大,您可能能够恢复丢失的额外空间或对分区表和分区超级块进行一些手动(对于初学者来说很危险)更改。您想将您的文件、您的工作托付给这样的黑客吗?
  • 即使您使用循环设备安装原始图像并手动复制文件......您最终手动复制了文件!那么你从原始磁盘转储中得到了什么?只需复制你的文件!

许多人都经历过灾难恢复,并且有很多经验可以分享。不要试图发明自己的备份解决方案,否则最终会把事情搞砸。使用适当的备份策略,例如倾倒柏油或者同步。如果您需要更强大的功能,请使用阿曼达或者巴库拉或者其他数百种可立即使用的解决方案之一。

这可能不是您所期望的答案,但必须说。

答案2

请不要使用它dd来备份您的物理卷,原因已在您的问题评论中说明。

至少,如果您想进行磁盘到磁盘备份,请使用类似的方法rsync(尽管这也存在问题),如果您无法让它工作,请回到这里cron

答案3

我怀疑您的 cron 行不正确。请使用以下条目编辑您的 crontab 文件:

1 0 * * 2-6 /root/applog_backup.sh

如果这解决了您的问题,请告诉我。

答案4

我建议你花点时间研究一下 Bacula 产品。它是开源的(免费!),而且功能强大。设置起来很复杂,但一旦你开始使用,你就再也不用担心备份了。

相关内容