#author("2026-05-02T04:50:21+00:00","default:sysosa","sysosa")
#author("2026-05-02T16:18:19+00:00","default:sysosa","sysosa")
概要とか [[https://openzfs.org/wiki/Main_Page?utm_source=chatgpt.com>+https://openzfs.org/wiki/Main_Page?utm_source=chatgpt.com]]
ドキュメント [[https://openzfs.github.io/openzfs-docs/>+https://openzfs.github.io/openzfs-docs/]]
github [[https://github.com/openzfs/zfs>+https://github.com/openzfs/zfs]]

高速なストレージ、小さいファイルにも十分対応できて大きなファイルにも対応。HPC用途とかで。  &size(10){小規模向けかな。大規模ならcephやlustre、IBM Storage Scale(GPFS)とかでしょうか};
cephでクラスターファイルシステムがスケーラブルなのでしょうけど、初期費用が高い。っで1台で収められてそこそここ早いのがとなるとこれかなと。

HDDが飛んだ際にはメール通知、slack通知が可能です. 設定次第ではbeep音も出せるそうな.
&size(10){最近のadaptec SmartRAIDは無口になってアラート音はなしです. LED点灯やメール通知のみですね。双璧のBroadcom MegaRAIDシリーズも最近の製品は無口になっているそうな};

ここでは rockylinux9 に OpenZFS を入れてみたいと思います

***導入 [#na15a1d6]
専用のリポジトリを追加します. 参照先 [[https://openzfs.github.io/openzfs-docs/Getting%20Started/RHEL-based%20distro/index.html>+https://openzfs.github.io/openzfs-docs/Getting%20Started/RHEL-based%20distro/index.html]]

#code(nonumber){{
[root@zfs ~]# cat /etc/redhat-release
Rocky Linux release 9.7 (Blue Onyx)

[root@zfs ~]# uname -r
5.14.0-611.5.1.el9_7.x86_64

[root@zfs ~]# dnf install https://zfsonlinux.org/epel/zfs-release-3-0$(rpm --eval "%{dist}").noarch.rpm

[root@zfs ~]# ls /etc/yum.repos.d/
rocky-addons.repo  rocky-devel.repo  rocky-extras.repo  rocky.repo  zfs.repo

[root@zfs ~]#
}}

zfsのカーネルモジュールですが、dkms版とkABI版がある. dkms版ならkernel updateの際に自動的にそのkernelにあったkernel moduleをコンパイルして用意してくれます.
まぁそれはそれでいいのですが、そのkernel向けとして特化したkABI版の方がまぁー安定かなぁ.
ここでは kABI版を使います

そして現時点(2026.04)で最新版の zfs-2.4.1 を使いたいと思います.
#code(nonumber){{
[root@zfs ~]# dnf repolist --all
 :
zfs                        OpenZFS for EL9 - dkms                       enabled
 :
zfs-latest-kmod            OpenZFS latest for EL9 - kmod                disabled
 :
[root@zfs ~]# dnf config-manager --disable zfs
[root@zfs ~]# dnf config-manager --enable zfs-latest-kmod
}}
ここで、「dnf install zfs」でkernel moduleらがインストールされるのですが、どうもrockylinux9.7の初回のkernel version「5.14.0-611.5.1」向けの zfs-2.4.1 はないようなのでkernel updateします
#code(nonumber){{
[root@zfs ~]# dnf update kernel kernel-core kernel-modules kernel-modules-core kernel-tools kernel-tools-libs
[root@zfs ~]# grubby --update-kernel ALL --args selinux=0
[root@zfs ~]# grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
[root@zfs ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@zfs ~]# reboot

(再ログイン)
[root@zfs ~]# uname -r
5.14.0-611.47.1.el9_7.x86_64

[root@zfs ~]# dnf install zfs

[root@zfs ~]# ls -l /lib/modules/$(uname -r)/weak-updates/zfs/
total 0
lrwxrwxrwx. 1 root root 58 Apr 26 03:01 spl.ko -> /lib/modules/5.14.0-611.34.1.el9_7.x86_64/extra/zfs/spl.ko
lrwxrwxrwx. 1 root root 58 Apr 26 03:01 zfs.ko -> /lib/modules/5.14.0-611.34.1.el9_7.x86_64/extra/zfs/zfs.ko
[root@zfs ~]#
}}
と、&color(magenta){5.14.0-611.47.1}; なのですが、&color(orangered){5.14.0-611.34.1}; に入ったkernel moduleが、weak-updatesで &color(magenta){5.14.0-611.47.1}; に提供されている


***設計 [#md1dc950]

色々調べて、小さいファイルにも大きなファイルにも有効にしたいと願い
|BGCOLOR(YELLOW):項目|BGCOLOR(YELLOW):要件|BGCOLOR(YELLOW):300TBなストレージなら|BGCOLOR(YELLOW):備考|
|HDD|           vdevを複数作る. 多い方がいい|実用量の80%が約300TBになるなら384TBほど盛る&br;ミラー構成: 24TB x(2-1)*16=384TB, 16vdev(32slot必要)&br;RAIDZ構成:24TB x(3-1)*8=384TB, 8vdev(24slot) &br;RAIDZ2構成:24TB x(6-2)*4=384TB, 4vdev(24slot)|32slotマシンで前面24slotはHDDで埋めて&br;背面12slotは下記目的のSSDで埋めるのがいいかも&br;あるいは1UのフロントU.2 slot搭載マシン+24 HDD slot JBODとかで|
|special device|metadataと小さいファイルを置く | 8TB ミラーで2組&br;8TB x(2-1)*2= 16TB (8TB 4枚)|ミラー構成必須&br;小さいファイルであふれるなら、同じミラー構成(8TB*2枚)を追加|
|SLOG|NFSで同期書き込みなら有効、非同期なら微妙. 20GBほどあればいいみたい| 480GB PLP付 nvme ミラー| 小さいPLP nvmeってある?|
|L2ARC|キャッシュ. 主メモリーの5倍から10倍以内|主メモリー256GBなら 2TB nvme|RAID0構成でも可. 10倍以内にすること|
|主メモリ|一次キャッシュ| 256GBとか 128GB||
|CPU|クロック高め、core数そこそこ|3.0から3.5GHz, 24-48コア|チェックサム計算,RAIDZパリティ計算が嵩むので|
|nic|25GbEか100GbE|100GbE|swithing HUBのuplinkポートに繋げるとか. bondingもいいかも|

1Uのフロントに12slotsなnvme U.2とHBAを付けて、24bay JBOD構成かな.
一応拡張は可能っぽいけど、初めに作った構成を変更せず使うって感じに思えた. 大きくしたいなら別のシステムを用意するって感じかなぁ

っでこのようなストレージは作れないので仮想マシンで手順だけ試した

***構築 [#abf9deb5]
HDDは3本RAIDZ単位で2つ(2vdev). 合計6HDD
special deviceは SSDで2枚のmirrorで1vdev
SLOGもSSD2枚でmirrorで
L2ARCはSSD1枚
ってな感じで仮想マシンを作ってみた
#code(nonumber){{
[root@zfs ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   32G  0 disk
├sda1   8:1    0    1M  0 part
├sda2   8:2    0    1G  0 part /boot
├sda3   8:3    0  128M  0 part [SWAP]
├sda4   8:4    0    1K  0 part
└sda5   8:5    0 30.9G  0 part /
sdb      8:16   0  100G  0 disk       sdbからsdqの100Gは HDD として
sdc      8:32   0  100G  0 disk
sdd      8:48   0  100G  0 disk
sde      8:64   0  100G  0 disk
sdf      8:80   0  100G  0 disk
sdg      8:96   0  100G  0 disk
sdh      8:112  0   50G  0 disk      special device
sdi      8:128  0   50G  0 disk      special device
sdj      8:144  0   64G  0 disk      SLOG
sdk      8:160  0   64G  0 disk      SLOG
sdl      8:176  0   32G  0 disk      L2ARC
[root@zfs ~]#
}}
なので
#code(nonumber){{
zpool create -o ashift=12 tank \
  raidz sdb sdc sdd \
  raidz sde sdf sdg \
  special mirror sdh sdi \
  log mirror sdj sdk \
  cache sdl
}}
で完成になるが、
「PATHのデバイス名での指定はよくなく、「/dev/disk/by-id」か「/dev/disk/by-path」で指定する事。
#code(nonumber){{
[root@zfs ~]# ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx. 1 root root 10 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx. 1 root root 10 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx. 1 root root 10 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0-part3 -> ../../sda3
lrwxrwxrwx. 1 root root 10 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0-part4 -> ../../sda4
lrwxrwxrwx. 1 root root 10 Apr 26 13:29 pci-0000:09:01.0-scsi-0:0:0:0-part5 -> ../../sda5
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:02.0-scsi-0:0:0:1 -> ../../sdb
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:03.0-scsi-0:0:0:2 -> ../../sdc
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:04.0-scsi-0:0:0:3 -> ../../sdd
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:05.0-scsi-0:0:0:4 -> ../../sde
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:06.0-scsi-0:0:0:5 -> ../../sdf
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:07.0-scsi-0:0:0:6 -> ../../sdg
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:08.0-scsi-0:0:0:7 -> ../../sdh
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:09.0-scsi-0:0:0:8 -> ../../sdi
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:0a.0-scsi-0:0:0:9 -> ../../sdj
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:0b.0-scsi-0:0:0:10 -> ../../sdk
lrwxrwxrwx. 1 root root  9 Apr 26 13:29 pci-0000:09:0c.0-scsi-0:0:0:11 -> ../../sdl
[root@zfs ~]#
}}

