日本ソフトウェア科学会第 34 回大会 (2017 年度) 講演論文集

ディレクトリ毎にジャーナリングモードを設定可能なファイルシステム
青山 航

岩崎 英哉

ジャーナリングとは，ファイルの作成・更新などファイルシステムを変更する際に，ログにその変更を記録することで，ファイルシステムの信頼性を向上させる手法である．ジャーナリングの信頼性とファイルシステムの速度はトレードオフの関係にある．そのため，既存のシステムは，ジャーナリングの方法 (モード) を，信頼性を重視したもの，速度を重視したものなど，何種類か提供している．しかし，ジャーナリングモードはファイルシステムに一つしか設定できないため，ファイルシステム内のファイル毎に異なる特性に合わせることができない．この問題を解決するため，本研究は，ジャーナリングモードをディレクトリ毎に設定できるファイルシステムを提案し，Linux のext3 ファイルシステムを拡張して実現する．このことにより，ジャーナリングモードの設定単位を従来より細かくすることができ，ファイルの特性に合ったモードを設定することが可能となる．

[1]，soft-updates [4]，コピーオンライト [7] などの技

1 はじめに術が提案されている．中でも，ジャーナリングは ext3

ファイルシステムとは，ディスク上のデータを管理ファイルシステム (以下，ext3 と呼ぶ)，JFS，XFS，するオペレーティング・システム (OS) の一機構であReiserFS，NTFS など様々なファイルシステムで用る．一般的なファイルシステムは，ディスクを一定長いられている．のブロックに分割し，実際のデータが格納されていジャーナリングとは，ファイルの作成・更新などるブロック (実データブロック) と，i ノードやブロッ

ファイルシステムに対して変更を施す前に，変更履クの空き状況を示すビットマップが格納されている歴を記録する手法である．図 1 に，ジャーナリング

ブロック (メタデータブロック) の両方を用いて管理を用いてファイルへ書き込みを行う様子を示す．ここする．

で，D は実データ，M はメタデータ，TB はトランザユーザプログラムがファイルに書き込みを行うと，クションの開始，TE はトランザクションの終了を表

ファイルシステムは対応する複数のブロックに書きす．ジャーナリングでは，ジャーナルという特殊なロ込みを行う．このとき，OS の異常終了などにより実グファイルにファイルの変更内容を一旦記録し (図 1

データやメタデータの一部が失われてしまうと，ファ(b))，記録の終了を確認した後に，保存領域の対象のイルシステムの管理状態が中間的な不完全状態に陥ファイルに書き込みを行い (図 1 (c))，ジャーナルにり (この状態を，整合性が損なわれていると呼ぶ)，書き込みが終了したことを記録する (図 1 (d))．OS

ファイルシステムが破損してしまう可能性がある．

が異常終了した場合，ジャーナルへの書き込みの状態ファイルシステムの整合性を保証するために，ファイを調べることによって，処理がどこまで進行したかがルシステムの整合性検査 (fsck) [3] やジャーナリング

わかる．書き込みが完了していなければ，ファイルシステム変更が行われる前の状態に保たれ，ジャーナ

Wataru Aoyama, Hideya Iwasaki, 電気通信大学大学
院情報理工学研究科, Dept. of Communication Engineering and Informatics, University of ElectroCommunications.

ルへの書き込みが完了していれば，更新後の状態にし，ファイルシステムの整合性が損なわれないようにする．

図1

ジャーナリングを用いたファイル書き込み．(a) 初期状態，(b) コミット: トランザクションをジャーナルに書き込み，(c) チェックポイント: データを保存領域に書き込み，(d) クリーンアップ: トランザクションが終了したことを記録．

ext3 では，変更履歴に保存する対象や書き込みの順番を，ジャーナリングモードにより設定することが2 ext3 ファイルシステムできる．ジャーナリングモードとしては，信頼性を重Linux の標準的なファイルシステムである ext2 ファ視したもの，速度を重視したものなど，何種類か提供

イルシステム (以下，ext2 と呼ぶ) には，OS が異常しており，重要なファイルには信頼性の高いモード，終了後の復旧に時間がかかるという問題があった．こ

重要度があまり高くないファイルには速度が速いモーの問題を解決するために，ext2 と互換性を保ちながドというように，ファイルの特性 (重要度) に合ったらジャーナリング機能を導入した ext3 が開発された．

