我有一个 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
答案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
或其他),另一种是使用要复制的工作设备的模式(如果第一个选项不可用)。无论哪种情况,第二个参数都是您希望用于重建的磁盘。
文件系统是否以只读方式安装或以读写方式安装似乎并不重要。这就是为什么我怀疑它拒绝你的论点并给你一个错误的错误,而不是正确的错误。