実機では「/dev/disk/by-id」が望ましい。
理由はHDD/SSD/nvmeのシリアル番号で指定することになるので。
zfsはHDDの障害時にLEDランプなんて異常を提示しないので、デバイスのシリアル番号をslotにテプラで付けておくのがいいみたい

なので実際には
#code(nonumber){{
[root@zfs ~]# modprobe zfs

[root@zfs ~]# zpool create -o ashift=12 tank \
  raidz pci-0000:09:02.0-scsi-0:0:0:1 \
        pci-0000:09:03.0-scsi-0:0:0:2 \
        pci-0000:09:04.0-scsi-0:0:0:3 \
  raidz pci-0000:09:05.0-scsi-0:0:0:4 \
        pci-0000:09:06.0-scsi-0:0:0:5 \
        pci-0000:09:07.0-scsi-0:0:0:6 \
  special mirror pci-0000:09:08.0-scsi-0:0:0:7 \
                 pci-0000:09:09.0-scsi-0:0:0:8 \
  log mirror pci-0000:09:0a.0-scsi-0:0:0:9  \
             pci-0000:09:0b.0-scsi-0:0:0:10 \
  cache pci-0000:09:0c.0-scsi-0:0:0:11

[root@zfs ~]# zpool status tank
  pool: tank
 state: ONLINE
