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)感到非常满意。它经过验证,运行良好,不占用大量资源,我完全信任它。
replace
需要挂载文件系统rw
才能运行。
在降级的 BTRFS RAID1 文件系统中,您只有一次机会rw
使用-o degraded
以下方法挂载文件系统:
Run Code Online (Sandbox Code Playgroud)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
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)