写入时检查文件完整性

写入时检查文件完整性

我正在使用以下命令进行备份:

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
是 Windows 机器上使用 SMB 协议访问的 RAID 1 设备。
我怀疑在磁盘上写入或使用 smb 发送数据时出现错误,但不确定。

因此,我有两个问题:

  1. 有没有办法在写入磁盘期间检查档案的完整性,如果检查失败则重试写入块?
  2. 有什么想法可以找出失败的真正原因吗?

答案1

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 解压很感兴趣。谢谢。(请随时通过电子邮件与我联系。)

答案2

  1. 对于所有完整性问题,首要任务是检查硬件。您的 RAID 是否正常?您的硬盘是否出现 SMART 错误?
  2. 写入块并控制其完整性是内核的工作,而不是您的工作。您的工作是要求内核以连贯的方式写入文件,这引出了我的观点 2。
  3. 您正在通过 5 个不同的程序传输数据。tar 不太可能损坏任何数据,因为该代码被广泛使用和修复(但您永远不知道),但我对 lbzip2 和 ionice 不太确定。在进行诸如在 FS 级别检查块的完整性之类的疯狂操作之前,请使用不太复杂的 bash 命令。单个“tar”就足够了。并验证创建的文件没有完整性问题。然后转到 3。
  4. 如果您的问题与网络有关,那么诊断它的最佳方法是查看日志(/var/log/* 或 Windows 上的事件日志)和网络数据包。我会在 linux/unix 上插入 tcpdump 或在 Windows 上插入 wireshark,并验证 TCP 校验和是否未损坏。

但是,真的,在之前先把那些管道都拆掉吧……

答案3

由于您的目标是 Windows 机器上的 CIFS 共享 - 为什么不在 Windows 端使用 Windows 压缩文件系统,而在 Linux 端使用普通的 tar(不带压缩)?

这样,您就可以将压缩负载放在 Windows 框上 - 并摆脱很多复杂性。

顺便问一下:你检查过 Windows 系统的网络连接吗?有没有遇到任何网络错误?

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

相关内容