Linux BTRFS-转换为带有故障驱动器的单个驱动器


12

少量背景故事:

我有一个小型媒体文件系统,上面存储着用于HTPC设置的各种电影和电视节目。最初是使用btrfs1TB WD外部驱动器设置的。

后来,我决定购买另一个驱动器,以提供此文件系统RAID1镜像功能。该驱动器是希捷梭子鱼(2TB,BARRACUDA 7200.14系列)。不幸的是,这不是驱动器的好选择。尽管BTRFS可以纠正这些错误,但该驱动器很快就开始产生大量的读取错误。

最近,从该驱动器读取的错误数量激增,其状况稳定地恶化。BTRFS现在开始崩溃:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

我想从RAID1阵列中删除故障的驱动器,并在单个驱动器上恢复无冗余。不幸的是,似乎缺少有关如何执行此操作的文档。

我知道可以执行以下操作:

sudo btrfs balance start -dconvert=single /media

可以将数据配置文件转换为single模式,但是我不确定仅将数据放置在何处。由于其中一个驱动器发生故障,我希望能够确保BTRFS不会尽职尽责地擦除好驱动器上的所有数据,并将单个副本放在坏驱动器上-相反,我想简单地就像其他驱动器不存在一样(例如,转换回我的旧设置)

这不起作用:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

我是什么做的?帮助将不胜感激。

TL; DR:从BTRFS中的1个驱动器开始single,添加了另一个驱动器,使其成为它RAID1,另一个驱动器现在出现错误,我该如何只返回一个驱动器(特别是已知的良好驱动器)single


更新:尝试dconvert=single仅执行一个操作就可以完成我担心的操作,并删除已知的正确副本。:(
eeeeeta

Answers:


11

好的,我在Trello链接的帮助下找到了答案。如果其他人想要这样做,请按以下步骤进行。

程序

从包含两个磁盘的RAID1阵列中,一个磁盘/dev/sda有故障,另一个磁盘是/dev/sdc已知的良好磁盘:

  1. 禁用此阵列的自动挂载/etc/fstab重新启动。基本上,我们希望btrfs忘记该数组的存在,因为存在一个错误,即使拔出该驱动器,它仍会尝试使用其中一个驱动器。
  2. 现在您的阵列已卸载,执行:

    echo 1 | sudo tee /sys/block/sda/device/delete

    sda错误的设备名称替换。这会导致磁盘旋转(您应该在dmesg中进行验证)并变得无法访问内核。

    或者:只需在启动前将驱动器从计算机中取出!我选择不选择此方法,因为上面的方法对我来说很好。

  3. 使用-o degraded模式挂载阵列。
  4. 从开始进行重新平衡操作sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint。这将重组已知正常驱动器上的盘区,将其转换为single(非RAID)。根据驱动器的速度和阵列的大小,这将花费几乎一天的时间。(我的有〜700 GiB,并以每分钟1 1GiB块的速度重新平衡)幸运的是,此操作可以暂停,并且在阵列出现时将保持联机。
  5. 完成此操作后,您可以发出sudo btrfs device remove missing /mountpoint以删除“丢失”的故障设备。
  6. 开始第二次重新平衡,sudo btrfs balance start -mconvert=dup /mountpoint以恢复元数据冗余。这在我的系统上需要几分钟。
  7. 你完成了!您的阵列现在single处于模式,所有冗余都已删除。
  8. 将有故障的驱动器带到外面,然后用锤子将其打败。

故障排除

  • 求助,btrfs试图写入我的故障磁盘,出错,并强制其为只读!
    • 您是否按照第1步进行操作,并在继续之前重新启动?btrfs可能仍认为您已分解的驱动器存在。重新引导将使btrfs忘记任何错误,并让您继续。

2
这行不通。我使用的是Ubuntu 16.04(内核4.4)。dmesg说“缺少的设备(1)超过限制(0),不允许进行可写安装”。因此,我被困在“安装-o降级”步骤
HelloSam

@HelloSam:也许这是错误。参见bbs.archlinux.org/viewtopic.php?id=210541
jaltek

考虑,soft在每个之后添加convert=以跳过已经具有目标概要文件(应该是所有概要文件)的块。
汤姆·黑尔

9

感谢您的帖子。我有一个想法,我可以测试RAID,将驱动器从热交换托架中弹出,使用另一个驱动器,然后再将RAID驱动器弹出。回想起来,这是个坏主意,现在我需要我的热交换托架。

这是我发现的。作为根:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

请注意为每个驱动器列出的设备。brtrfs平衡专家向我介绍了devid选项,花了几次尝试找出过滤器的工作方式(最初尝试devid = / dev / sdb1)。因此,您的首次尝试将是这样的。

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

这给了我一个错误。

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

这是dmesg的错误:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

所以这是最后的工作:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

希望这可以帮助其他人。


如果您只想用一个驱动器替换另一个驱动器,则可以使用来完成btrfs replace
dma_k

一年前左右对我有用,但今天不起作用。我键入的内容无关紧要devid=,将得到的单个数据放置在设备1上
。– YtvwlD

还要签出-sconvert以转换系统块。
汤姆·黑尔

考虑使用|而不是,平衡手册页上所述:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
汤姆·黑尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.