Baidu Blog

Back

This article was translated from English by ChatGPT 5.

ZFS入門#

私のコミュニティに詳しい方ならご存じかもしれませんが、以前のブログサイトが消えてしまったのは、サーバーをZFSへ移行したためでした。

旧ブログではZFSが何であるかを説明していなかったと記憶しています。そこで今回は、ZFSとは何か、そしてなぜ私がメインサーバーにZFSを選んだのかを丁寧に解説します。

構造#

ZFSはもともとSun MicrosystemsによってSolaris向けにファイルシステム兼ボリュームマネージャーとして開発されました。現在はOpenZFSプロジェクトとして維持され、Linuxなどのプラットフォーム上で進化を続けています。

従来、ファイルシステムは「本がどの棚にあるかを知っている司書」のような存在と考えられますが、その本の内容や棚の構造については何も知らない存在でした。

ページがくっついてしまったり(データ破損)、棚自体が崩壊してしまったり(ハード障害)すると、この司書は無力です。

しかし、ZFS(Zettabyte File System)はこのモデルを完全に変革しました。建築家、司書、製本職人を兼ね備えたオールインワンの専門家のような存在です。

ZFSはデータの場所を知っているだけでなく、物理ストレージ(ディスク)の構造を理解し、すべてのデータブロックを継続的に検証します。

従来のようにRAID・ボリューム管理・ファイルシステムが別レイヤーで積み重なるのではなく、ZFSはRAIDコントローラ、ボリュームマネージャ、ファイルシステムを一体化し、統一されたストレージプールを提供します。

この統合により、OSは直接ZFSストレージプールとやり取りし、従来のレイヤー間の情報断絶による非効率やリスクを避けられます。

ZFSのストレージ構造は三層のピラミッドとして理解できます:

  1. 物理ディスク: 最下層。HDDやSSDなど実際のハードウェア。
  2. vdev(仮想デバイス): ZFSの基本構成単位。1つ以上の物理ディスクから構成され、データと冗長性の方式を決めます。単一ディスク、ミラー、RAID-Zアレイなどがあります。
  3. zpool(ストレージプール): 最上位のコンテナ。1つ以上のvdevから構成されます。zpoolが作成されると、その全容量をZFSのすべてのファイルシステム(データセット)で柔軟に利用でき、事前にパーティションを切る必要がありません。

安全性#

冗長性と耐障害性はすべてvdevレベルで実装されます。vdevの種類がプールの性能・容量・安全性を直接決定します。

  • ストライプ/単一ディスク: 冗長性なし。性能と容量は最大化されるが、1台でも故障すればvdev全体が失敗する。
  • ミラー: RAID 1に類似。各ディスクに同じデータを保持。2台ミラーなら1台故障しても無事。ZFSは3重以上のミラーも可能で柔軟。読み込み性能はディスク数に比例し、書き込みは単一ディスク相当。高IOPS向き。
  • RAID-Z: ZFS独自のパリティ方式。従来のRAID 5/6の「ライトホール問題」をCoW(Copy-on-Write)で回避。
    • RAID-Z1: 1台分のパリティ、1台故障に耐える。
    • RAID-Z2: 2台分のパリティ、2台故障に耐える。
    • RAID-Z3: 3台分のパリティ、3台故障に耐える。冗長性が非常に高い。

Copy-on-Write (CoW)#

従来のファイルシステムはデータを上書きするため、書き込み中に電源断が起きれば破損します。

ZFSは決して既存データを上書きしません。変更時の手順は:

  1. 新しいデータを未使用領域に書く。
  2. 親メタデータのポインタを新ブロックに更新。
  3. ポインタ更新はアトミックに行われ、成功か不発かのどちらか。

これにより常に一貫性が保たれ、電源断が起きても旧データは安全です。fsckが不要になります。

スナップショット#

CoWの応用がスナップショットです。指定時点の読み取り専用コピーで、即時作成可能。容量は変更・削除されたブロック分のみ消費。

信頼しない哲学#

ZFSの思想は「ハードウェアを決して信頼しない」。メモリ・ケーブル・コントローラ・ディスクは常に故障し得ると仮定し、エンドツーエンドの多層保護を実装します。

エンドツーエンド検証#

各ブロックにチェックサムを保持し、読み出し時に検証。親ポインタに格納されるため、Merkle木(ハッシュ木)を形成。これにより隠蔽できない完全な信頼連鎖を実現します。

自己修復#

冗長性がある場合、破損を検出すれば正常コピーから復元し、破損データを修復します。さらに定期的なスクラビングで潜在的エラーも洗い出します。

性能#

ZFSはキャッシュとログを駆使して最適化しています。

読み取り#

ARC(適応置換キャッシュ)をRAM上に保持。利用頻度に基づいて効率的にヒット率を高めます。メモリ増設が最も効果的な性能改善。

L2ARCはSSDを使った二次キャッシュですが、インデックス用にRAMを消費するため、むやみに大きくすると逆効果。まずRAM増設を優先すべきです。

書き込み#

非同期書き込みは即完了応答し、高速。同期書き込みはZIL(ZFS Intent Log)に記録されます。SLOG(専用ログデバイス)をNVMeなどに配置すると大幅に性能改善。ただし恩恵があるのは同期書き込みのみ。

代替技術#

ZFS以外にもBtrfsやLVM+ext4/XFSなどが存在。機能比較表は以下の通り。

(省略:表は原文のとおり)

商用の類似技術にはStorage Spaces、Veritas VxVM、Oracle ASM、NetApp ONTAP、Dell PowerScaleなどがあります。

結論#

私のメインサーバーにはECC RAM 96GBがあるため、最終的にProxmox VEに含まれるZFSを選びました。

スナップショットで削除ファイルを復元できた経験から、ZFSは私のお気に入りとなりました。大容量メモリをお持ちなら強くおすすめします。

普段は小説を書くので文の切れ方が少し不自然かもしれませんが、ご容赦ください。これで初心者にも分かりやすいZFS入門を締めくくります。それでは、次回の記事でお会いしましょう 👋

Introduction to ZFS
https://baidu.blog.icechui.com/ja/blog/p/zfsintro
Author baidu0com
Published at August 18, 2025