モードの設定することが望まれる [5] [6]．しかし，既存の Linux では，ファイルシステムに一つのジャー

2. 1 ディスクキャッシュナリングモードしか設定できないため，ファイルシス

Linux では，ディスク I/O を減らすために，ディテム内のファイル毎に異なる特性に合わせることがでスク上のデータをメモリにキャッシュする．これを，きない．

ディスクキャッシュと呼ぶ．ディスクキャッシュには，このような問題点を解決するため，本研究では，ファイルの実データをページ単位に分割したページジャーナリングモードをディレクトリ毎に設定するこキャッシュや，ファイルの i ノードをキャッシュしたとが可能なファイルシステムを提案する．このことにi ノードキャッシュなどが存在する．たとえば，ディより，ジャーナリングモードの設定単位を従来より細スクへの読み込みが発生すると，カーネルはファイルかくすることができ，ファイルの特性に合ったモードの i ノードから i ノードキャッシュ，実データをペーを設定することが可能となる．

ジ単位に分割してページキャッシュを生成する．その本稿の構成は次の通りである．2 節で，ext3 とジャー後，同じファイルをアクセスすると，i ノードキャッナリングの処理について述べる．3 節では，既存研究

シュとページキャッシュを用いてファイルを高速に読の特徴と問題点を述べる．4 節では，本研究で提案すみ込む．

るシステムの概要と動作の流れについて述べ，5 節

Linux では，O SYNC や O DIRECT フラグを明示的ではシステムの実装について述べる．6 節で，実験をに指定しない限り非同期 I/O となる．図 2 に，ファイ行い，最後に 7 節で本稿をまとめ，今後の課題を述

ルへの非同期書き込みを行う様子を示す．ここで，Dべる．

は実データ，M はメタデータ，Dirty フラグが立っているデータを灰色で表す．非同期書き込みでは，ディスクキャッシュへの書き込みが完了すると，ユーザに書き込みが終了したことを通知する (図 2 (a))．この図2

非同期書き込み．(a) write システムコールによる処理 (b) カーネルスレッドによる処理

図3

非同期書き込みのジャーナリング．(a) write シス

テムコールによる処理 (b) カーネルスレッドによる処理

時，作成したページキャッシュおよび i ノードキャッ
シュに変更が加えられたことを表す Dirty フラグを立

変更履歴を全て保存するため信頼度は最も高い

てる．その後，カーネルスレッド pdflush が，Dirtyが，同じデータをディスクに二回書き込む必要がフラグを立っているデータをディスクの保存領域に書あるため，オーバーヘッドは大きい．

き込む．(図 2 (b))

2. ordered モード メタデータのみをジャーナリングの対象とする．ただし，実データがディスク

2. 2 ジャーナリングに書き込まれた後にメタデータの書き込みを行

ジャーナリングでは，不可分なファイル操作処理をう．このモードでは，実データより前にメタデー1 つのトランザクションとし，以下の 3 つの操作によタがディスクに書き込まれることがないので，メりファイルシステムの整合性を保証する．
コミット

タデータが不正なデータを指し示すことはない．

3. writeback モード メタデータのみをジャーナ

トランザクション内のファイルシステムへの操作リングの対象とする．このモードでは，メタデー処理をジャーナルに書き込む処理．

タが不正なデータを指す可能性があり信頼性はチェックポイント

低いが，メタデータの書き込み順番に制約はない

トランザクション内のファイルシステムへの操作ので，ディスク I/O 待ち時間が少なく，速度が処理を保存領域に書き込む処理．

最も速い．

リカバリ

非同期書き込みのジャーナリングの処理では，ジャーコミットが完了した処理を，再度チェックポイン

ナリングを行うデータには JBDDirty フラグを立てる

トすることでファイルシステムを復元する処理．

ことで，ジャーナリングを行うデータと行わないデータを区別する． 図 3 に，ordered モードでジャーナ

ext3 では，ジャーナルをファイルシステム内の隠リングの処理を行うときの非同期書き込みの様子を示しファイル，またはファイルシステム外の別デバイスす．ここで，D は実データ，M はメタデータ，Dirtyとして扱う．また，保存する変更履歴の種類をジャーフラグが立っているデータを灰色，JBDDirty フラグナリングモードによって設定することができ，以下のが立っているデータを黒色で表す．この時，ジャー3 つのモードを提供している．

