问题
我向 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
网上有类似问题
- btrfs raid1 未使用所有磁盘?
- 表现如预期。由于现有驱动器有更多可用空间,因此它们会在新磁盘之前被写入。我的情况正好相反,新驱动器有更多可用空间。
- Btrfs 将较小的驱动器添加到 RAID1
- 当磁盘失效时,用户最终不得不采取完全不同的方法。
- 为什么 btrfs 拒绝将元数据转换为 RAID1
- 是由于特定 Btrfs 版本 (4.0) 中的回归所致。但我在 4.4 和 4.15 上都尝试了这些步骤。
- BTRFS 余额已完成,但仍显示以“单一”模式存储的数据
- 建议添加“soft”参数来转换过滤器,并
-mconvert=raid1,soft
在之前单独运行-dconvert=raid1,soft
。这个解决方案没有解决我的问题。
- 建议添加“soft”参数来转换过滤器,并
概括
显然我一定做错了什么,但到目前为止,除了“它做得正确并且‘应该’有效”之外,几个小时的谷歌搜索和实验没有产生任何结果。
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