BigAdmin System Administration Portal
ZFS の移植 (OpenSolaris.org)
Print-friendly VersionPrint-friendly Version

他のプラットフォームへの ZFS の移植

何人かの方々から、他のプラットフォームへの ZFS の移植についてご質問をいただくと同時に、コードの移植作業のお申し出までいただきました。このページは移植プロセスを支援するとともに、経験と発見を共有するための共通の場を提供するためのものです。ZFS を他のプラットホームに移植していて、このページへの投稿を希望される場合は、コミュニティーリーダーのひとりにメールしてください。そのミュニティーリーダーは、ユーザがこの内容を編集することができるようにユーザーをリーダーにすることができます。

進行中の移植作業

FUSE

Ricardo Correia は ZFS をユーザーランド用のファイルシステムとして FUSE に移植しようとしています。プロジェクトのページは次のとおりです。

http://www.wizy.org/wiki/ZFSonFUSE

また、Ricardo のブログは次のとおりです。

http://zfs-on-fuse.blogspot.com/

FreeBSD

Pawel Jakub Dawidek は FreeBSD への ZFS の移植を行おうとしています。FreeBSD については、次を参照してください。

http://perforce.freebsd.org/depotTreeBrowser.cgi?FSPC=//depot/user/pjd/zfs

gcc 情報

ZFS のソースコードは ON のすべてと同様に 'shadow compilation' の一部としてビルドされ、gcc を使用して、gcc 特有の警告を検出するようにデザインされています。なお、現在のクリーンなビルドを得るために警告のセットを少々修正した上で使用しています。詳細は、ON で使用している「コンパイララッパー 」を参照してください。具体的には、次の警告フラグを使用しています。

    -Wall
    -Wno-unknown-pragmas
    -Wno-missing-braces
    -Wno-sign-compare
    -Wno-parentheses
    -Wno-uninitialized
    -Wno-implicit-function-declaration
    -Wno-unused
    -Wno-trigraphs
    -Wno-char-subscripts
    -Wno-switch

このほかにも、C99 互換性規則を実施するための -std=gnu99 オプションがあります。これらと同じオプションを使用すると、間違いなく移植が容易になります。

推奨フェーズ

ZFS の移植にアプローチするにはさまざまな方法がありますが、次に、推奨する一連のマイルストーンを示します。これらのマイルストーンでは「ソースツアー」に記載の用語を使用しているので、読み進める前に、ZFS ソースコードの配置、つまり大まかな階層構造を理解しておいてください。

libzpool と ztest

libzpool は SPA (Storage Pool Allocator) と DMU (Data Management Unit) のユーザーランドへの移植で、必要なソースコードの大部分を含んでいます。libzpool は、ztest によるユーザーランドのテストと zdb によるデバッグを目的としてデザインされています。libzpool は、カーネル特有のコードが zfs_context.h としてすでに仕分けされているので、比較的簡単に移植できるはずです。Solaris のこれらのインタフェースの移植 (#define でできない移植) は、usr/src/lib/libzpool/common を参照してください。

ztest をループ内で一日中問題なく実行できた場合は、カーネルコードのおそらく 80% が移植できています。しかし、もっとも困難な 20% はまだ残っています。これには、ztest の一部として使用される zdb の移植も必要になります。

zpool(1M) と zfs(1M)

次のステップはユーザーランド管理ツール、[zfs(1M)] (http://cvs.opensolaris.org/source/xref/on/usr/src/cmd/zfs/) と zpool(1M) を取得して作業し、データセットを作成することです。この作業では、ZPL を使用する必要があるファイルシステムの実際のマウントは行いませんが、ユーザーランドからカーネルへのインタフェースを設定し、DSL の動作確認を行います。

カーネル側では、/dev/zfs を作成し、zfs_ioctl.c に定義されている ioctl をサポートする必要があります。

zvol

実行するシンプルなインカーネルコンシューマは zvol (ZFS volume) インタフェースです。これにはいくらかの OS 特有のデバイスに関する知識が必要になりますが、DMU インタフェースは非常にシンプルです。zvol.c を参照してください。

ZFS ファイルシステム

最後のハードルはもっとも困難です。それは OS 特有の VFS インタフェースを使用して大部分を最初から書く必要があるためです。現在の ZPL のコードは実装にアプローチする方法についてのアイデアを得るためのガイドラインとしては役に立ちますが、きわめて Solaris 特有のコードになっています。一部のアイデア (拡張属性 NFSv4/NT ACL) はまったく移植できないオペレーティングシステムもあります。

BigAdmin