FreeBSD unionfsの改善提案および修正状況
後藤大地 (daichi@freebsd.org)
作成年月日 Mon Feb 13 12:08:39 2006
更新年月日 Tue Oct 23 13:32:15 2007
[English]
1 概要
FreeBSD 6.2-RELEASEまでに搭載されているunionfsにはいくつかの問題があった。問題は、大きく分けて2つの領域に分類することができる。unionfsにおける仕様が曖昧な部分に起因する問題と、FreeBSD unionfsのロックの実装に関する問題である。
FreeBSD unionfsの2つの問題:
- unionfsにおける仕様が曖昧な部分に起因する問題
- FreeBSD unionfsのロックの実装に関する問題
この結果、CD9660ファイルシステムに対してunionfsをかぶせて使用するような場合にいくつかの問題が起こっていた。このためFreeSBIEのようなシステムではunionfsをそのまま採用できないでいた。本稿では、これら問題を説明すると同時に、これら問題を解決するためのパッチを提供する。すでに新しいunionfs実装の重要な部分の大半はシステムへマージされている。現在開発が進められている改善パッチは随時システムへのマージを実施している。
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 6.2-RELEASEまでの古いFreeBSD unionfsが抱えいた問題は次のとおり。
- [実装上の問題] 従来のunionfsは、ロック機構として次のような方法を使っている。VOP_* 系の呼び出しに対し、必要に応じて上層/下層をロックしにいくというものである。この場合、unionfsのvnode を含め、1つのvnodeに対して最大で同時に3つのロックを行うことになる。つまり、カーネル側の仕組とは別のタイミングで複数のロック/アンロックを行うため、デッドロックが起りやすい状況にある。事実、従来のunionfsは不安定であり、高負荷状況になるとデッドロックが起りやすい。
- [実装上の問題] VOP_*系の呼び出しにおいて、一部はunionfsのvnodeを応答するのに対し、一部は上層/下層のvnodeを直接応答する。特にLOOKUPでこの現象が起きた場合、ユーザからは理解しがたい状況に陥る可能性がある。これまでに確認しているものは、pwdが上層/下層の絶対パスを応答してしまう現象である。
- [実装上の問題] readdirの実装が不十分で、上層の一覧のみを応答する。このため、下層にのみ存在するファイルなどをユーザが識別することが出来ない。
- [実装上の問題] 上層/下層に同一のファイル/ディレクトリが存在した場合、上層を削除後にホワイトアウトが作成されないため、ユーザからは削除されていないように見える。
- [実装上の問題] アクセス権の判定において、下層にのみファイル/ディレクトリがある場合、上層にshadow file/dirを作成後に与えられる権限を応答しない。このため、書き込めるはずのファイルに書き込めないなどの問題が発生する。
- [unionfsの仕様の曖昧さに起因する問題] unionfsの仕様には下層のshadow file/dirを作成する場合に、属性の引き継ぎに関する規定がない。このため、従来の実装では「0777をそのときのumaskで修正したもの」という方法のみが提供されてきたが、これが現在のFreeBSD unionfsでは好ましくない結果を生んでしまうことがある。たとえば、実行権限を与えるべきでないファイルへ実行権限が与えられてしまうなど。
これら古いFreeBSD unionfsが抱える問題によってたとえば次のような影響がでていた。
- [実装上の問題] 不安定。unionfsを使って安定したサーバなどの運用を行うことが困難。
- [unionfsの仕様の曖昧さに起因する問題] FreeSBIEなどにおいてOpenOffice.org、Emacs、Vimなどを実行する場合に、あらかじめファイルを作成するといった冗長な作業を行わないとアプリケーションの起動ができなかったり、ファイルの編集ができなかったりする。
4 問題への改善提案
提案してきたパッチにおける[実装上の問題]への改善内容は次のとおり。これら成果物はすでにFreeBSDシステムへマージされており、FreeBSD 8/FreeBSD 7.0/FreeBSD 6.3ではこれら問題は発生しない。
- [実装上の問題への対処] unionfsのvnodeが内部に持つロックオブジェクトを上層/下層のロックオブジェクトへのポインタに差し替え、なおかつロック/アンロックをunionfsで管理することでkernelをできるだけ修正せずに正常動作するようにする。また、kernelへの影響を無くすため、上層/下層のロックは常に同じ状態を維持できるように管理する。
- [実装上の問題への対処] 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/73094の修正 (修正完了)
- [実装上の問題への対処] これ以外で、前述したようにわかっている問題を対処。
[unionfsの仕様の曖昧さに起因する問題]に対する改善については、本来仕様に規定されていないことであるため、規定されていない振る舞いをどうするべきか、という議論を含むことになる。
FreeBSD 6.2-RELEASEまでの古いunionfsにおける実装では、この結果、アクセス権を判定し動作を決定するアプリケーションが、ユーザの期待どおりに動作しないという状況が発生している。
この振る舞いをどうするかであるが、これは場面に応じて要求される事柄であり、また、本来仕様に定められていないことであるために、対応が難しいところだと考えられる。今回はこの振る舞いに対し、オプションによって3つの振る舞いを持たせるということで対処することを提案した。パッチはこの3つの振る舞いをオプションで切り替える機能を含んでいる。
[unionfsの仕様の曖昧さに起因する問題]に対する改善:3つの動作パターン
- [traditionalモード] - 互換性のために用意するモード。従来のFreeBSD unionfsの動作と同じ動作をする。基本的にSTABLEブランチはAPIや振る舞いの変更を受け付けないためFreeBSD 6-STABLEへのマージについては標準ではこのモードが有効になるっている。
- [transparentモード] - 下層のパーミッションをできるかぎり上層においても保持するモード。前述した問題のほとんどはこの動作によってカバーすることができる。多くの場合においてtransparentモードは期待した動作をするモードだと考えられ、すでにp19以降のパッチではtransparentがデフォルトモードに設定されている。FreeBSD 7/8ではこのモードがデフォルト。
- [masqueradeモード] - 任意にパーミッションを指定する方法。任意の指定を行うことで、セキュリティなどに配慮したファイルシステムを用意できる。
本来仕様が策定されていない部分の振る舞いであるから、複数の振る舞いを用意し選択できるようにすることは、意義のある対応であると考える。たとえば、3-7において説明した[unionfsの仕様の曖昧さに起因する問題]は、[transparentモード]で対処できる。
この結果、次の問題も[transparentモード]で修正された。
5 インストール方法
パッチを適用してインストールする方法の作業例をプロンプト5.1に示す。
# cd /usr/src/
# patch -p3 < /anywhere/unionfs-p19-20070504.diff
# cp /usr/src/sys/fs/unionfs/union.h /usr/include/fs/unionfs/
# cd /usr/src/sbin/mount_unionfs/
# make obj depend && make && make install
# make clean
# cd /usr/src
# make buildkernel
# make installkernel
# shutdown -r now
プロンプト5.1 インストール作業の例
6 使用方法
マニュアルページmount_unionfs(8)を参照のこと。すべてマニュアルページにまとまっている。
7 ダウンロード
FreeBSD 8-current向けパッチ。パッチセット番号が大きいほど新しいパッチセット。
FreeBSD 7-stable向けパッチ。
FreeBSD 7-current向けパッチ。
- SHA256 (unionfs-p19-20070524.diff) = 174d1557f48d968633ec43e536c8574976dede43c5dab017a9dfdd615c6e78ab
- SHA256 (unionfs-p19-20070504.diff) = ece0c5a5684b50fdc1ef6649edcc25dae6490db7f1642d5068a03dc573227cf3
- SHA256 (unionfs-p18.diff) = a6ca145867657d9ca335b9c65f9ee26ed0373564d57516e6e656df0db9487193
- SHA256 (unionfs-p17.diff) = 364d2990e7e2a2382b10b5393a74a91d7d229f0a12c18c4838feb267b6931914
- SHA256 (unionfs-p16.diff) = 1328d7a44a38e0a247ddfae9136320d4b7894ceb3cb4c709fef241ef0cd2b7b7
- SHA256 (unionfs-p15.diff) = d45ba534a4d7c1d2010b9e2290a8713c6acfd8b0e4568e6f0cd9309bb8756919
- SHA256 (unionfs-p14.diff) = 79288951ca1fb5fddf75af83b29e807f40ae54040c280fabf0c8521720b1d8be
- SHA256 (unionfs-p13.diff) = 3dbd287608c39b65f8928d196963e05fa39afbd438840424cfbfb8cfbc05c8b8
- SHA256 (unionfs-p12.diff) = 2dd9ab54eb70a64305076c52e0d4372d9412c5432af139d8bb1a8025542538a3
- SHA256 (unionfs-p11.diff) = 11a5f45e4289eb18f58065020083adf583ebc32fdfc40a8937a69acf51602734
- SHA256 (unionfs-p10.diff) = ec1f21244ce48cf8817f18ce55da8c5e09a38c4945895233629ad27dd2754c5a
- SHA256 (unionfs-p9.diff) = 48210f2d5593b955fe782f3dc1bcc61cc5136ced31911f0efdfd684bce72f7d8
- SHA256 (unionfs-p8.diff) = 4544ad31ca6047f2816320367d74982e8665a7d60b2c8c73aa375723bed06cbd
- SHA256 (unionfs-p7.diff) = de808ff1f836612cc97f244793f17a6d3bcf4df8ddd0924a0331d0352d06c110
- SHA256 (unionfs-p6.diff) = 9f757b3e59beeb7c9d7ad837462d317e94fc7fc2610f97b212270780fc35f958
- SHA256 (unionfs-p5.diff) = df65da3197dd60d0c37251883a9290f9b03e6b4c1f8e2a5940886aa373ab296c
- SHA256 (unionfs-p4.diff) = 8a3fed6e835676a1dd27ca8872a042d10ef988c5e5912c9a7823835372255ce5
- SHA256 (unionfs-p3.diff) = ec7aeb1d55e6d6d86665d319a0404f61cb1066282363d70f8ce1ab41b66297b0
- SHA256 (unionfs-p2.diff) = beaf51723cfd7017a29a1e24e21c585f884328dcb808e586f4e96391c192d1f3
- SHA256 (unionfs-p1.diff) = c18b4e19a06875656819738e1de566d2b9faab418af91949e28d72ffacfd2572
FreeBSD 6-stable向けパッチセット:
- SHA256 (unionfs6-p19-20070504.diff) = 9eaf754432e67ba4dc4f5c331f19f5204ab1ae41d8cf06bde28b759a9c3eb036
- SHA256 (unionfs6-p18.diff) = 93c698d9815c8fbbef1e6ed5a0e98b47efd1d6f1563b7abc234f505653bf7912
- SHA256 (unionfs6-p17.diff) = dfded90daefeb5988ae9888b4beb7dfbbd4e937b299cdf49dcacf48936706930 (Craig Rodrigues氏による作成)
- SHA256 (unionfs6-p16.diff) = 6e8fcae176bc119d3dbfebc531f045a561735edd320eacd1a4ccb603082bdb7d
- SHA256 (unionfs6-p15.diff) = 9eca9198a36298ed940d41190ac73681958cfd3c69a5ac6ffb3e393fb82af523
- SHA256 (unionfs6-p14.diff) = 12d57beada4d176413f156578d061bd00beac30ea8285f940714eba90e0380f8
- SHA256 (unionfs6-p13.diff) = d6a2d2b40d825daf293d5e12bec149ac376a606a8f544c1bd7a02a890e1be216
- SHA256 (unionfs6-p12.diff) = 5174e395f2adef79b6dad77532185b34ddc76bf035bf482d12c12e3c0a0cdc63
- SHA256 (unionfs6-p11.diff) = 3be3069ff5cca431efb24161f732ce9707ef9bc4691e00f06c42e7e64a96bad9
- SHA256 (unionfs6-p10.diff) = ecdaa60d72edaf77c3d67643a30e106cdaa0fada8c847c655ba123216925c112
- SHA256 (unionfs6-p9.diff) = c312ac0620a83d3a6b25a38cd061e1d0285cd9d97a37860a28e3ddb0cf2bf055
- SHA256 (unionfs6-p8-fix1.diff) = 618e44a7b127a9203b987c9f95cca8dccab17961d8c0bfd01165673ab9c950a9
- SHA256 (unionfs6-p8.diff) = e7c935a39a3483f14048c917b86081c175e8f84ba3688263a20878ec507bf85a
- SHA256 (unionfs6-p7.diff) = 6c85658eb01c25ac2413c9b8fed50b8b25fc51daf4a119e0f067f27856285937
- SHA256 (unionfs6-p6.diff) = f1e39bd48560810b3d811125318af12dab0d12bb9d4d942712b6b61798679399
- SHA256 (unionfs6-p5.diff) = 7e0c876c7428693367533b9a6bad44023851e43c0a4795a4939accc72ee9fdc7
- SHA256 (unionfs6-p4.diff) = aa5faf32dd06645cdce1a90219083707a79a25a7c0882aed8a11b19b62db0b0a
- SHA256 (unionfs6-p3.diff) = 49a80103631267d824dfa6775e572e16098aa789994bf58bb0259a8e10ead0d7
- SHA256 (unionfs6-p2.diff) = c6deb8be2cc0b3251a5a3ed04d9945f7756bb915b5a5bf77482546d34cec862c
- SHA256 (unionfs6-p1.diff) = afa06531d1525e4a96fb6f315f48a8119c79094d97994c155944bbeb0d4f64c5
7.1 unionfs-p19-20070504.diff / unionfs-p19-20070524.diffにおける変更点
- MPSAFE化を実現
- デフォルトのコピーモードをtraditionalからtransparentへ変更。問題報告してきたユーザの多くがtransparentモードで解決する類のものであり、デフォルトでの動作をtransparentにするべき時期がきたと考える。transparentは多くの場合においてより適切な動作モードである。
- kern/111262を修正
- unionfsにおけるvfs_cacheサポートを追加。この結果unionfsでprocfsを使うようなアプリケーションが動作するようになっている。
- unionfsから内部で実装していたキャッシュメカニズムを削除。これはvfs_cacheのサポートを実現したため内部でキャッシュをする必要がなくなったためであり、よりソースコードが簡素化できるという利点がある。
- whiteoutの振る舞いを変更するオプションを追加。``-o whiteout=always''はこれまで通りの動作、``-o whiteout=whenneeded''を指定すると必要なときにwhiteoutを作成するようになる。これは組込み機器などディスクやメモリに制限がある環境で動作させるために追加されたもの(Ed Schouten氏からの寄贈。感謝)
- nullfsと共にunionfsを使った場合に発生していたmtxロック問題を修正
- unionfsに関するロック問題を修正
- CoverityによってNULLチェックをすべき箇所が報告されたのでチェックを追加 (正しく動作している限りCoverityによって報告されたチェックの条件が発生することはないため、この処理は故意に追加していなかったが、ほかの層やFSでの動作に問題があれば同条件が発生する可能性がないとはいえないため、指摘にしたがって処理を追加するものとした) (Stanislav Sedov氏の指摘。感謝)
7.2 unionfs-18.diffにおける変更点
- アクセス権の確認が不十分な処理が存在したためこれを修正
- 不要なメモリを即座に解放するように変更
- Linuxバイナリ互換機能と併用した際にreaddirが永久ループする問題を回避する処理を追加
7.3 unionfs-17.diffにおける変更点
- 上層/下層の双方にvnodeが存在する場合に下層のvnodeをvmがロックせずにアクセスする問題を解決するため、上層/下層の双方を常にロックする実装に変更。
- 上層/下層の双方をロックする実装は、カーネルのデッドロックを容易に引き起こしてしまう。これを解決するためにvfs_lookup.cに修正を追加。この修正で、親vnode→子vnodeの順でかならずロックを実施するようになる。これはcache_lookupの実装で示されているように、デッドロックを回避するために必要。
- open/closeをカーネルスレッド毎に管理するように変更。
- readdirの処理状態をカーネルスレッド毎に管理するように変更。
- advlockで上層へ複製する際に、必要に応じてvnodeを再オープンするように変更。
- mount_unionfsのオプションをfstab表記に対応するように変更(Craig Rodrigues氏による)
- マニュアルを変更(Craig Rodrigues氏による)
7.4 unionfs-16.diffにおける変更点
- 名称規則やコーディングスタイルをよりFreeBSD kernel srcの流儀にそったものに変更
- sys/ufs/ufs/ufs_lookup.cに対するパッチを-currentへマージ。このため-current向けパッチセットからはsys/ufs/ufs/ufs_lookup.cへのパッチを削除
- -currentにおけるsys/fs/unionfs/union_subr.cへの変更に対応して、パッチ内容の変更
7.5 unionfs-15.diffにおける変更点
- -rオプションの削除と、マニュアルの更新
- 名称規則やコーディングスタイルをよりFreeBSD kernel srcの流儀にそったものに変更
7.6 unionfs-14.diffにおける変更点
- mount_unionfs.8の変更を追加 (佐藤広生さんから寄贈)
- 下層のファイル/ディレクトリに対して EXTATTR(ACL, MAC) の設定が行われてしまう問題を修正
- FreeBSDでより扱いやすいようにThe BSD Licenseの3項目の条項を削除
7.7 unionfs-13.diffにおける変更点
- VOP_RENAME 呼び出し直後に compact2 などの panic が発生する問題を修正
7.8 unionfs-12.diffにおける変更点
- VOP_LOOKUPで共有ロックを要求された場合に、ロックせずに応答する場合があったのを修正
- FreeBSD 6.xにてロック関連のpanicが発生する問題を修正
- その他、雑多な修正
7.9 unionfs-11.diffにおける変更点
- ロック/アンロックに関する実装を一部変更。これにより、LK_CANRECURSEを使用せずにnullfsと共有可能となった。また、以前の null_vnops.cへの修正は不要となったため削除
- shadow fileの作成に失敗した場合に、vnodeをアンロックしない場合があるのを修正
7.10 unionfs-10.diffにおける変更点
- VOP_RENAMEの処理でvnodeのlockを解除しない場合があるのという問題を修正
- umount -f でpanicする問題への対策を実装
- VOP_ADVLOCKの処理でロックの一貫性を保証するために常に上層へshadow fileを作成するように処理を変更
7.11 unionfs-9.diffにおける変更点
- nullfsと併用できるようにした。この問題を解決するために、src/sys/fs/nullfs/null_vnops.cのロック処理を修正した。
7.12 unionfs-8.diffにおける変更点
- アクセス可能な一般ユーザがshadow dirを作成できないためにディレクトリを移動できない問題を修正。これを解決するために、shadow dir作成時に一時的にroot権限を取得する
2006/02/13 - 6.xにおいてビルドできない問題があったため、unionfs6-p8.diffを修正したunionfs6-p8-fix1.diffを追加。
7.13 unionfs-7.diffにおける変更点
- 空ではないディレクトリを削除できる問題を解決。この問題を解決するために、src/sys/ufs/ufs/ufs_lookup.cのホワイトアウトに関する問題を修正している
- "Returning with 1 locks held." panic が発生する問題を修正。shadow dirの作成失敗時にvnodeのロックを解放していないという問題があった
7.14 unionfs-6.diffにおける変更点
- ln(1)に-fオプションを付加した場合に既存のリンクの削除に失敗する問題を修正。同時にハードリンク特有の問題もいくつか対策
- VOP_GETWRITEMOUNTに対する処理を追加。以前の処理ではvn_start_writeが機能しないため書き込みが正常に行われない恐れがあった
7.15 unionfs-p5.diffにおける変更点
- "can't fifo/vnode bypass -1" panic が発生する問題を修正
- ソースコードへ動作説明のコメントを追加
- style(9)に準拠したソースコードスタイルへ編集
7.16 unionfs-p4.diffにおける変更点
- 64bit arch で正常動作しない問題を修正
- __FreeBSD_versionによる6-stable/7-currentの切り分けを追加
7.17 unionfs-p3.diffにおける変更点
- shadow dirの属性を正しく設定しない問題を修正
- 不要なアンロックを行い、アンロックしなければいけない vnode をロックしたまま関数を抜けていた問題を修正(p2の修正では不十分だった)
- 一部のcomponentnameが正しく初期化されていない問題を修正
7.18 unionfs-p2.diffにおける変更点
- 不要なアンロックを行い、アンロックしなければいけない vnode をロックしたまま関数を抜けていた問題を修正。VOP_RENAMEのfdvpをロックせずにホワイトアウトを作成していたため、下層に対応するファイルがある場合にrenameを実行するとパニックが発生していた。
- unionfs-p1.diffでは3つの動作モードとして[-c <old|fullcopy|useful>]を使っていたが、名前が不適切という指摘に従い、より直感的でわかりやすい名前として[-c <traditional|transparent|masquerade>]へ変更
7.19 unionfs-p1.diffにおける変更点
- 従来のunionfsにおけるロックの実装を改良することに限界を感じたため、ロックの戦略を変更し、フルスクラッチからunionfsを構築。
- 従来のunionfsが抱えていた様々な問題をわかっている範囲でより正しく実装。ただし、readdirの実装は一考の余地あり。
8 既知の問題
- 下層にのみ存在するディレクトリをrenameすると、ディレクトリ以下に存在しているファイルなどにアクセスできなくなる。これは、上層にshadow dirを作成しこれをリネームした後、ホワイトアウトを作成しているためである。下層のディレクトリ内を維持したままrenameするには、上層に完全なコピーを作成してからrenameすること。これは、バグではなく仕様
- ハードリンクを作成する場合、lookup直後にVOP_GETWRITEMOUNTが呼び出されるため、下層にのみファイルが存在する場合、上層のvnodeに対するVOP_GETWRITEMOUNTを呼び出すことができない。これにより、ハードリンクの作成に失敗する。根本的な解決を行うには、VOP_GETWRITEMOUNT内でshadowfileを作成することだが、VOP_GETWRITEMOUNT内部でFSに変更を加えること出来ない。現在のカーネルソースでvop_stdgetwritemountを使用するファイルシステムの場合は単純にマウントポイントを取得するだけなので、上位のディレクトリのvnodeを利用することで解決できる。しかし、保証されていないため安全ではない。現在はこの方法で問題を回避しているが、将来的には問題となる恐れがある。また、複数のマウントポイントを内報するディレクトリをunionfsでマウントした場合、この解決策が仇となる可能性がある。よって、複数のマウントポイントを内包するディレクトリをunionfsでマウントすることは避けるべきである。
- stat(2)は、ホワイトアウトを識別できない。現在のufsおよび他のファイルシステムは、ホワイトアウトの vnode を応答しないため、stat(2)でホワイトアウトの情報を取得することはできない(マニュアルには取得できるかのように書かれている)。しかし、rm(1)などはこれを考慮した実装となっており、問題ではなく仕様として捉えるべきかもしれない(どのような流れでこのような仕組みにたどりついたのか知らないため、この点については既存の仕組みを因習している)
9 成果物のマージ1
unionfs-17.diffからsys/kern/vfs_lookup.cに対するパッチをはずした成果物が2006-12-02 19:35:56 UTCづけのFreeBSD 7-currentブランチにマージされた。
リスト9.1 unionfs-17.diffからsys/kern/vfs_lookup.cに対するパッチをはずした成果物を-currentへマージ
rodrigc 2006-12-02 19:35:56 UTC
FreeBSD src repository
Modified files:
sys/fs/unionfs union.h union_subr.c union_vfsops.c
union_vnops.c
sbin/mount_unionfs Makefile mount_unionfs.8 mount_unionfs.c
Log:
Many, many thanks to Masanori OZAWA <ozawa@ongs.co.jp>
and Daichi GOTO <daichi@FreeBSD.org> for submitting this
major rewrite of unionfs. This rewrite was done to
try to solve many of the longstanding crashing and locking
issues in the existing unionfs implementation. This
implementation also adds a 'MASQUERADE mode', which allows
the user to set different user, group, and file permission
modes in the upper layer.
Submitted by: daichi, Masanori OZAWA
Reviewed by: rodrigc (modified for minor style issues)
Revision Changes Path
1.13 +1 -1 src/sbin/mount_unionfs/Makefile
1.21 +184 -23 src/sbin/mount_unionfs/mount_unionfs.8
1.25 +107 -74 src/sbin/mount_unionfs/mount_unionfs.c
1.33 +87 -92 src/sys/fs/unionfs/union.h
1.87 +948 -1080 src/sys/fs/unionfs/union_subr.c
1.79 +394 -332 src/sys/fs/unionfs/union_vfsops.c
1.135 +1864 -1613 src/sys/fs/unionfs/union_vnops.c
2007-02-13 05:56:43 UTC、主要なコードの大半がFreeBSD 6-stableブランチにマージされた。
リスト9.2 FreeBSD 6-stableに成果物がマージされた
rodrigc 2007-02-13 05:56:43 UTC
FreeBSD src repository
Modified files: (Branch: RELENG_6)
sys/fs/unionfs union.h union_subr.c union_vfsops.c
union_vnops.c
sbin/mount_unionfs Makefile mount_unionfs.8 mount_unionfs.c
Log:
MFC: New unionfs implementation from Daichi GOTO and Masanori OZAWA,
which fixes many locking and crashing problems in the previous
implementation. kib@ helped a lot by eliminating a source
of deadlocks encountered with unionfs with these commits:
rev. 1.50 of src/sys/fs/deadfs/dead_vnops.c
rev. 1.97 of src/sys/kern/vfs_lookup.c
Submitted by: daichi, Masanori OZAWA <ozawa ongs co jp>
Revision Changes Path
1.12.8.1 +1 -1 src/sbin/mount_unionfs/Makefile
1.20.2.1 +198 -25 src/sbin/mount_unionfs/mount_unionfs.8
1.24.2.1 +108 -74 src/sbin/mount_unionfs/mount_unionfs.c
1.31.2.1 +88 -94 src/sys/fs/unionfs/union.h
1.86.2.1 +937 -1080 src/sys/fs/unionfs/union_subr.c
1.76.2.2 +398 -334 src/sys/fs/unionfs/union_vfsops.c
1.132.2.1 +1879 -1607 src/sys/fs/unionfs/union_vnops.c
10 成果物のマージ2
unionfs-p19-20070524.diffは2007年10月14日(日本時間)、FreeBSD 8-currentブランチにマージされた。次いで2007年10月22日(日本時間)にRELENG_7へ、翌2007年10月23日(日本時間)にデフォルトモードの変更パッチだけを除外したものがRELENG_6へマージされた。
11 Appendix
11.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やほかのunionfsに関する多くの問題も修正されている。
将来的には、-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)を参照のこと。
Q: viで書き込むと次のメッセージを表示することがある。他のプロセスで、何も変更を加えていないが問題ないか?
'filename: file modified more recently than this copy; use ! to override.'
A: 上層へ 'copied-up file'を作成した場合にも表示される。これは、ファイルのinodeが変更されたことをviが検出するため。正常な動作であり問題はない。
11.2 連絡先
日本語から英語への翻訳に興味がある方は、翻訳したテキストをdaichi AT-MARK freebsd.orgかdaichi MT-MARK jp.freebsd.orgへ寄贈プリーズ。日本語テキストだとSPAMフィルタで弾かれる可能性があるのでjp.freebsd.orgの方がいいかも。バグ報告も同アドレスへ。
11.3 謝辞
太田さんと小野寛生さん、田丸博晴さんのご尽力によって、本サイトに英語版ページが作成されました。マニュアルページは佐藤広生さんによって編集されました。高品質なマニュアルが実現されたのは佐藤さんの手によるものです。感謝! 日本語サイトは随時更新されますので、英語版サイトを読んで日本語が混じっているところは、随時だれか英語に翻訳して〜
ディスクレス環境でのunionfsの動作試験を行ってくれているDanny Branissさん、FreeSBIEの主要開発者であり、最新のFreeSBIEで現在のunionfsの成果物を統合して積極的に開発を展開してくれているDario Freniさん、src committerにしてはじめてマージにむけて興味を持ってくれたAlexander Leidingerさん、daichiのsrc mentorを担当しマージへ向けて忍耐よく作業をしてくれたsrc committerのCraig Rodriguesさん。特にCraig Rodriguesさんのご尽力によってFreeBSD 7-currentへのマージが実現したといっても過言ではない。
whiteoutモード機能を提供してくれたEd Schouten氏。Coverityで報告されたNULLチェック関連の修正を示唆してくれたStanislav Sedov氏。いつも誰よりもはやくデッドロックやパニックの報告をしてくれるKris Kennaway氏。大量のunionfsパッチをレビューしてくれたJeff Roberson氏とKen Smith氏。
そして、自分のおかしな英語翻訳を修正してくれたFabian Keilさん、みなさんに感謝っ