btrfs
- 現状、最もアドホックな分析やデータレークで安定するfilesystem
- inodeが大量に必要なフォーマット等で安定性が高い
- 5chやツイッターのデータを扱うような場合
install
ubuntu, debian
$ sudo apt install btrfs-progs
基本的な操作
format filesystem
$ sudo mkfs -t btrfs -f /dev/<sdx>
-f
; すでに他のファイルシステムでフォーマットされているときに必要
repair format filesystem
$ sudo btrfs check --repair --force /dev/<sdx>
- これで治らない場合、ディスクが故障している可能性がある
空き容量の確認
$ sudo btrfs filesystem show /dev/<sdx>
または
$ btrfs filesystem df ./<mount-point>
デフラグ
$ sudo btrfs filesystem defragment -r -v <mount_dir>
デフラグと圧縮
# lzoアルゴリズムで圧縮する場合(高圧縮率)
$ sudo btrfs filesystem defragment -r -v -clzo <mount_dir>
# glibで圧縮する場合(高速度)
$ sudo btrfs filesystem defragment -r -v -czlib <mount_dir>
ext4ディスクをbtrfsに変換する
$ sudo btrfs-convert /dev/<sdx>
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
checksum: crc32c
free space report:
total: 1000204886016
free: 892787671040 (89.26%)
creating ext2 image file
...
- ext2でスナップショットを作成する必要があるらしく時間がかかる(1TBのSSDで5~6時間程度)
fstabにマウントルールを書く
具体例
UUID=58455548-bafc-4750-b949-fc098e95b264 /mnt/nvme2n1 btrfs compress=lzo,noatime,autodefrag 0 0
compress=lzo
- lzoによる圧縮を有効にする
noatime
- アクセスによってタイムスタンプを更新しない
autodefrag
- 自動でデフラグを有効にする
サブボリュームの使い方
概要
btrfs
でフォーマットされたディスクに対してディレクトリを作るような操作でマウント可能なボリュームを切り出す機能
具体的な操作
サブボリュームの作成
$ sudo btrfs subvolume create <sv-name>
サブボリュームのパラメータの確認
$ sudo btrfs subvolume show <sv-name>
<sv-name>
Name: <sv-name>
UUID: 7a5be655-2329-024a-a24a-9fa93bfde24c
Parent UUID: -
Received UUID: -
Creation time: 2021-12-11 21:31:41 +0900
Subvolume ID: 796
Generation: 11310
Gen at creation: 11302
Parent ID: 5
Top level ID: 5
Flags: -
Snapshot(s):
サブボリュームを適当な場所にマウント
$ sudo mount /dev/<サブボリュームを含むディスク> -o subvol=<sv-name> <target-mount-point>
トラブルシューティング
ディスクフルに近く、ディスクへの読み書きが遅い
原因
- metadataの使用量が100%に近いことに起因する
$ btrfs fi df ./nvme2n1
Data, single: total=840.50GiB, used=815.00GiB
System, single: total=4.00MiB, used=128.00KiB
Metadata, single: total=91.01GiB, used=90.49GiB
GlobalReserve, single: total=512.00MiB, used=209.62MiB
対応
- 様々なコマンドを実行したがあまり効果がなかった
- metadataを増やすのが一つの解決策であるが、1 diskの場合、難しい
- roでマウントして違うディスクにデータを対比させてフォーマットし直すのが現実的な解決