Copyright 2014 FUJITSU LIMITED Btrfsの基礎 - part1. 機能編 - 2014年9月17日 Satoru Takeuchi Linux Development Div. Fujitsu LTD.
Dec 01, 2014
Copyright 2014 FUJITSU LIMITED
Btrfsの基礎- part1. 機能編 -
2014年9月17日Satoru Takeuchi
Linux Development Div.
Fujitsu LTD.
目次
はじめに
概要
基本設計
機能紹介
1 Copyright 2014 FUJITSU LIMITED
はじめに
前提知識 Linux上でXFS, ext4の使用経験あり
btreeの知識[1]
説明方針設計(data構造とalgorithmの概要)の説明を重視
• それさえわかれば、codeの詳細は一目瞭然
• 一般的&重要な機能に絞って、簡単なものから一つずつ
一度にたくさん詰め込んで説明しない
調査に使用したkernel version 3.16
2 Copyright 2014 FUJITSU LIMITED
概要
Linuxの次世代main streamになる予定のfile system ZFSの影響を受けており、機能も類似(equalではない。UIも異なる)
主な特長 XFSやext4より高信頼な設計
• CoW形式のdata更新、checksum, RAID構成
XFSと同等のscalability(最大file/file system sizeは16EiB。XFSは8EiB)
• 性能は発展途上(改善中)
LVMのようなvolume management機能
• snapshot採取
• file systemへのpartition/deviceのonline追加/削除/置換
• LVMより運用が容易、かつ高速
3 Copyright 2014 FUJITSU LIMITED
基本設計
中心技術 btreeを核とした媒体構造
Copy on Write(CoW)型のfile更新
既存dataの更新処理を例に、高信頼性を説明比較対象: 一般的なoverride型のfile更新: ext4, XFSなどが採用
• 詳細は説明しないがmetadata journalingが有効とする
4 Copyright 2014 FUJITSU LIMITED
やりたいこと
注意: 以下はあくまで概念図。正確なdata構造とは異なる(これ以降の図も同様)
5 Copyright 2014 FUJITSU LIMITED
この2つのdataを更新したい
やりたいこと: 付随作業
6 Copyright 2014 FUJITSU LIMITED
metadata
data
この2つのdataを更新したい関連するmetadataも
要更新
override型: 更新前の状態
7 Copyright 2014 FUJITSU LIMITED
metadata
data
この2つのdataを更新したい
override型: 更新
8 Copyright 2014 FUJITSU LIMITED
metadata
data
既存dataを上書き(override)して更新
override型: 更新中の障害発生
ここでkernel panicが発生したらどうなるか?
9 Copyright 2014 FUJITSU LIMITED
metadata
data
更新済
未更新
override型: 障害発生後の復旧
metadata: journalingによって更新前後いずれかの整合性のとれた状態を保証
data: 更新中の中途半端な状態になりうる
10 Copyright 2014 FUJITSU LIMITED
metadata
data
更新前の状態
更新中の中途半端な状態
CoW型: 更新前の状態
11 Copyright 2014 FUJITSU LIMITED
metadata
data
この2つのdataを更新したい関連するmetadataも
要更新
CoW型: 更新用copyの作成
まず変更予定sub treeのcopyを作成 root nodeを除く
12 Copyright 2014 FUJITSU LIMITED
CoW型: copyを更新
copyした領域を更新
13 Copyright 2014 FUJITSU LIMITED
CoW型: pointer張り替え
root nodeのpointerを張り替えれば終了
参照されなくなった古いsub treeは後ほど非同期に廃棄
14 Copyright 2014 FUJITSU LIMITED
CoW型: 更新中の障害発生
ここでkernel panicが発生したらどうなるか?
15 Copyright 2014 FUJITSU LIMITED
CoW型: 障害発生後の復旧
元のtree構造は全く変化なし data, metadata共に整合性を保証
作成途中のsub treeは後ほど非同期に廃棄
16 Copyright 2014 FUJITSU LIMITED
後で捨てる
元の状態
実例: overwrite型 vs CoW型
1,000回の強制電源断testの結果[2] Btrfs: 一切問題発生せず
ext4(ordered mode): metadata破壊によりdisk full状態に
• なぜかmetadataが壊れているが…
17 Copyright 2014 FUJITSU LIMITED
高信頼化用の更なる仕組み
RAID構成 file system levelで実施
管理単位はbtreeのnode, およびdata extent(詳細は媒体構造編を参照)
checksum: 全metadata,dataのchecksumを管理
管理単位はRAID構成のときと同じ
read/write時&user指定時(scrub command発行時)に整合性check
不整合検出時の対処
• mirroringあり(RAID1, RAID10): 正しいchecksumを持つ別のdata copyを元に正しいdataを復元
• mirroringなし: 不整合検出dataをfile systemから切り離し
18 Copyright 2014 FUJITSU LIMITED
機能説明
次のcategoryに分けて説明基本機能
volume管理機能
耐障害機能
復旧用機能
重要な機能に絞って説明詳細はmanを参照
19 Copyright 2014 FUJITSU LIMITED
基本機能
作成/mount
状態確認
透過的data圧縮
SSD向け最適化
20 Copyright 2014 FUJITSU LIMITED
作成/mount
任意の個数のdeviceから作成可能各deviceのsize, 性能、種類(HDD or SSD)は同程度のものにしておくほうが
無用なtroubleを回避可能
使用方法単一deviceから作成: mkfs.btrfs [<options>] <device>
複数deviceから作成: mkfs.btrfs [<options>] <device list>
mount: mount -o <options> <device>
• mount時に指定したdevice listの中から任意のdeviceを指定可能
• 他のdeviceの情報は自動検出
21 Copyright 2014 FUJITSU LIMITED
状態確認
file systemの様々な状態を確認
使い方 label, uuid, device構成情報など: btrfs filesystem show <path>
diskの空き領域: btrfs filesystem df <device> <path>
• 詳細は後述
• [注意] 通常のdf commandは使用不可(結果が信用できない)
device構成情報: btrfs device status <path>
22 Copyright 2014 FUJITSU LIMITED
透過的data圧縮
storageへのI/O前の圧縮/伸張によりI/O高速化&storage使用量削減CPU intensiveなsystemよりI/O intensiveなsystemで真価を発揮
組み込みCPUなどの低速なCPUでは性能劣化の可能性も
適用可否の判断には要性能測定
使用できるmode no(default), lzo, zlib: 右側ほど圧縮に長時間を要するが、高圧縮率
使用方法(file system全体): mount optionにより指定 compress=<lzo|zlib>: 圧縮率が悪ければ圧縮しない
compress-force=<lzo|zlib>: 圧縮率が悪くても強制圧縮
使用方法(個々のfile): chattrにより指定
23 Copyright 2014 FUJITSU LIMITED
透過的data圧縮の流れ: write
24 Copyright 2014 FUJITSU LIMITED
user buffer storage
データ 圧縮後のデータデータ
1) データのcopy 2) 圧縮&書き込み
page cache
Userは圧縮の有無を認識しない
計算量は増加 storageへのデータ転送量縮小=> I/O高速化=> storage利用効率向上
透過的data圧縮の流れ: read
25 Copyright 2014 FUJITSU LIMITED
user buffer storage
データ 圧縮後のデータデータ
2) データのcopy 1) 展開&読み出し
page cache
Userは圧縮の有無を認識しない
計算量は増加 storageへのデータ転送量縮小=> I/O高速化=> storage利用効率向上
SSD向け最適化
SSDの特性を考慮した動作論理に変更
使い方: mount optionによって指定 SSD向け最適化: <ssd|nossd> optionによって有効化/無効化
• 明に指定しなくてもmount時に自動検出可能
TRIM/discard: <discard|nodiscard> optionによって有効化/無効化
• 未使用領域をdeviceに通知し、容量削減&deviceの長寿命化
• SSD以外にも、VM imageやthin provisioning deviceの容量削減にも有用
• 性能劣化する場合もあるので、使用可否の判断には要性能測定
低速なSSD向け最適化: ssd_spread option(暗にssdも有効化される)
• 大きな領域から優先的に空き領域を獲得
• server向けのSSDの場合、controllerが優秀なので、多分不要
26 Copyright 2014 FUJITSU LIMITED
volume管理機能
device追加/削除/置換
balance
subvolume
snapshot
quota
27 Copyright 2014 FUJITSU LIMITED
device追加/削除/置換
既存のbtrfsにonlineでdeviceを追加/削除/置換注意: 削除時はbtree構造の再構成処理(balance処理。後述)が強制動作
使い方追加: btrfs device add <device> <path>
削除: btrfs device delete <device> <path>
置換: <old>のdataを<new>にcopy後、treeのpointerを切り替え
開始: btrfs replace start <old> <new> <path>
進捗確認: btrfs replace status <path>
中止: btrfs replace cancel <path>
28 Copyright 2014 FUJITSU LIMITED
追加処理の概念図
初期状態: /dev/sda, /dev/sdbから成るfile systemmount point: /btrfs/mnt/pnt
29 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
device追加commandの発行
Btrfsのvolumeに/dev/sdcを追加 command: btrfs device add /dev/sdc /btrfs/mnt/pnt
30 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
新規deviceを使用
新規領域は、次回書き込み発生時から使用
31 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
例: 新規file作成
削除処理の概念図
初期状態: /dev/sda, /dev/sdb, /dev/sdc から成るBtrfsmount point: /btrfs/mnt/pnt
32 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
device削除commandの発行
Btrfsのvolumeから/dev/sdcを削除 command: btrfs device delete /dev/sdc
33 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
これを削除
削除deviceのdata copy
/dev/sdc内のdataをすべて、/dev/sdaか/dev/sdcにcopy(後述のbalance処理)
34 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
copy
pointer張り替え
削除対象deviceからその他deviceにpointerを張り替え
35 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
pointer張り替え
削除deviceの切り離し
削除deviceをBtrfsのvolumeから切り離せば終了途中で失敗しても元のtreeはそのまま残っているので問題なし
36 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
置換処理の概念図
初期状態: /dev/sda, /dev/sdbから成るfile systemmount point: /btrfs/mnt/pnt
37 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
device置換commandの発行
Btrfsのvolumeの/dev/sdbを/dev/sdcに置換 command: btrfs device replace /dev/sdb /dev/sdc /btrfs/mnt/pnt
38 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
置換deviceのdataをcopy
/dev/sdb内のsub treeを/dev/sdcにcopy
39 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
subtreeをcopy
pointerの張り替え
置換元deviceへのpointerを置換先deviceに張り替え
40 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc張り替え
置換元deviceの切り離し
これで完了途中で失敗しても、元のtreeはそのまま残っているので問題なし
41 Copyright 2014 FUJITSU LIMITED
/dev/sda
Btrfsのvolume全体
/dev/sdc
balance
device間でのdata格納量の平準化性能特性の平準化を期待
device追加直後は、balanceを推奨
• 追加前から存在したdevice: dataが存在
• 追加したdevice: dataがほぼ存在しない(後述のsuper blockのみ)
balance中にumount, crashすると、次回mount時に再開
使い方開始: btrfs balance start <path>
進捗確認: btrfs balance status <path>
中断: btrfs balance pause <path>
再開: btrfs balance resume <path>
中止: btrfs balance cancel <path>
42 Copyright 2014 FUJITSU LIMITED
balanceの概念図
/dev/sda, /dev/sdbから成るBtrfsへの/dev/sdc追加直後mount pointは/btrfs/mnt/pnt
43 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
• 全く使用していない• 性能ばらつき発生の可能性あり
balance commandの発行
Btrfsのtree構造不均衡を解消 command: btrfs balance start /btrfs/mnt/pnt
44 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
dataのcopy
全deviceのdata使用量がbalanceするよう、balance後のtreeを構築
45 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
copy
pointerの張り替え
46 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
張り替え
data copy(繰り返し)
balance完了していなければ、同様の処理を繰り返す
47 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
copy
pointer張り替え(繰り返し)
48 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
張り替え
balanceの完了
device間のdata量が均衡すれば、終了途中で失敗しても中途半端な状態は見えない
49 Copyright 2014 FUJITSU LIMITED
/dev/sda /dev/sdb
Btrfsのvolume全体
/dev/sdc
後で解放 後で解放
subvolume
file system内に作成する、個別のfile systemとしてmountできる領域 Btrfsの様々な操作(後述のsnapshot, quota)はsubvolume単位で行う
bind mountとの違い
• Subvolumeごとに独立したinode namespaceを保持
• Subvolumeのmount前にfile system rootをmountしておく必要は無い
• 例: subvolumeをsystem volumeに設定可能
mount optionは共通(初回mountのものに合わせられる)
使い方生成: btrfs subvolume create <path>
削除: btrfs subvolume delete <path>
全subvolumeの列挙: btrfs subvolume list <path>
特定subvolumeの情報表示: btrfs subvolume show <path>
mount: mount -o subvol=<subvol path> <path>
50 Copyright 2014 FUJITSU LIMITED
snapshot
root tree or subvolume(or snapshot)のcopy subvolumeの一種。subvolumeに対するcommandを全て適用可能
更新時はCoWによって、更新したdataのみcopyされる
read onlyのsnapshotも作成可能
metadataだけのcopyなので、full copyに比べて高速に作成可能注意: backupとsnapshotは異なる
• 共有dataが壊れれば関連snapshotのdataは全て影響を受ける
使い方生成: btrfs subvolume snapshot [-r] <src> <dest>
• -rを指定するとreadonly。指定しなければreadwrite
削除: btrfs subvolume delete <path>
51 Copyright 2014 FUJITSU LIMITED
snapshotの概念図
初期状態: 以下のようなfile system treeが存在mount point: /btrfs/mnt/pnt
pwd: 同上
52 Copyright 2014 FUJITSU LIMITED
metadata
data
file systemのroot
subvolume “foo”のroot
snapshot採取command
コマンド: btrfs subvolume snapshot foo bar
53 Copyright 2014 FUJITSU LIMITED
ここ(foo)のsnapshotを採取したい
metadataのcopy
fooのmetadataをcopy
54 Copyright 2014 FUJITSU LIMITED
copy
pointerを張る
copy先dataからfooのdataへのpointerを張る
55 Copyright 2014 FUJITSU LIMITED
file system treeからのpointerを張る
file system treeのrootからbarへのpointerを張り、完了 data copyは不要なので、通常のcopyよりも高速
56 Copyright 2014 FUJITSU LIMITED
以後”/bar”として認識される
snapshot更新時の挙動
例: /bar以下のfileのdataを更新
57 Copyright 2014 FUJITSU LIMITED
/
/foo /bar
ここを更新
snapshot更新時の挙動: CoW
更新領域のみcopy, 更新、pointer張り替え元subvolume(foo)には影響なし
58 Copyright 2014 FUJITSU LIMITED
copy
張り替え
/
/foo /bar
file単位のsnapshot
subvolume単位ではなくfile単位のsnapshotを作成可能新たにinodeを作成
• dataを共有、metadataは新規作成
• data更新時はCoWにより、更新した領域だけ新規copyを作成
使い方: 同じsubvolume内にあることが基本作成: cp --reflink <src> <dst>
59 Copyright 2014 FUJITSU LIMITED
quota
subvolume単位でstorageの使用量を制限 XFSのgroup/project quotaに類似
quota制限付きのsubvolumeをquota group(qgroup)と呼ぶ
qgroupの親子関係を作成可能
• 親qgroupの制限を子qgroupにも継承
• 注意: 親子関係はfile system tree上のsubvolumeの親子関係と独立
使い方有効/無効: btrfs quota <enable|disable> # defaultはdisable
qgroupに制限値を設定: btrfs qgroup <size|none> <path>
全qgroupの列挙: btrfs qgroup show
qgroup間の親子関係を作成: btrfs qgroup assign <src> <dst> <path>
qgroup間の親子関係を削除: btrfs qgroup remove <src> <dst> <path>
60 Copyright 2014 FUJITSU LIMITED
耐障害機能
RAID
data整合性check&修正
61 Copyright 2014 FUJITSU LIMITED
RAID: 機能説明
file system levelのRAID data, metadata両方について別々に指定
使用可能な構成 single: 冗長化, stripingなし
dup: 同じdeviceの中に2つcopy
• single device構成のmetadataの場合のみ使用可能
RAID0, RAID1, RAID10, RAID5, RAID6
• RAID1, RAID10: mirroring数はdevice数によらず2
• LVMの挙動(device数に応じてmirroring数を増加可能)と異なる
• RAID5/6: scrubとreplaceが使用不可
• 鋭意開発中、近日修正見込み
62 Copyright 2014 FUJITSU LIMITED
RAID: default値と設定方法
default値単一device構成: data=single, metadata=dup(HDD) or single(SSD)
• SSDは、controllerによる同一内容blockのdedupによってdupが無意味な場合あり
複数device構成: data=RAID0, metadata=RAID1
使い方: mkfs.btrfsの optionに指定metadata: -m <single|dup|raid0|raid1|raid10|raid5|raid6>
• dupは単一deviceの場合のみ指定可能
data: -d <single|raid0|raid1|raid10|raid5|raid6>
63 Copyright 2014 FUJITSU LIMITED
data整合性check&修正
全fileのdata/metadataを走査して、checksumの整合性check
mirroringあり: data修復
mirroringなし: file systemから該当dataを切り離し
使い方開始: btrfs scrub start <path>
進捗確認: btrfs scrub status <path>
停止: btrfs scrub cancel <path>
再開: btrfs scrub resume <path>
64 Copyright 2014 FUJITSU LIMITED
復旧用機能
backup/restore
mount options
修復機能
障害解析機能
65 Copyright 2014 FUJITSU LIMITED
前提知識: 復旧のために推奨される運用
通常運用: 定期的なbackup採取
kernel panic or file system不整合発生 File systemの復旧
1. 通常通りmountを試行。成功すれば完了。失敗すれば2へ
2. 「復旧時に使用するmount option」を試行。成功すれば完了。失敗すれば3へ
3. 「restore」or「修復機能」を試行
原因究明
• 「障害解析機能」を用いて原因究明と再発防止
66 Copyright 2014 FUJITSU LIMITED
backup/restore
file system levelのbackup,restore ddやcp –aを使うよりも高速なbackupが可能
subvolume単位で採取可能
差分backup/restoreも可能
想定される用途定期的にbackupを採取(full backup/週、差分backup/日)
file system不整合発生時にbackupからfile systemを復旧
使い方 backup採取: btrfs send <subvol>
• 通常は事前に採取したread only snapshotに対して実施
backupからfile systemを復元: btrfs receive <target mount point>
67 Copyright 2014 FUJITSU LIMITED
mount options
“skip_balance” option
仕掛中のbalance処理をmount時に再開しない
balanceのbugによる異常発生後のmountに有用
• これを指定しないと、再度同じbugによる問題が発生する可能性あり
“recovery” option
file system内部に持つbackup dataを使ってmountを試行
障害発生後のmount失敗時に使用
“degraded” option
RAID構成に必要な数のdeviceが存在しない場合に指定
特定deviceが壊れた際などに使用
mount後にdevice構成の修復が必要
68 Copyright 2014 FUJITSU LIMITED
修復機能
file system の整合性をofflineでcheck&可能な限り修復
使い方壊れたfile systemからfileを可能な限り復旧: btrfs restore <device>
壊れたsuper blockを復元: btrfs rescue super-recover <device>
壊れたchunk tree(後述)を復元: btrfs rescue chunk-recover <device>
file systemの整合性check&修復: btrfs check <device>
• 最後の手段。他の手段を使ってどうしても駄目なら使う
• backupがあれば、そこから復旧するほうが容易かつ確実
69 Copyright 2014 FUJITSU LIMITED
障害解析用機能
kernel panic, file system不整合障害の原因究明に使用
使い方metadata dump採取: btrfs-image <path> <dest>
• metadataのimageを採取、imageをBtrfs技術者に送付、技術者が解析
• data領域は採取しない
• file system全体のcopyよりも短時間で採取可能、省space
• data領域の障害は解析不能
kdump: kdumpのdocument参照(Btrfs固有機能ではない)
• system全体のmemory imageを採取
• kernel panic/hang up発生時の原因究明などに使用
metadataのtree構造を表示: btrfs-debug-tree <device>
superblockの情報を表示: btrfs-show-super <devlicelist>
指定extentのdeviceへのmap情報を表示: btrfs-map-logical –l <extent number> <one of btrfsdevice>
• extentについては媒体構造編を参照
70 Copyright 2014 FUJITSU LIMITED
参考文献
1. The Art of Computer Programming vol3. Donald Knuth
2. Linux Filesystem Analysis for IVI system. Mitsuharu Ito
http://events.linuxfoundation.org/sites/events/files/slides/linux_file_system_analysis_for_IVI_systems.pdf
3. linux kernel source
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
4. Btrfs wiki
https://btrfs.wiki.kernel.org/index.php/Main_Page
5. BTRFS: The Linux B-Tree Filesystem. Ohad Rodeh, Josef Bacik, and Chris Mason
http://domino.research.ibm.com/library/cyberdig.nsf/papers/6E1C5B6A1B6EDD9885257A38006B6130/$File/rj10501.pdf
71 Copyright 2014 FUJITSU LIMITED
Copyright 2014 FUJITSU LIMITED72