ナリング対象のメタデータに JBDDirty，対象ではな

1. data モード メタデータと実データの両方をい実データに Dirty フラグを立て，ユーザに通知すジャーナリングの対象とする．このモードでは，る．(図 3 (a)) その後，カーネルスレッド pdflush は図4

図5

Okeanos ファイルシステム

Selective Journaling

Dirty フラグの立っているデータをディスクに書き込ジャーナリングモードを設定できる機構である．ユー

み，kjournald は，JBDDirty フラグの立っているデー

ザは，予めファイルにモードを設定することで，当タをコミット，チェックポイントを行う．(図 3 (b))

該ファイルに対する操作は設定したジャーナリングモードに基づいて処理されるようになる．このこと

3 関連研究で，ファイルシステム内に複数のモードを持つことがこれまでに，ジャーナリングモードの設定単位を可能としている．しかし，File-Adaptive Journaling細かくする研究はいくつか行われている．Okeanos

では，ファイル一つ一つにジャーナリングモードを[2] は，同期書き込み時に複数のページキャッシュをま設定する必要があり，設定が煩雑である．例えば，新とめてコミットする Wasteless Journaling モードと，規ファイルにジャーナリングモードを設定する場合，データサイズが閾値以下の書き込みには Wasteless

ファイルの書き込み前にユーザがジャーナリングモー

Journaling を適用する Selective Journaling モードをドを設定しなければならない．それに対して本研究で持つファイルシステムである．Selective Jouranling

は，ディレクトリ単位でジャーナリングモードを設定モードでマウントされたファイルシステムでは，図 4するため，設定の煩雑さが軽減されている．のようにコミット前にページキャッシュを一つのデータに結合する．このことで，書き込むブロック数を4 設計減らし，シーケンシャルアクセスが可能になるため，

4. 1 システムの概要

ディスク I/O 待ち時間を減らすことができる．

本システムは，ディレクトリ単位でジャーナリング

Adaptive Journaling [5] は，図 5 のように I/O パモードを設定可能なファイルシステムである．同一ターンからジャーナリングモードを自動的に設定すディレクトリ直下の全てのファイルに，そのディレクる機構である．シーケンシャルアクセスの場合にはトリに設定されたジャーナリングモードが適用されordered モードを適用することで，ディスクの無駄なる．子ディレクトリには，親ディレクトリのジャーナシーク時間を減らすことができる．

リングモードとは独立に，ジャーナリングモードを設Okeanos はデータサイズに応じてジャーナリング定できる．設定できるジャーナリングモードは，ext3モードを自動的に設定する．また，Adaptive Jour-と同じく，data，ordered，writeback のいずれかとnaling はトランザクション単位でジャーナリングモーする．ここで，ジャーナリングモードを設定していなドを自動的に設定する．このため，どちらに関してもいディレクトリは，無モードとして扱い，ジャーナリユーザ自身の判断に基づいて，ファイルの重要度に応ングの処理を行わずにファイル操作をする．

じた設定をすることができない．

File-Adaptive Journaling [8] は，ファイル単位で同じディレクトリ内のファイルは共通する性質を持
ち重要度が共通することが多いことから，モード設定の細かさの単位をディレクトリとする本システムの設計は適切であると考えられる．
本ファイルシステムは，ext3 と同様にブロックデバイスに mkfs でファイルシステムを生成，mount でファイルシステムをマウントして利用する．mkfs によるファイルシステムの生成時にルートディレクトリのジャーナリングモードを設定することができる．
また，ユーザは，ファイルシステムのマウント後に，本システムが提供するインタフェースを用いてディレクトリのジャーナリングモードを設定・変更することができる．
本ファイルシステムは，ext3 と互換性があるため

図6

ディレクトリ構造例

ext3 と ext2 として使用していたパーティションを初期化せずにマウントすることが可能である．これらの図 6 を用いて，本システムの動作の流れを説明する．

ファイルシステムは，ディレクトリにジャーナリング

ディレクトリ右上の丸は，d は data，o は ordered，モードを持たないため，全てのディレクトリのジャーw は writeback モードであることを表し，赤い点線

ナリングモードは無モードで開始する．