config:

        NAME                                STATE     READ WRITE CKSUM
        tank                                ONLINE       0     0     0
          raidz1-0                          ONLINE       0     0     0
            pci-0000:09:02.0-scsi-0:0:0:1   ONLINE       0     0     0
            pci-0000:09:03.0-scsi-0:0:0:2   ONLINE       0     0     0
            pci-0000:09:04.0-scsi-0:0:0:3   ONLINE       0     0     0
          raidz1-1                          ONLINE       0     0     0
            pci-0000:09:05.0-scsi-0:0:0:4   ONLINE       0     0     0
            pci-0000:09:06.0-scsi-0:0:0:5   ONLINE       0     0     0
            pci-0000:09:07.0-scsi-0:0:0:6   ONLINE       0     0     0
        special
          mirror-2                          ONLINE       0     0     0
            pci-0000:09:08.0-scsi-0:0:0:7   ONLINE       0     0     0
            pci-0000:09:09.0-scsi-0:0:0:8   ONLINE       0     0     0
        logs
          mirror-3                          ONLINE       0     0     0
            pci-0000:09:0a.0-scsi-0:0:0:9   ONLINE       0     0     0
            pci-0000:09:0b.0-scsi-0:0:0:10  ONLINE       0     0     0
        cache
          pci-0000:09:0c.0-scsi-0:0:0:11    ONLINE       0     0     0

