9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FreeBSD入門シリーズ

Part1 導入 Part2 pkg/ports Part3 jail Part4 ZFS Part5 bhyve
✅ Done ✅ Done ✅ Done 👈 Now -

はじめに

FreeBSDを使う最大の理由、それはZFS

"ZFSは最後のファイルシステムになる" - Sun Microsystems

2005年にSunが開発したこのファイルシステム、機能がヤバい:

  • スナップショット: 瞬時にバックアップ
  • 圧縮: 透過的にデータ圧縮
  • 重複排除: 同じデータは1回だけ保存
  • RAID-Z: ソフトウェアRAIDの進化形
  • 自己修復: データ破損を自動検知・修復
  • Copy-on-Write: データ整合性を保証

ZFSの基本概念

┌─────────────────────────────────────────────────────────────┐
│                        ZFS 構造                              │
│                                                              │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                    ZPool (プール)                    │    │
│  │   物理ディスクをまとめた仮想ストレージ               │    │
│  │                                                      │    │
│  │  ┌───────────┐  ┌───────────┐  ┌───────────┐       │    │
│  │  │  Dataset  │  │  Dataset  │  │  zvol     │       │    │
│  │  │  (FS)     │  │  (FS)     │  │  (Block)  │       │    │
│  │  │ /data     │  │ /home     │  │ swap      │       │    │
│  │  └───────────┘  └───────────┘  └───────────┘       │    │
│  └─────────────────────────────────────────────────────┘    │
│                          ↓                                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │        vdev (仮想デバイス)                          │    │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐              │    │
│  │  │  disk1  │ │  disk2  │ │  disk3  │ (RAID-Z1等) │    │
│  │  └─────────┘ └─────────┘ └─────────┘              │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

用語

  • ZPool: 物理ディスクをまとめたストレージプール
  • vdev: プールを構成する仮想デバイス
  • Dataset: ファイルシステムまたはzvolの論理単位
  • Snapshot: ある時点のデータの読み取り専用コピー
  • Clone: スナップショットから作成した書き込み可能なコピー

プールの作成

シンプルなプール

# 1台のディスクでプール作成
zpool create tank /dev/da0

# 確認
zpool list
# NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
# tank    100G   400K   100G        -         -     0%     0%  1.00x  ONLINE  -

zpool status
# pool: tank
# state: ONLINE
# config:
#
#         NAME        STATE     READ WRITE CKSUM
#         tank        ONLINE       0     0     0
#           da0       ONLINE       0     0     0

ミラー(RAID1相当)

zpool create tank mirror /dev/da0 /dev/da1

RAID-Z1(RAID5相当)

zpool create tank raidz1 /dev/da0 /dev/da1 /dev/da2

RAID-Z2(RAID6相当)

zpool create tank raidz2 /dev/da0 /dev/da1 /dev/da2 /dev/da3

SSDをキャッシュに追加

# 読み取りキャッシュ(L2ARC)
zpool add tank cache /dev/nvme0

# 書き込みログ(SLOG)
zpool add tank log /dev/nvme1

データセットの操作

作成

# ファイルシステム作成
zfs create tank/data
zfs create tank/home
zfs create tank/home/aqua

# 確認
zfs list
# NAME              USED  AVAIL  REFER  MOUNTPOINT
# tank              500K  96.4G    96K  /tank
# tank/data          96K  96.4G    96K  /tank/data
# tank/home          96K  96.4G    96K  /tank/home
# tank/home/aqua     96K  96.4G    96K  /tank/home/aqua

マウントポイントの変更

zfs set mountpoint=/home tank/home

削除

zfs destroy tank/data

スナップショット - ZFS最強の機能

スナップショット作成

# 作成(一瞬で完了)
zfs snapshot tank/home@before-upgrade

# 確認
zfs list -t snapshot
# NAME                       USED  AVAIL  REFER  MOUNTPOINT
# tank/home@before-upgrade      0      -   100K  -

瞬時に作成される理由:Copy-on-Writeのおかげで、メタデータの更新だけで済む。

スナップショットからの復元

# 特定ファイルの復元
cp /tank/home/.zfs/snapshot/before-upgrade/important.txt /tank/home/

# データセット全体をロールバック
zfs rollback tank/home@before-upgrade

スナップショットの差分

# 何が変わったか確認
zfs diff tank/home@before-upgrade tank/home
# M       /tank/home/config
# +       /tank/home/new_file.txt
# -       /tank/home/deleted_file.txt

定期スナップショット

zfs-auto-snapshotを使う。

