![写入时检查文件完整性](https://linux22.com/image/561171/%E5%86%99%E5%85%A5%E6%97%B6%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E5%AE%8C%E6%95%B4%E6%80%A7.png)
我正在使用以下命令进行备份:
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
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
- 对于所有完整性问题,首要任务是检查硬件。您的 RAID 是否正常?您的硬盘是否出现 SMART 错误?
- 写入块并控制其完整性是内核的工作,而不是您的工作。您的工作是要求内核以连贯的方式写入文件,这引出了我的观点 2。
- 您正在通过 5 个不同的程序传输数据。tar 不太可能损坏任何数据,因为该代码被广泛使用和修复(但您永远不知道),但我对 lbzip2 和 ionice 不太确定。在进行诸如在 FS 级别检查块的完整性之类的疯狂操作之前,请使用不太复杂的 bash 命令。单个“tar”就足够了。并验证创建的文件没有完整性问题。然后转到 3。
- 如果您的问题与网络有关,那么诊断它的最佳方法是查看日志(/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 连接使用的网卡)