Btrfs RAID1:如何更换物理上不再存在的磁盘驱动器?

Btrfs RAID1:如何更换物理上不再存在的磁盘驱动器?

我有一个 btrfs RAID1 系统,其状态如下:

# btrfs filesystem show
Label: none  uuid: 975bdbb3-9a9c-4a72-ad67-6cda545fda5e
        Total devices 2 FS bytes used 1.65TiB
        devid    1 size 1.82TiB used 1.77TiB path /dev/sde1
        *** Some devices missing

丢失的设备是完全故障且操作系统无法识别的磁盘驱动器。我取出了有故障的磁盘并将其送去回收。

现在我在 /dev/sdd 下安装了一个新磁盘。在网上搜索时,我找不到这种情况的说明(搜索词选择错误?)。当操作系统仍然可以访问有故障的磁盘时,有许多如何挽救 RAID 系统的示例。 btrfs replace命令需要源磁盘。

我尝试了以下方法:

# btrfs replace start 2 /dev/sdd /mnt/brtfs-raid1-b
# btrfs replace status /mnt/brtfs-raid1-b
Never started

没有错误消息,但状态表明它从未启动。我无法弄清楚我的尝试有什么问题。

我正在运行 Ubuntu 16.04 LTS Xenial Xerus,Linux 内核 4.4.0-57-generic。

更新#1

好吧,当在“非后台模式(-B)”下运行命令时,我看到一个以前没有出现过的错误:

# btrfs replace start -B 2 /dev/sdd /mnt/brtfs-raid1-b                                                                                                                     
ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/brtfs-raid1-b": Read-only file system

/mnt/brtfs-raid1-b已安装 RO(只读)。我别无选择; Btrfs 不允许我将剩余磁盘挂载为 RW(读写)。当我尝试挂载磁盘 RW 时,系统日志中出现以下错误:

BTRFS: missing devices(1) exceeds the limit(0), writeable mount is not allowed

当处于RO模式时,我似乎什么也做不了;无法更换、添加或删除磁盘。但是我没有办法将磁盘挂载为RW。还剩下什么选择?

当一个简单的磁盘出现故障时,事情不应该这么复杂。系统应该继续运行 RW 并警告我驱动器出现故障。我应该能够插入新磁盘并在其上重新复制数据,而应用程序仍然不知道磁盘问题。这才是正确的 RAID。

答案1

replace需要安装文件系统才能rw运行。

在降级的 BTRFS RAID1 文件系统中,您有一个并且只有一个rw有机会使用挂载文件系统-o degraded

   degraded
       (default: off)

       Allow mounts with less devices than the RAID profile constraints
       require. A read-write mount (or remount) may fail when there are
       too many devices missing, for example if a stripe member is
       completely missing from RAID0.

挂载后rw,找到devid丢失的设备:

btrfs filesystem show /mountpoint

用新设备替换丢失的设备:

btrfs replace start -B <devid> /dev/new-disk /mountpoint

检查状态:

btrfs replace status /mountpoint

replace将在重新启动时恢复

答案2

更新: 根据@mkudlacek 的说法,这个问题已经得到解决。

为了繁荣,这是我对为什么在 2017 年无法重建丢失驱动器的 RAID 的回答。

事实证明,这是自 2017 年初起 btrfs 的限制。要再次以 rw 方式挂载文件系统,需要修补内核。不过我还没有尝试过。因此,我打算放弃 btrfs;人们不必为了更换有故障的磁盘而修补内核。

点击以下链接了解详情:

如果截至 2020 年您仍然遇到此问题,请发表评论。我相信人们想知道这个问题是否已得到解决。

更新: 截至 2020 年 10 月 20 日,我已迁移到旧的 mdadm 和 lvm,对我的 RAID10 4x4 Tb(总空间 8 Tb)感到非常满意。它已被证明,运行良好,不占用大量资源,我对此完全信任。

答案3

将新驱动器添加到文件系统,然后btrfs device add /dev/sdd /mountpoint删除丢失的驱动器,btrfs dev del missing /mountpoint可能需要重新安装文件系统才能btrfs dev del missing工作。

答案4

btrfs replace确实是值得尝试的事情,但是关于它的调用有两个问题:它只会在您使用时显示错误-B(否则它将以状态 0 退出,就好像一切都很好,但是当您使用时您会看到“从未启动”您检查状态),无效的参数将引发不相关的错误。

例如,我认为我的磁盘没问题,但 RAID1 不知何故不同步(可能是停电,主机幸存下来,但磁盘没有备用电源,并且可能在稍微不同的时间上线)。为了检查,当我关闭磁盘 B(安装时)时,我可以正常读取数据。当我关闭磁盘 A 的电源(磁盘 B 已打开,并且文件系统已安装)时,我会收到错误并损坏数据。显然,A 盘没有问题,B 盘已损坏。但磁盘 B 似乎可以工作,所以我想重新使用它并重建。因此我想替换/dev/diskB/dev/diskB.

当我使用btrfs replace start -B /dev/diskB /dev/diskB /mnt/btrfs它时,它向我展示了ERROR: ioctl(DEV_REPLACE_START) failed on "/mnt/btrfs": Invalid argument, <illegal result value>。所以看来挂载点有问题,对吧?不,当我将第一个更改/dev/diskB为时/dev/diskA,它就起作用了。错误出在设备中,而不是挂载点中。

同样,我发现第一个参数(2)有点奇怪。也许错误是错误的,并且它可以使用设备来代替2

btrfs replace有两种操作模式:一种是使用损坏的设备作为第一个参数(之后start -B或其他),另一种是使用要复制的工作设备的模式(如果第一个选项不可用)。无论哪种情况,第二个参数都是您希望用于重建的磁盘。

文件系统是否以只读方式安装或以读写方式安装似乎并不重要。这就是为什么我怀疑它拒绝你的论点并给你一个错误的错误,而不是正确的错误。

相关内容