btrfs raid1 未使用所有磁盘?

btrfs raid1 未使用所有磁盘?

我在 Ubuntu 16.04 上有一个带有 3 个磁盘的 Btrfs raid1。然而,似乎只有 2 个磁盘被使用,而不是全部 3 个。我应该如何解决这个问题?

root@one:~# btrfs fi sh
Label: none  uuid: 3880b9fa-0824-4ffe-8f61-893a104f3567
            Total devices 3 FS bytes used 54.77GiB
            devid    1 size 2.73TiB used 56.03GiB path /dev/sda2
            devid    2 size 2.73TiB used 56.03GiB path /dev/sdc2
            devid    3 size 2.59TiB used 0.00B path /dev/sdb3

我尝试运行转换过滤器,但 /dev/sdb3 仍然没有被使用。

root@one:~# btrfs balance start -dconvert=raid1 -mconvert=raid1 /top/raid/
Done, had to relocate 112 out of 112 chunks

root@one:~# btrfs fi df /top/raid/
Data, RAID1: total=55.00GiB, used=54.40GiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=373.06MiB
GlobalReserve, single: total=128.00MiB, used=0.00B

起初,Ubuntu服务器安装时只有1个磁盘。然后我添加了一个磁盘并转换为raid1。然后我添加了第三个磁盘/dev/sdb3并再次尝试平衡。第三个磁盘未被使用。

root@one:~# btrfs --version
btrfs-progs v4.4

我可以很好地挂载 /dev/sdb3 。

root@one:~# mount /dev/sdb3 /mnt
root@one:~# ll /mnt
total 16
drwxr-xr-x 1 root    root     74 Apr 13 09:37 ./
drwxr-xr-x 1 root    root    200 Apr 12 21:19 ../
drwxr-xr-x 1 root    root    200 Apr 12 21:19 @/
drwxr-xr-x 1 root    root    152 Apr 12 15:31 @home/
drwxrwx--t 1 root    root     36 Apr 13 09:38 @samba/

root@one:~# btr fi sh
Label: none  uuid: 3880b9fa-0824-4ffe-8f61-893a104f3567
        Total devices 3 FS bytes used 54.82GiB
        devid    1 size 2.73TiB used 56.03GiB path /dev/sda2
        devid    2 size 2.73TiB used 56.03GiB path /dev/sdc2
        devid    3 size 2.59TiB used 0.00B path /dev/sdb3

答案1

编辑

注意:btrfs 常见问题解答正如 @jeff-schaller 评论的那样(强调我的),陈述如下:

btrfs 支持 RAID-0、RAID-1 和 RAID-10。从 Linux 3.9 开始,btrfs 还支持 RAID-5 和 RAID-6,尽管该代码仍处于实验阶段。

btrfs 首先将所有设备组合到一个存储池中,然后在创建文件数据时复制这些块。 RAID-1 目前定义为“不同设备上所有数据的 2 个副本“。这与 MD-RAID 和 dmraid 不同,因为它们为 n 个设备制作了 n 个副本。在 btrfs RAID-1 中三台 1 TB 设备,我们获得 1.5 TB 的可用数据。因为每个块仅复制到 2 个设备,写入给定块仅需要写入 2 个设备;阅读只能从一本开始。

RAID-0 的定义类似,条带分布在尽可能多的设备上。 3 × 1 TB 设备可产生 3 TB 可用空间,但根本不提供冗余。

RAID-10 是建立在这些定义之上的。每个条带都准确地划分为 2 个 RAID-1 集,并且这些 RAID-1 集恰好写入 2 个设备(因此最少 4 个设备)。具有 6 × 1 TB 设备的 btrfs RAID-10 卷将产生 3 TB 可用空间,其中包含所有数据的 2 个副本。

目前我手头没有足够大的驱动器来测试这一点,但我的猜测很简单,因为您有相对较大的驱动器,所以 btrfs 只是选择将数据写入到目前为止的前两个驱动器。我预计随着更多数据写入驱动器,这种情况将来会发生变化。

如果您对我对较小驱动器的测试感兴趣:

