![Linux で取り外し可能なデバイス (eSATA、USB ストレージ) をアンマウントする](https://rvso.com/image/1288697/Linux%20%E3%81%A7%E5%8F%96%E3%82%8A%E5%A4%96%E3%81%97%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%20(eSATA%E3%80%81USB%20%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8)%20%E3%82%92%E3%82%A2%E3%83%B3%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B.png)
eSATA、USB ドライブなどの取り外し可能なデバイスは、突然取り外すことができます (プラグを抜くだけで)。
パーティション上に開いているファイル ハンドルがある場合、umount
ドライブが物理的に切り離された後でも、このパーティションはアンマウントされません。つまり、Linux コマンドは失敗します。
アンマウントが失敗すると、デバイスの再接続時にmount
も失敗します。したがって、どのプロセスがドライブを使用しているかを調べて、それらを強制終了するか、すべてのハンドルを閉じる必要があります。どちらもできない場合は、ドライブをマウントするためにボックスを再起動する必要があります。また、それを使用しているプロセスを強制終了することは絶対にできません。
「強制アンマウント」オプションは見当たりません。オプションはあります-f
が、NFS 専用です。
これは非常に奇妙に聞こえますが、Linux はユーザーが単にドライブを引っこ抜くというシナリオに対応していないのでしょうか? Linux でこのシナリオを適切に処理する方法を知っている人はいますか?
特定のパーティション/デバイスで開いているファイル ハンドルを確認したり、特定のデバイスのみのすべてのファイル ハンドルを選択的にフラッシュして閉じたりする方法はありますか?
注: このlsof
コマンドは、私が使用している組み込み Linux (busybox) では使用できません。
「fuser」は組み込みLinuxでは利用できません。
レイジー umount -l を試してみました。しかし、一貫して機能しているようには見えません。たとえば、ファイル ハンドルを開いたままにします (デバイス上のファイルに対して「tail -f」を使用)。次に、ドライブをデタッチしてから「umount -l」を実行すると、アンマウントされます。その後、ドライブを再接続し、tail がまだ実行されている間に、同じマウント ポイントに再度マウントしようとします。一貫して機能しているわけではありません。成功するときもあれば、失敗するときもあります。ファイル システムが不整合な状態のままになる場合、レイジー オプションを使用するのは不安です。また、このレイジー オプションがこのようなシナリオで使用することを意図しているかどうかもわかりません。
ファイルハンドルが開いているプロセスを終了できません。
たとえば、デバイスを /mnt/abc にマウントし、ドライブを切断して再接続すると、Linux は、アンマウントやマウントを行わなくても、デバイスのファイル システムを同じマウント ポイント "/mnt/abc" に再接続するようです。その後、再接続後に同じ古いオープン ファイル ハンドルが機能し始めるようです (少なくともファイル読み取り操作の場合)。これは私の観察です。これが予想される動作かどうかはわかりません。ただし、これも一貫して機能しているようには見えません。
読み取り用にファイル ハンドルを開いておき ("tail -f")、その後デタッチして再アタッチし、tail 対象のファイルに変更を加えると、"tail -f" の出力が変更内容で更新されるのを確認しました。ただし、デバイスがなくなった後にファイルを変更しようとして (予想どおりエラーが発生します)、再アタッチすると、デバイスのファイル システムが同じマウント ポイントに正しく再アタッチされません。ファイル書き込みの場合 (デバイスが存在しないとき)、動作していないようです。
すべてのハンドルを閉じず、すべてのパーティションを適切にアンマウントせずにドライブが突然取り外された場合、Linux が従う標準的/一貫した動作はありますか?
答え1
リストされているすべてのファイル記述子をスキャンし/proc
(それが存在すると仮定)、プロセスをリスト/強制終了する bash スクリプトを作成できます。
/proc/$m/fd/$n
シンボリック リンクとして提示される PID m の n 番目のファイル記述子です。readlinkbusybox
をサポートしているので、自動化できるはずです。
編集: これは本質的に を再実装していると言えますlsof
が、実際にはかなり簡単です。
答え2
lsof
を使用して、特定のディレクトリ下の開いているファイルを一覧表示できますlsof +D /path/to/mountpoint
。
答え3
やってみました:
umount -l /path/to/mountpoint
fuser -km /path/to/mountpoint
さて、私の以前の提案はうまくいきませんでした。馬鹿げているかもしれませんが、実際に試してみましたか:
umount -f /path/to/mountpoint
Busybox のドキュメントによると、強制アンマウント オプション (例として NFS を表示) である必要があります。
それでもうまくいかない場合は、次のことを試してください。
eject -s /dev/my-sata-or-usb-device
答え4
不足している場合の簡単な解決策は、mount_point を実際のマウント ポイントに置き換えるlsof
ことです 。これは、上記の billc.cn の回答に基づいています。find /proc/*/fd | xargs readlink | grep /mount_point