コンテンツにスキップ

F2FS

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Shkawasaki (会話 | 投稿記録) による 2019年5月14日 (火) 12:56個人設定で未設定ならUTC)時点の版 (インデックス構造)であり、現在の版とは大きく異なる場合があります。

F2FS
開発者 サムスン電子モトローラ・モビリティファーウェイ
正式名 Flash-Friendly File System
導入 2012年12月20日 (Linux 3.8)
構造
ディレクトリ マルチレベルハッシュテーブル
領域管理 ビットマップ(空き容量)、テーブル
限度
最大ファイル サイズ 3.94 TiB
最大ファイル数 ボリュームサイズに依存
最大ファイル名長 255バイト
最大ボリューム サイズ 16 TiB
ファイル名の文字 NUL と '/' 以外の全ての文字
特徴
タイムスタンプ 変更、属性変更、アクセス
日付分解能 1ナノ秒
属性 POSIX拡張属性
パーミッション POSIX、ACL
透過的圧縮 なし
透過的暗号化 あり
対応OS Linux
テンプレートを表示

F2FSFlash-Friendly File System)は、サムスン電子の金載極(韓国語: 김재극英語: Jaegeuk Kim)によって開発されたLinux向けのフラッシュファイルシステムである[1]

NANDフラッシュメモリベースのストレージ[注釈 1]は、スマートフォン・タブレットからサーバまで、様々な種類のコンピュータで利用されている。F2FSはこれらのストレージの特性を考慮したファイルシステムとして設計が行われている[2]

F2FSはログ構造ファイルシステムを、NANDフラッシュメモリベースのストレージに適したものにして取り入れている。F2FSでは、従来のログ構造ファイルシステムの問題点であるガベージコレクションの負荷の高さなどを解消している[1]。NANDフラッシュメモリベースのストレージではフラッシュ変換レイヤ(英語: Flash Translation Layer、FTL)が実装されており、フラッシュメモリの特性[注釈 2]の隠蔽とHDDエミュレートを行い、SATAなどのインタフェースで利用ができるようにしている。F2FSはFTLの存在を前提として、NANDフラッシュメモリベースのストレージの性能を引き出すことができるように設計されている[1]

特徴

F2FSには、以下の機能が実装されている[3]

  • マルチヘッドログ
  • マルチレベルハッシュテーブル
  • 静的/動的なホットデータとコールドデータの分離
  • Adaptive logging scheme
  • Configurable operational units
  • 二重チェックポイント
  • 巻き戻しと前進復帰の対応
  • ヒープ形式のブロック割り当て
  • TRIM/FITRIMのサポート
  • オンラインデフラグメンテーション
  • インライン拡張属性
  • インラインデータ
  • インラインディレクトリ
  • オフラインファイルシステムチェック
  • Atomic operations
  • ファイルシステム全体の暗号化
  • オフラインでのファイルシステムのサイズ変更
  • キャッシュ (コンピュータシステム)の定期的な書き込み
  • Extent cache
  • Move_file_range
  • Host-managed SMR
  • 複数のデバイスに対応
  • Large IO submission
  • Disk Quota (user/group)

また、以下の機能の実装が予定されている[3]

設計

ディスクレイアウト

F2FSはボリューム全体を多数のセグメントに分割する。各セグメントのサイズは2MB固定である。連続する複数セグメントをまとめてセクションが定義され、セクションの集合としてゾーンが定義される。デフォルト設定では、セクションとゾーンは同じサイズに設定されるが、ユーザはmkfsを用いて簡単にサイズを変更できる。

F2FSはボリューム全体を6個のエリアに分割する。以下に記述するように、スーパーブロックエリアを除き、各エリアは複数のセグメントから構成される。

