如何扩展btrfs元数据?


9

我的btrfs元数据已满。(我正在使用创建每小时快照btrbk。)

如何增加/扩展分配给btrfs文件系统元数据的空间?

还是自动扩展?


您是否仅将分区用于备份?
Rui F Ribeiro

1
它的子卷@home挂载在/home,子卷中有btrbk备份btrbk-snap。对于支持最多2 ^ 64个快照的文件系统,我希望它具有增加元数据大小的方法……
Tom Hale


@EmmanuelRosa我有。您认为哪一部分有用?
汤姆·黑尔

第二个讨论重新平衡元数据。也许使用正确的过滤器,您可以为元数据块分配更多的空间。
伊曼纽尔·罗莎

Answers:


7

TL; DR元数据(如果btrfs没有遭受一般的低空间条件)将自动增加。如果不存在未分配的可用空间,则自动增加。但是,如果btrfs已为的数据部分分配了超出所需空间的空间,则可以重新分配该空间。这balance在btrfs中称为-ing。

假设的后备块设备上有足够的未分配内存btrfs,则文件系统的元数据部分(如OP假定的那样)自动分配内存以增加/扩展元数据。

因此,答案是:是的(只要不是在低内存/自由空间条件btrfs,那么元数据将得到自动增加,因为这样的:

(1)看一下btrfs的一些初始分配设置(在40GB设备上)

$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.49GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.33GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

(2)可以看出,文件系统中用于存储元数据的已分配空间为1.55GiB,其中1.33GiB,因此几乎使用了所有空间(这可能是在OP的情况下发生的情况)

(3)现在,我们增加了要添加的元数据。为此,我们使用命令的--reflink=always选项复制/ home文件夹cp

$> cp -r --reflink=awlways /home /home.copy

(4)由于(假设/ home中有很多文件),已经向文件系统中添加了许多新数据,这是因为我们使用的--reflink空间很少甚至没有用于实际数据的额外空间,因此它使用了写时复制机制。简而言之,大多数元数据已添加到文件系统中。因此,我们可以再看看

$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.65GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=2.78GiB, used=2.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

可以看出,为此分配给元数据使用的空间btrfs自动扩大。

由于这是自动完成的,因此通常不会被用户检测到。但是,在某些情况下,大多数情况下整个文件系统已经被填满。在那些情况下,btrfs可能会开始“结结巴巴”,并且无法自动增加为元数据分配的空间。原因是,例如,所有空间都已经分配给了部件(数据,系统,元数据,GlobalReserve)。令人困惑的是,仍然可能存在明显的空间。一个示例将是以下输出:

$> btrfs filesystem df /
Data, single: total=38.12GiB, used=25.01GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

可以看出,系统的所有40GiB分配都已关闭balance,因为尽管仍有足够的空间容纳新文件的数据,但元数据(如OP情况)很低。btrfs不再可能自动为支持文件系统的设备分配内存(只需将分配总数38.12G + 1.55G + .. == 40GiB加起来)。

但是,由于有多余的可用空间分配给了data文件系统的一部分,因此平衡btrfs很有用。平衡将意味着重新分配已经分配的空间。

在OP的情况下,由于某种原因,可以假定btrfs分配的不同部分之间发生了不平衡。

不幸的是,简单的命令sudo btrfs balance -dusage=0原则上应该搜索空块(为数据分配)并将其交给更好的用户使用(这将是元数据几乎耗尽的空间),可能会失败,因为找不到完全空的数据块。

因此,btrfs开发人员建议连续增加“当应重新布置数据块以回收空间时”的使用限制。

因此,如果

$> sudo btrfs balance -dusage=0
Done, had to relocate 0 out of 170 chunks 

没有搬迁,应该做一些

$> sudo btrfs balance -dusage=5
Done, had to relocate 0 out of 170 chunks  <--(again fail)
$> sudo btrfs balance -dusage=10
Done, had to relocate 0 out of 170 chunks  <--(again fail)
$> sudo btrfs balance -dusage=15
Done, had to relocate 2 out of 170 chunks  <--(success)

另一个答案暗示了btrfs节点大小的影响,这在一定程度上影响了元数据增长的速度。节点大小(如另一个答案中所述)仅在mkfs.btrfs文件系统创建时设置一次。从理论上讲,如果有可能将节点数据的值更改为较小的值,则可以减小元数据的大小(这是不可能的!)。但是,节点大小将无法以任何方式帮助扩展或增加分配的元数据空间。相反,它可能首先只是有助于节省空间。不能保证较小的节点大小,但是会减小元数据的大小。确实,某些情况可能表明,较大的节点大小会减少btrfs的树遍历长度,因为注释可以包含更多的“链接”。


1

根据btrfs Wiki上FAQ,这是不可能的,也不太可能实现。

是否可以在不重新创建文件系统的情况下更改元数据块的大小?

否,一旦创建文件系统,就无法更改传递给mkfs.btrfs -n SIZE的值。需要备份/还原。请注意,这可能永远不会实现,因为它将需要对核心功能进行重大更新。

您可以将现有的btrfs文件系统迁移到具有更大容量的新文件系统-n SIZE。您甚至可以使用btrfs RAID和balance将其添加到现有文件系统中,然后删除旧文件系统。

另请参见有关快满的驱动器的部分


2
节点大小(在您声明的状态下,只能在文件系统创建时设置一次)与元数据大小之间存在差异,imho是btrfs filesystem df /命令输出行所Metadata, single: total=xxGiB, used=xxx表示的。
humanityANDpeace

你想说什么?当然有区别,但这不是意见问题。-n设置每个元数据块的大小,同时btrfs filesystem df显示这些块所用的空间。如果原始帖子作者的元数据和实际数据占用的空间过多,则应减小的大小-n,以使元数据块的最小大小较小(占用的空间较少,但碎片较多)。
埃斯金纳

3
OP询问如何“增加/扩展分配给元数据的空间”,因此您的“无法设置nodesize(-n选项)”的答案是不正确的,不是重点。因为当他进一步询问“或[元数据的分配空间]是否自动扩展?”时,暗示它不是节点大小,而是他感兴趣的分配空间。因此,答案应该是“是”。您当然是正确的,暗示此-n设置会间接影响元数据的大小,但问题似乎更针对元数据的已分配内存,而不是单个元数据注释大小……。–
humanityANDpeace

...例如,假设在后备块设备上有100G的未使用空间,那么在为元数据分配/分配的内存的情况下,将自动扩展(正确地假设OP)。与btrfs然而它不是uncommen,所有后备设备/存储器,已经获分配到数据个BlockGroup,这意味着除了空闲存储器(用于数据本身),则生成“没有空间”错误。因此,用户需要尝试一些操作btrfs balance,如果其他段中仍然有空间,则可以重新分配它,以增加元数据部分的不足空间。
humanityANDpeace
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.