Btrfs:添加到 RAID1 的新设备未使用

Btrfs:添加到 RAID1 的新设备未使用

问题

我向 RAID1 阵列添加了一个新驱动器,虽然它被列为阵列的一部分,但并未写入新数据(尽管它是最大的驱动器并且是空的)。另外,sudo btrfs fi usage确实将其显示为数组的一部分,但未在Data,RAID1“nor”Metadata,RAID1部分下列出(请参见下面的输出)。

尽管我能找到的每份指南都显示我已将新设备正确添加到现有 RAID1 阵列,但事实并非如此。

序幕

熟悉 RAID 但不一定了解 Btrfs 实现的人可能会认为无法使用奇数个磁盘执行 RAID1,这是可以理解的。但 Btrfs 实际上并不是传统的“RAID1”,它是别的东西。它可以说更灵活,并且可以使用任意数量的任意大小的磁盘>1,确保每个块都写入任意两个不同的磁盘(通常从可用空间最多的磁盘开始),而且(据说)很好。它明确支持使用奇数个磁盘。这里是一个关于此的示例问题。

脚步

首先,我从一个正常运行、最近平衡的 4 磁盘 Btrfs RAID1 阵列开始。 (使用 1x4tb、2x8tb 和 1x10tb 驱动器。)所有四个磁盘都是数据和元数据 RAID1 阵列的一部分(请参阅下面的输出)。

然后我添加了一个新的 10tb 磁盘,通过:

sudo btrfs device add -f /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start /mnt/btrfs/ba07  ### As later noted, I also ran this with RAID1 conversion filters.

之后,这里的输出sudo btrfs fi usage /mnt/btrfs/ba07似乎表明它实际上不是数组的一部分:

Overall:
    Device size:                  36.38TiB
    Device allocated:             17.19TiB
    Device unallocated:           19.19TiB
    Device missing:                  0.00B
    Used:                         16.73TiB
    Free (estimated):              9.82TiB      (min: 9.82TiB)
    Data ratio:                       2.00
    Metadata ratio:                   2.00
    Global reserve:              512.00MiB      (used: 96.53MiB)

Data,RAID1: Size:8.58TiB, Used:8.35TiB
   /dev/sdf        5.68TiB
   /dev/sdg        5.53TiB
   /dev/sdh        3.57TiB
   /dev/sdi        2.38TiB

Metadata,RAID1: Size:18.00GiB, Used:14.21GiB
   /dev/sdf        8.00GiB
   /dev/sdg       17.00GiB
   /dev/sdh        4.00GiB
   /dev/sdi        7.00GiB

System,RAID1: Size:32.00MiB, Used:1.47MiB
   /dev/sdh       32.00MiB
   /dev/sdj       32.00MiB

Unallocated:
   /dev/sdf        1.59TiB
   /dev/sdg        1.73TiB
   /dev/sdh        5.52TiB
   /dev/sdi        1.26TiB
   /dev/sdj        9.09TiB

请注意条目Data,RAID1且不Metadata,RAID1包括新磁盘/dev/sdj.

故障排除步骤

在黑暗中拍摄,我尝试过:

sudo btrfs filesystem resize max /mnt/btrfs/ba07

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

结果是相同的,磁盘未列在Data,RAID1或下Metadata,RAID1

最近,我尝试了下面来自 EarthMind 的评论中的提示,并结合推荐:

btrfs device delete /dev/sdj /mnt/btrfs/ba07              #Succeeded
btrfs device add    /dev/sdj /mnt/btrfs/ba07              #Succeeded
btrfs balance start -mconvert=raid1,soft /mnt/btrfs/ba07  #Tip said to do these balances separately, metadata first
btrfs balance start -dconvert=raid1,soft /mnt/btrfs/ba07

所有步骤立即完成,并且后台没有执行任何操作;大概这是因为我已经多次运行平衡变化,并且在删除之前 sdj 上没有数据可以移动。

sudo btrfs fi usage显示了同样的事情:/dev/sdj 不是数据或元数据 RAID1 的一部分。

由于疯狂的定义通常被定义为一遍又一遍地做同样的事情却期待不同的结果,我目前正在这样做:

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

无论出于何种原因,似乎真的在做某事。 (但单独完成时则不然,即使我之前多次尝试过完全相同的命令。)具体来说,/dev/sdj 似乎正在进行写入,这就是这里的全部目标。现在宣布胜利还为时过早,因为这可能需要数小时甚至数天的时间才能完成。具体来说,这部分输出btrfs fi usage /mnt/btrfs/ba07似乎很有希望:

