0

I've added a device to my existing Btrfs file system recently, but it doesn't report the new device as having even allocated any space for the data. Take a look:

Before I started:

# btrfs fi show /
Label: 'LINUX'  uuid: f0b4d012-91d8-43bd-90b5-e398a012ccff
    Total devices 1 FS bytes used 126.72GiB
    devid    1 size 272.40GiB used 128.03GiB path /dev/sda3
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 273.4G  0 disk 
├─sda1   8:1    0     1M  0 part 
├─sda2   8:2    0     1G  0 part /boot
└─sda3   8:3    0 272.4G  0 part /pool
sdb      8:16   0  68.3G  0 disk 

So now I want to add /dev/sdb:

# btrfs device add /dev/sdb /
# btrfs balance start --full-balance /

< an hour or so later ... >

# btrfs fi usage /
Overall:
    Device size:         340.73GiB
    Device allocated:    128.03GiB
    Device unallocated:  212.70GiB
    Device missing:          0.00B
    Used:                126.68GiB
    Free (estimated):    213.10GiB  (min: 213.10GiB)
    Data ratio:               1.00
    Metadata ratio:           1.00
    Global reserve:      338.14MiB  (used: 0.00B)

Data,single: Size:126.00GiB, Used:125.60GiB
   /dev/sda3     126.00GiB

Metadata,single: Size:2.00GiB, Used:1.08GiB
   /dev/sda3       2.00GiB

System,single: Size:32.00MiB, Used:16.00KiB
   /dev/sda3      32.00MiB

Unallocated:
   /dev/sda3     144.37GiB
   /dev/sdb       68.33GiB

Huh, I thought that was supposed to do it, lets try this:

# btrfs balance start -dconvert=single -mconvert=raid1 /

< an hour or so later ... >

# btrfs fi show /
Label: 'LINUX'  uuid: f0b4d012-91d8-43bd-90b5-e398a012ccff
    Total devices 2 FS bytes used 126.72GiB
    devid    1 size 272.40GiB used 128.03GiB path /dev/sda3
    devid    2 size 68.33GiB used 2.03GiB path /dev/sdb
# btrfs fi usage /
Overall:
    Device size:         340.73GiB
    Device allocated:    130.06GiB
    Device unallocated:  210.67GiB
    Device missing:          0.00B
    Used:                127.80GiB
    Free (estimated):    211.03GiB  (min: 105.69GiB)
    Data ratio:               1.00
    Metadata ratio:           2.00
    Global reserve:      338.47MiB  (used: 0.00B)

Data,single: Size:126.00GiB, Used:125.64GiB
   /dev/sda3    126.00GiB

Metadata,RAID1: Size:2.00GiB, Used:1.08GiB
   /dev/sda3      2.00GiB
   /dev/sdb       2.00GiB

System,RAID1: Size:32.00MiB, Used:16.00KiB
   /dev/sda3     32.00MiB
   /dev/sdb      32.00MiB

Unallocated:
   /dev/sda3    144.37GiB
   /dev/sdb      66.30GiB

What the heck?

Kernel said anything during balance? Just a whole lot of this:

Feb 13 21:55:06 localhost kernel: BTRFS info (device sda3): found 7541 extents
Feb 13 21:55:06 localhost kernel: BTRFS info (device sda3): relocating block group 621927202816 f
Feb 13 21:55:18 localhost kernel: BTRFS info (device sda3): found 7020 extents
Feb 13 21:55:28 localhost kernel: BTRFS info (device sda3): found 7020 extents
Feb 13 21:55:28 localhost kernel: BTRFS info (device sda3): relocating block group 620853460992 f
Feb 13 21:55:39 localhost kernel: BTRFS info (device sda3): found 2540 extents
Feb 13 21:55:48 localhost kernel: BTRFS info (device sda3): found 2540 extents
Feb 13 21:55:48 localhost kernel: BTRFS info (device sda3): relocating block group 619779719168 f
Feb 13 21:55:58 localhost kernel: BTRFS info (device sda3): found 3971 extents
Isabell Cowan
  • 123
  • 1
  • 9
  • # btrfs balance start -dconvert=single converts the data into single drive mode. So... you got the expected behaviour there. Did you want to have a striping or mirroring btw? – Marc Stürmer Apr 22 '17 at 22:32
  • No, I did not intend to do any striping or mirroring. I was under the mistaken impression that BtrFS would balance the data between each device proportional to device size. I realize no it will not allocate any data on sdb until sda3 has <= 66.30GiB unallocated space. – Isabell Cowan Apr 24 '17 at 22:33
  • Balancing data between each device is striping, aka RAID 0. – Marc Stürmer Apr 26 '17 at 21:27

1 Answers1

0

Actually, -dconvert=single will balance data (as you may expect) between devices without striping it. But documentation says that allocation is "linear". I don't really know what it means but it could be that one device will be used only when the other one is full.

If you go to this page : https://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices#Filesystem_creation , you may read this…

# Use full capacity of multiple drives with different sizes (metadata mirrored, data not mirrored and not striped)
mkfs.btrfs -d single /dev/sdb /dev/sdc

(the important part is "full capacity")

As far as I'm concerned, I have two PCs with this configuration (single data, raid1 metadata). The first one makes use of 3 drives for data whereas the second PC only uses one drive for data and 3 drives for metadata. I still don't know why but I hope it will be documented in the futur.