errors: No known data errors
[root@zfs ~]#
}}
となる


***mount [#a90079ad]
作ったzfsボリュームをmountします

zfs の ストレージプール名を「tank」にしたので、ファイルシステム上には/tankとしてmountされます
#code(nonumber){{
[root@zfs ~]# df -lTht zfs
Filesystem     Type  Size  Used Avail Use% Mounted on
tank           zfs   386G  128K  386G   1% /tank
[root@zfs ~]#

(zfsコマンドからの確認としては)
[root@zfs ~]# zfs get mountpoint
NAME  PROPERTY    VALUE       SOURCE
tank  mountpoint  /tank       default
[root@zfs ~]#
}}
初期構築時なので、作った名称がそのまま使われてますが、「zfs set mountpoint」で変更も可能です
#code(nonumber){{
[root@zfs ~]# zfs set mountpoint=/home tank
[root@zfs ~]# zfs get mountpoint
NAME  PROPERTY    VALUE       SOURCE
tank  mountpoint  /home       local
[root@zfs ~]# df -lTht zfs
Filesystem     Type  Size  Used Avail Use% Mounted on
tank           zfs   386G  128K  386G   1% /home
[root@zfs ~]#
}}
と変更が可能です。従来の /etc/fstab らの調整は不要です。


加えて/appsと/homeを同じプール(tank)で賄い事も可能で、まず/homeのmountを解除して、tank/homeとtank/appsを作ります。
そしてmountpointで場所を指定します

#code(nonumber){{
[root@zfs ~]# zfs set mountpoint=none tank

[root@zfs ~]# zfs create tank/home
[root@zfs ~]# zfs create tank/apps

(確認)
[root@zfs ~]# zfs list -r tank
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank        792K   385G    96K  none
tank/apps    96K   385G    96K  none
tank/home    96K   385G    96K  none
[root@zfs ~]#

[root@zfs ~]# zfs set mountpoint=/home tank/home
[root@zfs ~]# zfs set mountpoint=/apps tank/apps
[root@zfs ~]# df -lTht zfs
Filesystem     Type  Size  Used Avail Use% Mounted on
tank/home      zfs   386G  128K  386G   1% /home
tank/apps      zfs   386G  128K  386G   1% /apps
[root@zfs ~]#
}}

これらをnfsでexportする際ですが、疑似ファイルシステムを作らずに単に「/etc/exports」に
#code(nonumber){{
/home  192.168.1.0/24(rw,sync,no_subtree_check)
/apps  192.168.1.0/24(rw,sync,no_subtree_check)
}}
で十分. 
ZFSならではの「sharenfs」プロパティで公開する方法もありますが、「/etc/exports」に慣れていればそれを使った方がいいみたい
#code(nonumber){{
zfs set sharenfs="rw=@192.168.1.0/24" tank/home
}}
zfsコマンドで調整する形になりますが、まぁー「/etc/exports」でいいかな。

あとスナップショットに関してですが、
#code(nonumber){{
[root@zfs ~]# zfs create tank/home/userA
[root@zfs ~]# zfs create tank/home/userB

