在RHEL5.4系统上,我设置了一个脚本来每天晚上用cron备份dd拷贝的驱动器。 我吐dd输出到日志文件和电子邮件。 它在/ etc / crontab和/ var / spool / cron / root中,当我发现它甚至不能在cron下运行。
该脚本应该将/ dev / sda复制到/mnt/backup/sda.img(/ mnt / backup是一个已安装的250GB外部)。
当我在terminal上以根用户身份运行它时,它可以正常工作,我可以看到数据正在写入磁盘,而sda.img也越来越大。
然而,当作为cron运行,我得到从dd的输出说它复制147GB,但无法find它吐在147GB的地方 – 它没有把它放在sda.img。 它不在文件系统上,因为剩下的只有50GB。
它去了哪里? 我怎样才能确保在terminal发生的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
我closures了cron,以防止在备份期间每小时的作业修改磁盘。 我还closures了其他服务和生产数据库,以尽量减less重要位置的磁盘写入。
你有你的“备份”脚本正在执行cron …并closurescron在脚本中,以防止cron作业在“备份”期间运行。 你真的不知道这里的问题在哪里? 你的脚本closures了crond,但是crond正在运行你的脚本,因此,closurescrond将closures连接到你的脚本的描述符,这些描述符会随着一个坏的pipe道或者来自crond本身的中断信号而死掉。
由于脚本死亡,crond将不会重新启动。 这就是我们所说的“徒步自杀”。
即使在重新启动crond之后,它也不会注册完成该作业,因为它在执行期间被closures,并且/或者不得不发信号通知其终止。 无论是crond本身还是anacron(取决于你正在使用的cron调度器),它将不得不再次运行这个工作,有可能进入一个无限循环。
如果您在可靠性pipe理和灾难恢复方面没有实际经验,那么您的问题就是发明自己的“备份”解决scheme时出现问题的一个很好的例子。 更糟糕的是,缺乏系统工作的知识。
首先,也是最重要的一点, 您不要在活动文件系统上创build原始磁盘转储 。 文件系统是为了不直接触摸原始磁盘内容而发明的。 你想保存文件系统中存储的文件,这对你来说很重要。 所以你必须通过文件系统访问它们,而不是磁盘上存储的原始字节。 如果安装了分区,则绝对不能保证数据实际存储在磁盘上,并且在复制过程中磁盘将保持一致的状态。
即使可以以可恢复的方式快照磁盘的状态(如突然断电,这可以通过ext3等日志文件系统快速恢复),但对于热磁盘转储,情况永远不会如此。 磁盘转储需要很长时间才能完成,在转储的开始和结束之间几乎存在无限的中间状态,转储将包含这些状态的混合,即使使用日志文件系统,转储也可能无法恢复。
而且我还没有提到原始磁盘转储备份的所有其他问题:
很多人都在那里,并且有很多关于灾难恢复的经验。 不要试图创造自己的备份解决scheme,你会结束这些事情。 使用适当的备份,如dump , tar或rsync 。 如果您需要更强大的function,请使用Amanda或Bacula ,或者其他数百个可供使用的解决scheme之一。
可能不是你所期望的答案,但不得不说。
请注意,请不要使用dd来备份您的物理卷,因为您的问题的评论中所述的所有原因。
至less如果你想做磁盘到磁盘的备份使用像rsync (尽pipe这不是没有问题),如果你不能从cron工作,回来这里。
我怀疑你的cron行不正确。 请用下面的条目编辑你的crontab文件:
1 0 * * 2-6 /root/applog_backup.sh
请让我知道这是否解决您的问题。
我build议你花点时间,看看一个叫Bacula的产品。 这是开源(免费!),并做了一个伟大的工作。 设置起来很复杂,但是一旦你开始了,你会忘记再次担心备份。