【2023年07月】Btrfs メモ

# はじめに

Btrfs を学習した際のメモ

Btrfs は `バターエフエス` と読む、 `B-tree file system` の略
オンラインデフラグができる
マウントしたままファイルシステムの拡張と縮小ができる
スナップショットがとれる

構築できるRAIDの種類は以下

- RAID0 : 2台以上
- RAID1 : 2台以上
- RAID10 : 4台以上
- RAID5 : 3台以上（実験中）
- RAID6 : 4台以上（実験中）

特殊なモードの `single` と `dup` がある

- single
各データブロックをストレージプールの一部として配置するモード。
このモードは冗長性や冗長性に対する保護を提供せず、データは単一のデバイスにのみ書き込まれる。

- dup
各データブロックを同じデバイス上の2箇所に書き込むモード。
単一のデバイス内での読み取りエラーから保護する一定の冗長性が提供さる。
しかし、デバイス全体が故障した場合には保護されない。

# ファイルシステムの作成

## シングルデバイス

- デバイスは `/dev/sdb` (2GB) と、 `/dev/sdc` (2GB)

```terminal
$ sudo mkfs.btrfs /dev/sdb
btrfs-progs v5.16.2
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM /dev/sdb (2.00GiB) ...
NOTE: several default settings have changed in version 5.15, please make sure
      this does not affect your deployments:
      - DUP for metadata (-m dup)
      - enabled no-holes (-O no-holes)
      - enabled free-space-tree (-R free-space-tree)

Label:              (null)
UUID:               ********-****-****-****-************
Node size:          16384
Sector size:        4096
Filesystem size:    2.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP             102.38MiB
  System:           DUP               8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata, no-holes
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/sdb
```

## RAID 0 (ストライピング)

- デバイスは `/dev/sdb` (2GB) と、 `/dev/sdc` (2GB)

```terminal
$ sudo mkfs.btrfs -f -d raio0 /dev/sdb /dev/sdc
btrfs-progs v5.16.2
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM /dev/sdb (2.00GiB) ...
NOTE: several default settings have changed in version 5.15, please make sure
      this does not affect your deployments:
      - DUP for metadata (-m dup)
      - enabled no-holes (-O no-holes)
      - enabled free-space-tree (-R free-space-tree)

Performing full device TRIM /dev/sdc (2.00GiB) ...
Label:              (null)
UUID:               ********-****-****-****-************
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID0           409.50MiB
  Metadata:         RAID1           256.00MiB
  System:           RAID1             8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata, no-holes
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/sdb
    2     2.00GiB  /dev/sdc
```

## RAID 1 (ミラーリング)

- デバイスは `/dev/sdb` (2GB) と、 `/dev/sdc` (2GB)

```terminal
$ sudo mkfs.btrfs -f -d raid1 /dev/sdb /dev/sdc
btrfs-progs v5.16.2
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM /dev/sdb (2.00GiB) ...
NOTE: several default settings have changed in version 5.15, please make sure
      this does not affect your deployments:
      - DUP for metadata (-m dup)
      - enabled no-holes (-O no-holes)
      - enabled free-space-tree (-R free-space-tree)

Performing full device TRIM /dev/sdc (2.00GiB) ...
Label:              (null)
UUID:               ********-****-****-****-************
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID1           204.75MiB
  Metadata:         RAID1           256.00MiB
  System:           RAID1             8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata, no-holes
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1     2.00GiB  /dev/sdb
    2     2.00GiB  /dev/sdc
```

# ファイルシステムの情報確認

- 複数デバイスでストレージプールを構築している場合、構成している１つのデバイスを `btrfs filesystem show` すると、ストレージプール全体が表示される
- 複数デバイスでストレージプールを構築している場合、構成している１つのデバイスを `mount` すると、ストレージプール全体がマウントされる
- 2023/06　時点で、mountせずに、サブボリュームの情報やファイルシステム全体の利用可能なスペースを知る方法はないらしい

## RAID 0 (ストライピング)

`sudo btrfs filesystem df /export` で `Data, RAID0:` と表示される

```terminal
$ sudo btrfs filesystem show /dev/sdb
Label: none  uuid: ********-****-****-****-************
	Total devices 2 FS bytes used 144.00KiB
	devid    1 size 2.00GiB used 272.00MiB path /dev/sdb
	devid    2 size 2.00GiB used 264.00MiB path /dev/sdc
$ lsblk -f
NAME                      FSTYPE      FSVER    LABEL UUID                                   FS AVAIL FSUSE% MOUNTPOINTS
  :
  :
sdb                       btrfs                      ********-****-****-****-************                  
sdc                       btrfs                      ********-****-****-****-************                  
  :
  :
$ sudo mount /dev/sdb /export
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
  :
  :
/dev/sdb                           4.0G  3.6M  3.5G   1% /export
  :
  :
$ sudo btrfs filesystem df /export
Data, RAID0: total=409.50MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=160.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
```

## RAID 1 (ミラーリング)

`sudo btrfs filesystem df /export` で `Data, RAID1:` と表示される

```terminal
$ sudo btrfs filesystem show /dev/sdb
Label: none  uuid: ********-****-****-****-************
	Total devices 2 FS bytes used 176.00KiB
	devid    1 size 2.00GiB used 468.75MiB path /dev/sdb
	devid    2 size 2.00GiB used 468.75MiB path /dev/sdc
$ lsblk -f
NAME                      FSTYPE      FSVER    LABEL UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
  :
  :
sdb                       btrfs                      ********-****-****-****-************      1.7G     0% /export
sdc                       btrfs                      ********-****-****-****-************ 
  :
  :
$ sudo mount /dev/sdb /export
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
  :
  :
/dev/sdb                           2.0G  3.4M  1.8G   1% /export
  :
  :
$ sudo umount /dev/sdb
$ sudo mount /dev/sdc /export
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
  :
  :
/dev/sdb                           2.0G  3.4M  1.8G   1% /export
  :
  :
$ sudo btrfs filesystem df /export
Data, RAID1: total=204.75MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=160.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
```

# ファイルシステムのチェック

## マウントしたままチェック、チェックはバックグラウンドで行われる、自動的に修復も行われる

- チェック開始
```terminal
$ sudo btrfs scrub start /export
```

- 進行状況の確認
```terminal
$ sudo btrfs scrub status /export
```

- キャンセル
```terminal
$ sudo btrfs scrub cancel /mountpoint
```

## アンマウントしてチェック

```terminal
$ sudo umount /dev/sdb
$ sudo btrfs check
```

## アンマウントしてチェックし、復旧も行う

```terminal
$ sudo umount /dev/sdb
$ sudo btrfs check --repair 
```

# ストレージプールのデバイスを入れ替える

`/dev/sdb` (2GB)、 `/dev/sdc` (2GB) で構成されているストレージプールで、`/dev/sdc` が故障したので、ストレージプールから削除し、デバイスを入れ替えて、再度ストレージプールを構成し直す

- ストレージプールから `/dev/sdc` を削除
```terminal
$ sudo btrfs device delete /dev/sdc /export
```

- 一度、ストレージプールのバランスをとる
```terminal
$ sudo btrfs filesystem balance /export
```

- `/dev/sdc` を入れ替える
- ストレージプールにデバイスを追加する
```terminal
$ sudo btrfs device add /dev/sdc /export
```

- ストレージプールのバランスをとる(`/dev/sdb` から `/dev/sdc` へデータがコピーされる)
```terminal
$ sudo btrfs filesystem balance /export
```
# さいごに

かんたんでしたね