[root@zfs ~]# zfs set mountpoint=/home/userA tank/home/userA
[root@zfs ~]# zfs set mountpoint=/home/userB tank/home/userB

[root@zfs ~]# mkdir /home/userC
}}
と/home/userCだけデータセットからの切り出しではなくmkdirで作ったとします。
っで
#code(nonumber){{
zfs snapshot tank/home@backup1
}}
とすると/home/userAと/home/userBを含まない形でスナップショットが取れます。
もし/home全体のスナップショットが欲しければ
#code(nonumber){{
zfs snapshot -r tank/home@monday_backup
}}
と「-r」を付ける。

透過的圧縮。ファイルをそこに置いておくと自動的に内部で圧縮されます。表には元のファイル名ですが、裏では圧縮されて空き容量を増やす仕組みです
データセットを指定して行います
#code(nonumber){{
zfs set compression=lz4 tank/home/userA
}}
これで/home/userAに集まるファイルはすべて透過的圧縮の対象となります。

クオート設定
#code(nonumber){{
zfs set quota=1T tank/home/userA
zfs set quota=200G tank/home/userA
}}
とデータセットを作った領域に設けられます。単に「mkdir /home/userC」には適用されないです
解除方法は
#code(nonumber){{
zfs set quota=none tank/home/userA
}}
残り幾つ使えるかは「zfs list」で見れて
#code(nonumber){{
[root@zfs ~]# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank              996K   385G    96K  none
tank/apps          96K   385G    96K  /apps
tank/home         288K   385G    96K  /home
tank/home/userA    96K   385G    96K  /home/userA
tank/home/userB    96K   200G    96K  /home/userB
[root@zfs ~]#
}}
と表示される。「AVAIL」に出ます




***ZFS Event Daemon(zed)による通知機能を作る [#n70de1ab]

ZFSでは使っているエンクロージャ、JBODによりますが、HDD/nvme/SSDらが飛ぶとLEDが点灯します
でもそれだけでは不十分でメール通知を有効にしてみます

使用するのはzed. zfs-zed.service です。
でもこのzedは「ローカルのメール送信コマンドを叩くのみ」なので、マシンにメール送信機能(MTA)を準備する必要があります
ここでは簡易な方法として msmtp での構築を行ってみます. っでパッケージをインストールします

#code(nonumber){{
[root@zfs ~]# dnf install epel-release 
[root@zfs ~]# dnf install msmtp s-nail
(確認)
[root@zfs ~]# alternatives --list
 :
mta                     auto    /usr/bin/msmtp
mailx                   auto    /usr/bin/mailx.s-nail
[root@zfs ~]#
}}

そして設定ファイル「/etc/smtprc」を作成します
下記はGmailを使った場合です。

Gamilのpasswordは「アプリパスワード」という物で
1.Googleアカウントに入って
2.「セキュリティーとログイン」ページに行って
3.「Googleにログインする方法」欄の「2段階認証プロセス」をクリックします
4.「アプリパスワード」欄がでますので、そこで「>」をクリックして、例えば msmtp とアプリ固有名を付けて「作成」ボタンを押下すると文字列がでます。それが「アプリパスワード」です。
「アプリパスワード」はその「作成」ボタンを押下した瞬間しか表示されないです。閉じると2度と見れません。見落とした、忘れたなら再度作成して作ってください。

#code(nonumber){{
[root@zfs ~]# vi /etc/msmtprc
defaults
auth           on
tls            on
tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
logfile        /var/log/msmtp.log

account        gmail
host           smtp.gmail.com
port           587
from           xxxxxxxxxxxxxxxxxxxxxxx@gmail.com
user           xxxxxxxxxxxxxxxxxxxxxxx@gmail.com
password       aaaabbbbccccdddd

