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

Han*_*gon 7 btrfs replace raid1 disk

我有一个 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
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试了以下方法:

# btrfs replace start 2 /dev/sdd /mnt/brtfs-raid1-b
# btrfs replace status /mnt/brtfs-raid1-b
Never started
Run Code Online (Sandbox Code Playgroud)

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

我正在运行 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
Run Code Online (Sandbox Code Playgroud)

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

BTRFS: missing devices(1) exceeds the limit(0), writeable mount is not allowed
Run Code Online (Sandbox Code Playgroud)

在 RO 模式下,我似乎什么也做不了;无法替换、添加或删除磁盘。但是我无法将磁盘安装为 RW。还剩下什么选择?

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

Han*_*gon 10

事实证明,这是 2017 年初 btrfs 的一个限制。为了让文件系统再次挂载 rw,需要修补内核。我还没有尝试过。因此,我打算远离 btrfs;人们不应该为了能够更换故障磁盘而修补内核。

点击以下链接了解详情:

如果您在 2020 年仍然遇到此问题,请发表评论。我相信人们想知道这是否已修复。

更新: 截至 2020 年 10 月 20 日,我转向了旧的 mdadm 和 lvm,并且对我的 RAID10 4x4 Tb(总空间为 8 Tb)感到非常满意。它经过验证,运行良好,不占用大量资源,我完全信任它。

  • 哇,这太疯狂了。没有人知道 RAID 的存在只是为了提高可用性? (3认同)
  • 了解其中的差异很重要。`mdadm` 没有完整性检查机制,无法自行修复发现的错误(下面的 `dm-integrity` 可能会有所帮助)。与 Btrfs 或 ZFS 等卷管理文件系统不同,Btrfs 或 ZFS 执行校验和,可以找出哪个数据副本已损坏并在用户不注意的情况下替换它。 (3认同)
  • 您好,您的回答已经失效。我只是强行移除了一个 HDD,使用降级的 RAID 启动,并且能够毫无问题地更换驱动器。内核 4.19.0-12-amd64、btrfs-progs 4.20.1-2、Debian Buster。 (3认同)

Tom*_*ale 8

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.
Run Code Online (Sandbox Code Playgroud)

rw安装,找到devid丢失的设备:

btrfs filesystem show /mountpoint
Run Code Online (Sandbox Code Playgroud)

用新设备替换丢失的:

btrfs replace start -B <devid> /dev/new-disk /mountpoint
Run Code Online (Sandbox Code Playgroud)

检查状态:

btrfs replace status /mountpoint
Run Code Online (Sandbox Code Playgroud)

replace将在重新启动时恢复

  • 抱歉,这对您没有帮助,但我确实希望它可以帮助通过 Google 访问的其他人。 (5认同)
  • @HansDeragon 我认为“-o 降级”已经存在一段时间了... (3认同)
  • 替换操作完成后,您可能需要将一些 DUP 和单个块(在替换磁盘时出现?)转换为 RAID1 配置文件:`sudo btrfs balance start -dprofiles=dup\|single,convert=raid1 -mprofiles= dup\|single,convert=raid1 /mountpoint`。使用 `sudo btrfs fi usage -T /mountpoint` 命令仔细检查。 (2认同)