は矢印先のファイルのシンボリックリンクであることを表す．また，カレントユーザは aoyama とする．こ4. 2 システムの動作例

こで，/var/mail/のハードリンクとして~/mail/を

本ファイルシステムでは，ファイルに対する操作は作成する．このとき，前述で取り上げた 5 つのパター

親ディレクトリのジャーナリングモードに従い，ディンについて考える．

レクトリに対する操作は自身のジャーナリングモード

1. ファイルの変更 ユーザが ~/.bashrc を編集すに従い，ファイル操作処理を行う．しかし，Linux でる場合，親ディレクトリの ~/を参照する．従っはファイルやディレクトリにリンクを貼ることでファて，ordered モードが適用される．

イルに別名をつけ，異なる名前で同一ファイルにアク2. ディレクトリの変更 ユーザが ~/thesis/にファセスできため，ファイルと親ディレクトリの関係が一イルを新規作成する場合，自身のジャーナリング対一になるとは限らない．そこで，複数の親ディレクモードの data モードでディレクトリのエントリトリが参照される可能性がある以下の 3 つの状況については，特別な処理をする．

を追加する．

3. ファイ ル の 移 動 ユ ー ザ が ~/.profile を• ファイルの移動による操作は，移動先のディレ/root/に移動する場合，移動先の/root/を参クトリのジャーナリングモードに従うことにす照する．従って，data モードで.profile を更新る．ただし，移動元と移動先のディレクトリからする．また，~/から.profile エントリの削除にファイルエントリを削除，追加する操作はそのは ordered モード，/root/から.profile エントディレクトリのジャーナリングモードに従う．

リの追加には data モードで実行される．

• ハードリンクに対する操作は，最後に貼られた

4. シ ン ボ リック リ ン ク に 対 す る 操 作 ユ ー ザ がリンク先ファイルの親ディレクトリのジャーナリ/root/memo を編集する場合，リンク元の~/memoングモードに従う．

を参照する．従って，~/の ordered モードでデー• シンボリックリンクに対する操作は，リンク元ファイルの親ディレクトリのジャーナリングモードに従う．

タを編集する．

5. ハードリンクに対する操作 ユーザが ~/mail/以下のファイルを削除する場合，最後にリンクが貼られた~/mail/を参照する．従って，ordered

ムコールを利用する．本システムでは，ioctl システモードでディレクトリのエントリを削除する．

ムコールに，ジャーナリングモードの設定・取得するためのリクエスト (IOC SETJOURNAL・IOC GETJOURNAL)

5 実装を追加した．

本システムは，Linux Kernel 4.2 の ext3 とファ

IOC SETJOURNAL では，以下の処理を行う．

イルシステムをメンテナンスするユーティリティ
e2fsprogs†1 に拡張を施して実現する．

1. ユーザ空間からモード情報をコピーする．
2. 安全のために，ジャーナルを全てフラッシュする．
3. 現状のジャーナリングモードに従って，i flags

5. 1 ジャーナリングモードのデータ構造ディレクトリにジャーナリングモードを格納するにモード情報を設定する．

IOC GETJOURNAL では，以下の処理を行う．

ため，ディスク上に i ノードが格納されるブロック

1. i flags からモードを取得する．

(i ノードブロック) とメモリ上にキャッシュされる i

2. ユーザ空間にモードの情報をコピーする．

ノードキャッシュにジャーナリングモードの情報をここで，ファイル操作時のジャーナリングモードを追加する．しかし，ディスク上のブロックは固定長参照する時間を減らすために，ファイルの i ノードにであるため，i ノードブロックに新しく変数を追加もジャーナリングモードを自動的に格納する．ファイ

すると，既存のデータ構造を破壊してしまう．そこ

ルの i ノードにジャーナリングモードをキャッシュとで，ジャーナリングモードをファイルのフラグとしして格納するタイミングは以下の通りである．て，i ノードブロックに保持する．ext3 では，i flagsの 32 ビットでファイルのフラグを管理しているが，12 ビットの使用されていない部分がある．本システ
ムでは，data モードを表す DATA MODE FL，orderedモードを表す ORDERED MODE FL，writeback モードを表す WRITEBACK MODE FL，ジャーナリングを行わな• ファイルを新規作成した (i ノードにリンクが追加された) 時• ファイルを移動した (親ディレクトリが変更された) 時• 親ディレクトリのジャーナリングモードが変更された時

