web-dev-qa-db-ja.com

ディスクが突然切断された後のクリーンアップに使用するユーティリティは何ですか?

外付けハードドライブが物理的に切断され、デバイスがデバイスマッパーを使用してマウントされている場合、クリーンアップは行われません。

特に:

  • ドライブがマウントされたディレクトリが空です
  • マウントはまだmount(8)に存在します
  • デバイスマッパーデバイスはまだ存在しています
  • 物理デバイスはまだ/dev/sd*として存在します

このシナリオでは、上記の項目をクリーンアップせずに、最初の3つのステップを手動でクリーンアップする必要があります(umount、dmsetup remove、およびudevadm trigger --subsystem-match = blockを使用)。それでも、ディスクのsysfsディレクトリは/sys/bus/scsi/drivers/sdに残っているため、SCSIデバイスが登録解除されていることを確認するには、手動で1> deleteをエコーする必要があります。これがないと、ディスクを再接続しても機能しません。

だから私の質問は-デバイスにマップされた物理ディスクが応答しなくなったことを検出し、必要なクリーンアップを実行できるプログラムはありますか?

2
vladsharp

私はあなたのためにそれを行うプログラムを知りませんが、私はある段階で突然それ自体を切断することによって定期的にこの状態になるデバイスを持っていました。上記の手順を手動で実行した後、正常に再接続されます。私のソリューションは、システムがまだ何かがマウントされていると信じていても、それが発生したときにマウントポイントが空として表示されることに気づきました。

私の解決策は、単純な空のファイルをドライブに置き、その存在をシェルスクリプトでチェックして、自動的にクリーンアップすることです。ドライブまたは完全なシェルスクリプトはもうありませんが、独自のスクリプトを作成する基本的な例を示します。実行したときに手動でクリーンアップするために実行する必要のあるコマンドを追加できます。

この例では、マウントポイントとして/ mnt/externalhdを使用し、探しているファイルのルートファイルシステムで.isonlineという名前が付けられていると想定していることに注意してください。また、操作中にファイルが変更されないことを前提として、ドライブ上の既存のファイルの存在を確認することもできます。 ifステートメントは/ devエントリもチェックするため、デバイスが再接続するのを待っている間はクリーンアップのループを作成しないことに注意してください。ただし、ディスクの正しい/ dev/disk/by-uuid/*エントリを見つけて使用する方が正確です。デバイスの接続順序が異なる場合は、幸いなことに私が経験したことのない問題が不可欠です。

if [ ! -e /mnt/externalhd/.isonline ] && [ -e /dev/sdb ]; then {
   # This line optionally logs the disconnect to a file for your records.
   echo "`date '+%d %b %Y %H:%M:%S'` OFFLINE: /dev/sdb disconnected, cleaning up" >> /var/log/externalhd.log

   # Do whatever you need to do to clean up the bad unmount and enable reconnection

   # Optionally log the completion of the cleanup process
   echo "`date '+%d %b %Y %H:%M:%S'` CLEANUP: /dev/sdb cleanup process completed" >> /var/log/externalhd.log
}
fi

それがお役に立てば幸いです。完全なクリーンアップを完了するために実行する必要のあるコマンドが少し曖昧で、ドライブ自体が最終的に停止したときに古いスクリプトを削除したようです。ドライブをクリーンアップするために実行する必要のあるコマンドを使用してスクリプトを設定すると、手動で実行する場合と同じコマンドになりますが、Sudoの部分を削除する必要があります。

次に、スクリプトをcron経由で実行して、アンマウントの不良を定期的にチェックし、アンマウントが検出されるたびに自動的にクリーンアップします。スクリプトが/ home/user/cleanumountに保存されていると仮定すると、次の手順でcronジョブを追加できます。この例では、5分ごとにチェックが実行されます。

最初に次のコマンドを実行します:Sudo crontab -u root -e

メニューの数字を押してリストからテキストエディタを選択するように求められる場合があります。その場合は、対応する数字を押して好みのエディタを選択してください。

次に、次の2行をcrontabに追加します(一番上の行はオプションですが、推奨されるコメントなので、その機能を理解できます)。

# Run /home/user/cleanumount every 5 minutes to cleanly unmount /dev/sdb after sudden disconnects
*/5 * * * *    /home/user/cleanumount

次に、ファイルを保存してテキストエディタを終了すると、新しいcrontabが自動的にインストールされてcronデーモンにロードされます。

5分が十分に頻繁でない場合は、行の最初の部分を調整し、単純な*に変更して1分ごとに実行するか、たとえば*/2を2分ごとに*/3を3分ごとなどに変更します。 crontabの詳細については、man 5 crontabを実行してください。

あなたがそれが役に立つと思うことを願っています、それは私があなたのために書いたこのすべての情報をとても素晴らしいなら冗長にするために他の賢い人が気の利いたツールを持って来ない限りです:)

1
MttJocy