Data,RAID1: Size:8.40TiB, Used:8.36TiB
   /dev/sdf        5.56TiB
   /dev/sdg        5.45TiB
   /dev/sdh        3.47TiB
   /dev/sdi        2.31TiB
   /dev/sdj       19.00GiB

最后一行 /dev/sdj 正在增长。

附加信息

系统信息:

$ btrfs --version
btrfs-progs v4.15.1

$ uname -r
4.15.0-54-generic

$ lsb_release -d
Description:    Ubuntu 18.04.2 LTS

网上有类似问题

概括

显然我一定做错了什么,但到目前为止,除了“它做得正确并且‘应该’有效”之外,几个小时的谷歌搜索和实验没有产生任何结果。

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07从阵列中删除并重新添加磁盘后,它暂时似乎可以使用,即使这是使用同一命令的第三次或第四次尝试。当它完成时,我会在几个小时或几天内将其添加为答案:

#Repeat the third command below a few times if the whole thing doesn't work the first time.
#Note, don't specify "soft" parameter.
#If it's still not working, try the whole 3-line series of commands below multiple times.
#Because, software.

btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add    /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

答案1

我也注意到了同样的问题。我的初始 RAID 1 对是 (2)12TB 驱动器。当我添加更多驱动器 (2)8TB 时,我无法弄清楚为什么新驱动器没有根据btrfs 文件系统使用/路径。我做了更多研究,发现 btrfs 使用的算法是添加到可用空间最多的驱动器。因此,在 12TB 对用完 4TB 之前,8TB 对将不会被使用。

我的测试表明你只需要使用btrfs 设备添加 /dev /path命令并且不需要运行BTRFS 余额命令使 btrfs RAID 1 工作。

我希望 RAID 1 btrfs 文件系统的未来迭代使用百分比可用空间算法而不是绝对可用空间。当 SSD 磁盘用于磨损平衡时,这一点将变得很重要。

现在我想出了一个创可贴。我通过将每个磁盘的文件系统大小设置为池中最小磁盘的大小来启动磁盘池。从而强制 RAID 1 平等地使用池中的所有磁盘。当池变满时,我将剩余磁盘的大小调整为下一个最小的磁盘容量,以便平等地使用剩余磁盘。由于数据更加分散,这还有助于减少磁盘故障时的重建时间。

您可以 mkfs.btrfs 磁盘上的整个分区,然后使用以下命令设置池中每个驱动器的可用空间btrfs 文件系统调整大小 {devid}:{size} /path 所以如果我最小的磁盘是 4TB 我会btrfs 文件系统调整大小 {1..4}:4T /path。找到磁盘的设备btrfs 文件系统显示

答案2

我想通了如何在这种特殊情况下修复它(但不是为什么它正在发生)。我也不能确定它会“修复”上述问题末尾提到的类似问题。

不管怎样,这显然是 Btrfs 不希望的、无意的,或者充其量是未记录的行为。 (例如,您必须执行这些步骤才能让 Btrfs 开始使用新添加的设备,这可能只是“未记录”。至于为什么它并不总是有效......是另一个问题。)

在这个(真实的)例子中:

  • /dev/sdj是要添加的设备,btrfs 不使用该设备来分发数据。
  • /mnt/btrfs/ba07是阵列的安装位置。
btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add    /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07

通常的免责声明,请确保您的数据已备份。该device delete命令应该在不丢失数据的情况下执行此操作(并且确实如此),并且只要其他磁盘上有足够的空间来接收已删除设备的数据就应该可以工作(如果它甚至没有被使用,显然就是这种情况),但更好安全总比后悔好。

如果它不起作用,并且假设阵列的其余部分确实有数据并且新添加的磁盘是空的,btrfs balance start那么您会在...之后注意到:

  • 命令 ( btrfs balance start...) 可能会立即返回,
  • btrfs balance status /mountpoint显示没有活动,并且
  • Data,RAID1输出部分不btrfs fi usage列出新设备。

如果不起作用,请btrfs balance start再次尝试最后一个命令 (...)。

如果仍然不起作用,请再次尝试所有三个命令。

我不知道是否总是需要多次执行,或者为什么在这种情况下需要这样做。 (就我而言,无论运行多少次,最后一个命令本身都不起作用。但是在删除并重新添加设备后,然后执行两次平衡命令(中间有一些经过时间和随机的不相关命令),它第二次开始工作。

另请注意,在这种特殊情况下,这些没有工作,即使经过多次尝试:

  • 在数据平衡之前单独执行元数据平衡(如类似问题中所建议的,在上面的问题中记录)。
  • 将参数添加到和参数,soft中。-mconvert=raid1-dconvert=raid1

相关内容