BtrfsでRAID5を使う

btrfsは複数のデバイスから1つのプールを作成することができる。プールはbtrfsが備えるRAID機能を用いることができる。今回は6本のディスクでRAID5を使用したプールを作成する。

btrfsについてはBtrfsの薄い本を参考にした。

github.com

追加したディスクの判別

fdisk -lでディスクの情報を表示してDisk Modelで追加したディスクか判別した。ディスクは秋葉原のショップインバースで500GB1200円で売られていたものを5本と、別の日に特価で640GB1200円の1本の合計6本を追加した。通常RAIDはディスクのサイズを揃えて置かないと容量が無駄になるがbtrfsのRAIDは容量が異なっていてもいい感じに使用してくれる。

hoge@hoge-desktop:~$ sudo fdisk -l

--- 中略 ---
ディスク /dev/sda: 596.17 GiB, 640135028736 バイト, 1250263728 セクタ
Disk model: ST9640320AS     
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

ディスク /dev/sdb: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: ST500LT012-1DG14
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

ディスク /dev/sdc: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: ST500LT012-1DG14
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト


ディスク /dev/sdd: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: ST500LM021-1KJ15
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xc28aee7b

デバイス   起動 開始位置  最後から    セクタ サイズ Id タイプ
/dev/sdd1           2048 976769023 976766976 465.8G  7 HPFS/NTFS/exFAT

ディスク /dev/sde: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: ST500LT012-1DG14
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

--- 中略 ---

ディスク /dev/sdg: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: ST500LT012-1DG14
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

RAID5でプールを作成する

最初にbtrfs関係のパッケージを追加する。

sudo apt install btrfs-progs -y

-dでraid5を指定 -mはメタデータの設定でこちらもraid5にしておく データはRAID5でメタデータはRAID1みたいな構成もできる。

hoge@hoge-desktop:~$ mkfs.btrfs -m raid5 -d raid5 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdg
btrfs-progs v5.10.1 
See http://btrfs.wiki.kernel.org for more information.

probe of /dev/sda failed, cannot detect existing filesystem.
ERROR: use the -f option to force overwrite of /dev/sda

エラーが出て失敗。gdiskでGPTとMBRを消す。

hoge@hoge-desktop:~$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

Command (? for help): m
b   back up GPT data to a file
c   change a partition's name
d   delete a partition
i   show detailed information on a partition
l   list known partition types
n   add a new partition
o   create a new empty GUID partition table (GPT)
p   print the partition table
q   quit without saving changes
r   recovery and transformation options (experts only)
s   sort partitions
t   change a partition's type code
v   verify disk
w   write table to disk and exit
x   extra functionality (experts only)
?   print this menu

Command (? for help): d
No partitions

Command (? for help): x

Expert command (? for help): z
About to wipe out GPT on /dev/sda. Proceed? (Y/N): y
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Blank out MBR? (Y/N): y

再実行したものの今度はsddにdosパーティションがあるので失敗(これはfdisk -lでみた時点でわかっていた)。これもgdiskで消す。

hoge@hoge-desktop:~$ sudo mkfs.btrfs -m raid5 -d raid5 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdg
btrfs-progs v5.10.1 
See http://btrfs.wiki.kernel.org for more information.

/dev/sdd appears to contain a partition table (dos).
ERROR: use the -f option to force overwrite of /dev/sdd

消したあとにもう一度mkfs.btrfsを実行。 今度は正常に作成することができた。465.76GiB*5+596.17GiB(Total 2924.97GiB)の変則的な構成だと 2.86TiBになった。

hoge@hoge-desktop:~$ sudo mkfs.btrfs -m raid5 -d raid5 /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdg
btrfs-progs v5.10.1 
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ba3f187a-bfb3-47b5-aa02-334b15f2ea33
Node size:          16384
Sector size:        4096
Filesystem size:    2.86TiB
Block group profiles:
  Data:             RAID5             5.00GiB
  Metadata:         RAID5           853.12MiB
  System:           RAID5            13.12MiB
SSD detected:       no
Incompat features:  extref, raid56, skinny-metadata
Runtime features:   
Checksum:           crc32c
Number of devices:  6
Devices:
   ID        SIZE  PATH
    1   596.17GiB  /dev/sda
    2   465.76GiB  /dev/sdb
    3   465.76GiB  /dev/sdc
    4   465.76GiB  /dev/sdd
    5   465.76GiB  /dev/sde
    6   465.76GiB  /dev/sdg

btrfs filesystemc show で構成しているデバイスを確認できる。

hoge@hoge-desktop:~$ sudo btrfs filesystem show ba3f187a-bfb3-47b5-aa02-334b15f2ea33
Label: none  uuid: ba3f187a-bfb3-47b5-aa02-334b15f2ea33
    Total devices 6 FS bytes used 128.00KiB
    devid    1 size 596.17GiB used 1.17GiB path /dev/sda
    devid    2 size 465.76GiB used 1.17GiB path /dev/sdb
    devid    3 size 465.76GiB used 1.17GiB path /dev/sdc
    devid    4 size 465.76GiB used 1.17GiB path /dev/sdd
    devid    5 size 465.76GiB used 1.17GiB path /dev/sde
    devid    6 size 465.76GiB used 1.17GiB path /dev/sdg

マウントする

マウントするときにcompressオプションを使うと透過圧縮が使える。

sudo mount -o compress=lzo UUID=ba3f187a-bfb3-47b5-aa02-334b15f2ea33 /data

ついでにラベルをつける

sudo btrfs filesystem label /data pool01

hoge@hoge-desktop:~$ sudo btrfs filesystem show /data
Label: 'pool01'  uuid: ba3f187a-bfb3-47b5-aa02-334b15f2ea33
    Total devices 6 FS bytes used 1.56MiB
    devid    1 size 596.17GiB used 1.17GiB path /dev/sda
    devid    2 size 465.76GiB used 1.17GiB path /dev/sdb
    devid    3 size 465.76GiB used 1.17GiB path /dev/sdc
    devid    4 size 465.76GiB used 1.17GiB path /dev/sdd
    devid    5 size 465.76GiB used 1.17GiB path /dev/sde
    devid    6 size 465.76GiB used 1.17GiB path /dev/sdg

最後にfstabに追加して起動したときにマウントするようにしておく。

UUID=ba3f187a-bfb3-47b5-aa02-334b15f2ea33       /data   btrfs   compress=lzo    0       0