---
title: ZFS — カーネルの一部ではないが、避けては通れない
url: https://doc.liz6.com/ja/linux-kernel/03-file-system/05-ZFS
locale: ja
area: linux-kernel
tags:
- linux-kernel
- file-system
date: 2026-06-30
modified: 2026-07-16
description: '概要: ZFS アーキテクチャ (ZPL/DMU/SPA/ZIL/ARC) → COW トランザクションモデル → Linux VFS との統合 (SPL) → Btrfs/bcachefs との比較 → ライセンス問題'
---

# ZFS — カーネルの一部ではないが、避けては通れない

> 概要: ZFS アーキテクチャ (ZPL/DMU/SPA/ZIL/ARC) → COW トランザクションモデル → Linux VFS との統合 (SPL) → Btrfs/bcachefs との比較 → ライセンス問題

## なぜ ZFS は Linux カーネルに含まれないのか

ZFS は CDDL ライセンスを使用しており、Linux の GPLv2 と互換性がありません。Sun/Oracle はデュアルライセンスを選択しなかったため、ZFS は Linux メインラインにマージされることはありません。

**解決策**: OpenZFS は **カーネルモジュール** として提供され、DKMS を介してコンパイル・インストールされます。CDDL モジュールと GPL カーネル間のインターフェースは、SPL (Solaris Porting Layer) によって抽象化されます。ライセンス紛争の焦点は「派生作品に該当するか」という点にあり、これは法的なグレーゾーンであるため、ディストリビューションごとの対応が異なります：
- Ubuntu: `zfs-dkms` を直接パッケージ化
- Debian: contrib リポジトリで提供
- Fedora/RHEL: 公式サポートなし（ユーザーが自行コンパイル）

---

## ZFS アーキテクチャスタック

<svg viewBox="0 0 720 420" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="ZFS カーネルモジュールアーキテクチャ: ユーザー空間から VDEV 物理デバイス抽象化までの呼び出し階層">
  <defs>
    <marker id="zfs-arch-arrow" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="420" fill="#ffffff"/>
  <text x="360" y="26" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">ZFS アーキテクチャスタック: ユーザー空間から物理デバイスへの呼び出し階層</text>

  <rect x="190" y="42" width="340" height="32" rx="6" fill="#e2e8f0"/>
  <text x="360" y="63" text-anchor="middle" font-size="12" font-weight="700" fill="#334155">ユーザー空間 — zfs(1) / zpool(1) / libzfs</text>

  <line x1="360" y1="74" x2="360" y2="88" stroke="#475569" stroke-width="1.6" marker-end="url(#zfs-arch-arrow)"/>
  <text x="360" y="100" text-anchor="middle" font-size="12" font-weight="700" fill="#1f2933">カーネル (OpenZFS モジュール)</text>

  <rect x="50" y="108" width="620" height="306" rx="10" fill="none" stroke="#cbd5e1" stroke-dasharray="4 3"/>

  <rect x="64" y="118" width="592" height="44" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="136" font-size="12" font-weight="700" fill="#3730a3">ZPL(ZFS POSIX Layer) — VFS インターフェース(i_op / f_op など)</text>
  <text x="76" y="153" font-size="10" fill="#4f46e5">zfs_znode → 対応する inode → zfs_vnode_ops → VFS file_operations</text>

  <rect x="64" y="168" width="592" height="44" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="186" font-size="12" font-weight="700" fill="#3730a3">DMU(Data Management Unit) — トランザクションオブジェクトからブロックへのマッピング</text>
  <text x="76" y="203" font-size="10" fill="#4f46e5">dnode→オブジェクト(ファイル/ディレクトリ/属性) · dmu_tx→トランザクション · dnode→ブロックポインタツリー(間接ブロック)</text>

  <rect x="64" y="218" width="592" height="44" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="76" y="236" font-size="12" font-weight="700" fill="#115e59">ZIL(ZFS Intent Log) — 同期書き込みジャーナル</text>
  <text x="76" y="253" font-size="10" fill="#0f766e">zil_commit() → ZIL デバイス(SSD/HDD パーティション)への書き込み、fsync を高速化(同期書き込みは大トランザクションを迂回)</text>

  <rect x="64" y="268" width="592" height="44" rx="8" fill="#dcfce7" stroke="#4ade80"/>
  <text x="76" y="286" font-size="12" font-weight="700" fill="#166534">ARC(Adaptive Replacement Cache) — 読み込みキャッシュ</text>
  <text x="76" y="303" font-size="10" fill="#15803d">MRU(最近最も多く使用) + MFU(最近最も頻繁に使用) · page cache よりも先進的で、zfs_arc_max で設定可能</text>

  <rect x="64" y="318" width="592" height="44" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="336" font-size="12" font-weight="700" fill="#3730a3">SPA(Storage Pool Allocator) — 物理デバイス管理層</text>
  <text x="76" y="353" font-size="10" fill="#4f46e5">metaslab→空き空間管理 · space map→ログ形式での追跡 · 割り当てポリシー first-fit / best-fit</text>

  <rect x="64" y="368" width="592" height="44" rx="8" fill="#e2e8f0" stroke="#cbd5e1"/>
  <text x="76" y="386" font-size="12" font-weight="700" fill="#334155">VDEV(Virtual Device) — RAID / デバイス抽象化</text>
  <text x="76" y="403" font-size="10" fill="#475569">disk · mirror · raidz(1/2/3) · special(メタデータ/重複排除) · cache(L2ARC) · log(ZIL/SLOG)</text>
