ZFSは、主にオラクルのSolaris上で実装されている128ビット・アドレッシングを特徴とするファイルシステム。今までSolaris (SunOS) で用いられてきた Unix File System (UFS) の次世代ファイルシステムと位置づけられている。名称はZettabyte File Systemに由来するが、現在は何の略称でもないとされる。

## 概要

2004年9月にアナウンスがあり、2005年11月リリースのOpenSolaris build 27で実装が公開された。
"Common Development and Distribution License" (CDDL) のもと、オープンソースで開発されている。

特徴として以下の項目が挙げられる。

- チェックサムが64ビット化された
- コピーオンライトの実装
- ボリュームマネージャが必要なく、ボリュームの構成が容易にできるようになった
- ディスクの違い(容量、種類)を吸収する仮想ボリューム(ストレージプールと呼称)をサポート
- ストレージプールの作成・フォーマット・マウントがコマンド一行ですむ
- ファイルシステム自身がRAID機能を持つ
- ブロックサイズが可変長かつファイルシステム単位で指定可能、サイズ上限はストレージプールの仕様上限となる16MBまで
- スナップショットおよびブックマークを用いたフル・差分バックアップおよびリストア

またSolaris10 11/06版より以下の機能が加わった。

- RAID-Z2(ダブルパリティによるRAID-6相当の機能)
- ホットスペア
- クローンプロモーション(アクティブなZFS領域を複製と置換を容易にする機能)
- 再帰的スナップショットコマンドの簡素化オプション

以下に記載されていない機能追加として、Oracle Solaris Solaris SRU 11.2.8.4.0などより、Persistant L2ARC (ブートをまたがるL2ARCの内容の再利用)が追加されている(他の環境での実装状況を記載する必要あり) 。

以降の追加機能は下記のバージョン番号を参照。

### バージョン番号

利用可能な形式と特徴を指定するために、新機能が導入されるに従ってZPoolとZFSのバージョン番号が増える。バージョン番号の一覧は以下の通り。([]内はサポートしているオペレーティングシステム)

1. Initial ZFS version [Supported by Solaris 10 06/06]
2. Ditto blocks (replicated metadata) [Supported by Solaris 10 06/06 build 09]
3. Hot spares and double parity RAID-Z [Supported by Solaris 10 11/06]
4. zpool history [Supported by Solaris 10 08/07]
5. Compression using the gzip algorithm
6. bootfs pool property [Supported by FreeBSD 7.0]
7. Separate intent log devices
8. Delegated administration [Supported by Solaris 10 10/08]
9. refquota and refreservation properties
10. Cache devices
11. Improved scrub performance
12. Snapshot properties
13. snapused property [Supported by OpenSolaris 2008.11, FreeBSD 8.0]
14. passthrough-x aclinherit [Supported by OpenSolaris 2009.06, FreeBSD 8.1]
15. user/group space accounting [Supported by Solaris 10 10/09, FreeBSD 8.2, FreeBSD 8-STABLE]
16. stmf property support
17. Triple-parity RAID-Z
18. Snapshot user holds
19. Log device removal
20. Compression using zle (zero-length encoding)
21. Deduplication
22. Received properties [Supported by Solaris 10 9/10]
23. Slim ZIL
24. System attributes
25. Improved scrub stats
26. Improved snapshot deletion performance
27. Improved snapshot creation performance
28. Multiple vdev replacements [Supported by FreeBSD 9-CURRENT]
29. RAID-Z/mirror hybrid allocator [Supported by Solaris 10 8/11]
30. ZFS data set encryption
31. Improved 'zfs list' performance [Supported by Solaris 11 Express b151a]
32. One MB blocksize
33. Improved share support [Supported by Solaris 11 EA b173]
34. Sharing with inheritance [Oracle Solaris 11.1 or later]
35. Sequential resilver [Oracle Solaris 11.2 or later]
36. Efficient log block allocation [Oracle Solaris 11.3 or later]
37. lz4 compression
38. xcopy with encryption [Oracle Solaris 11.4 or later]
39. reduce resilver restart
40. Deduplication 2
41. Asynchronous dataset destroy
42. Support for reguid
43. RAID-Z enhancements and cloud device support
44. Device Removal

