Ubuntu

btrfs raid1 沒有使用所有磁碟?

  • April 15, 2017

我在 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

編輯

注意:btrfs FAQ聲明如下,由@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 個副本。在三個 1 TB 設備上的 btrfs RAID-1 中,我們得到 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 驅動器的 VM 中安裝了 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 一起提供,但在文件系統創建和鏡像等方面似乎表現相同。

引用自:https://unix.stackexchange.com/questions/358770