我有一个由一个500GB磁盘组成的现有BTRFS文件系统,我刚刚购买了一个2TB磁盘以增加家庭服务器的存储容量,并且我想将新磁盘添加到现有文件系统中。根据我的阅读,似乎没有BTRFS安装程序可以处理不同大小的磁盘而不会浪费较大磁盘和较小磁盘之间的大小差异,但是我是BTRFS的新手,所以我可能错过了一些东西,因此是否有安装程序那可以让我在文件系统中合并两个磁盘而又不浪费空间?
我有一个由一个500GB磁盘组成的现有BTRFS文件系统,我刚刚购买了一个2TB磁盘以增加家庭服务器的存储容量,并且我想将新磁盘添加到现有文件系统中。根据我的阅读,似乎没有BTRFS安装程序可以处理不同大小的磁盘而不会浪费较大磁盘和较小磁盘之间的大小差异,但是我是BTRFS的新手,所以我可能错过了一些东西,因此是否有安装程序那可以让我在文件系统中合并两个磁盘而又不浪费空间?
Answers:
Btrfs可以对数据和元数据使用不同的raid级别:
默认值(即使是一个磁盘)的默认值是raid1(用于元数据(目录等))和raid0(用于数据)。
如果您没有进行更改,那么添加第二张光盘并进行重新平衡可能没有问题。因为只有元数据会被复制到两张光盘上(您可以使用来查看元数据的大小btrfs filesystem df /
)。请注意,如果您的任何一个磁盘都发生故障,则会丢失数据。
因为2tb磁盘比500g大得多,所以如果添加新的磁盘然后删除旧的磁盘,则可能会给您带来更好的赔率(一个特定驱动器发生故障的可能性比任何一个驱动器的损失都小得多失败)。
如果您计划以后使用RAID阵列(具有更多类似大小的驱动器),则可能希望使用raid1在新驱动器上为数据和元数据重新创建文件系统,然后将所有内容复制过来。然后,当您有更多钱时,再购买第二个2TB驱动器。
ps:在单个驱动器上使用raid1意味着数据将存储在一个驱动器上的两个位置(以防止损坏),并会减少您的存储空间(这对于元数据而言确实是个好主意)。
pss:认真地说,不要试图不要将raid1用于元数据。psss:btrfs非常有可能获得动态更改突袭等级的能力。
这取决于您对多设备Btrfs文件系统的数据块使用什么配置文件。
当使用RAID0(数据块的默认值)时,每个磁盘只能装满阵列中最小磁盘的容量。
当对数据块使用“单个”配置文件时,每个磁盘都将被填满。例如mkfs.btrfs -d single /dev/sda /dev/sdb
我有一个具有2TB和3TB磁盘的文件服务器。它从USB闪存驱动器启动Ubuntu 12.10。首先,我创建了不带-d single
选项的Btrfs文件系统:
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.82TB
3TB驱动器的。
然后,我使用“ balance”命令将数据块从RAID0转换为“单个”配置文件:
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
可以在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通用内核的Ubuntu 10.10。
更新:以下答案是在Linux 3.0发布之前编写的。Linux 3.0包含准循环补丁。
进行数据镜像或分条时,需要在具有可用空间的另一台设备上分配第二个镜像或条带块。BTRFS以循环方式将块分配给设备,如果您拥有不同大小的设备,这可能会导致空间丢失。
管道中有一个准循环机制补丁可以对此进行改进。当然,如果您有500GB和2TB磁盘,仍然不可能将不同设备上的所有块配对。该补丁程序更适合于1 x 1TB + 2 x 500GB之类的情况,其中每个小磁盘都应该使用大磁盘而不是其他小磁盘进行镜像/剥离。
在您的情况下,我只将“单”模式用于您的数据(mkfs.btrfs -d single
)。块不是在那种模式下配对的,所以我认为使用不同大小的设备不会有问题。我还没有测试过。
此问题仅适用于Gotchas页面中的btrfs-raid1设置:
- 分配是循环进行的。如果您在由不匹配的驱动器(不同大小的卷)组成的卷上执行raid1策略,则较小的卷可能会填满,同时在单个最大的驱动器上留有大量空间。可以验证这是一个问题,如果有任何差异“DF”和“的btrfs文件系统DF [挂载点]” AND 如果后者命令还示出了“用过的”“总”和都对“数据”线相同的。重新平衡可以缓解此问题。(2.6.33)
- 如果您的音量确实以这种方式填满,则重新平衡可能会迅速导致ENOSPC(“设备上没有剩余错误错误”)。您可能必须删除一个相对较大的文件才能解决此僵局,然后重新平衡会成功。(2.6.33)
- 重新平衡可能会导致很长时间内迅速占用大量CPU。(2.6.34和2.6.35)