今、自分のシステムでどのバージョンまでサポートしているか知りたい場合はコマンド`zpool upgrade -v`で確認できる。

2012年1月、OpenZFSは従来のバージョン番号に代わり、機能フラグ(feature flag)を導入した。これにより、新規に追加された機能は個別にサポートを有効化ないしは無効化できるようになっている。機能フラグの状況についても、コマンド`zpool upgrade -v`で確認できる。

## 訴訟合戦

2007年9月、ネットアップがZFSは自社の特許を侵害しているとして、開発したサン・マイクロシステムズを訴えた。10月にサン・マイクロシステムズは特許は無効と反訴。互いの経営者同士が自らのブログで応酬を繰り広げていたが、サンがオラクルに買収された後の2010年9月9日、訴訟取り下げで合意した。

## キャパシティ

128ビット・アドレッシングで主な制限は以下の通り。

- 16エクサバイト — ファイルシステムの最大値
- 16エクサバイト — 1ファイルの最大値

## プラットホーム

このほか、SunOS系列(Illumos系統含む)ディストリビューションでもサポートされている。

### 移植

CDDLでライセンスされるオープンソースであり、Solaris系以外のUnix系オペレーティングシステムにも移植が進んでいる。

## 制限事項

ZFSはデータの更新を常にコピーオンライト処理とする。これに起因して、既存のUnix向けファイルシステムでは発生しないような問題が生じることがある。

ZFSにて、データが頻繁に更新されるファイルシステムにて空き容量が少なくなると、空き容量がゼロでないにもかかわらずデータ更新に失敗することがある。これはコピーオンライトを採用したファイルシステムでは避けられない問題である。具体的な例として、固定サイズのファイルに`mmap()`を用いてアクセスする場合、ページをファイルへ書き戻す際にファイルシステムの空き容量不足によるエラーを防ぐため、`fallocate()`ないしは`posix_fallocate()`を用いてファイルブロックを確保する習慣があるが、ZFSではコピーオンライトが必須となっている影響により、これを実行してもなおエラーが発生する場合がある。この影響で、ZFSは当初`fallocate()`の実装を見送っていた。2020年6月までに、Linuxに限って`fallocate()`の互換実装がマージされている。しかし、実際にはスナップショットや圧縮機能との干渉が指摘されており、本質的な対応は困難とされている。また、詳細な調査の結果、illumosにてZFSへのカーネルコアダンプをサポートするため、ファイルブロックを確保する機能がZFSに存在することが確かめられた。しかし、この機能はコピーオンライトをバイパスした書き込みを実行するなど利用目的がカーネルコアダンプに限定されており、`fallocate()`を含めた通常運用下での使用は考慮されていないことも明らかになっている。

ZFS上のファイルに対してランダムアクセスによるデータ更新を行うと、予め`fallocate()`などにより物理的に連続したファイルブロックを確保することを期待していてもブロックが断片化する。ext4が`fallocate()`による連続したファイルブロックの確保を正式にサポートしていることから、これを前提としたソフトウェアをZFSへ持ち込むと問題が発生しやすい。これもデータ更新がコピーオンライト処理となる直接の結果であり、`mmap()`の使用により特に顕著となる。このような場合はファイルブロックに対して連続性を前提とするのではなく、断片化を容認した上で、それが機能や性能に影響しないようにする必要がある。また、ファイルシステム単位での可変長ブロック機能を利用すれば最大16MBの物理的に連続したブロックが使用できる。ext4の最大エクステント(4KBブロックの場合、128MB)よりは小さいものの、個々のファイルに対する特殊な設定変更は不要である。