スーパーブロック (SB)
パーティションの先頭に配置される。ファイルシステムが壊れないよう、2つのコピーが作られる。スーパーブロックはパーティションの基本情報とF2FSのデフォルトパラメータを持つ。
チェックポイント (CP)
ファイルシステム情報、有効NAT/SIT集合のビットマップ、orphan inodeリスト、現在アクティブなセグメントのエントリーサマリーを持つ。
セグメント情報テーブル (SIT)
有効ブロック数と、全てのメインエリアブロックの有効ビットマップを持つ。
ノードアドレステーブル (NAT)
メインエリアを構成するノードブロックのアドレステーブル。
セグメントサマリーエリア (SSA)
メインエリアとノードブロックの所有者情報エントリーを持つ。
メインエリア
ファイル、ディレクトリ、およびそれらのインデックスを持つ。

ファイルシステムとフラッシュ記憶装置の不整合を避けるため、F2FSはCPの開始ブロックアドレスをセグメントサイズ境界に配置する。また、メインエリアの開始ブロックアドレスもゾーンサイズ境界に配置する。このためにSSAにセグメントを追加確保している。

メタデータ構造

F2FSはチェックポイント(CP)を用いてファイルシステムの一貫性を保持する。F2FSはマウント時にCPエリアをスキャンし、最後に作られた有効なCPを探す。スキャンにかかる時間を短縮するため、F2FSはCPのコピーを2つしか持たない。2つのコピーのうち1つが、最後に作られた有効なCPである。この方式をシャドーコピー方式と呼ぶ。CPだけでなく、ノードアドレステーブル(NAT)とセグメント情報テーブル(SIT)にもシャドーコピー方式が使われる。ファイルシステムの一貫性を保つため、各CPは有効なノードアドレステーブル(NAT)とセグメント情報テーブル(SIT)に関連付けられる。

インデックス構造

ファイルシステムの鍵となるデータ構造は「ノード」である。伝統的なファイルシステムと同様に、F2FSも3種類のノード、すなわち、iノード(inode)、直接ノード、間接ノードを持つ。iノードブロック1つのサイズは4KBである。以下に示すように、iノードブロックは923のデータブロックインデックス、2つの直接ノードポインタ、2つの間接ノードポインタ、そして1つの二重間接ノードポインタをを持つ。直接ノードブロックは1018のデータブロックインデックスを持ち、間接ノードブロックは1018のノードブロックインデックスを持つ。よって、1つのiノードブロック(すなわち一つのファイル)は以下のサイズのデータを保持できる。

4 KB × (923 + 2×1018 + 2×10182 + 10183) = 3.94 TB

全てのノードブロックの配置は、ノードアドレステーブル(NAT)によって管理される。すなわち、各ノードの配置アドレスはNATを参照して取得する。F2FSは、このインデックス構造により葉(リーフ)に当たるデータを書き換えたときのノード情報更新範囲を限定し、木構造放浪問題(wandering tree problem)を軽減している。

ディレクトリ構造

ディレクトリエントリ (dentry) は11バイトのサイズをもち、以下の属性を持つ。

ディレクトリエントリ構造
hash ファイル名のハッシュ値
ino inode 番号
len ファイル名の長さ
type ディレクトリ、シンボリックリンクなどのファイルタイプ

dentryブロックは214のdentryスロットとファイル名を持つ。各dentryが有効かどうかは、ビットマップにより管理される。dentryブロックは4KBのサイズを持ち、以下の構造を持っている。

dentry ブロック (4 K) = ビットマップ (27 bytes) + 予約域 (3 bytes) +
                      dentryスロット (11 * 214 bytes) + ファイル名 (8 * 214 bytes)

F2FSのディレクトリ構造は多層レベルハッシュテーブルとして実装されている。以下に示すように、各レベルのハッシュテーブルは専用のハッシュバケットを複数持っている。"A(2B)"は、1つのハッシュバケットが2つのデータブロックを持つことを意味する。

定義
A ... ハッシュバケット
B ... ブロック
N ... MAX_DIR_HASH_DEPTH (最大ハッシュ深さ)
レベル #0    A(2B)
レベル #1    A(2B) - A(2B)
レベル #2    A(2B) - A(2B) - A(2B) - A(2B)
    ...
