1.4. Ceph File System の制限と POSIX 規格
Ceph File System は、以下の点で厳密な POSIX セマンティクスから乖離しています。
-
クライアントがファイルの書き込みに失敗した場合、書き込み操作は必ずしも Atomic ではありません。例えば、
O_SYNC
フラグで開かれた 8MB のバッファーを持つファイルに対して、クライアントがwrite()
システムコールを呼び出したところ、予期せぬ終了で、書き込み操作が部分的にしかできなくなってしまうことがあります。ローカルファイルシステムを含め、ほとんどのファイルシステムがこのような動作をします。 - 書き込み操作が同時に行われる状況では、オブジェクトの境界を超えた書き込み操作は必ずしも Atomic ではありません。例えば、ライター A が "aa|aa"、ライター B が "bb|bb" を同時に書いた場合、"|" はオブジェクトの境界であり、本来の"aa|aa" や "bb|bb" ではなく、"aa|bb" が書かれてしまいます。
-
POSIX には
telldir()
やseekdir()
というシステムコールがあり、カレントディレクトリーのオフセットを取得して、そこまでシークすることができます。CephFS はいつでもディレクトリーを断片化できるため、ディレクトリーの安定した整数オフセットを返すことは困難です。そのため、0 以外のオフセットでseekdir()
システムコールを呼び出しても、動作する場合がありますが、動作を保証するものではありません。seekdir()
をオフセット 0 で呼び出すと必ず動作します。これは、rewinddir()
システムコールと同等のものです。 -
スパースファイルは、
stat()
システムコールのst_blocks
フィールドに正しく伝わりませんでした。st_blocks
フィールドには、ファイルサイズをブロックサイズで割った商が常に入力されているため、CephFS では、割り当てられたり書き込まれたりしたファイルの一部を明示的に追跡しません。この動作により、du
などのユーティリティーが使用スペースを過大評価してしまいます。 -
mmap()
システムコールでファイルを複数のホストのメモリーにマッピングした場合、書き込み操作が他のホストのキャッシュに一貫して伝わらない。つまり、あるページがホスト A でキャッシュされ、ホスト B で更新された場合、ホスト A のページはコヒーレントに無効にはなりません。 -
CephFS クライアントには、スナップショットへのアクセス、作成、削除、名前の変更に使用される隠れた
.snap
ディレクトリーがあります。このディレクトリーはreaddir()
システムコールから除外されていますが、同名のファイルやディレクトリーを作成しようとしたプロセスはエラーを返します。この隠しディレクトリーの名前は、マウント時に-o snapdirname=.<new_name>
オプションを使用するか、client_snapdir
設定オプションを使用して変更できます。
関連情報
- Ceph Metadata サーバーをインストールするには、ファイルシステムガイドの Ceph Orchestrator を使用した MDS サービスの管理 セクションを参照してください。
- Ceph File System を作成するには、ファイルシステムガイド の Red Hat Ceph File System の導入 セクションを参照してください。
関連情報
- Red Hat OpenStack Platform で Ceph File System へのインターフェイスとして NFS Ganesha を使用する場合、そのような環境をデプロイメントする方法は、CephFS via NFS Back End Guide for Shared File System Service の CephFS with NFS-Ganesha のデプロイメントセクションを参照してください。