我在具有单个 SATA 驱动器的虚拟机中安装了 Ubuntu Server 16.04 LTS,并将操作系统安装在单个 btrfs 分区上。

然后我添加了另一个 SATA 驱动器,对其进行分区,运行btrfs device add /dev/sdb1 /,然后在转换为 raid1 时平衡它btrfs balance start -dconvert=raid1 -mconvert=raid1 /

我对设备 /dev/sdc1 重复了一遍。对我来说结果是一样的 - 我有一个跨越三个驱动器的 btrfs。我还分配了一个 2GiB 文件,确实可以从所有三个磁盘访问它。我的btrfs fi sh显示如下:

Label: none  uuid: cdfe192c-36da-4a3c-bc1a-74137abbb190
    Total devices 3 FS bytes used 3.07GiB
    devid    1 size 10.00GiB used 5.25GiB path /dev/sda1
    devid    2 size 10.00GiB used 5.03GiB path /dev/sdb1
    devid    3 size 8.00GiB used 2.28GiB path /dev/sdc1

你是如何调用 mkfs.btrfs 的?你的 btrfs-progs 版本是什么?

# btrfs --version
btrfs-progs v4.4

我无法重现你的情况。如果您尝试挂载 /dev/sdb3 会发生什么?

如果您有虚拟机或备用磁盘可以进行分区,请创建 3 个分区并尝试以下操作。

我创建了一个 Ubuntu 16.04 VM,并将 /dev/vda 分为三个分区,每个分区 2GiB。

# mkfs.btrfs -d raid1 -m raid1 /dev/vda{1..3}

Label:              (null)
UUID:               0d6278f7-8830-4a73-a72f-0069cc560aaf
Node size:          16384
Sector size:        4096
Filesystem size:    6.00GiB
Block group profiles:
  Data:             RAID1           315.12MiB
  Metadata:         RAID1           315.12MiB
  System:           RAID1            12.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  3
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/vda1
    2     2.00GiB  /dev/vda2
    3     2.00GiB  /dev/vda3

# btrfs fi sh

Label: none  uuid: 0d6278f7-8830-4a73-a72f-0069cc560aaf
    Total devices 3 FS bytes used 112.00KiB
    devid    1 size 2.00GiB used 614.25MiB path /dev/vda1
    devid    2 size 2.00GiB used 315.12MiB path /dev/vda2
    devid    3 size 2.00GiB used 315.12MiB path /dev/vda3

尝试安装 /dev/vda1,向其写入文件,然后安装 /dev/vda2 或 /dev/vda3 并检查该文件是否存在(肯定应该存在)。

PS:我首先在 Arch 上使用 btrfs-progs 版本 4.10.2 进行了尝试,得到了相同的结果,但我认为 Ubuntu 16.04 可能附带了一个可能表现不同的旧版本。结果它随 v4.4 一起发布,但在文件系统创建和镜像等方面似乎表现相同。

答案2

该卷现在正在使用所有磁盘。我想拉班的猜测应该是正确的。由于前两个磁盘比第三个磁盘大,“btrfs 只是选择将数据写入到目前为止的前两个驱动器”。

root@one:~# btrfs fi sh
Label: none  uuid: 3880b9fa-0824-4ffe-8f61-893a104f3567
        Total devices 3 FS bytes used 151.00GiB
        devid    1 size 2.73TiB used 148.03GiB path /dev/sda2
        devid    2 size 2.73TiB used 148.03GiB path /dev/sdc2
        devid    3 size 2.59TiB used 8.00GiB path /dev/sdb3

root@one:~# btrfs dev usage /
/dev/sda2, ID: 1
   Device size:             2.73TiB
   Data,RAID1:            147.00GiB
   Metadata,RAID1:          1.00GiB
   System,RAID1:           32.00MiB
   Unallocated:             2.58TiB

/dev/sdb3, ID: 3
   Device size:             2.59TiB
   Data,RAID1:              8.00GiB
   Unallocated:             2.58TiB

/dev/sdc2, ID: 2
   Device size:             2.73TiB
   Data,RAID1:            147.00GiB
   Metadata,RAID1:          1.00GiB
   System,RAID1:           32.00MiB
   Unallocated:             2.58TiB

相关内容