第一次测试btrfs,看看是否可以将其用于特定项目。
我在虚拟机中工作。
使用这 3 个大小随机的小型磁盘创建了一个卷。
mkfs.btrfs -d single /dev/sdb /dev/sdc /dev/sdd mount /dev/sdb /mnt/data
添加另一个设备只是为了测试
btrfs device add /dev/sde /mnt/data
创建一堆 1GB 文件来填满磁盘
dd if=/dev/urandom of=1GB_07.bin bs=64M count=16 iflag=fullblock
我从虚拟机中删除了其中一个磁盘并重新启动
我能够以只读模式强制安装
mount -ro degraded /dev/sdb /mnt/data
我可以看到所有文件。我尝试将它们同步到另一个目录,但无法复制我创建的 1G 文件之一。有道理,它在丢失的磁盘上!
从这里开始,有没有一种方法可以“丢弃”丢失的磁盘及其上的文件,并使事物再次以读/写模式运行?我只是想将一个盒子与一堆随机大小的磁盘拼凑在一起。冗余对我来说并不重要,我不想要镜像数据的开销在这个盒子上。
如果我丢失了包含一些数据的驱动器,我只想替换/删除它并从源重新同步以获取 BTRFS 计算机上丢失文件的新副本。
那有意义吗?这可能吗?
答案1
根据您的确切描述,不,这是不可能的,因为您也会丢失部分元数据树(如果您真的很不幸,您也会丢失块树(btrfs fi df
输出中的系统块),这相当于擦除 ext4 文件系统上的超级块和部分 inode 表)。缺少元数据是您被迫以只读方式安装的部分原因。
默认情况下,BTRFS 使用dup
元数据模式。这意味着它存储每个元数据块的 2 个副本,但两者都保存在同一设备上(即使您有多个设备)。因此,如果您使用此元数据配置文件从多设备 BTRFS 卷中丢失一台设备,您将(可能)丢失一些元数据。如果元数据树损坏了,您可能会丢失文件系统的大部分内容,并且也可能根本无法挂载文件系统。
您需要做的是使用raid1
元数据模式。说真的,这对性能的影响并不像您想象的那么大,特别是如果您不定期写入文件系统,并且它将防止单个设备故障破坏整个文件系统。
这样,一旦设备出现故障:
- 用于
mount -o remount,rw,degraded
强制文件系统再次可写。 如果您不修复它,请不要让文件系统像这样运行! 说真的,如果你让文件系统降级但可写,可能会发生非常糟糕的事情。 - 以某种方式删除受故障影响的每个文件。目前,可靠地弄清楚受影响的内容并非易事,尤其是在存在一定程度的碎片化的情况下。
- 删除这些文件和目录后,请使用
btrfs device delete
删除故障设备(如果设备完全丢失,您可以使用btrfs device delete missing
删除它)。在这种情况下使用btrfs replace
可能会失败,并且不会获得更好的性能。使用btrfs device delete
还消除了新设备至少与旧设备一样大的要求(因此使您的生活更轻松,因为您不处理统一尺寸的设备)。 - 用于
btrfs device add
添加替换设备,然后btrfs balance start -musage=100
重新平衡元数据块(当您复制丢失的文件时,数据块会自然地重新平衡)。 - 使用
rsync
或类似的工具复制回现在丢失的内容。
答案2
要将故障设备替换为工作设备,请使用btrfs replace
,例如
btrfs replace start -r /dev/failed-dev /dev/new-dev /mountpoint
监视
btrfs replace status /mountpoint