ZFSとは
ZFSは元々Oracle社のSoralis上で実装されたファイルシステムです。 LinuxにもZFS on Linuxとして実装されておりカーネルモジュールとして動作します。
ZFSは以下のような特徴があります。
- 差分スナップショットの作成
- コピーオンライトの対応
- RAID-ZというRAID-5に近い仕組みの実装
- 暗号化や圧縮の対応
セットアップ
今回はEC2用のUbuntu22.04のイメージを使用してセットアップします。 手順は公式のものに従います。
インストール
$ sudo apt update
$ sudo apt install zfsutils-linux
公式の手順ではリポジトリを追加していますが、不要でした。
ZFSをつかってみる
ZFSを使う上で抑えて抑えておくと良い単語を以下に整理しておきます。
用語解説
- プール: 複数のデバイスのグループ。ここにボリュームを作成していく。
- ボリューム: 実際に使用するデータ領域。一つのプールに対して複数作成できる。パーティションのような存在。
- RAID-Z: RAID-5に近い機能。パリティの数を1-3で選択可能。プールの構成に関わってくる。
プールの作成
今回は10GiBのEBSボリュームを3つアタッチしてあります。
今回は3つのボリュームからRAID-Z(パリティは1つ)でプールを構築します。
プールの作成
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
nvme0n1 259:0 0 8G 0 disk # これはルートボリューム
├─nvme0n1p1 259:2 0 7.9G 0 part /
├─nvme0n1p14 259:3 0 4M 0 part
└─nvme0n1p15 259:4 0 106M 0 part /boot/efi
nvme1n1 259:1 0 10G 0 disk # ZFS用のボリューム
nvme3n1 259:5 0 10G 0 disk # ZFS用のボリューム
nvme2n1 259:6 0 10G 0 disk # ZFS用のボリューム
# zpool create のコマンドは以下
# zpool create <プール名> <RAID構成> <デバイス>
$ sudo zpool create sample-pool raidz /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
$ zpool status
pool: sample-pool
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
sample-pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
errors: No known data errors
無事に構築できたようです。 エラーも出ていません。
ボリュームの作成
sample-volume
という名前でボリュームを作ってみます。
インストール
$ sudo zfs create sample-pool/sample-volume
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
sample-pool 163K 19.0G 30.6K /sample-pool
sample-pool/sample-volume 30.6K 19.0G 30.6K /sample-pool/sample-volume
$ zfs get mountpoint
NAME PROPERTY VALUE SOURCE
sample-pool mountpoint /sample-pool default
sample-pool/sample-volume mountpoint /sample-pool/sample-volume default
無事に作成できたようです。 使用可能な領域が19になっているのはパリティが存在するためです。 パリティが一つあるため、使用可能な領域がn-1/nになります。(RAID5と同じです)
ボリュームは/sample-pool
以下に自動でマウントされます。
適当にダミーのファイルを置いてみます。
ダミーファイルの配置
$ sudo dd if=/dev/zero of=/sample-pool/sample-volume/dummy bs=1M count=1024
$ echo "Hello, ZFS!" | sudo tee /sample-pool/sample-volume/hello.txt
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
sample-pool 1023M 18.0G 30.6K /sample-pool
sample-pool/sample-volume 1023M 18.0G 1023M /sample-pool/sample-volume
しっかりと使用率が上昇していますね。
その他の機能
他にもいくつか機能があるので見ていきます。
スナップショット
スナップショットの作成
先程のボリュームからスナップショットを作成します。
スナップショット
$ sudo zfs snapshot sample-pool/sample-volume@snap0
$ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
sample-pool/sample-volume@snap0 0B - 1023M -
# ファイルを編集して再度スナップショット作成
$ echo "Hello, ZFS! edtied..." | sudo tee /sample-pool/sample-volume/hello.txt
$ sudo zfs snapshot sample-pool/sample-volume@snap1
$ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
sample-pool/sample-volume@snap0 16.7K - 1023M - # 差分でスナップショットを作成するため使用率が増加
sample-pool/sample-volume@snap1 0B - 1023M -
無事にスナップショットが作成できたようです。
ちなみにこのスナップショットを別プールに移動させたり、別のサーバーに送ったりすることもできます。
スナップショットからの復元
スナップショットから復元してみます。
スナップショットからの復元
$ sudo zfs clone sample-pool/sample-volume@snap1 sample-pool/sample-volume-cloned
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
sample-pool 1023M 18.0G 30.6K /sample-pool
sample-pool/sample-volume 1023M 18.0G 1023M /sample-pool/sample-volume
sample-pool/sample-volume-cloned 0B 18.0G 1023M /sample-pool/sample-volume-cloned # スナップショットから作成されたボリューム
RAIDの回復
ディスクが故障した想定で、プール内のデバイスの置換を行ってみます。 今回はEBSを使用しているので、デバイスが故障してデータが喪失するといったリスクはほぼ無いとおもいますが...
デバイスのち缶
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:2 0 7.9G 0 part /
├─nvme0n1p14 259:3 0 4M 0 part
└─nvme0n1p15 259:4 0 106M 0 part /boot/efi
nvme1n1 259:1 0 10G 0 disk
├─nvme1n1p1 259:7 0 10G 0 part
└─nvme1n1p9 259:8 0 8M 0 part
nvme3n1 259:5 0 10G 0 disk
├─nvme3n1p1 259:9 0 10G 0 part
└─nvme3n1p9 259:10 0 8M 0 part
nvme2n1 259:6 0 10G 0 disk
├─nvme2n1p1 259:11 0 10G 0 part
└─nvme2n1p9 259:12 0 8M 0 part
nvme4n1 259:13 0 10G 0 disk
# デバイスの入れ替えは以下のコマンドで行います。
# zpool replace <プール名> <プール内のデバイス> <新しいデバイス>
$ sudo zpool replace sample-pool /dev/nvme1n1 /dev/nvme4n1
$ zpool status
pool: sample-pool
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu Mar 30 12:46:43 2023
1.50G scanned at 256M/s, 1.28G issued at 218M/s, 1.50G total
432M resilvered, 85.09% done, 00:00:01 to go
config:
NAME STATE READ WRITE CKSUM
sample-pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
replacing-0 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0 (resilvering) #置換が進行中
nvme2n1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
errors: No known data errors
# 暫く経つと完了する
$ zpool status
pool: sample-pool
state: ONLINE
scan: resilvered 512M in 00:00:07 with 0 errors on Thu Mar 30 12:46:50 2023
config:
NAME STATE READ WRITE CKSUM
sample-pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
errors: No known data errors
おわりに
今回はZFSを使ってみました。ボリュームの管理機能がついていたり、スナップショットの作成が簡単であったりとなかなか高機能で便利だと思います。 今回は紹介を省きましたが、暗号化や圧縮にも対応しているのでいろいろと便利そうです。