account default : gmail
}}
っでテストメールを出してみる。
#code(nonumber){{
[root@zfs ~]# echo "test mail" | mail -s "test" xxxxxxxxxxxxxxxxxxxxxxx@gmail.com
}}
これでメールが届いたらok

そしてzedの設定を行います
#code(nonumber){{
[root@zfs ~]# vi /etc/zfs/zed.d/zed.rc

[root@zfs ~]# sed -e '/^#/d' -e '/^$/d' /etc/zfs/zed.d/zed.rc
ZED_EMAIL_ADDR="xxxxxxxxxxxxxxxxxxxxxxx@gmail.com"
ZED_NOTIFY_VERBOSE=1                                   <-- これを1にしないと「zpool scrub tank」程度の内容でメールが来ない. けどテストのために有効にしておく
ZED_USE_ENCLOSURE_LEDS=1
ZED_SYSLOG_SUBCLASS_EXCLUDE="history_event"

[root@zfs ~]# systemctl restart zfs-zed.service
}}

テストとしては「zpool scrub tank」とかで。
#code(nonumber){{
[root@zfs ~]# zpool scrub tank
}}
っで、メールが届くか確認します。

「ZED_NOTIFY_VERBOSE=1」ですが、「/etc/zfs/zed.d/zed.rc」には下記のように書かれてます
#code(nonumber){{
# Notification verbosity.
#   If set to 0, suppress notification if the pool is healthy.
#   If set to 1, send notification regardless of pool health.
}}
pool自体に問題がなければ通知しない。ZED_NOTIFY_VERBOSEを有効にすれば、poolに問題がなくても通知する。テスト目的なら有効にして、
本番は無効でいいのかなと。


***とんだHDDをLEDで場所を知らせる [#e4835211]
zedの設定ファイル「/etc/zfs/zed.d/zed.rc」には
「ZED_USE_ENCLOSURE_LEDS=1」との設定項目がある. 該当部分は
#code(nonumber){{
# Turn on/off enclosure LEDs when drives get DEGRADED/FAULTED.  This works for
# device mapper and multipath devices as well.  This works with JBOD enclosures
# and NVMe PCI drives (assuming they're supported by Linux in sysfs).
}}
と書かれているので、多分システム次第で飛んだHDDの場所が分かるようになっているかと.

Broadcom の HBA に接続していると
#code(nonumber){{
[root@zfs ~]# ls /sys/class/enclosure/1\:0\:14\:0/Slot11/device/block/
sdn
[root@zfs ~]#
}}
とデバイス名がでます。なので、zedによるLED点灯は行けるかなと思われます


***意図的に HDD を飛ばしてみる [#z4d2cd65]

#code(nonumber){{
[root@zfs ~]# zpool status
  pool: tank
 state: ONLINE
  scan: scrub repaired 0B in 00:00:00 with 0 errors on Fri May  1 01:30:35 2026
config:

        NAME                                STATE     READ WRITE CKSUM
        tank                                ONLINE       0     0     0
          raidz1-0                          ONLINE       0     0     0
            pci-0000:09:02.0-scsi-0:0:0:1   ONLINE       0     0     0
            pci-0000:09:03.0-scsi-0:0:0:2   ONLINE       0     0     0
            pci-0000:09:04.0-scsi-0:0:0:3   ONLINE       0     0     0
          raidz1-1                          ONLINE       0     0     0
            pci-0000:09:05.0-scsi-0:0:0:4   ONLINE       0     0     0
            pci-0000:09:06.0-scsi-0:0:0:5   ONLINE       0     0     0
            pci-0000:09:07.0-scsi-0:0:0:6   ONLINE       0     0     0
        special
          mirror-2                          ONLINE       0     0     0
            pci-0000:09:08.0-scsi-0:0:0:7   ONLINE       0     0     0
            pci-0000:09:09.0-scsi-0:0:0:8   ONLINE       0     0     0
        logs
          mirror-3                          ONLINE       0     0     0
            pci-0000:09:0a.0-scsi-0:0:0:9   ONLINE       0     0     0
            pci-0000:09:0b.0-scsi-0:0:0:10  ONLINE       0     0     0
        cache
          pci-0000:09:0c.0-scsi-0:0:0:11    ONLINE       0     0     0

errors: No known data errors
[root@zfs ~]#
}}

