我有一个双磁盘 btrfs 文件系统,数据和元数据都在 RAID1 中(通过 btrfs 功能,而不是 mdraid)。这些磁盘是 USB3 驱动器,顶部有 dm-crypt。其中一个磁盘出现故障(有数千个坏扇区,并且写入经常超时)。我已经获得了第三个 USB 驱动器来替换出现故障的 USB 驱动器,我该如何替换它?
答案1
这原来是皇家皮塔饼。首先,需要注意的是,btrfs 现在有一个适当的替换命令,这比添加新的、删除失败的命令要好得多。
首先,首先对新磁盘进行分区并在其上设置 dm-crypt。继续解锁吧。
如果你的磁盘没有写入超时(显然每个需要 360 秒!),你可以执行一个简单的操作:
btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid \
/dev/mapper/luks-NEW-disk-uuid /mount/path
然而,这最终会对坏磁盘进行一些例行写入,如果这些导致超时,您将看到大约 30 秒的快速复制,然后是 6-12 分钟的空闲,等待超时。
为了避免对其进行写入,可以使用设备映射器设置快照。读取将转到底层坏设备(读取基本上没问题);写入将转到写入时复制 (COW) 存储。首先,您需要一个适当大的块设备用于 COW 存储。我为其创建了一个新的逻辑卷 ( Watt-sdj1_dmsnap
)。任何块设备都应该可以工作——即使是循环设备也应该可以。我个人建议使用持久磁盘,以防万一出现问题,但如果您生活在危险之中并且有足够的 RAM,那么 RAM 磁盘就可以了。
我的需要约 1.7GB 的 COW 空间(从 3TB 驱动器上移动 2.24 TiB)。我建议慷慨地使用 COW 空间;用完可能是一件坏事,一旦用完,你就可以将其全部释放。
接下来,您需要卸载 btrfs 文件系统(如果已安装),并锁定(停止)dm-crypt 设备。我将快照放在加密下方,因为我不希望将未加密的数据写入磁盘。
就我而言,分区是/dev/sdj1
.首先,为了避免任何错误,将其设置为只读:
blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj
(您可以稍后使用 重新设置--setrw
)。现在,实际设置快照:
dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"
为了快速解释这意味着什么,设备映射器表的格式如下:起始扇区 扇区数 目标类型 目标参数。起始扇区为0;扇区数与 sdj1 的大小相同(毕竟我们想要完成整个事情);目标类型是快照。快照目标有几个参数:源开发 牛开发者 模式 块大小。我们提供的源设备为/dev/sdj1
; COW 设备是我创建的逻辑卷; PO 模式意味着p持久(元数据写入磁盘,因此可以在重新启动后进行备份)并且哦verflow(如果我们向快照写入大量数据,则可以进行恢复)。块大小是快照的粒度;如果我们写入一个字节,该字节周围的整个块都将被复制(并消耗快照中的空间)。 8是4K,所以不会有对齐问题。
现在,最后再次解锁设备 - 但不是解锁/dev/sdj1
,而是解锁/dev/mapper/sdj_divert
。然后再次挂载 btrfs 文件系统。
您可以使用以下命令检查快照使用情况dmsetup status sdj_divert
;应该给出类似的内容(但斜杠之前的数字要小得多):
0 5860524928 snapshot 914216/545259520 3568
前三项是起始扇区、扇区数量和目标类型。下一个数字是使用的扇区数(斜杠之前),然后是扇区总数(斜杠之后)。这只是所用空间的一小部分。最终的数字是用于元数据的扇区数,它已经包含在使用的数字中。
btrfs replace start
现在,最后,您可以使用答案顶部的简单命令。那会立即返回;通过运行观察状态btrfs replace status /mount/path
。
替换完成后,确认损坏的设备已从文件系统中删除(例如,btrfs fi show /mount/path
),然后您可以锁定/关闭故障驱动器,然后删除快照(dmsetup remove sdj_divert
)。然后你可以释放 COW 空间(如果你偏执的话,在擦拭它之后)。
最后还有一个技术上可选的步骤:我的替换设备更大,但 btrfs 尚未使用额外的空间。为了使其可供 btrfs 使用,请在btrfs fi show
输出中查找 devid,然后运行
btrfs fi resize DEVID:max /mount/path
那应该几乎是即时的。