我正在尝试替换 RAID1 btrfs 文件系统中的故障磁盘。
我仍然可以挂载分区rw
(大约 5 分钟延迟和大量 I/O 内核错误之后)。
我开始replace
尝试-r
让故障磁盘不影响操作速度:
-r only read from <srcdev> if no other zero-defect mirror exists. (enable this if your drive has lots of read errors, the access would be very slow)
不过,我的表现真的很差。分区为 3.6TiB,在 9.25 小时内我得到:
3.8% done, 0 write errs, 0 uncorr. read errs
按照这个速度,需要10多天才能完成!!!
由于我无法控制的情况,等待的时间太长了。
我经常看到有关故障磁盘的内核错误,平均每 5 分钟左右:
Jan 26 09:31:53 tara kernel: print_req_error: I/O error, dev sdc, sector 68044920
Jan 26 09:31:53 tara kernel: BTRFS warning (device dm-3): lost page write due to IO error on /dev/mapper/vg4TBd2-ark
Jan 26 09:31:53 tara kernel: BTRFS error (device dm-3): bdev /dev/mapper/vg4TBd2-ark errs: wr 8396, rd 3024, flush 58, corrupt 0, gen 3
Jan 26 09:31:53 tara kernel: BTRFS error (device dm-3): error writing primary super block to device 2
Jan 26 09:32:32 tara kernel: sd 2:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Jan 26 09:32:32 tara kernel: sd 2:0:0:0: [sdc] tag#0 Sense Key : Medium Error [current]
Jan 26 09:32:32 tara kernel: sd 2:0:0:0: [sdc] tag#0 Add. Sense: Unrecovered read error
Jan 26 09:32:32 tara kernel: sd 2:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 02 eb 9e 23 00 00 04 00
Jan 26 09:32:32 tara kernel: print_req_error: critical medium error, dev sdc, sector 391967000
我猜测错误是由于 btrfs 试图将会计数据写入磁盘(即使它完全空闲)。
即使是 mount ro
, btrfs 也可能会尝试写入磁盘。挂载选项-o
nologreplay
:
Warning currently, the tree log is replayed even with a read-only mount! To disable that behaviour, mount also with nologreplay.
我怎样才能加快这个过程?
这篇文章说replace
重启后会继续。
我在想:
- 取消当前
replace
- 移除故障磁盘
mount -o degraded,rw
- 鉴于这种一次性安装选项的问题,希望没有停电)
在这个时间点,我建议同时:
- 允许
replace
在不存在故障磁盘的情况下继续(最近scrub
显示好磁盘具有所有数据) - 转换数据以
single
允许rw
在过程中断电的情况下再次安装
这是一个replace
提前完成的合理计划吗?
我的计算表明,考虑到磁盘 I/O 速度,6.5 小时(而不是 10 天)是可行的。
如果您在故障驱动器上有重要数据,您想要的程序是
ddrescue
.首先,复制任何重要的东西
如果文件系统上有任何数据您不能长时间没有,请先执行此操作。
断开故障驱动器。
将文件系统挂载为只读和降级。
将您需要的数据复制到另一个位置。
然后ddrescue驱动
现在要获取其余数据,我们使用
ddrescue
.卸载 Btrfs 文件系统。不要安装它。不要将其安装为只读。
有一个格式化为 Ext4 或 Btrfs 的新驱动器,并禁用了写时复制。
运行 ddrescue 以创建从死驱动器到新驱动器的映像
Ddrescue 可能需要数小时甚至数天才能完成,具体取决于驱动器大小和速度。此外,如果驱动器故障太多,它可能永远不会完成。你允许它救援的时间取决于你。
当 ddrescue 完成处理后,移除/断开故障驱动器并且不要再次重新连接它。
将驱动器映像挂载到循环设备。
现在您应该能够使用正常的挂载命令挂载您的 Btrfs RAID 文件系统,而不是降级模式。它将自动使用循环映像设备代替丢失的驱动器。
安装 Btrfs 驱动器后,立即对其运行清理以修复 ddrescue 可能无法恢复的任何数据。
从那里你有2个选择。您可以使用循环设备继续运行 Btrfs 文件系统,也可以将循环设备替换为另一个驱动器。
这个答案提到了对故障磁盘的写入导致
replace
停止。它建议
dmsetup
在故障磁盘上设置一个 COW 设备,以便任何写入都成功。注意:在这种情况下,文件系统包含在
dmcrypt
设备中。如果不是这种情况,请参阅我关于“陷阱”和潜在数据丢失的评论。鉴于
replace
正在爬行,我做了以下事情:noauto
在/etc/fstab
在故障驱动器上禁用包含 btrfs fs 的 LVM VG:
禁用故障设备:
挂载文件系统
-o ro,degraded
(degraded
只能使用一次)检查
replace status
并看到它被暂停:安装
-o remount,rw
并看到replace
继续:在我写这篇文章的时候:
replace status
每 30 秒左右显示 0.1% 的健康进展iostat -d 1 -m <target-dev>
显示大约 145MB/s(希捷宣传 160MB/s)更新:
完成后,我注意到它
btrfs device usage /mountpoint
显示了一些Data,DUP
andMetadata,single
,而不仅仅是RAID1
,所以我重新平衡了:resize
此外,如果两个设备现在都包含 slack ,请考虑ing:我还建议您
scrub
,因为我有262016 个csum
似乎与中断有关的可纠正错误replace
。