@home
挂载在/home
,子卷中有btrbk
备份btrbk-snap
。对于支持最多2 ^ 64个快照的文件系统,我希望它具有增加元数据大小的方法……
@home
挂载在/home
,子卷中有btrbk
备份btrbk-snap
。对于支持最多2 ^ 64个快照的文件系统,我希望它具有增加元数据大小的方法……
Answers:
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的树遍历长度,因为注释可以包含更多的“链接”。
根据btrfs Wiki上的FAQ,这是不可能的,也不太可能实现。
是否可以在不重新创建文件系统的情况下更改元数据块的大小?
否,一旦创建文件系统,就无法更改传递给mkfs.btrfs -n SIZE的值。需要备份/还原。请注意,这可能永远不会实现,因为它将需要对核心功能进行重大更新。
您可以将现有的btrfs文件系统迁移到具有更大容量的新文件系统-n SIZE
。您甚至可以使用btrfs RAID和balance将其添加到现有文件系统中,然后删除旧文件系统。
另请参见有关快满的驱动器的部分。
btrfs filesystem df /
命令输出行所Metadata, single: total=xxGiB, used=xxx
表示的。
-n
设置每个元数据块的大小,同时btrfs filesystem df
显示这些块所用的空间。如果原始帖子作者的元数据和实际数据占用的空间过多,则应减小的大小-n
,以使元数据块的最小大小较小(占用的空间较少,但碎片较多)。
-n
选项)”的答案是不正确的,不是重点。因为当他进一步询问“或[元数据的分配空间]是否自动扩展?”时,暗示它不是节点大小,而是他感兴趣的分配空间。因此,答案应该是“是”。您当然是正确的,暗示此-n
设置会间接影响元数据的大小,但问题似乎更针对元数据的已分配内存,而不是单个元数据注释大小……。–
btrfs
然而它不是uncommen,所有后备设备/存储器,已经获分配到数据个BlockGroup,这意味着除了空闲存储器(用于数据本身),则生成“没有空间”错误。因此,用户需要尝试一些操作btrfs balance
,如果其他段中仍然有空间,则可以重新分配它,以增加元数据部分的不足空间。