btrfs,没有剩余磁盘空间

btrfs,没有剩余磁盘空间

我在 btrfs 卷上遇到了磁盘空间问题。df显示有足够的​​磁盘空间。但是当我尝试复制 10GB 测试文件系统时,显示此设备上没有磁盘空间。

df -h | grep /mnt/ssd

/dev/sda 448G 135G 313G 31% /mnt/ssd

同样在这里:

btrfs filesystem df /mnt/ssd

Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B

我不知道如何读取这个的输出:

sudo btrfs filesystem show

Label: none  uuid: aba64e21-69d1-46c1-b3f2-dfda832b67fd
    Total devices 2 FS bytes used 133.88GiB
    devid    1 size 447.13GiB used 447.13GiB path /dev/sda
    devid    2 size 447.13GiB used 447.13GiB path /dev/sdb

那么使用了 133.88GiB 还是 447.13GiB?非常令人困惑。

答案1

要了解这里发生了什么,您首先需要了解 BTRFS 使用两阶段分配器。第一阶段分配大块空间(在大多数文档中实际上称为“块”),这些空间仅用于一种类型的分配,即数据(仅用于文件中的数据)、元数据(文件名、目录结构、访问时间、所有权、权限等)或系统(仅用于存储有关块分配的数据)。一旦分配了一个块,只有将所有数据移出该块才能释放该块中的空间。

那么,对于您的文件系统来说,这到底意味着什么?

嗯,您的输出btrfs filesystem df显示以下内容:

Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B

这些total值表示已为该类型的块分配了多少空间,而used值表示这些块内正在使用多少空间。在您的例子中,您为数据块分配了 446.32GB 的空间(根据常规dfbtrfs filesystem show输出,几乎是整个磁盘),但实际上只有 133.29GB 的空间正在使用。鉴于此以及所描述的症状,BTRFS 正在尝试分配元数据块,但没有空间来这样做(因为所有可用空间都在已分配的块内),因此您只会收到错误。

要从中恢复,您必须运行平衡。平衡实际上是将选定块中的所有数据(或如果您未传递任何选项,则将全部数据)发送回分配器,这会产生释放空块或几乎空块的净效果,因为它会将内容重新打包到部分满的块中。

我想先说:

btrfs balance start -dusage=0 /mnt/ssd

这将删除所有没有实际数据的数据块,这可能足以让事情暂时恢复正常,但仍会让您在将来容易受到同样的问题的影响。

为了帮助完全压缩内容,请重复上述命令并增加选项的值-dusage。我通常每次增加 5 到大约 50(超过 50,您通常会浪费时间)。使用过滤器(上面仅指定用于处理数据块)将告诉余额选择最多只占该百分比的块,因此通过逐步逐步增加,您可以更轻松地压缩内容而不会遇到其他问题。

您可以通过定期运行以下命令来帮助避免将来出现此类问题(我通常在我的系统上每天运行它):

btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd

这将平衡前 10 个少于四分之一的数据和元数据块,在大多数情况下应该在几秒钟内完成。

答案2

我从未在 HDD 上使用 Btrfs 文件系统时遇到过此类问题,但我在 SSD 上遇到过同样的问题。SSD 不知道哪些块是真正空闲的,您需要对其进行修剪。

但当问题发生时,fstrim -v /mnt/ssd几乎没有显示任何空间被修剪!我的解决方案:

btrfs balance start /mnt/ssd
  #  you can monitor its progress by 'btrfs balance status /mnt/ssd'
fstrim -v /mnt/ssd

第二个命令这次应该会削减很多空间。此后我的可用空间就真正可用了。

但请注意:我在单个 SSD 上使用 Btrfs,就我的情况而言是 RAID,我不知道它是否会产生任何区别(我指望您的反馈)。


关于令人困惑的部分:Btrfs 作为文件系统可以在分配给它的设备(或多个设备)内扩大或缩小自身。至于现在,您的文件系统已经臃肿了。它447.13GiB在每个设备上都使用了整个空间。我认为只要涉及到,整个空间就处于“使用中”状态fstrim。但是文件系统内部133.29GiB由实际数据使用。平衡文件系统应该会缩小它,然后fstrim才能完成其工作。

文件系统会随着时间再次膨胀。这就是为什么我学会了定期执行上述维护,尤其是在之前apt-get upgrade

相关内容