“单”模式下磁盘故障后 BTRFS 能否恢复/继续?

“单”模式下磁盘故障后 BTRFS 能否恢复/继续?

第一次测试btrfs,看看是否可以将其用于特定项目。

我在虚拟机中工作。

  1. 使用这 3 个大小随机的小型磁盘创建了一个卷。

    mkfs.btrfs -d single /dev/sdb /dev/sdc /dev/sdd
    mount /dev/sdb /mnt/data
    
  2. 添加另一个设备只是为了测试

    btrfs device add /dev/sde /mnt/data 
    
  3. 创建一堆 1GB 文件来填满磁盘

    dd if=/dev/urandom of=1GB_07.bin bs=64M count=16 iflag=fullblock
    
  4. 我从虚拟机中删除了其中一个磁盘并重新启动

  5. 我能够以只读模式强制安装

    mount -ro degraded /dev/sdb /mnt/data
    

我可以看到所有文件。我尝试将它们同步到另一个目录,但无法复制我创建的 1G 文件之一。有道理,它在丢失的磁盘上!

从这里开始,有没有一种方法可以“丢弃”丢失的磁盘及其上的文件,并使事物再次以读/写模式运行?我只是想将一个盒子与一堆随机大小的磁盘拼凑在一起。冗余对我来说并不重要,我不想要镜像数据的开销在这个盒子上

如果我丢失了包含一些数据的驱动器,我只想替换/删除它并从源重新同步以获取 BTRFS 计算机上丢失文件的新副本。

那有意义吗?这可能吗?

答案1

根据您的确切描述,不,这是不可能的,因为您也会丢失部分元数据树(如果您真的很不幸,您也会丢失块树(btrfs fi df输出中的系统块),这相当于擦除 ext4 文件系统上的超级块和部分 inode 表)。缺少元数据是您被迫以只读方式安装的部分原因。

默认情况下,BTRFS 使用dup元数据模式。这意味着它存储每个元数据块的 2 个副本,但两者都保存在同一设备上(即使您有多个设备)。因此,如果您使用此元数据配置文件从多设备 BTRFS 卷中丢失一台设备,您将(可能)丢失一些元数据。如果元数据树损坏了,您可能会丢失文件系统的大部分内容,并且也可能根本无法挂载文件系统。

您需要做的是使用raid1元数据模式。说真的,这对性能的影响并不像您想象的那么大,特别是如果您不定期写入文件系统,并且它将防止单个设备故障破坏整个文件系统。

这样,一旦设备出现故障:

  1. 用于mount -o remount,rw,degraded强制文件系统再次可写。 如果您不修复它,请不要让文件系统像这样运行! 说真的,如果你让文件系统降级但可写,可能会发生非常糟糕的事情。
  2. 以某种方式删除受故障影响的每个文件。目前,可靠地弄清楚受影响的内容并非易事,尤其是在存在一定程度的碎片化的情况下。
  3. 删除这些文件和目录后,请使用btrfs device delete删除故障设备(如果设备完全丢失,您可以使用btrfs device delete missing删除它)。在这种情况下使用btrfs replace可能会失败,并且不会获得更好的性能。使用btrfs device delete还消除了新设备至少与旧设备一样大的要求(因此使您的生活更轻松,因为您不处理统一尺寸的设备)。
  4. 用于btrfs device add添加替换设备,然后btrfs balance start -musage=100重新平衡元数据块(当您复制丢失的文件时,数据块会自然地重新平衡)。
  5. 使用rsync或类似的工具复制回现在丢失的内容。

答案2

要将故障设备替换为工作设备,请使用btrfs replace,例如

btrfs replace start -r /dev/failed-dev /dev/new-dev /mountpoint

监视

btrfs replace status /mountpoint

相关内容