い JOURNAL NONE MODE FL の 4 つのフラグを追加し，この時，ジャーナルにモードを設定してしまうとシスi flags のあいている 2 ビットに格納する．

テムが正常に動作しなくなるため，対象のファイルにジャーナルであることを表す EXT3 JOURNAL DATA FL

5. 2 ジャーナリングモードの設定・取得フラグが立っていないことをか確認してから行う．

ディレクトリの新規作成時には，親ディレクトリ

また，ファイルシステムの生成時にルートディレクのジャーナリングモードを引き継ぐ必要があるので，トリのジャーナリングモードを設定可能にするため，mkdir の処理を変更する．ext3 のディレクトリを生

e2fsprogs の e2mkfs プログラムを拡張する．e2mkfs

成する ext3 mkdir() では，新規ディレクトリの iは，ext2，ext3，ext4 専用の mkfs であり，ファイルノードを生成する処理の時に，引数のオプションからシステムの初期化やルートディレクトリの生成を行

i flags を適切に設定する．そこで，i ノードを生成う．そこで，ルートディレクトリの生成が確認できたする時に，親ディレクトリの i flags からジャーナ

ら，ioctl システムコールを用いてルートディレクトリングモードの情報のみを取得して，作成するディレリのモードを設定する．

クトリの i flags に追加する．
また，ユーザがディレクトリに付与されたモードを更新・参照するインタフェースとして，ioctl システ

5. 3 設定したジャーナリングモードでの処理
ext3 では，ファイルシステムのマウント時にファイル操作処理を決定してしまう．本ファイルシステム†1 http://e2fsprogs.sourceforge.net/

では，設定したモードに従ってファイル操作処理をするために，以下のファイルシステムに書き込むためのングモードに応じたファイルシステムの復旧を可能に関数を拡張する．

する．

1. 書き込み前に準備を行う write begin 関数
ext3 では，write begin 関数でページキャッシュ

6 実験の生成と i ノードに JBDDirty フラグを立てる．

拡張元である ext3 と比較することで提案手法のext3 は，ジャーナリングモード無モードが存在オーバーヘッドを計測した．実験に使用したシステム

しないため問題はないが，本ファイルシステムの構成を表 1 に示す．

は，ジャーナリングモード無モードが存在するので，JBDDirty を立ててはいけない場合もある．

実験には，ファイルシステムの性能を計測するマイクロベンチマーク IOzone†2 を使用した．IOzone を

そこで，本ファイルシステムでは，書き込み対用いて，書き込み，再書き込み，ランダム書き込みの象のジャーナリングモードから，ジャーナリング3 つのパターンについて計測する．ベンチマークの設

モード無モードであれば i ノードに Dirty フラグ

定として，レコードサイズを 64KB，ファイルサイズを，それ以外のモードであれば JBDDirty フラを 1GB，O RSYNC,O SYNC を有効，測定には fsync にグを立てるように処理を拡張する．

よるフラッシュが含まれる．

2. 書き込み処理を行う write end 関数

図 7 に，IOzone の実行結果を示す．左から write-ext3 では，data モード用，ordered モード用，back モード，ordered モード，data モードにおけるwriteback モ ー ド 用 の write end 関 数 が 定 義実行結果を示している．各グラフは，左から書き込されている．data モードと ordered モードのみ，再書き込み，ランダム書き込みのパターンを示

write end 関数では，ページキャッシュに JBD-している．ここで，ext3 のジャーナリングモード

Dirty フラグを立て，writeback モードでは，ペーが，writeback モードを ext3-w，ordered モードをジキャッシュに Dirty フラグを立てる．本ファイ

ext3-o，data モードを ext3-d とする．実験で実装しルシステムでは，ジャーナリングの処理はファイ

たファイルシステム myext3 も同様に，myext3-w，ル書き込み時まで決定することができない．そこ

myext3-o，myext3-d とする．

で，write end 関数のラッパ関数を用意し，書き実行結果より，オーバーヘッドの増加量は 5%以内

込み対象のジャーナリングモードから，各モードに収まっていることが分かった．IOzone によるファ用の write end 関数を呼び出すように処理を拡イルの生成パターンによっては，実行結果が 0.01 ほど張する．

