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時間半ぐらいで終わるみたいですね

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index