FreeBSD unionfsの改善提案原文 {{{FreeBSD unionfsの改善提案 Daichi GOTO (daichi@freebsd.org) 作成年月日 Wed Jan 4 17:20:11 2006 更新年月日 Sat Jan 14 23:11:26 2006

[English] 1 概要

FreeBSD 6.0-RELEASEまでに搭載されているunionfsにはいくつかの問題があることが知られている。問題は、大きく分けて2つの領域に分類することができる。unionfsにおける仕様が曖昧な部分に起因する問題と、FreeBSD unionfsのロックの実装に関する問題である。

FreeBSD unionfsの2つの問題:

この結果、CD9660ファイルシステムに対してunionfsをかぶせて使用するような場合、いくつかの問題が起る。そのため、FreeSBIEのようなシステムでは問題が起ることが知られている。本稿では、これら問題を説明すると同時に、これら問題を解決するためのパッチを提供するものである。最終目標は、これらパッチをFreeBSDにマージし、パッチを当てなくても問題が発生しないFreeSBIEが作成できるようにすることにある。 2 unionfsとは

unionfsは、2つのファイルシステムをアタッチしてひとつのファイルシステムとして扱うためのファイルシステムのことである。たとえばCD-ROMに対してメモリファイルシステムをアタッチして、CD-ROM上のファイルに対して書き込みができるかのように見せかけるといった用途に用いられる。

ベースとなるディレクトリ (下層) 以下に対して変更を加えることなく、上にかぶせたディレクトリ(上層)以下に対してのみ変更を与えることになるため、下層のディレクトリはそのままに、変更点だけ保持したいといった場合にも活用できる。

詳細な仕様はMarshall Kirk McKusick、George V. Neville-Neil著 "The Design and Implementation of the FreeBSD Operating System" の P.256 Section 6.7, The Union Filesystemからの2ページ強分などを参照のこと。 3 従来のFreeBSD unionfsが抱える問題

従来のFreeBSD unionfsが抱える問題は次のとおり。

  1. [実装上の問題] 従来のunionfsは、ロック機構として次のような方法を使っている。VOP_* 系の呼び出しに対し、必要に応じて上層/下層をロックしにいくというものである。この場合、unionfsのvnode を含め、1つのvnodeに対して最大で同時に3つのロックを行うことになる。つまり、カーネル側の仕組とは別のタイミングで複数のロック/アンロックを行うため、デッドロックが起りやすい状況にある。事実、従来のunionfsは不安定であり、高負荷状況になるとデッドロックが起りやすい。
  2. [実装上の問題] VOP_*系の呼び出しにおいて、一部はunionfsのvnodeを応答するのに対し、一部は上層/下層のvnodeを直接応答する。特にLOOKUP でこの現象が起きた場合、ユーザからは理解しがたい状況に陥る可能性がある。これまでに確認しているものは、pwdが上層/下層の絶対パスを応答してしまう現象である。
  3. [実装上の問題] readdirの実装が不十分で、上層の一覧のみを応答する。このため、下層にのみ存在するファイルなどをユーザが識別することが出来ない。
  4. [実装上の問題] 上層/下層に同一のファイル/ディレクトリが存在した場合、上層を削除後にホワイトアウトが作成されないため、ユーザからは削除されていないように見える。
  5. [実装上の問題] アクセス権の判定において、下層にのみファイル/ディレクトリがある場合、上層にshadow file/dirを作成後に与えられる権限を応答しない。このため、書き込めるはずのファイルに書き込めないなどの問題が発生する。
  6. [unionfsの仕様の曖昧さに起因する問題] unionfsの仕様には下層のshadow file/dirを作成する場合に、属性の引き継ぎに関する規定がない。このため、従来の実装では「0777をそのときのumaskで修正したもの」という方法のみが提供されてきたが、これが現在のFreeBSD unionfsでは好ましくない結果を生んでしまうことがある。たとえば、実行権限を与えるべきでないファイルへ実行権限が与えられてしまうなど。

これら従来のFreeBSD unionfsが抱える問題による影響はたとえば次のとおり。

4 問題への改善提案

今回提案しているパッチにおける、[実装上の問題]への改善内容は次のとおり。

  1. [実装上の問題への対処] unionfsのvnodeが内部に持つロックオブジェクトを上層のロックオブジェクトへのポインタに差し替えることで、kernelが直接上層の vnodeをロックできるように戦略を変更することで対処。下層へのアクセスが必要な場合は、そのとき必要最小限の範囲でロック。ただし、上層に対応する vnodeが存在しない場合は、下層のロックオブジェクトでunionfsのものを差し替える。VOP_* の呼び出し中に上層にvnodeを作成した場合は、unionfs のものを上層へ差し変えて下層をアンロックする。これらはnullfsの仕組みを応用したもの。この変更が大規模であるため、従来のソースへのパッチではなく、フルスクラッチからつくり直している。
  2. [実装上の問題への対処] http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/84107の修正

  3. [実装上の問題への対処] http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/84498の修正 (MAYBE)

  4. [実装上の問題への対処] http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/89755の修正 (MAYBE)

  5. [実装上の問題への対処] http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/73094の修正 (MAYBE)

  6. [実装上の問題への対処] これ以外で、前述したようにわかっている問題を対処。

[unionfsの仕様の曖昧さに起因する問題]に対する改善については、本来仕様に規定されていないことであるため、規定されていない振る舞いをどうするべきか、という議論を含むことになる。

現状のFreeBSD unionfsにおける実装では、この結果、アクセス権を判定し動作を決定するアプリケーションが、ユーザの期待どおりに動作しないという状況が発生している。

この振る舞いをどうするかであるが、これは場面に応じて要求される事柄であり、また、本来仕様に定められていないことであるために、対応が難しいところだと考えられる。今回はこの振る舞いに対し、オプションによって3つの振る舞いを持たせるということで対処することを提案したい。パッチはこの3つの振る舞いをオプションで切り替える機能を含んでいる。

[unionfsの仕様の曖昧さに起因する問題]に対する改善:3つの動作パターン

本来仕様が策定されていない部分の振る舞いであるから、複数の振る舞いを用意し選択できるようにすることは、意義のある対応であると考える。たとえば、3-7において説明した[unionfsの仕様の曖昧さに起因する問題]は、[transparentモード]で対処することができる。

この結果、次の問題も[transparentモード]で修正されると考えられる。

5 インストール方法

パッチを適用してインストールする方法の作業例をプロンプト5.1に示す。

プロンプト5.1 インストール作業の例 6 使用方法

mount_unionfs(8)に追加したオプション

mount_unionfs(8)から削除したオプション

7 ダウンロード

パッチは基本的にFreeBSD 7-current向け。パッチセット番号が大きいほど新しいパッチセット。

FreeBSD 6.x向けパッチセット:

7.1 unionfs-p5.diffにおける変更点

7.2 unionfs-p4.diffにおける変更点

7.3 unionfs-p3.diffにおける変更点

7.4 unionfs-p2.diffにおける変更点

7.5 unionfs-p1.diffにおける変更点

8 既知の問題

9 Appendix 9.1 FAQ

Q: 従来のunionfsの修正という形ではなく、フルスクラッチから作り替える必要はあったのか?

A: 従来の実装は本質的にロックの実装でデッドロックが発生しやすいものになっていた。これを修正するのは難しく、ほとんどが作り替えになる。このため、従来のソースに対する修正という形ではなく、フルスクラッチから作成することにした。

Q: 互換性はどうなっているのか?

A: 現在のパッチでは、従来の使い方をする限り従来の動作と互換性がある。しかもhttp://www.freebsd.org/cgi/query-pr.cgi?pr=kern/84107(そしてたぶんhttp://www.freebsd.org/cgi/query-pr.cgi?pr=kern/84498、 http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/89755、 http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/86596、 http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/73094)の問題も修正されている。

将来的には、-c transparentの動作をデフォルトにするべきだと考える。従来の動作で問題となる動作のほとんどは、-c transparentにすることで修正されると考えるからである。

Q: パッチの実装はunionfsの本来の動作に沿っているのか

A: 沿っていると考える。unionfsの仕様についてはMarshall Kirk McKusick、George V. Neville-Neil著 "The Design and Implementation of the FreeBSD Operating System" の P.256 Section 6.7, The Union Filesystemからの2ページ強分にまとまっているので、そちらを参照のこと。

Q: 読み込みを行っただけで shadow file が生成されるのはなぜか?

A: 下層のファイルに対してアクセス日時を更新することは出来ないため、shadow fileを作成して日時を更新するからである。この動作をやめるには、-o noatime オプションを指定すればよい。詳細はmount(8)を参照のこと。 9.2 連絡先 & お願い

だれかこのページを英語に翻訳してぷり〜ず :) 翻訳したテキストはdaichi@freebsd.orgかdaichi@jp.freebsd.orgへ。日本語テキストだとSPAMフィルタで弾かれる可能性があるので、daichi@jp.freebsd.orgの方がいいかも。バグ報告も同アドレスへ。 }}}

OssDocExample (last edited 2009-12-25 07:17:49 by localhost)