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のストレージプールをつくる
/dev/sdaみたいにデバイス名で指定すると、順番が変わったときにまずいらしいので、by-idで指定しました。
1 | $ ls -lA /dev/disk/by-id/ |
で、使うディスクを調べます。
1 | $ 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
1 | $ sudo zfs set compression=zstd tank |
暗号化
ZFSでは、作ったpoolから切り出してそれを1つのファイルシステムとして使う機能があります。切り出したものをデータセットと言うらしいです。
例えば、
1 | $ zfs create tank/test |
とすると、tank/testというデータセットが作られ、/tank/testにマウントされます。
pool自体を暗号化して使うこともできますが、このデータセット単位で暗号化して使ったほうが何かと便利そうです。
tank/data を作り、これを暗号化しました。
1 | $ sudo zfs create -o encryption=on -o keylocation=prompt -o keyformat=passphrase tank/data |
暗号化したデータセット(プール)をマウントするには、
1 | $ sudo zfs load-key -r tank/data |
でパスワードを入力し、ロードしたのち、
1 | $ sudo zfs mount tank/data |
と、マウントすればよいです。
キーをアンロードして、またパスワードが要求されるようにするには
1 | $ sudo zfs unload-key -r tank/data |
とします。
そのほかの設定など
アクセス時刻の書き込みは、書き込みが多くなって性能劣化するらしいのでオフにしました。
1 | $ sudo zfs set atime=off tank |
ZFSの機能として、ファイルの重複を検出して容量を削減してくれるdedupという機能があります。
が、大量にメモリを食うので有効にするのはやめておきました。
速いSSDを利用してキャッシュとして使う、L2ARCという機能もあります。
こちらも、搭載したキャッシュの1.59%のメモリを食うらしいのでやめておきました。
メモ、コマンドなど
リスト
1 2 3 4 | $ 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ぐらい書き込みました
圧縮の設定の確認(データセットには、親の設定が引き継がれるみたい)
1 2 3 4 | $ zfs get compression NAME PROPERTY VALUE SOURCE tank compression zstd local tank/data compression zstd inherited from tank |
圧縮率の確認
1 2 3 4 | $ zfs get compressratio NAME PROPERTY VALUE SOURCE tank compressratio 1.01x - tank/data compressratio 1.01x - |
あれ?全然圧縮されてないような
中身に映像のデータが多いからかもしれません。多分テキストメインとかだともっと小さくなると思います。
暗号化の確認
1 2 3 | $ zfs get encryption tank/data NAME PROPERTY VALUE SOURCE tank/data encryption aes-256-gcm - |
追記
ディスクの交換
悪名高いST3000DM001が壊れたので、新しいHDDに交換しました。
交換前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $ 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を作っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | $ 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に追加して交換
1 | $ sudo zpool replace tank 18318311259659557981 /dev/disk/by-id/scsi-SSEAGATE_ST2000NM013A_WS10XSAP |
交換中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ 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時間半ぐらいで終わるみたいですね
最近のコメント