#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]