この状態で事象発生させてみる (proxmoxでOSDノードのHDDを選択して detach 操作を行う)
「pci-0000:09:06.0-scsi-0:0:0:5」の部分をDetachさせてみた

#code(nonumber){{
[root@zfs ~]# zpool status
  pool: tank
 state: DEGRADED
status: One or more devices have been removed.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using zpool online' or replace the device with
        'zpool replace'.
  scan: scrub repaired 0B in 00:00:00 with 0 errors on Fri May  1 01:30:35 2026
config:

        NAME                                STATE     READ WRITE CKSUM
        tank                                DEGRADED     0     0     0
          raidz1-0                          ONLINE       0     0     0
            pci-0000:09:02.0-scsi-0:0:0:1   ONLINE       0     0     0
            pci-0000:09:03.0-scsi-0:0:0:2   ONLINE       0     0     0
            pci-0000:09:04.0-scsi-0:0:0:3   ONLINE       0     0     0
          raidz1-1                          DEGRADED     0     0     0
            pci-0000:09:05.0-scsi-0:0:0:4   ONLINE       0     0     0
            pci-0000:09:06.0-scsi-0:0:0:5   REMOVED      0     0     0
            pci-0000:09:07.0-scsi-0:0:0:6   ONLINE       0     0     0
        special
          mirror-2                          ONLINE       0     0     0
            pci-0000:09:08.0-scsi-0:0:0:7   ONLINE       0     0     0
            pci-0000:09:09.0-scsi-0:0:0:8   ONLINE       0     0     0
        logs
          mirror-3                          ONLINE       0     0     0
            pci-0000:09:0a.0-scsi-0:0:0:9   ONLINE       0     0     0
            pci-0000:09:0b.0-scsi-0:0:0:10  ONLINE       0     0     0
        cache
          pci-0000:09:0c.0-scsi-0:0:0:11    ONLINE       0     0     0

errors: No known data errors
[root@zfs ~]#
}}

これは意図的に抜いても同じようになります。
実機では恐らくそのHDDに問題があって利用できなくなるとzfsからは「FAULTED」と付けられます。そうなった際はそのHDDをzfsの管理から外させるコマンド(zpool offline)を実行します
#code(nonumber){{
[root@zfs ~]# zpool offline tank pci-0000:09:06.0-scsi-0:0:0:5

[root@zfs ~]# zpool status
 :
          raidz1-1                          DEGRADED     0     0     0
            pci-0000:09:05.0-scsi-0:0:0:4   ONLINE       0     0     0
            pci-0000:09:06.0-scsi-0:0:0:5   OFFLINE      0     0     0
            pci-0000:09:07.0-scsi-0:0:0:6   ONLINE       0     0     0
 :
[root@zfs ~]#
}}

次に、飛んだHDDを抜いて、新しいHDDをシステムに入れます。
この際、追加するHDDがどこかのzfsで使っていたHDDなら大事故になるようで、要注意。
その際は「ZFSラベルを消す」ことが大事。
#code(nonumber){{
[root@zfs ~]# zpool labelclear -f  "/dev/disk/by-path/pci-0000:09:06.0-scsi-0:0:0:5"

あるいは
[root@zfs ~]# wipefs -a  "/dev/disk/by-path/pci-0000:09:06.0-scsi-0:0:0:5"
[root@zfs ~]# sgdisk --zap-all   "/dev/disk/by-path/pci-0000:09:06.0-scsi-0:0:0:5"
}}
でラベルを消す

