我在 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
Run Code Online (Sandbox Code Playgroud)
我不知道如何读取这个输出:
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
Run Code Online (Sandbox Code Playgroud)
那么使用的是 133.88GiB 还是 447.13GiB?非常混淆。
要了解这里发生了什么,您首先需要了解 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
Run Code Online (Sandbox Code Playgroud)
这些total
值指示已为该类型的块分配了多少空间,而该used
值显示了这些块内正在使用的空间量。在您的情况下,您有 446.32GB 的空间分配给数据块(几乎是基于常规df
和btrfs filesystem show
输出的整个磁盘),但实际上只有 133.29GB 的空间在使用。鉴于此和所描述的症状,BTRFS 正在尝试分配元数据块但没有空间这样做(因为所有可用空间都在已分配的块内),因此您只会收到错误。
要从中恢复,您必须进行平衡。从字面上看,平衡将选定块中的所有数据(如果您不传递任何选项,则将所有数据发送回)通过分配器返回,这具有释放空块或大部分空块的净效果,因为它将事物重新打包成部分完整的块。
我会从:
btrfs balance start -dusage=0 /mnt/ssd
Run Code Online (Sandbox Code Playgroud)
这将删除其中没有实际数据的所有数据块,这可能足以让事情现在重新工作,但在将来仍然会让您容易遇到同样的问题。
为了帮助完全压缩事物,请重复上述命令并增加-dusage
选项的值。我通常每次增加 5 到大约 50(超过 50,你通常是在浪费时间)。使用过滤器(上面指定仅用于处理数据块)将告诉 balance 选择最多只占满百分比的块,因此通过一点一点地逐步增加它,您可以更轻松地压缩事物而不会遇到其他问题。
您可以通过定期运行以下内容来帮助避免将来出现此类问题(我通常每天在我的系统上运行它):
btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd
Run Code Online (Sandbox Code Playgroud)
这将平衡前 10 个未满四分之一的数据和元数据块,在大多数情况下应该在几秒钟内完成。
归档时间: |
|
查看次数: |
3428 次 |
最近记录: |