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に負けてない性能を体験しよう。
この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!