破解时间机器网络备份失败与巨慢的谜题

0x01 问题

最近发生了不知道从什么时候开始,透过网络的时间机器(TimeMachine)备份巨慢无比,一晚上只能备份十几个G,而且经常不定期就失败。这到底是怎么回事?

0x02 探查

通过查看时间机器备份任务的backupd的系统日志,发现备份失败显示是由于目标磁盘IO失败导致的。但是反复检查目标机器并没有发现什么不对劲的地方。而且不论更换使用smb协议还是afp协议,传输都巨慢无比。通过Wireshark抓包,也没有发现什么特别奇怪的地方,只是发现每个传输请求基本都在3~5ms,远高于RTT(<1ms)。这里面的时间差又是怎么来的呢? 终于在一次传输中抓到了传输失败,发现是说到远程刚创建的文件读取失败。我明明是备份服务,是往远程写入,怎么会出现读取呢?

偶然间发现一个现象,大概两个多月前安装的ESET Cyber Security居然扫描到了我的目标备份盘,并且在扫描时,好像备份就失败了。这两者是否有什么关系?

0x03 第一波尝试

在ESET中,经过查看发现了可以选择的目标范围。于是这里重新选择了只有本地磁盘,并且不进行网络驱动器和可移动磁盘的扫描。再次备份,发现终于网络备份不失败了。于是失败的问题解决,原因是ESET会对刚网络驱动器上刚创建的备份文件进行扫描,而由于SAMBA的特点,此时就不能进行继续写入,于是报了IO错误导致备份失败。

0x04 第二波尝试

看着备份上传只有几十k到几百k的速度,难道这和ESET也有关系? 于是我尝试关闭了ESET的文件系统实时保护,结果备份速度瞬间就飙到了14MB/s以上!!!震惊之余,赶紧分析下是为何。再次仔细查看了ESET的设置。在实时保护选项中,发现了可以选择文件检查的时机。默认选中了文件创建文件打开文件执行。看到这里就想到了,之前的失败是由于文件创建被扫描导致的,而现在缓慢,是否是文件打开导致的? 因为备份必然会打开某个文件句柄再进行复制。于是打开文件系统实时保护,取消勾选文件创建文件打开,备份速度依然没有下降。看起来问题的到了解决

0x05 总结

安全软件虽然有助于文件系统防护,但是时机还是要经过一些调教才能适应多种情况。这里在事后操作,由于网络驱动器的 文件操作会牵扯到高开销的网络读写,也伴随着网络延迟,如果意外增加几乎是并行的读取,比起本地驱动器可能会遇到诸多问题。所以要善用一些扫描选项的白名单及排除机制,达到安全与体验的均衡。

0x06 进阶

最近有读到关于macOS的文件系统相关的文章,其中提到了一个东西叫做fsevents。这套非公开API的非常强大,可以用来监控文件系统上每一个文件的任何改动,包括,创建,修改,删除,属性改变,状态改变等等。感兴趣的可以访问 这个链接 编译一个文件系统监控工具。更多的信息可以读这本书《深入解析Mac OS X & iOS操作系统》。