有没有其他的理由“设备上没有剩余空间”?

我在Ubuntu服务器系统上使用Dirvish备份一个高清到外部USB 3.0驱动器。 直到前几天,一切正常,但现在每个备份失败,“设备(28)上没有剩余空间”和“文件系统已满”。 不幸的是,这不是那么简单:设备上有> 500 GB的空闲空间。

细节:

rsync_error:

rsync: write "/mnt/backupsys/shd/gesichert1/20130223_213242/tree/<SomeFilename1>.eDJiD9": No space left on device (28) rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32) rsync: write "/mnt/backupsys/shd/gesichert1/20130223_213242/tree/<SomeFilename2>.RHuUAJ": No space left on device (28) rsync: write "/mnt/backupsys/shd/gesichert1/20130223_213242/tree/<SomeFilename3>.9tVK8Z": No space left on device (28) rsync: write "/mnt/backupsys/shd/gesichert1/20130223_213242/tree/<SomeFilename4>.t3ARSV": No space left on device (28) [... some more files ...] rsync: connection unexpectedly closed (2712185 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] 

日志看起来很像往常一样,直到它击中:

 <SomeFilename1> <SomeFilename2> <SomeFilename3> <SomeFilename4> <PartOfAFilename>filesystem full write error, filesystem probably full broken pipe RESULTS: warnings = 0, errors = 1 

但是,如上所述,设备上有很多空间:

 df -h /dev/sdg1 2.7T 2.0T 623G 77% /mnt/backupsys/shd 

还有很多inode:

 df -i /dev/sdg1 183148544 2810146 180338398 2% /mnt/backupsys/shd 

该设备安装为rw:

 mount /dev/sdg1 on /mnt/backupsys/shd type ext3 (rw) 

该进程以root用户身份运行。

我正要说,我没有改变任何东西,但事实并非如此:我已经开启了我正在备份的驱动器的acl:

 /dev/md0 on /mnt/md0 type ext4 (rw,acl) 

这可能是问题吗? 如果是的话,怎么样? root仍然具有对文件的完全访问权限。

编辑:

我只是检查了临时目录:

  • / tmp只包含一个空的.webmin文件夹
  • / var / tmp是空的

这些目录所在的文件系统有足够的可用空间和inode:

 df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 289G 55G 220G 20% / df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 19202048 167644 19034404 1% / 

EDIT2:

目录是相当大的,但不是> 2 GB。 备份失败的甚至不是最大的一个,它包含7530个文件。

EDIT3:

发表这个问题时我不认为有关的一个信息:

在备份开始失败的前一天,我已经在备份的文件系统上激活了acls。 我现在假设这触发了Dirvish(或rsync)认为所有的文件已经改变,所以复制而不是硬链接的文件列表非常大。 这可能意味着一些缓冲区太小了。

今天,一个完整的备份到一个空的磁盘工作完美无瑕。 我会尝试下一个增量备份。 这将显示是否激活acls是导致问题的原因。

看看左边的inode的2%,让我想到了EXT文件系统强加的根保留。 你可能想要检查这些:

  1. “ 为文件系统保留根目录空间 – 为什么? ”
  2. “ 对于非操作系统磁盘,”文件系统保留块 “的合理大小?

我会尝试.tar.gz一些较旧的备份,希望它会减lessinode使用的数量。

我的怀疑(见EDIT3)显然是正确的:添加acl支持文件系统rsync / dirvish认为所有的文件已经改变。 因此,不是创build增量备份,而是创build硬链接到已经存在的文件,而不是创build一个完整的备份,当然因为硬盘没有足够的空间而失败。

所以错误信息实际上是正确的。

在用空的备份磁盘重新启动后,增量备份像以前一样工作。

我发现dummzeuchfind了解决问题的办法,但实际上还有一个例子,我发现磁盘可以拥有足够多的inode /可用空间,并在尝试传输某些目录时仍然显示“设备上没有剩余空间”。

这是由于使用ext4文件系统格式化的块设备上的哈希冲突导致的,其中目录索引也被启用,特别是在单个目录托pipe超过100k个文件的情况下,文件的名称由相同algorithm生成(caching文件,md5sum文件名等。)

解决方法是尝试使用另一个目录索引algorithm:

 tune2fs -E "hash_alg=tea" /dev/blockdev_name 

或者完全禁用该块设备的目录索引(可能会影响性能)

 tune2fs -O ^dir_index /dev/blockdev_name 

另一个解决scheme是查看用这些文件填充目录并修复软件。

可能的解决scheme是将具有大量文件的文件夹的内容拆分为多个单独的子文件夹。

Axel Wagner在这里详细描述了这个问题

http://blog.merovius.de/2013/10/20/ext4-mysterious-no-space-left-on.html

干杯。

目录本身有一个2GB的大小限制,即如果目录大小​​大于2GB的文件(不是目录中的文件的大小),则会遇到问题。 话虽如此,只有2.8M的inode使用,这不应该是一个问题。 通常发生在15M左右的节点。

所以这可能没有太大的帮助 – 但是在备份设备上试试ext4?

在sysctl中增加Inotify观察者限制:

 fs.inotify.max_user_watches = 100000 

并重新启动,或执行sysctl -w版本也。

这通常会做到这一点。 内核中打开的文件太多,错误是完全误导的。 Dropbox就是一个典型的例子。

我build议你检查一下其他的东西:

  1. 看看你的临时目录是不是满了。 有时它被用于中间存储,并且容易满载。
  2. 检查是否有一个进程仍然保存描述符到一个被删除的文件。 由于DF报告适当的大小,但不会受到伤害的可能性较小。