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

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

我有一个现有的 BTRFS 文件系统,由一个 500GB 磁盘组成,我刚刚购买了一个 2TB 磁盘来增加家庭服务器的存储容量,我想将新磁盘添加到现有文件系统中。从我读到的内容来看,似乎没有 BTRFS 设置可以处理不同大小的磁盘,而不会浪费大磁盘和小磁盘之间的大小差异,但我对 BTRFS 还不熟悉,我可能错过了一些东西,那么有没有一种设置可以让我在文件系统中合并两个磁盘而不会浪费空间?

答案1

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

默认值(即使对于一个磁盘)是用于元数据(目录等)的 raid1 和用于数据的 raid0。

如果您不更改这一点,那么添加第二张光盘并运行重新平衡可能没有问题。因为只有元数据会被复制到两个光盘(您可以使用 查看元数据大小btrfs filesystem df /)。请注意,如果您的任何一个磁盘发生故障,您就会丢失数据。

因为 2TB 磁盘比 500G 大太多了,所以如果你添加新的磁盘然后移除旧的磁盘,也许会给你更好的机会(一个特定驱动器发生故障的几率比任何一个驱动器发生故障的几率要小得多)。

如果您计划稍后使用 raid 阵列(具有更多类似大小的驱动器),您可能需要使用 raid1 在新驱动器上重新创建文件系统,以存储数据和元数据,然后复制所有内容。然后,当您有更多钱时,再购买第二个 2tb 驱动器。

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

pss:说真的,不要试图不使用 raid1 作为元数据。psss:btrfs 很有可能获得动态更改 raid 级别的能力。

答案2

这取决于您对多设备 Btrfs 文件系统的数据块使用了什么配置文件。

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

  • 当您对数据块使用“单一”配置文件时,每个磁盘都将被填满至其全部容量。例如mkfs.btrfs -d single /dev/sda /dev/sdb

我有一台带有 2TB 和 3TB 磁盘的文件服务器。它从 USB 闪存驱动器启动 Ubuntu 12.10。首先,我创建了 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

请注意used 1.82TB3TB 驱动器。

然后我使用“balance”命令将数据块从 RAID0 转换为“single”配置文件:

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

答案3

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

答案4

在 btrfs 中可以组合不同大小的驱动器。
但目前 btrfs 不能很好地处理 ENOSPC(设备上没有剩余空间)。

例如,我在 RAID0(条带化)阵列中安装了 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

即使重新平衡也无济于事。

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

因此,在目前的开发状态下,尽管 btrfs 确实支持一个阵列中的不同大小,但您很可能无法使用所有拥有的空间。

我正在使用带有 2.6.35-22-generic 内核的 Ubuntu 10.10。

相关内容