その上で差し替え操作を行います
#code(nonumber){{
[root@zfs ~]# zpool replace tank "pci-0000:09:06.0-scsi-0:0:0:5"  "pci-0000:09:06.0-scsi-0:0:0:5"
}}

今回は同じPATHになってますが、気にしなくてもいいみたい。新しいHDDには未使用なHDDなので大丈夫なそうな


***zfs同士のバックアップ [#gf1d5033]


***posix acl [#fdc03c58]

デフォではPOSIX ACLは有効になっていないです。
なので有効にします
#code(nonumber){{
[root@zfs ~]# zfs set acltype=posixacl tank/home

[root@zfs ~]# zfs get acltype
NAME             PROPERTY  VALUE     SOURCE
tank             acltype   off       default
tank/apps        acltype   off       default
tank/home        acltype   posix     local
tank/home/userA  acltype   posix     inherited from tank/home
tank/home/userB  acltype   posix     inherited from tank/home
[root@zfs ~]#
}}
tank/homeでaclが有効ならそれが配下にも波及されるみたい

#code(nonumber){{
[root@zfs ~]# setfacl -m user:cryosparc:rx /home/saber
[root@zfs ~]# getfacl /home/saber/
getfacl: Removing leading '/' from absolute path names
# file: home/saber/
# owner: saber
# group: saber
user::rwx
user:cryosparc:r-x
group::---
mask::r-x
other::---

[root@zfs ~]#
}}
っとなるみたい.

nfs先では?
まずは
#code(nonumber){{
[root@zfs ~]# vi /etc/exports
/home  192.168.0.0/24(rw,sync,no_subtree_check)
/apps  192.168.0.0/24(rw,sync,no_subtree_check)

[root@zfs ~]# systemctl enable nfs-server --now
}}
っでnfs-clientから

#code(nonumber){{
[root@rockylinux9 ~]# mount -t nfs zfs:/home /home
[root@rockylinux9 ~]# df -Tht  nfs4
Filesystem     Type  Size  Used Avail Use% Mounted on
zfs:/home      nfs4  386G  1.0M  386G   1% /home
[root@rockylinux9 ~]#
[root@rockylinux9 ~]# ls -l /home
total 2
drwx------. 2 cryosparc cryosparc 5 May  3 00:10 cryosparc
drwxr-x---+ 2 saber     saber     5 May  3 00:09 saber
drwxr-xr-x. 2 root      root      2 May  2 04:18 userA
drwxr-xr-x. 2 root      root      2 May  2 04:19 userB
[root@rockylinux9 ~]#

[root@rockylinux9 ~]# getfacl /home/saber/
getfacl: Removing leading '/' from absolute path names
# file: home/saber/
# owner: saber
# group: saber
user::rwx
group::r-x
other::---

[root@rockylinux9 ~]# umount /home


(nfs v3でmount)
[root@rockylinux9 ~]# mount -t nfs -o vers=3 zfs:/home /home
[root@rockylinux9 ~]# ls -l /home
total 2
drwx------. 2 cryosparc cryosparc 5 May  3 00:10 cryosparc
drwxr-x---+ 2 saber     saber     5 May  3 00:09 saber
drwxr-xr-x. 2 root      root      2 May  2 04:18 userA
drwxr-xr-x. 2 root      root      2 May  2 04:19 userB

[root@rockylinux9 ~]#
[root@rockylinux9 ~]# getfacl /home/saber/
getfacl: Removing leading '/' from absolute path names
# file: home/saber/
# owner: saber
# group: saber
user::rwx
user:cryosparc:r-x         <--- ACLが効いている
group::---
mask::r-x
other::---

[root@rockylinux9 ~]#
}}
zfsに関わらず、普通にnfs versiomn3でexportすれば、getfac/setfaclが使えます。NFSv4なら面倒なnfs4_setacl とかの出番になります


***zfs同士のバックアップ [#gf1d5033]
1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS