ZFS RAID-ZをUbuntuで試してみる (暗号化、圧縮)
概要
Ubuntu Server で RAID-Z を試してみたので、そのときのメモです。
2TB HDDを5台使って構築しました。
始める前に、Ubuntu 22.04に更新することをおすすめします。
ZFSは圧縮機能があるのですが、アルゴリズムが選べます。
zstdとかいうのが一番効率がよいらしくこれを使おうとしたのですが、Ubuntu Server 20.04ではZFSのバージョンが古く使えなかったので22.04へアップグレードしました。具体的にはZFS 2.0から使えるらしいです。(20.04だと0.8.3止まり)
ZFS
ZFSのストレージプールをつくる
/dev/sdaみたいにデバイス名で指定すると、順番が変わったときにまずいらしいので、by-idで指定しました。
$ ls -lA /dev/disk/by-id/
で、使うディスクを調べます。
$ sudo zpool create -f tank raidz /dev/disk/by-id/ata-ST3000DM001-1ER166_Z503Q518 /dev/disk/by-id/ata-TOSHIBA_DT01ACA200_50HY2TNGS /dev/disk/by-id/ata-TOSHIBA_DT01ACA200_29FEA4DGS /dev/disk/by-id/ata-HGST_HUS724020ALE640_PK2138P2H7LLSJ /dev/disk/by-id/ata-HITACHI_HUA723020ALA640_YGJV1XPA
プール名をtankとします。-f オプションはディスクの容量が混在してるときに使います。今回は2TBが4台、3TBが1台混ざってたので -f を付けました。もちろん使える容量は2TBに合わせられてしまいます。
by-idは ata, scsi, wwn から始まるやつがありますが、どれも一意なのでどれ使ってもいいらしいです。
https://www.reddit.com/r/zfs/comments/o5qm6e/comment/h2o0o1b/
作ったこのプールは、/tankに自動でマウントされます。
圧縮
圧縮は前述の通り、zstdがよさそうなのでこれを指定しました。ほかにはlz4やgzipがあります。
比較はこのサイトが参考になります。
https://nofu.jp/wiki/blog/2022/2022-02-21
$ sudo zfs set compression=zstd tank
暗号化
ZFSでは、作ったpoolから切り出してそれを1つのファイルシステムとして使う機能があります。切り出したものをデータセットと言うらしいです。
例えば、
$ zfs create tank/test
とすると、tank/testというデータセットが作られ、/tank/testにマウントされます。
pool自体を暗号化して使うこともできますが、このデータセット単位で暗号化して使ったほうが何かと便利そうです。
tank/data を作り、これを暗号化しました。
$ sudo zfs create -o encryption=on -o keylocation=prompt -o keyformat=passphrase tank/data
暗号化したデータセット(プール)をマウントするには、
$ sudo zfs load-key -r tank/data
でパスワードを入力し、ロードしたのち、
$ sudo zfs mount tank/data
と、マウントすればよいです。
キーをアンロードして、またパスワードが要求されるようにするには
$ sudo zfs unload-key -r tank/data
とします。
そのほかの設定など
アクセス時刻の書き込みは、書き込みが多くなって性能劣化するらしいのでオフにしました。
$ sudo zfs set atime=off tank
ZFSの機能として、ファイルの重複を検出して容量を削減してくれるdedupという機能があります。
が、大量にメモリを食うので有効にするのはやめておきました。
速いSSDを利用してキャッシュとして使う、L2ARCという機能もあります。
こちらも、搭載したキャッシュの1.59%のメモリを食うらしいのでやめておきました。
メモ、コマンドなど
リスト
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 4.98T 2.16T 153K /tank
tank/data 4.98T 2.16T 4.98T /tank/data
とりあえず5TBぐらい書き込みました
圧縮の設定の確認(データセットには、親の設定が引き継がれるみたい)
$ zfs get compression
NAME PROPERTY VALUE SOURCE
tank compression zstd local
tank/data compression zstd inherited from tank
圧縮率の確認
$ zfs get compressratio
NAME PROPERTY VALUE SOURCE
tank compressratio 1.01x -
tank/data compressratio 1.01x -
あれ?全然圧縮されてないような
中身に映像のデータが多いからかもしれません。多分テキストメインとかだともっと小さくなると思います。
暗号化の確認
$ zfs get encryption tank/data
NAME PROPERTY VALUE SOURCE
tank/data encryption aes-256-gcm -
追記
ディスクの交換
悪名高いST3000DM001が壊れたので、新しいHDDに交換しました。
交換前
$ sudo zpool status tank -v
pool: tank
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
18318311259659557981 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-ST3000DM001-1ER166_Z503Q518-part1
ata-TOSHIBA_DT01ACA200_50HY2TNGS ONLINE 0 0 0
ata-TOSHIBA_DT01ACA200_29FEA4DGS ONLINE 0 0 0
ata-HGST_HUS724020ALE640_PK2138P2H7LLSJ ONLINE 0 0 0
ata-HITACHI_HUA723020ALA640_YGJV1XPA ONLINE 0 0 0
壊れたHDDを引っこ抜いて新しいHDDを接続します。その後、GPTを作っておきます。
$ sudo gdisk /dev/sdX
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition
i show detailed information on a partition
l list known partition types
n add a new partition
o create a new empty GUID partition table (GPT)
p print the partition table
q quit without saving changes
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit
x extra functionality (experts only)
? print this menu
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y
Command (? for help): W
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
zpoolに追加して交換
$ sudo zpool replace tank 18318311259659557981 /dev/disk/by-id/scsi-SSEAGATE_ST2000NM013A_WS10XSAP
交換中
$ sudo zpool status tank -v
pool: tank
state: DEGRADED
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 Sat Aug 27 12:51:09 2022
1.14T scanned at 8.61G/s, 65.0G issued at 489M/s, 7.75T total
12.9G resilvered, 0.82% done, 04:34:37 to go
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
18318311259659557981 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-ST3000DM001-1ER166_Z503Q518-part1
scsi-SSEAGATE_ST2000NM013A_WS10XSAP ONLINE 0 0 0 (resilvering)
ata-TOSHIBA_DT01ACA200_50HY2TNGS ONLINE 0 0 0
ata-TOSHIBA_DT01ACA200_29FEA4DGS ONLINE 0 0 0
ata-HGST_HUS724020ALE640_PK2138P2H7LLSJ ONLINE 0 0 0
ata-HITACHI_HUA723020ALA640_YGJV1XPA ONLINE 0 0 0
4時間半ぐらいで終わるみたいですね
最近のコメント