</svg>

---

## COW トランザクションモデル

```
各書き込み操作:
  1. 新しいブロックを割り当て（対象の metaslab で空き領域を検索）
  2. 割り当てられたブロックに新データを書き込み
  3. dnode のブロックポインタを更新（旧ブロックではなく新ブロックを指す）
  4. dnode が変更された → dnode 自体も新しい位置に書き込む必要がある → 上位ポインタを更新
  5. 上位へ遡る → uberblock (ルート) が更新され → 原子操作で完了

重要: 全ポインタ更新は原子的である（uberblock の単一書き込み）
  → クラッシュ後は、旧状態か新状態のどちらかが見えるだけで、中間状態はない
  → これが「ジャーナルがない」という保証である（COW 自体が一貫性を保証する）

トランザクショングループ化 (TXG):
  ZFS は複数のシステムコールによる書き込み操作を 1 つのトランザクショングループ (TXG) に統合する
  約 5 秒ごとにコミットされる (zfs_txg_timeout)
  → 断片化を減らし、書き込みスループットを向上
  → fsync はこの遅延を回避する: ZIL を介して独立してコミットされる
```

---

## SLOG と ZIL

```
ZIL (ZFS Intent Log):
  同期書き込み (O_SYNC / fsync) のアクセラレータ
  通常の非同期書き込み → 5 秒ごとの TXG → ZIL は不要
  同期書き込み → ZIL が個別に記録 → ユーザー空間へ返却 → 高速
         → 5 秒後に TXG がコミット → ZIL の記録は破棄可能

SLOG (Separate LOG):
  ZIL を専用デバイス（低遅延 NVMe SSD）に配置
  同期書き込みのレイテンシを HDD から SSD レベルに低下
  クラッシュリカバリ: ZIL + 最新の TXG をリプレイ → 完全な復旧

ZIL はライトキャッシュではない！
  操作ログのみを保存 → データは常に TXG によってメインストレージに書き込まれる
  停電で ZIL が消失 → 直近 5 秒間の同期書き込みのみが消失（非同期書き込みは影響を受けない）
```

---

## Btrfs/bcachefs との比較

| | ZFS | Btrfs | bcachefs |
|---|---|---|---|
| ライセンス | CDDL | GPLv2 | GPLv2 |
| カーネル統合 | DKMS モジュール | in-tree | in-tree (6.7+) |
| COW | 常に適用 | メタデータは常に、データは任意 | 常に適用 |
| スナップショット | ZVOL, dataset レベル | subvolume | subvolume |
| RAID | raidz(1/2/3), mirror | raid0/1/10/5/6 | 複数デバイス階層 |
| ARC/L2ARC | あり | なし (page cache を使用) | なし |
| 重複排除 | オンライン (メモリを大量消費) | オフライン (ツールあり) | なし |
| 内蔵圧縮 | lz4, zstd, gzip | zstd, lzo, zlib | zstd, lz4, gzip |
| ストレージ送信/受信 | zfs send/recv | btrfs send/receive | 計画中 |

ZFS の明確な優位性は、成熟度（20 年以上の運用実績）と ARC 読み込みキャッシュです。Btrfs の優位性は、カーネルメインラインへの統合と、より軽量な RAID です。bcachefs はまだ新しく、安定性は検証待ちです。

---

## デバッグ

```bash
# ARC の状態（zfs のインストールが必要）
cat /proc/spl/kstat/zfs/arcstats

# プールの状態
zpool status
zpool iostat -v 1

# 現在の TXG
cat /sys/module/zfs/parameters/zfs_txg_timeout
```

---

## 参照と拡張

- **OpenZFS ドキュメント**: https://openzfs.github.io/openzfs-docs/
- **ソースコード**: https://github.com/openzfs/zfs
- **重要論文**: 
  - "The Zettabyte File System" (Sun, 2003)
  - "The Adaptive Replacement Cache" (Megiddo & Modha, 2003)

---

*キーワード: ZFS, DMU, ZIL, ARC, SPA, COW, SLOG, dnode, uberblock, TXG, CDDL, DKMS*
