ZFSは壊れにくいファイルシステムだと言われてはいますが、なんらかの原因で壊れることもあります。スクラブで直らない場合にはzdb(1M)で直すのが順当な修正方法となります。ただし、zdb(1M)はそもそもZFSの開発者が利用するために提供されているものなので、ドキュメントもありませんし、動作の詳細を知りたい場合にはソースコードを読む必要があります。
ここではとくにzdb(1M)の使い方の中でも利用率が高いだろうと思われる方法を紹介しておきます。ただし、将来のバージョンで同じ処理がサポートされ続けるとは限らず、また、問題が発生しないとも限りません。使用する場合には開発者向けのコマンドであることを理解したうえで使用してください。
まず、問題が発生したプールはexportします。importした状態のまま処理を行うと処理がカーネルを経由するためにパニックしやすくなるからです。LiveCDから起動して処理を実施してもかまいません。最近のFreeBSDインストーラはZFSも扱うことができます。
「zdb -e -d プール」にてまずはプール内部の構成を確認します。
「-e」はexportされたプールであることを指定しています。importした状態であれば次のように「-e」をはずせば同じことが実施されます。ただし、importした状態での作業はお薦めできません。
「zdb -l デバイスファイル」を指定すれば直接プールの情報をチェックできます。プール名がわからない場合などはこちらを使ってプール名のチェックを実施します。
対象となるプールがパニックを誘発する状態にあるかどうかは次のように「zdb -e プール」で調査することができます。すべてのチェックが実施されるのできわめて大量のログが出力されます。
これまでの操作が実施できない場合、次のように/dev/dskというリンクファイルを作成してから作業してみてください。FreeBSDでは/devに仮想デバイスが展開されますが、Solarisでは/dev/dskに仮想デバイスが展開されているため、zdbがそちらをチェックしに行って失敗している可能性があります。最新版では修正されていると思いますが、再び同じ状況に戻るとも限らないのでこの方法は覚えておくと便利です。
プールの状況を調べる基本的なzdb(1M)の使い方はこんなところです。これ以上深入りする必要があるようだと、なにかと失敗する可能性が出てくるのでこのあたりで止めておいたほうが良いでしょう。