レベル #N/2  A(2B) - A(2B) - A(2B) - A(2B) - A(2B) - ... - A(2B)
    ...
レベル #N    A(4B) - A(4B) - A(4B) - A(4B) - A(4B) - ... - A(4B)

F2FSはディレクトリの中にあるファイル名をみつけると、まずそのファイル名のハッシュ値を計算する。次にレベル#0のハッシュテーブルを走査し、そのファイル名を持つdentryとそのinodeを見つける。見つからない場合は、レベル#1のハッシュテーブルを走査する。以下同様に、各レベルのハッシュテーブルを1からNまで順次走査していく。このとき、各レベルの走査対象となるハッシュテーブルは、以下の式によって決まるテーブル1つですむ。この式の複雑さはO(log(ファイル数))である。

 レベル#nにおいて走査するバケット番号 = (ハッシュ値) % (レベル#nのバケットの数)

ファイル作成時には、F2FSはファイル名を格納できる連続する空エントリを探す。この空エントリの探索は、ファイル名の走査と同様に、ハッシュテーブルの全レベルについて、レベル1からNまで順次行われる。

デフォルトのブロック割り当て

At runtime, F2FS manages six active logs inside the "Main Area:" Hot/Warm/Cold node and Hot/Warm/Cold data.

Block allocation policy
Hot node Contains direct node blocks of directories.
Warm node Contains direct node blocks except hot node blocks.
Cold node Contains indirect node blocks.
Hot data Contains dentry blocks.
Warm data Contains data blocks except hot and cold data blocks.
Cold data Contains multimedia data or migrated data blocks.

LFS has two schemes for free space management: threaded log and copy-and-compaction. The copy-and-compaction scheme which is known as cleaning, is well-suited for devices showing very good sequential write performance, since free segments are served all the time for writing new data. However, it suffers from cleaning overhead during high utilization. Conversely, the threaded log scheme suffers from random writes, but no cleaning process is needed. F2FS adopts a hybrid scheme where the copy-and-compaction scheme is adopted by default, but the policy is dynamically changed to the threaded log scheme according to the file system status.

In order to align F2FS with underlying flash-based storage, F2FS allocates a segment in a unit of a section. F2FS expects the section size to be the same as the garbage collection unit size in FTL. With respect to the mapping granularity in FTL, F2FS allocates each section of the active logs to as many different zones as possible. FTL can write the active log data into one allocation unit according to its mapping granularity.

消去処理

F2FS does cleaning both on demand, and in the background. On-demand cleaning is triggered when there are not enough free segments to serve VFS calls. The background cleaner is executed by a kernel thread, and triggers the cleaning job when the system is idle.

F2FS supports two victim selection policies: greedy, and cost-benefit algorithms. In the greedy algorithm, F2FS selects a victim segment having the smallest number of valid blocks. In the cost-benefit algorithm, F2FS selects a victim segment according to the segment age and the number of valid blocks in order to address the log block thrashing problem present in the greedy algorithm. F2FS uses the greedy algorithm for on-demand cleaning, the background cleaner uses the cost-benefit algorithm.

In order to identify whether the data in the victim segment are valid or not, F2FS manages a bitmap. Each bit represents the validity of a block, and the bitmap is composed of a bit stream covering whole blocks in the Main Area.

脚注

注釈

  1. ^ SDカードSSDなど
  2. ^ 書き込み回数の上限の存在など

出典

  1. ^ a b c Jaegeuk Kim (2012年10月5日). “f2fs: introduce flash-friendly file system”. 2018年4月28日閲覧。
  2. ^ Jaegeuk Kim (2016年12月3日). “start [F2FS Wiki]”. 2018年4月29日閲覧。
  3. ^ a b Jaegeuk Kim (2017年7月12日). “development [F2FS Wiki]”. 2018年4月29日閲覧。

関連項目

外部リンク