初心者のためのZFS
(ikrima.dev)- FreeNASでのZFS障害をきっかけに、トラブルシューティング、新しいボリューム構成、バックアップ戦略まで整理した入門ガイドで、ZFSを初めて運用する際に必要な構造とコマンドを一連の流れで扱う
- ZFSはファイルシステムと論理ボリュームマネージャーをあわせて提供し、Sun Microsystemsで始まった後、LinuxやFreeBSDなどでは主にOpenZFSのコードが使われている
- 基本構造は物理ディスクを束ねるvdev、それを集めたpool、ファイルシステムの役割を持つdataset、ブロックデバイス形式のvolumeに分かれ、RAIDZ-1/2/3はそれぞれ1台、2台、3台のディスク障害に耐えられる
- 実務で使うコマンドは
zpool create/status/list/import/export/destroy/scrubとzfs create/mount/list/get/set/snapshot/diff/rollback/send/recv/destroyが中心で、デバイス名変更の問題を避けるにはdevice UUIDの利用が推奨される - snapshotは特定時点の状態を軽量に保護し、
zfs send/recvで別のpoolやシステムへ複製できるが、snapshotだけでバックアップやDRを代替するのは難しい
ZFSの基本概念
- ZFSはext4、NTFS、exFATのようなローカルファイルシステムであると同時に、LinuxのLVMのような論理ボリュームマネージャーの役割も果たす
- Sun Microsystemsが開発し、ZFSのソースコードはOracleによるSun買収前まではオープンソースライセンスで公開されていた
- すでに公開されたコードが複数のOSへ移植されていたため、その後OpenZFSプロジェクトが立ち上がり、LinuxやFreeBSDなど大半のUnix系システムでこのコードが使われている
- ZFSに初めて触れる人が構造と運用コマンドを理解できるよう、初心者の視点で整理されている
ZFSの構成要素
- vdevは1台以上の物理ドライブで構成され、ハードドライブ以外にファイルを含めることもできる
- mirrorやRAIDZ形式で組み合わせ可能
- hot spare、L2ARC、ZILのような重要なvdev種別を含め、7種類のvdevタイプがある
- poolは1つ以上のvdevで構成され、通常はpool内にvolumeやdatasetを作成する
zpoolコマンドでpoolを作成する際にvdevもあわせて定義する- 複数のvdevタイプを組み合わせてRAIDZレベルを構成できる
- datasetはZFSにおけるファイルシステムに相当する構成要素
- ユーザーアクセス、quota、圧縮、snapshotなどを設定できる
- volumeはdatasetに似ているが、ブロックデバイス表現を提供する
- datasetの機能の一部のみを提供する
- ZFS上で別のファイルシステムを動かしたり、iSCSI extentをエクスポートしたりする際に便利
RAIDZの種類
- Dynamic/Simple Stripe、つまりRAID0はparityなしでデータを分散し、デバイスを1台失うと全データを失う
- MIRROR、つまりRAID1はディスクをミラーリングし、2〜4台またはそれ以上のディスクとともに使われる
- RAIDZ-1、つまりRAID5はデータとともにparityを分散し、RAID障害になるまで物理ドライブ1台の損失に耐えられる
- RAIDZには最低3台のディスクが必要
- RAIDZ-2、つまりRAID6は最大2台の物理ドライブ損失に耐えられる
- RAIDZ-2には最低4台のディスクが必要
- RAIDZ-3は最大3台の物理ドライブ損失に耐える
- 最低4台のディスクが必要だが、5台未満で使うのは望ましくない
poolの作成と状態確認
- ZFS poolは
zpool create [pool] [devices]形式で作成する- 単一ディスクpoolの例:
zpool create tank /dev/sdb - 3台ディスクstripeの例:
zpool create tank /dev/sdb /dev/sdc /dev/sdd - 2台ディスクmirrorの例:
zpool create tank mirror sdb sdc - RAIDZ poolの例:
zpool create tank raidz sdb sdc sdd - RAIDZ2/3は
zpool create [pool name] raidz[1,2,3] [devices]形式で作成できる
- 単一ディスクpoolの例:
- pool作成時には
-mフラグでデフォルトのmount pointを指定できる- 例:
zpool create tank -m /mnt/tank mirror sdb sdc
- 例:
- 例では
/dev/sdx形式のデバイス名を使っているが、デバイス名変更による起動問題を避けるにはdevice UUIDの利用が推奨される zpool statusはpool状態を確認する基本コマンドstateはpoolがオンラインかどうかを示すstatusはpoolに関する追加情報を表示するactionは必要な次の作業を示すscanはscrubの進行状況または最後のscrub状態を表示するerrorsはpoolに問題があるかどうかを示す
zpool listはpoolのサイズ、割り当て量、空き容量、fragmentation、capacity、dedup、healthなどの詳細を表示するzpool historyはpool作成以降、構成変更に使われたコマンド履歴を表示する
poolのimport、export、削除、scrub
- poolは作成後、通常は自動的にimportされmountされるが、トラブルシューティングやシステム再イメージ化の後には手動importが必要になる場合がある
zpool importをpool名なしで実行すると、import可能なpool一覧が表示される- import可能なpoolがない場合は
no pools available to importと表示される - pool名を指定するとそのpoolをimportし、importコマンドはpoolのmountも行う
zpool import -aはimport可能なすべてのpoolを取り込む
- import可能なpoolがない場合は
zpool import -R /mnt/tank2 tankのように-Rを使うとalternate rootの場所にmountする- これはpool自体のmount pathではなく、代替rootフォルダを指す
zpool export [pool name]はimportの逆操作で、pool内のmounted filesystemをunmountした後にexportを試みる- filesystemのunmountに失敗した場合は
-fで強制unmountできる - 使用中のZFS volumeがあると、
-fを使ってもexportは失敗する
- filesystemのunmountに失敗した場合は
zpool destroyはpoolとその配下のdatasetまたはvolumeを削除する- すべてのデータとsnapshotまで削除されるため注意が必要
- ZFS scrubはpool内の全blockを既知のchecksumと照合してデータの整合性を確認する
- parityのあるvdevでは正常なディスクのデータを使って破損データを修復する
- システム状態を維持するには、scrubをスケジュールに従って実行する必要がある
- 開始:
zpool scrub [pool] - 状態確認:
zpool statusのscan領域を確認 - 停止:
zpool scrub -s [pool]
datasetの作成とmount
zfs createは新しいfilesystemまたはvolumeを作成するコマンドで、ここではvolumeよりdatasetを中心に扱うzfs create tank/dataset1はtankの下にdataset1を作成するtankdatasetはzpool create時に自動作成される
zfs create -pはmkdir -pのように、存在しない親datasetもまとめて作成する- 親datasetが存在しない場合、通常の
zfs createは失敗する
- 親datasetが存在しない場合、通常の
zfs mountを引数なしで実行すると、現在mountされているZFS filesystemとmount pointを表示する- この出力にはchild datasetは含まれない
zfs mount [pool|dataset]は指定したfilesystemをmountするzfs mount -aはすべてのfilesystemをmountする
- child datasetはparent datasetなしでもmountできる
- この場合、OS filesystem上に必要なパスが作成される
- 後からparent datasetをmountしようとすると、作成済みディレクトリのため
directory is not emptyエラーになることがある
zfs unmount [dataset]は指定したdatasetをunmountする
datasetの参照とプロパティ設定
zfs list [dataset name]は指定したdatasetの情報を表示する- dataset名の代わりにmount pointを引数に指定することもできる
zfs listをdataset名なしで実行すると、システム上のすべてのdatasetを再帰的に表示する- dataset名を指定する際に
-rフラグを使うと、そのdataset配下を再帰的に表示できる - ZFS propertyはfilesystem、volume、snapshot、cloneの動作を制御する
- mount optionに似て見える場合がある
zfs get all [dataset]はdatasetのすべてのpropertyを表示する- 特定のproperty値は
zfs get compression tankのように確認する - property設定には
zfs setを使う- 例:
zfs set compression=lz4 tank - 設定後、
zfs get compression tankでcompressionの値がlz4に変わったことを確認できる
- 例:
snapshotの仕組みと活用
- snapshotはfilesystemの特定時点の状態を保存するが、ファイルをコピーするわけではない
- snapshotは既存データをread-onlyとしてマークし、その後filesystemに新しいデータが追加されても、snapshotが保護する既存data blockには影響しない
- 例の流れは次のとおり
- 既存データData Aがあるfilesystemでsnapshot 1を作成する
- その後Data Bを追加し、snapshot 2を作成する
- その後Data Cを追加する
- snapshot 1はData Aを保護し、snapshot 2はData AとData Bを保護する
- snapshot 1を削除しても、Data Aはsnapshot 2によって引き続き保護される
- snapshotが使用するデータ量は非常に小さい
- ファイルをコピーする代わりに、そのsnapshotに属することを示すfilesystem最上位のmetadata blockを記録するため
- snapshotはソフトウェア開発のテストや、アップグレード前のfailsafe作成に有用
- snapshotだけをbackupやDRソリューションと見なすべきではない
snapshotコマンド
- snapshot作成は
zfs snapshot [pool/dataset@snapshot_name]形式を使う- 例:
zfs snapshot tank/dataset1@snapshot1
- 例:
- snapshot一覧は
zfs list -t snapshotで確認する - child datasetが複数ある場合は、top-level datasetにsnapshotを作成するか、
-rフラグでrecursive snapshotを作成できる- 通常snapshotの例:
zfs snapshot tank@snapshot-master - recursive snapshotの例:
zfs snapshot -r tank@recursive
- 通常snapshotの例:
zfs diff [older snapshot] [newer snapshot]はsnapshot間の差分を比較する- 出力では追加ファイルや変更されたパスを確認できる
- snapshot復元は
zfs rollback [pool/dataset@snapshot_name]で行う- rollbackするとsnapshot以降に作成されたファイルは削除される
- より新しいsnapshotも削除され、この場合は
-rオプションの使用を求められることがある
ZFS send/recvと複製
- ZFS sendはsnapshotをデータstreamとして送れる機能
- snapshotやdatasetをファイル、別のpool、またはSSH経由で別システムへ複製できる
- 例では
tankとbackupという2つのpoolを使用するtank/Moviesdatasetに1.50Gのデータがある- 転送前に
zfs snapshot tank/Movies@$(date '+%Y-%m-%d_%H-%M')でsnapshotを作成する zfs send tank/Movies@2020-11-03_15-29 | zfs recv backup/Moviesでsnapshotをbackup poolへ転送する
- 転送後、
zfs listではbackup/Moviesとtank/Moviesの両方が見え、zfs list -t snapshotでも両側のsnapshotを確認できる zfs sendはさまざまなオプションやユースケースを掘り下げる価値のある機能で、RAIDZやsnapshotと組み合わせることでfilesystemをより堅牢にできる
datasetとsnapshotの削除
- dataset削除は
zfs destroy [pool/dataset]形式を使う-rフラグも利用できる
- snapshot削除も
zfs destroy [pool/dataset@snapshot_name]を使う- snapshot削除にも
-rフラグを使える
- snapshot削除にも
- ZFSにはさらに多くの機能があるが、この資料は基本概念とコマンドを学ぶための出発点に近い
1件のコメント
Hacker News のコメント
たとえばプール作成では、
ashift=12、lz4圧縮、xattr=sa、acltype=posixacl、atime=offのような妥当なデフォルト値をそのまま使い、暗号化は複数のオプションではなくオン/オフだけにしてほしい暗号化キーを生成し、起動時にプールを復号する
systemdサービスを設定し、キーのバックアップを案内してくれるとよい。zfs listはデータセットがマウントされているか、暗号化されているか、キーがロードされているかを表示すべきだ再帰データセットはなくし、
{pool}/{dataset}ではなく{pool}:{dataset}でプールとデータセットを明確に区別してほしい。プールやスナップショットの名前も自分で付けずに済むよう、{hostname}-[A-Z]、{pool name}_{datetime created}のような規則と数字の短縮名を自動で付けてくれるとよいプール作成時にディスク ID を直接入力しなくて済むようにし、
/dev/sda、/dev/sdbで作った後にドライブの順序を変えても混乱しないよう、ディスクにメタデータを保存してほしい進捗状況は常に
pvで表示し、週次スクラブと、時間別/日別/週別/月別のスナップショットおよびクリーンアップを自動設定してほしいプールのないディスクへ送信する場合は、確認を取ったうえで送信元プールと同じ設定の単一ディスクプールを作成し、
zpoolとzfsは 1 つのコマンドに統合してほしい暗号化データセットの送信時は
--rawを自動使用し、送信のデフォルトは--replicateにし、可能なら-Iを使ってほしい。スナップショットのファイルシステムを隠しディレクトリに隠すのではなく、スナップショットデータセットを簡単にマウントして探索する方法も必要だashift=12のデフォルトや{pool}:{dataset}構文は理解できるが、今から変えるにはもう遅すぎるように見えるし、一部の提案は知らないユースケースを壊しかねないホスト名でプール名を付ける方式は、複数ホストから取り込める SAN プールには合わない
週次スクラブ、定期スナップショット、定期クリーンアップは OS のスケジューラが担うべき仕事だと思う。
zpoolとzfsを統合することも可能ではあるだろうが、結局zfs -pool XXXX、zfs -volume XXXXのような形になるはずで、なぜ必要なのか分からない再帰データセットは実際に有用な場合がある。一方で、
zfs listがマウント有無、暗号化有無、キーのロード有無を表示すべきだという点には全面的に同意するディスク ID を入力させないという部分は曖昧だ。ID、WWN、ラベル、
sdXなど複数の指定方法はあるが、どのディスクを使うかはいずれにせよ伝える必要があるディスクにメタデータを保存して、順序を変えても見つけられる機能はすでにある。ドライブをいくつか差し替えてからプールをインポートしても見つけてくれる
一部の提案はデフォルトとして悪くないが、いくつかは自分の利用パターンと必要性の外側を十分に考慮していないように見える。ZFS ははるかに多くのユーザーを対象にしている
/dev/sda、/dev/sdbでプールを作って ZFS が混乱するというのは、率直に言って ZFS の問題ではなく、今の時代に合った使い方をしていないユーザー側の問題に近いLinux にはかなり前から
/dev/disk/by-id/ata-$manufactuer-$serial-$whateverのような完全な参照がある。プールを作るときはこうしたパスを使うべきだ{pool}:{dataset}でなければならないのか分からないスナップショット名を自分で付けたくないなら、私が作った小さなツール https://github.com/rollcat/zfs-autosnap が合うかもしれない
zfs-autosnap snapを cron に時間ごとに入れ、zfs-autosnap gcを日ごとに入れれば、保持ポリシーに従ってスナップショット履歴を回してくれる簡単な ZFS コマンドラッパーを使うのは難しくないので、私のコードを持っていって自分のツールを作ってもよい
職場でも、その日に想定したデプロイ形態に合わせて ZFS アレイを作るスクリプトをいくつも書いた。その中には、zvol を載せる LUKS 暗号化ボリュームの作成、命名規則の標準化、
ashift=12、lz4圧縮のようなデフォルト設定が含まれていたこれは ZFS ネイティブ暗号化が入るずっと前のことで、今の方式でも問題がないので、ZFS 暗号化をサポートするようにスクリプトを更新してはいない
今では多くのフラグを覚えていないが、スクリプトがドキュメントの役割を果たしてくれるし、チームの他の人たちは
make-zfs-big-mirrorやmake-big-zfs-undundant-raid0を実行するだけでよいいつか年に 20 回以上システムをプロビジョニングすることになれば、それすらプロビジョニングで自動化できるかもしれない
プール名を付けないというのは筋が通らない。プールをそんなに頻繁に作るわけではないのだから、普通に名前を付ければよい
スナップショット名を付けたくないなら
httmとzfs allowを使える。たとえばhttm -S .はrpool/ROOT/ubuntu_tiebek@snap_2022-12-14-12:31:41_httmSnapFileMountのようなスナップショットを作るzfsとzpoolは、それぞれ複数のサブコマンドを持つ優れた Unix コマンドだ。ZFS の設計者たちが、より複雑な単一の管理コマンドを作らなかったのは、とても賢明な判断だったと思うスナップショットデータセットを明示的にマウントして探索することも
zfs mountで簡単にできる。ただし、安定した仮想インターフェースがすべてのファイルバージョンを検索しやすくしてくれるし、これは btrfs などではずっと難しいという点も信じてほしい。httmも参考になる[0]: https://kimono-koans.github.io/opinionated-guide/#dynamic-sn...
ZFSにはほかにも便利なものがあります。
zpool-attach(8)とzpool-replace(8)の違いを知っておくとよく、zfs list -t all -o spaceは容量がどこで使われているかを表示します大きな変更やアップグレードの前にOSを保護するには、ZFS Boot Environmentsが最高の機能です。手始めとして https://is.gd/BECTL が役に立つかもしれません
zpool history poolnameはプール構成と変更履歴をすべて表示します。たとえばzpool create、autotrim=on、atime=off、compression=zstd、recordsize=1mのような変更が記録されますガイドに抜けている重要な情報もあります。3-wayミラーは3台のディスクのうち2台が故障してもデータが残り、4-wayミラーは4台中3台が故障しても残り、N-wayミラーはN台中N-1台が故障してもデータが保護されます
データが最重要だがスロットやディスクが多くない場合に有用です
何年も前から、大容量のマルチTB級PostgreSQLデータベースをZFS上で運用しています。ZFSのおかげで、バックアップ、過去のスナップショットに基づくテスト環境の作成、内蔵圧縮によるディスク節約がとても簡単になりました
興味があれば、経験談を https://lackofimagination.org/2022/04/our-experience-with-po... で読めます
ZFSを始めるときに最も役立ったのは、FreeBSDのZFS HandbookとAaron Toponceの記事でした
[0] https://docs.freebsd.org/en/books/handbook/zfs/
1 https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux...
転がっていたECC RAM 1GBの古いHP MicroserverにFreeBSDをインストールし、古い500GBハードディスクも5台あったので、FreeBSD Handbookを見ながら5xミラーで構成しました。FreeBSDは初めてでしたが、とてもスムーズでした
最近、主にLAMPサーバーで構成されたインフラを大幅に再構築しながら、効率的なバックアップ複製と暗号化のために、すべてLinux上のZFSベースにすることにしました
かなり前からバックアップにZFSと
rsyncを一緒に使っていたのでそれなりに慣れており、結果的にはうまくいきましたが、きちんとやろうとすると予想よりはるかに時間がかかりました。特にデータベースと複製に関して、Web上には誤った助言が多くありましたデータベースには、少なくともブロックサイズのアラインメントのような基本的なチューニングが必要です。mariadb/InnoDBについては、Let's Encrypt側の資料 https://github.com/letsencrypt/openzfs-nvme-databases が圧倒的によかったです。すべての項目に理由を挙げ、複数の出典を引用しているので価値があります
Webをさらに探すと、不完全で根拠のない理論を添えた矛盾した助言、逸話、神話が延々と出てきます。結局は自分でテストし、調整する項目を理解する必要がありますし、調整しないと決めるのも問題ありません
複製については、本当にマニュアルページをおすすめします。ZFSは堅牢な複製ツールを提供していますが、あまりに汎用的なので、Gitの低レベルな配管コマンドのように感じます。SSHで使うことを前提にしていないため自分でつなぎ合わせる必要があり、自動化するには境界条件まで考えなければならないので、最初は怖く感じます
そのため皆
syncoidのようなツールに流れるのですが、syncoid系の複製スクリプトにはひどい点がありました。ZFSのsend --replicationモードを使わず、より柔軟だからという理由でPerlで不完全に再実装しています初回テストで新規に復元したところ、すべての暗号化ルートが壊れ、データセットのプロパティがすべて自動同期されないのを見ると、たまったものではありません。組み込みの再帰的な複製オプションだけを使えば、ZFSがこれを処理してくれます
腰を据えて自分でスクリプトを書けば難しくありません。単純に保ち、
syncoidのように不要なものをパイプラインに大量に詰め込まなければよいのです。実際にテストすると、そうしたものが速度を落とすこともあります。進捗はpvで見て、そのまま流せば高速に動作しますいつか自分の複製スクリプトを公開するかもしれません。基本を扱いつつ、複製をめちゃくちゃに再実装しない良い参考スクリプトはほとんどないと感じています
io_capacityとio_capacity_maxのチューニングに触れていますが、MySQLのドキュメントを開いて実際のパラメータの役割を見ると、残念ながらそれほど有用ではありませんこれらの値は変更バッファのマージのようなバックグラウンド入出力を制御し、実際の作業を必要とするメインプロセスから入出力を奪うことがあります
かなり忙しい120K QPSのMySQL DBを運用した経験では、どちらも触る必要はありませんでした。必要だと感じるなら、まずredo logが埋まるまでの時間とバッファプールのダーティページ比率を監視すべきです。おそらく別のパラメータを調整するほうがよいでしょう
[0] https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.ht...
あるレベルではより効率的かもしれませんが、経験的には圧縮率を大きく低下させます
興味深い二次効果として、ワークロードにもよりますが、ディスク帯域幅がボトルネックの場合はスループットがかえって悪化することがあります。圧縮のおかげで物理ディスクが処理できる以上の速度で読み書きできるのに、圧縮を損なうと読み書き帯域幅に悪影響が出る可能性があります
数年前から Linux で ZFS を使い始め、全体的には順調だった。
唯一驚いたのは、volblocksize のデフォルト値がほとんどの RAIDZ 構成にとってかなり悪いという点。生のディスク容量の 50% を失いたくなければ、値を大きくする必要がある。
関連記事は以下。
https://jro.io/nas/#overhead
https://openzfs.github.io/openzfs-docs/Basic%20Concepts/RAID...
https://www.delphix.com/blog/zfs-raidz-stripe-width-or-how-i...
結局、ZFS 関連のスプレッドシートの一つまで見ることになった。
ZFS overhead calc.xlsx
https://docs.google.com/spreadsheets/d/1tf4qx1aMJp8Lo_R6gpT6...
RAID-Z parity cost
https://docs.google.com/spreadsheets/d/1pdu_X2tR4ztF6_HLtJ-D...
若くて今よりさらに愚かだった頃、熱心なファンたちがオープンソースの NAS OS、おそらく FreeNAS と ZFS がどれほど素晴らしいかをたくさん書いている記事を読んだ。eBay でスペックがかなり低い中古の HP MicroServer を買い、自分が何をしているのかもよく分からないまま飛び込んだ。
コミュニティフォーラムでいくつか質問したが、返ってきた答えの多くは「ドキュメントは読みましたか?」「RAM は十分ですか?」だった。
そのドキュメントというのは読みにくいスタイルの PowerPoint プレゼン資料で、少し伝道師めいた文体で、前提知識が多く、定期的に更新されてもいなかった。必要な RAM 量も曖昧で、とにかく可能な限り多く積めという点に重点が置かれていた。
結局、技術、過熱した雰囲気、自分の知識レベルに関するあらゆる危険信号を無視して、多くのデータを失った。学ぶことは多かった。
ファイルシステムはずっと安定してきたし、ドキュメントもより明確になったと思う。
それでも ext3 のような従来のジャーナリングファイルシステムより強力で高度である分、自分で自分の足を撃つ方法も増えている。
後のためにいくつか補足すると、ZFS の冗長性はすべて vdev 層にある。zpool は 1 つ以上の vdev で作られ、いずれの場合でも zpool 内の vdev を 1 つでも失うと、その zpool は永久に破壊される。
歴史的に RAIDZ、つまりパリティ RAID はディスクを追加して拡張することができなかった。RAIDZ を大きくする唯一の方法は、アレイ内の各ディスクを 1 台ずつより大きなディスクに交換することで、その再構築中にディスクが故障しないことを祈るしかない。
かなり素人的な判断では、RAIDZ は RAIDZ2 や RAIDZ3 のようにディスク数が多い場合にだけ検討する。n<=6 で予算が許すなら、複数のミラー vdev を使う。本番環境では、複数の RAID の読み書き性能指標をもっと調べる必要がある。
ただし、サイト全体のバックアップがあり、自分の能力と監視をかなり信頼できる場合に限って RAIDZ1 を勧められる。
私の場合は 3x3 ドライブのプールがあり、スナップショットをラックの数 U 下にあるバックアップ先へ送っている。そのバックアップ先は毎日起動し、3x4 ドライブのプールを持っていて、これも RAIDZ1 だ。
NAS でドライブ故障が起きたら、すぐにバックアップを開始してスナップショットを受け入れ、その後ドライブを交換するつもり。そうすれば、リシルバー中に 2 台目のドライブが故障してデータが飛ぶ可能性を最小化できる。
本当に重要なデータはもちろん外部にも置いている。
理解できないZFS の問題に遭遇している。ある zpool で
zpool statusが検出されたエラー一覧を出力するのだが、ファイルには出ず、常にスナップショット、そしておそらく削除済みスナップショットと思われる 16 進数の項目にだけ現れる。エラーとして表示されたスナップショットを削除して
zpool scrubを 2 回実行すると、エラーは消え、スクラブもエラーを見つけない。zpool statusはどのデバイスにもエラーを表示したことがない。ファイルにはエラーがなく、デバイスにもエラーがなく、スクラブでもエラーが検出されないのに、稼働中は 1 日に新しい「エラー」が 12 個ずつ
zpool statusに現れる。どうしてこんなことが起きるのか分からない。前者は変に見えるが、メーリングリストの通常の Web フロントエンドだ。
移動も変更もできず、削除だけ可能。なぜこうしたファイルが破損するのか全く手がかりがない。幸い、全部大きな Linux ISO だったので致命的ではなかった。