変化することがあったので，writeback モードにおけ3. ディスクに書き込みを行う writepages 関数

るオーバーヘッドは誤差によるものだと考えられる．

write end 関数と同様に writepages 関数では，以上のことから，同期書き込みにおいて本システム

data モード用，ordered モード用，writebackは，既存システムとほぼ同じ性能で，問題なく使用でモード用の関数が定義されている．各モード用のきることが示された．

関数では，Dirty フラグの立ったディスクキャッシュをディスクに書き戻す，JBDDirty フラグの表1

実験評価に使用したシステムの構成

CPUIntel Core i5 M520 2.40GHz

メモリ2GBに，writepages 関数のラッパ関数を用意し，書HDD

100GB Serial ATA/2.5 5400rpm

き込み対処のジャーナリングモードから，各モーLinux

Ubuntu16.04 x86 64

カーネル

Kernel 4.2

立ったディスクキャッシュを適切な順番でディスクに書き戻す．そこで，write end 関数と同様ド用の関数を呼び出すように処理を拡張する．
また，e2fsprogs の e2fsck を拡張することで，ジャーナルに記録されたデータから，それぞれのジャーナリ†2 http://www.iozone.org/

図7

IOzone による性能評価 (MB/s)

7 おわりに本稿は，既存ファイルシステムにおけるジャーナリングモードの設定粒度が荒く，個々のファイルの重要度に対応できないという問題を解決するために，ディレクトリ毎に設定できるファイルシステムを提案した．ジャーナリングモードをディレクトリ単位で設定することで，既存研究のような設定の煩雑さがなく，ファイルの重要度に対応した設定が可能である．
現状は，提案したシステムの実装を行っている途中であり，ディレクトリに writeback モード，orderedモード，data モードを設定してジャーナルへコミットとチェックポイントできるという段階である．今後は，ジャーナリングモード無モードの実装や，シンボリックリンクの対応，異常終了後のリカバリ処理の実装を完成させる．実装が終わり次第，システムの評価を行い，提案手法の有用性を確認し，ext3 の後続のファイルシステムでもある ext4 への実装を考えている．

参 考 文 献[1] Hagmann, R.: Reimplementing the Cedar File
System Using Logging and Group Commit, Proceedings of the Eleventh ACM Symposium on Operating
Systems Principles, SOSP ’87, New York, NY, USA,1987, pp. 155–162.
[2] Hatzieleftheriou, A. and Anastasiadis, S. V.:
Okeanos: Wasteless Journaling for Fast and Reliable Multistream Storage, Proceedings of the 2011
USENIX Conference on USENIX Annual TechnicalConference, USENIXATC’11, Berkeley, CA, USA,2011, pp. 19–19.
[3] Kowalski, T. J.: UNIX Vol. II, 1990, chapter Fsck
- the UNIX File System Check Program, pp. 581–592.
[4] McKusick, M. K. and Ganger, G. R.: Soft Updates: A Technique for Eliminating Most Synchronous Writes in the Fast Filesystem, Proceedings of the Annual Conference on USENIX Annual Technical Conference, ATEC ’99, Berkeley,CA, USA, 1999, pp. 24–24.
[5] Prabhakaran, V., Arpaci-Dusseau, A. C., andArpaci-Dusseau, R. H.: Analysis and Evolution ofJournaling File Systems, Proceedings of the Annual
Conference on USENIX Annual Technical Conference, ATEC ’05, Berkeley, CA, USA, 2005, pp. 8–8.
[6] Rocha, P. E. and Bona, L. C. E.: Analyzing the
Performance of an Externally Journaled Filesystem,
Proceedings of the 2012 Brazilian Symposium on
Computing System Engineering, SBESC ’12, Washington, DC, USA, 2012, pp. 93–98.
[7] Rosenblum, M. and Ousterhout, J. K.: The
Design and Implementation of a Log-structured
File System, ACM Trans. Comput. Syst., Vol. 10,No. 1(1992), pp. 26–52.
[8] Shen, K., Park, S., and Zhu, M.: Journaling of
Journal is (Almost) Free, Proceedings of the 12th
USENIX Conference on File and Storage Technologies, FAST’14, Berkeley, CA, USA, 2014, pp. 287–293.