pkg install zfs-auto-snapshot

# /etc/cron.d/zfs-auto-snapshot に自動で追加される
# 15分、1時間、1日、1週間、1ヶ月のスナップショットを自動作成

クローン - スナップショットから書き込み可能なコピー

# スナップショットからクローン作成
zfs clone tank/home@before-upgrade tank/home-test

# これで tank/home-test は書き込み可能
echo "test" > /tank/home-test/test.txt

開発環境のテストとかに便利。

圧縮

# 圧縮を有効化(lz4が高速でおすすめ)
zfs set compression=lz4 tank/data

# 圧縮率を確認
zfs get compressratio tank/data
# NAME        PROPERTY       VALUE  SOURCE
# tank/data   compressratio  2.50x  -

圧縮アルゴリズムの選択

  • lz4: 高速、軽い圧縮(デフォルト推奨)
  • zstd: より高い圧縮率(CPU負荷高め)
  • gzip: 互換性重視

重複排除(Deduplication)

zfs set dedup=on tank/backup

⚠️ 注意: 重複排除はメモリを大量に消費する。1TBあたり5GBくらい必要。

# 重複排除の効果を確認
zpool list
# NAME    SIZE  ALLOC   FREE  ... DEDUP  HEALTH
# tank    100G    50G    50G  ... 1.50x  ONLINE

クォータと予約

# クォータ(上限)を設定
zfs set quota=10G tank/home/aqua

# 予約(最低保証)を設定
zfs set reservation=5G tank/data

送受信(バックアップ/レプリケーション)

ローカルバックアップ

# スナップショットを別プールに送信
zfs send tank/data@backup | zfs recv backup/data

リモートバックアップ

# SSHで別サーバーに送信
zfs send tank/data@backup | ssh backup-server zfs recv backup/data

増分送信

# 前回のスナップショットとの差分だけ送信
zfs send -i tank/data@yesterday tank/data@today | zfs recv backup/data

スクラブ(データ整合性チェック)

# スクラブ開始
zpool scrub tank

# 進捗確認
zpool status
# scan: scrub in progress since Mon Jan  1 00:00:00 2024
#       1.00G scanned out of 50.0G, 2.00% done

# 月1回は実行推奨

スクラブはディスク上の全データを読み取ってチェックサムを検証する。

トラブルシューティング

ディスク障害

zpool status
# NAME        STATE     READ WRITE CKSUM
# tank        DEGRADED     0     0     0
#   raidz1    DEGRADED     0     0     0
#     da0     ONLINE       0     0     0
#     da1     FAULTED      0     0     0  # ← 壊れた
#     da2     ONLINE       0     0     0
# 新しいディスクに交換
zpool replace tank da1 /dev/da3

# リシルバリング進捗確認
zpool status
# scan: resilver in progress since ...

プールのインポート/エクスポート

# エクスポート(アンマウント)
zpool export tank

# インポート(マウント)
zpool import tank

# 別の場所にインポート
zpool import -R /mnt tank

壊れたプールの回復

# 読み取り専用でインポート
zpool import -o readonly=on tank

# 強制インポート(危険)
zpool import -f tank

パフォーマンスチューニング

# ARC(キャッシュ)サイズ確認
sysctl vfs.zfs.arc_max
# vfs.zfs.arc_max: 4294967296  (4GB)

# ARC統計
sysctl kstat.zfs.misc.arcstats.hits
sysctl kstat.zfs.misc.arcstats.misses

# レコードサイズ調整(データベース向け)
zfs set recordsize=8K tank/database

# 同期書き込みを無効化(危険だが高速)
zfs set sync=disabled tank/temp

実用設定例

ホームディレクトリ

zfs create -o compression=lz4 -o quota=100G tank/home/aqua

データベース

zfs create -o compression=lz4 -o recordsize=8K -o primarycache=metadata tank/mysql

仮想マシン(zvol)

zfs create -V 50G -o volblocksize=4K tank/vm/windows

まとめ

ZFSは:

  • スナップショットが最強(瞬時作成、差分バックアップ)
  • 圧縮・重複排除でストレージ節約
  • RAID-Zでハードウェアなしで冗長化
  • 自己修復でデータ整合性を保証
  • FreeBSDなら標準で使える

ZFSを使うためだけにFreeBSDを使う価値がある

次回予告

Part5: bhyveで仮想化、KVMに負けてない

FreeBSD生まれの仮想化技術「bhyve」。Windows、Linux、他のBSDを仮想マシンで動かせる。KVMに負けてない性能を体験しよう。

この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?