web-dev-qa-db-ja.com

cfgadmステータスが切断されている場合にSolarisに挿入されたSATAディスクを自動的に検出するにはどうすればよいですか?

私の目標は、SATAディスクと組み合わせて小さなOpenSolaris NAS(OmniOS + napp-itをHPMicroserver N54Lで実行)でバックアップルーチンを自動化することです。

バックグラウンド:

1つのポート、電源ボタン、およびいくつかのLED(電源およびHDDアクティビティ)を備えた単純なSATAまたはSAS/SATAバックプレーンを含む5.25 "-> 3.5"キャリアレスHDDトレイの1つを取り付けました。複数のHDDをバックアップするために(ローテーションで毎週1つ、オフサイトに保存)、zfs send/recvを使用してすべてのスナップショットを含む完全なメインプールをダンプするスクリプトを作成しました(新しいブロックのみを更新します)。このスクリプトは、手動で起動すると正常に機能します。

NASには直接VGAまたはシリアルコンソールが接続されておらず、ディスクを挿入してデスクトップシステムに戻り、ログオンするのが面倒なので、このプロセスをさらに自動化したいと思います。 WebインターフェイスまたはSSHを使用して、スクリプトを手動で開始します。バックアップの日数が若干異なる場合があるため(ディスクを忘れた、休日など)、cronジョブによる時間指定の開始はオプションではありません。したがって、バックアップはディスクの挿入直後に開始する必要があります。 。

問題:

スクリプトでは、cfgadmを使用して、ディスクを接続+構成し、後で構成解除+切断します。ディスクを挿入するだけで回転する場合、ディスクがそこにあることを知る方法がありません。私がすでに検討した可能な解決策:

  1. cfgadm -f -c connectを使用して、x分ごとに新しいディスクとzpoolを継続的にプローブし、エラー結果を確認します。あまりエレガントではありません。
  2. X分ごとに/var/adm/messagesをチェックし、デバイスパスまたはAHCIをgrepします。デバイスが手動で接続されている場合にのみメッセージが書き込まれるため、不可能です。
  3. iostat -Enを使用します。ディスクを表示しますが、ポート情報がリストされていないため、正確なシリアル番号をgrepする必要があります。また、x分ごとに実行する必要があります。
  4. SELECT構文でcfgadmを使用して、レセプタクルのステータスをフィルタリングします。挿入によって何もトリガーされないため、機能しません(バックプレーンが安すぎる可能性があります)。
  5. エンクロージャーの電源のオン/オフを認識します。大丈夫だろうが、私はこれを達成する方法を理解することができませんでした。
  6. 電源ボタンを再マッピングするか、マシンに別のボタンを追加します。うまくいくかもしれませんが、私もこれを行う方法がわかりません。

私は2つのことが必要だと思います:

  • ディスクとポートのステータスを組み合わせて識別する信頼性の高い方法(したがって、正しいスロット内の正しいディスクのみが検出されます)
  • この検出を登録してイベントをトリガーする方法(シェルスクリプトを開始)

これは可能ですか?そうでない場合、代替案として何を提案しますか?

最終的な解決策(2015年1月26日更新):

将来同様の問題を抱えている人のために:

  1. 受け入れられた回答 by geaで詳しく説明されているように、OmniOSでAHCIホットスワップを有効にします。
  2. 私自身の回答 で詳しく説明されているように、syseventadmを使用して、ディスクがオンラインになったときにバックアップスクリプトをトリガーします。
  3. ケーブル、コントローラー、ディスクに障害がなく、一緒に正常に動作することを確認してください(WD SE4TBディスクとオンボードAHCISATAコントローラーに問題があり、システムログにランダムなWARNING: ahci0: ahci_port_reset port 5 the device hardware has been initialized and the power-up diagnostics failedメッセージが表示されました)。
5
user121391

オンボードSata/AHCIはホットプラグ対応ですが、OmniOSではデフォルトで無効になっています。有効にするには、次の行を/ etc/systemに追加します。

set sata:sata_auto_online = 1

3
gea

興味深い質問...ちょっとした科学実験です。おそらくUSBを使用するか、リモートで送信するか、スケジュールどおりに送信するでしょう...

しかし、あなたの場合、私はcfgadmまたはログ解析の方法からディスクを「探す」ことはまったくしません。それはスケーラブルではありません。

定期的なzpool importの周りに、一意のZFSプール名とスクリプトロジックを使用して、リムーバブルディスクに名前を付けるだけです。 LinuxでのZFSでは、プールのインポートプロセスはシステムサービス/デーモンです。ただし、定期的に実行するのに費用はかかりません。ドライブと関連するプールを検出します。

バックアップが完了したら、プールがエクスポートプールになっていることを願っています。これは、ドライブが複数のバックアップサイクルの間サーバーに残っている状況をカバーします。ドライブにバックアップテープを残すようなものです。

1
ewwhite

この回答を追加して、イベントの監視について私が見つけたものを文書化します(他の場合にも役立つ可能性があります)。

Unix/linux.SEで質問しようとしたときに、Linuxでudevを使用してカーネルイベントを監視することについて 便利なスレッド に気づきました。 Solarisの同等のツールとして、私は つまずいた 使用する提案 syseventadm これは、syseventを監視し、定義されたアクション/スクリプトをトリガーします。


最初は、manページのコピーとXen Hypervisorの問題に関するいくつかの議論以外はあまり見つかりませんでしたが、サポートされているイベントは/usr/include/sys/sysevent/eventdefs.h(またはさまざまなリポジトリの/usr/src/uts/common/sys/sysevent/eventdefs.hでオンライン)にリストされています。そのディレクトリ内のファイル。

マンページの最初の例とsyseventadm add -c EC_zfs -s ESC_ZFS_scrub_start /path/to/script.sh \$pool_nameを使用して、スクラブが開始されるたびに発生し、最初の引数としてプール名を返すサンプルイベントのテストに成功しました。


試行錯誤の末、新しく追加されたディスクを監視する正しい方法を見つけました。

syseventadm add -c EC_dev_add -s disk /path/to/script.sh \$version \$dev_name \$phys_path \$driver_name \$instance
syseventadm restart

diskの後のすべてはオプションであり、引数$1から$5としてスクリプトに直接渡されます。

これで、新しく追加されたディスクがオンラインになるとすぐに、スクリプトがトリガーされ、スクリプトはデバイスIDが正しいかどうかを確認し(オプション)、名前でプールをインポートできます。

1
user121391