写入时检查文件完整性

我正在使用如下所示的命令进行备份

ionice -c3 tar -ch data | lbzip2 -n 4 | ionice -c3 tee /mnt/smb/out.tar.bz2 > /dev/null 

之后,我试图从备份恢复数据:

 lbzip2 -cd -n 10 /mnt/smb/out.tar.bz2 | tar -x 

在开始一小时后,由于文件完整性错误,lbzip2失败。
/ mnt / smb是使用SMB协议访问的Windows机器上的RAID 1设备。
我怀疑在写入磁盘或用smb发送数据时出错,但不确定。

所以,我有两个问题:

  1. 在写入磁盘时检查存档完整性,如果检查失败,重试写入块是否有任何方法?
  2. 任何想法如何找出失败的实际原因?

 tar -c ... \ | tee >(md5sum >/tmp/tar.md5) \ | lbzip2 \ | tee >(md5sum >/tmp/bz2.md5) \ > /mnt/smb/out.tar.bz2 

然后你可以检查

 md5sum /mnt/smb/out.tar.bz2 

并查看它是否返回与/tmp/bz2.md5中保存的相同的内容。 如果是这样,那么你应该没有存储问题,我会感兴趣的确切lbzip2错误信息,以及是否可以通过官方bzip2解压缩保存的文件。 谢谢。 (请随时通过电子邮件与我联系。)

  1. 所有的完整性问题,首要的任务是检查你的硬件。 你的RAID是否理智? 您的硬盘是否引发SMART错误?
  2. 写块和控制它们的完整性是内核的工作,而不是你的。 你的工作是要求内核以一致的方式写一个文件,这导致我2。
  3. 您的数据通过5个不同的程序进行pipe道传输。 tar不太可能破坏任何数据,因为代码被广泛使用和熨烫(但你永远不知道),但是我不太确定lbzip2和ionice。 在进行疯狂的事情之前,像在FS级别检查块的完整性,使用一个不那么复杂的bash命令。 一个“焦油”应该做的。 并validation创build的文件没有完整性问题。 然后去3。
  4. 如果您的问题与networking有关,诊断它的最好方法是查看日志(/ var / log / *或Windows上的事件日志)和networking数据包。 我会在linux / unix上插入一个tcpdump,或者在Windows上插一个wireshark,并validationTCP校验和没有被破坏。

但是,真的,摆脱所有这些pipe道之前…

既然你的目的地是一个Windows机箱上的CIFS共享,为什么不在Windows端使用Windows压缩的文件系统,而只是在Linux端使用普通的tar(不压缩)呢?

这样你就可以把压缩负载放在窗口盒子上 – 并且摆脱很多复杂性。

顺便说一句:你检查了networking连接的窗口框? 你有任何networking错误?

  • netstat -in
  • ethtool -S eth0|grep -vw 0 (用CIFS连接使用的网卡replaceeth0)