Dropbox 文件夹内使用 encfs 文件夹的“输入/输出错误”

Dropbox 文件夹内使用 encfs 文件夹的“输入/输出错误”

我的 Dropbox 中有一个 200GB 的 Encfs 加密文件系统,可供多台机器访问,到目前为止我从未遇到过任何问题。

我在一台(ubuntu)计算机 X 上移动了大约 10 GB 的数据,两天后,在另一台(ubuntu)计算机 Y 上完成同步时出现了一些问题:有些文件无法在 Y 上读取,并出现输入/输出错误,例如

$ file myfile.txt
myfile.txt: ERROR: cannot read `myfile.txt' (Input/output error)

因此文件系统不知何故被损坏了。所有文件都可以在计算机 X 上正常读取。我遇到过大约 20 个具有此属性的文件;可能还有更多。在一个目录中,通常只有少数文件会因此错误而失败,而更多文件则不会出现问题。

我的系统也在 Windows 机器 Z 上运行;我查看了 Z 中的文件,也遇到了 IO 错误(尽管 Windows 错误消息更加隐晦)。因此,从某种意义上说,问题几乎肯定是“在 X 端”。

我已成功导航到实际加密 Dropbox 目录中与发生输入/输出错误的目录相对应的目录。所有(加密)文件都可以正常读取,因此问题似乎不是物理磁盘的实际 IO 错误,问题似乎出在 encfs 上。

我已备份所有数据,我可以简单地删除所有数据并重写,但未损坏的副本位于一个上传速度非常慢的系统上(在我家里),并且花了两天时间才能同步;我不愿意重新启动(不是因为我没有两天时间,而是因为我不想让我家里的互联网速度变慢两天)。

Google 没有给我任何帮助。我不知道下一步该怎么做,除了“重新启动并重试”,就像我说的,我目前希望避免这种情况。我真的不明白文件系统如何存储在目录中,所以我不知道如何开始调试这个问题。

如果我确实必须重新启动,有人能告诉我一个好方法来检查目录中哪些文件有 IO 错误吗?编辑:最后我用了一个糟糕的方法——file在每个文件上运行,使用find,然后使用 grep 和 emacs 找到一个坏文件列表,如果任何文件被称为“输出错误”之类的东西,这种方法就不会起作用:-)

编辑(一年后):我已经忍受这个问题一年多了。我一直在使用malte 的解决方法。然而上周,我第一次丢失了数据。我在 encfs 目录中做了大量更改,除了移动数据之外,我没有做任何奇怪的事情,然后我的夜间脚本(我想补充一下,每晚在运行 Dropbox 和 Encfs 的两台 ubuntu 机器上,运行该脚本需要一个多小时,需要读取大量磁盘)告诉我某些文件在两端都出现 I/O 错误。我不得不使用 Dropbox 的“恢复已删除文件”功能来恢复文件,这很麻烦,因为当然所有文件名都是加密的,所以我不得不使用encfsctl等。

这促使我采取行动。所以我咬紧牙关,设置了第二个 Encfs 目录,这次使用不同的全局设置(我不知道如何在给定的 encfs 目录中更改这些设置,而且我非常确定这是不可能的,所以据我所知,我能做到这一点的唯一方法是将现在的 300 GB 从一个目录复制到另一个目录;我现在必须这样做,因为当我达到 500 GB 时,我将无法在我的 Dropbox 中存储两个副本,因为它的限制是 1000 GB)。

那么我做了什么?我使用以下方法设置了另一个加密文件存储系统:文件名初始化向量链接,每个文件的初始化向量和外部 IV 链。是的,我知道这不太安全!是的,我知道这并不适用于所有人!是的,我甚至知道 Encfs 的安全审计得出结论,我不应该使用 Encfs 存储 100,000 个用户 ID、密码和信用卡详细信息!但是这不是我使用 encfs 的目的。我只想使用 Dropbox,但要确保如果 Dropbox 被黑客入侵,或者有心怀不满的 Dropbox 员工泄露数据,那么我的数据就不会被出售。我这里没有军火级机密,我只有家人的照片和与工作相关的资料,比如参考资料,我不想被随意泄露。

既然我在这里,让我提一下我去年发现的一些其他链接,这些链接可能与这个问题有关,也可能无关。我对 FUSE 的工作原理了解不够。但考虑到这是我的问题,而且这已经成为我一年来的一个大问题,我想我会把这个问题作为我对他的和可能相关的问题的个人收集。

https://stackoverflow.com/questions/24966676/transport-endpoint-is-not-connected

https://github.com/vdudouyt/mhddfs-nosegfault

https://github.com/vgough/encfs/issues/109

并且还建议fsck在 encfs 目录上使用。

我并不是一名专家,不知道这些是否相关。我所知道的是,从昨天起,我已经“重新开始”使用 Encfs,几个月后我会报告这是否为我解决了问题。

更新两年后,我现在可以自信地说,更改这些 Encfs 文件设置已经解决了问题,但代价是可能削弱了我的安全性。自从我在设置中进行这些更改后,我就再也没有遇到过 I/O 错误。

答案1

如果您在“最高安全”模式下运行 encfs,或者您已启用“文件名到 IV 标头链接”,则任何类似 Dropbox 的服务都会中断。不要启用它。实际上,永远不要使用它,依赖文件路径进行文件数据加密 IV 简直是愚蠢至极。

我将使用“流”文件名编码和仅“每个文件初始化向量”和“传递到密文的文件漏洞”功能来使 encfs 可靠。

不要听信那些说 encfs 容易受到水印攻击的人。哦,当然,这是因为它的性质。只是不要把像翻录的 CD 那样带有可识别图案的文件放在那里。

这将是正确的 encfs 设置。仅启用每个文件端稀疏文件的唯一 iv 支持。

Version 6 configuration; created by EncFS 1.7.4 (revision 20100713)
Filesystem cipher: "ssl/aes", version 3:0:0 (using 3:0:2)
Filename encoding: "nameio/stream", version 2:1:0 (using 2:1:2)
Key Size: 256 bits
Using PBKDF2, with 206833 iterations
Salt Size: 160 bits
Block Size: 1024 bytes
Each file contains 8 byte header with unique IV data.
File holes passed through to ciphertext.

答案2

我遇到了完全相同的问题,也是几周前才开始的。为了让这个更完整:

  • 再次移出和移入文件确实可以解决问题
  • 我所有的机器都是 Ubuntu,所以不可能与 Windows 有关
  • 同步组中有三台机器,其中至少有两台出现问题。请参阅下面的扩展脚本,以便每台机器可以 a) 列出其错误并 b) 尝试修复其他机器的错误

查找损坏的文件:

saveFile="$(hostname)-corruptFiles"
find $dir -exec file {} \;|grep "output error" > /tmp/corruptFilesRaw.txt
cat /tmp/corruptFilesRaw.txt | awk -F  ":" '{print $1}' > $saveFile

修复损坏的文件:

while read i <&3; do
    #check if file is corrupted on this machine as well
    file "$i" >/dev/null 2>&1
    retcode=$?
    if [ $retcode -eq 0 ]; then
        #if not, fix it
        mv "$i" /tmp/crap
        sleep 5
        mv /tmp/crap "$i"
        sleep 1
    else
        #if it is corrupt here as well, skip it
        echo $i >> /tmp/remainingCorruptedFiles
    fi;
done 3<$fileList

#replace file list with list of remaining corrupt files
rm $fileList
mv /tmp/remainingCorruptedFiles $fileList

我在解密文件夹的根目录中有这两个脚本,因此脚本和损坏文件列表在所有机器之间同步

答案3

好吧,我想今天就把这个问题理顺,所以这就是我所做的。YMMV。

注意:我从未发现问题的原因。但测试表明,如果我在计算机 Y 上发现一个文件有 I/O 错误,那么将文件移出计算机 X,再移回文件系统,就可以解决问题。我不太喜欢这个解决方案,因为有一个潜在的问题可能会再次困扰我,但我不知道如何诊断潜在的问题。

好的,首先我备份了计算机 X 上的所有内容。

其次我运行(在 Y 上所有问题所在的目录中)

$ find . -exec file '{}' \; | grep "output error" > ~/io_problems.txt

[我的一些文件名中有空格,但没有换行符或类似内容]

我运行wc了 io_problems.txt,发现该文件中有 2000 多行,因此我的系统中有 2000 多个 I/O 错误。哎哟。

然后我使用一个简短的 emacs 宏来编辑io_problems.txt:在每一行中我找到字符串: ERROR: cannot read,然后从冒号开始删除该行的其余部分。我通过(C-x ( C-s : ERROR: cannot read [now press left arrow key to get back to the first colon] C-k [right arrow key] C-x ) C-u 2500 C-x e在 emacs 中键入(在 emacs 中)来完成此操作。我确信我可以使用 sed 或 awk 或其他任何东西,我只是更习惯使用 emacs。我将生成的文件重命名为list.txt

到目前为止,我只剩下一个文件list.txt,其中包含文件名列表(其中可能有空格),这些文件名在 Y 上有问题。

现在到了最重要的时刻:我需要循环遍历这个文件列表,并将每个文件移出文件系统然后再移回。文件名可能包含空格。所以我使用文件描述符进行循环。

while read i <&3; do
  mv "$i" ~/crap
  sleep 5
  mv ~/crap "$i"
  sleep 5
  done 3<~/list.txt

睡眠是为了不让 dropbox 负担过重,这在某种程度上导致了最初的问题(虽然我不认为问题出在 dropbox;我对加密文件进行了广泛的测试,并没有发现 X 和 Y 文件中有任何差异;我对 encfs/fuse 的无知使我无法进行更严格的测试来真正找出问题所在)。

2000 个文件,每个文件耗时 10 秒,这意味着整个操作将耗时超过 5 个小时。这对我来说还行。

我目前正在等待这个循环终止,但初步测试似乎表明问题正在缓慢但肯定地得到解决。

相关内容