带有不同大小磁盘的多设备BTRFS文件系统

我有一个由一个500GB磁盘组成的现有BTRFS文件系统,我刚刚购买了一个2TB磁盘来增加我的家庭服务器的存储容量,我想将新磁盘添加到现有的文件系统。 据我所知,似乎没有BTRFS设置可以处理不同大小的磁盘,而不会浪费大小磁盘之间的大小差异,但我是BTRFS的新手,我可能错过了一些东西,所以有一个设置这可以让我在文件系统中结合两个磁盘而不浪费空间?

Btrfs可以为数据和元数据使用不同的raid级别:

对于元数据(目录等)来说默认(即使对于一个磁盘)是raid1,对于数据是raid0。

如果你没有改变这个,那么添加第二张光盘并运行重新平衡就没有问题了。 因为只有元数据将被复制到两个光盘(您可以使用btrfs filesystem df /查看您的元数据大小)。 只要知道,如果你的任何一个磁盘失败,你会丢失数据。

因为2TB的磁盘比500G大得多,如果你添加新的磁盘,那么它可能会给你更好的机会,然后删除旧的(一个特定的驱动器失败的可能性远远低于两个驱动器失败)。

如果您计划在稍后使用RAIDarrays(使用更多类似大小的驱动器),则可能需要在raid1上为数据和元数据重新创build新驱动器上的文件系统,然后复制所有内容。 那么以后当你有更多的钱购买第二个2TB的驱动器。

ps:在单一驱动器上使用raid1意味着数据将被存储在一个驱动器上的两个位置(以防止损坏),并将减less您的存储空间(这是一个非常好的元数据的主意)。

pss:严重的是,不要试图将raid1用于元数据。 psss:btrfs有一个非常好的机会可以dynamic地改变raid级别。

这取决于您用于多设备Btrfs文件系统的数据块的configuration文件。

  • 当您使用RAID0(数据块的默认值)时,每个磁盘只能填充到arrays中最小磁盘的容量。

  • 当您对数据块使用“单个”configuration文件时,每个磁盘将被填充满容量。 例如mkfs.btrfs -d single /dev/sda /dev/sdb

我有一个2TB和3TB磁盘的文件服务器。 它从USB闪存驱动器启动Ubuntu 12.10。 首先,我创build了Btrfs文件系统,但没有-d single选项:

 mkfs.btrfs /dev/sda /dev/sdb 

结果是我只能存储大约4TB(3.45个二进制TB文件数据)。

 # btrfs fi show Label: none uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465 Total devices 2 FS bytes used 3.22TB devid 2 size 2.73TB used 1.82TB path /dev/sdb devid 1 size 1.82TB used 1.82TB path /dev/sda # btrfs fi df /mnt/btrfs1/ Data, RAID0: total=3.45TB, used=3.22TB Data: total=8.00MB, used=0.00 System, RAID1: total=8.00MB, used=264.00KB System: total=4.00MB, used=0.00 Metadata, RAID1: total=94.00GB, used=4.29GB Metadata: total=8.00MB, used=0.00 # df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb 4.6T 3.3T 241G 94% /mnt/btrfs1 

注意3TB驱动器used 1.82TB

然后我使用“balance”命令将数据块从RAID0转换为“单个”configuration文件:

 btrfs balance start -dconvert=single /mnt/btrfs1 

平衡4TB数据需要很长时间(大约30个小时)。 但完成后,我可以使用完整的5TB(4.36二进制TB文件数据)。

 # btrfs fi show Label: none uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465 Total devices 2 FS bytes used 4.34TB devid 2 size 2.73TB used 2.73TB path /dev/sdb devid 1 size 1.82TB used 1.82TB path /dev/sda # btrfs fi df /mnt/btrfs1/ Data: total=4.36TB, used=4.34TB System, RAID1: total=40.00MB, used=500.00KB System: total=4.00MB, used=0.00 Metadata, RAID1: total=94.00GB, used=4.01GB Metadata: total=8.00MB, used=0.00 # df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb 4.6T 4.4T 27G 100% /mnt/btrfs1 

我在Ubuntu中使用了btrfs中的多个设备,它工作得很好。 请记住,btrfs实际上并没有实现标准的RAID级别。 它实现可选的条带化和镜像,但不是真正的RAID。

在btrfs中可以组合不同大小的驱动器。
但是目前btrfs并没有处理ENOSPC(设备上没有空间)。

例如,我在RAID0(条纹)arrays中安装了3个驱动器。 1x500GB,1x250GB,1x160GB。
你会认为你将有800-900GB的磁盘空间。

这是df -h显示的内容:
/ dev / sdf 848G 615G 234G 73%/ media / btrfs

但是我不能在数组上存储更多的数据。 (没有剩余空间)

btrfs filesystem df /media/btrfs显示了我这个:
数据:总数= 612.51GB,使用= 612.51GB
元数据:总数= 1.62GB,使用= 990.73MB
系统:总数= 12.00MB,使用= 48.00KB

即使重新平衡也没有帮助。

在邮件列表中,我看到了这个callback:
最小驱动器的大小*arrays中驱动器的数量
(虽然我有更多的空间:612GB而不是160GB * 3 = 480GB)

所以在目前的发展状况下,即使btrfs在一个数组中支持不同的大小,你也将无法使用所有的空间。

我正在使用Ubuntu 10.10和2.6.35-22-通用内核。

更新:下面的答案是在Linux 3.0发布之前编写的。 Linux 3.0包含准循环补丁。

在进行数据镜像或分条时,需要将第二个镜像或条带块分配到具有空闲空间的其他设备上。 BTRFS以循环方式将块分配给设备,如果您有不同大小的设备,会导致空间丢失。

pipe道中有一个准循环补丁来改善这一点。 当然,如果你有一个500GB和一个2TB的磁盘,在不同的设备上configuration所有的块是不可能的。 该修补程序更适用于1 x 1TB + 2 x 500GB的情况,其中每个小磁盘应该更喜欢使用大磁盘而不是其他小磁盘进行镜像/条带化。

在你的情况下,我只是使用“单一”模式为你的数据( mkfs.btrfs -d single )。 在这种模式下块不是配对的,所以我认为不同尺寸的设备没有问题。 我还没有testing过。

这个问题只适用于btrfs-raid1设置,从Gotchas页面:

  • 分配是在循环的基础上完成的。 如果您在由不匹配的驱动器(不同大小的卷)组成的卷上执行raid1策略,则较小的卷可能会填满,而在单个最大的驱动器上留出大量空间。 如果 'df'和'btrfs filesystem df [mountpoint]'之间有任何差异,并且后者命令也显示“Data”行上的“total”和“used”相同,则可以validation这是一个问题。 重新平衡可以减轻这个问题。 (2.6.33)
    • 如果您的音量确实如此填满,重新平衡可能会很快导致ENOSPC(“设备上遗留的错误无法保存”)oops。 你可能不得不删除一个相对较大的文件来解决这个僵局,那么重新平衡就会成功。 (2.6.33)
    • 重新平衡可能会导致CPU使用时间过长。 (2.6.34和2.6.35)