避ける umount -l
これを書いている時点では、トップ投票の回答はの使用を推奨していumount -l
ます。
umount -l
危険またはせいぜい安全ではない。要約すれば:
- 実際にデバイスをアンマウントするのではなく、名前空間からファイルシステムを削除するだけです。開いているファイルへの書き込みは続行できます。
- btrfsファイルシステムの破損を引き起こす可能性があります
回避策/代替策
の有用な動作はumount -l
、絶対パス名によるアクセスからファイルシステムを隠すことです。これにより、moutpointの使用を最小限に抑えます。
000
アンマウントするディレクトリに対する権限を持つ空のディレクトリをマウントすることで、これと同じ動作を実現できます。
次に、マウントポイントの下にあるファイル名への新しいアクセスは、アクセス許可なしで新しくオーバーレイされたディレクトリにヒットします。これにより、アンマウントへの新しいブロッカーが防止されます。
最初にしよう remount,ro
ロックを解除する主なアンマウントの成果は、読み取り専用の再マウントです。remount,ro
バッジを獲得すると、次のことがわかります。
- 保留中のすべてのデータがディスクに書き込まれました
- 今後の書き込みはすべて失敗します
- デバイスを物理的に切断する必要がある場合、データは一貫した状態にあります。
mount -o remount,ro /dev/device
書き込み用に開いているファイルがある場合、失敗することが保証されているので、まっすぐに試してください。あなたはラッキーだと思うかもしれません、パンク!
運が悪い場合は、書き込み用にファイルを開いているプロセスのみに注目してください。
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
その後、デバイスを読み取り専用で再マウントし、一貫した状態を確保できます。
この時点で読み取り専用で再マウントできない場合は、ここにリストされている他の考えられる原因のいくつかを調査してください。
読み取り専用の再マウント実績がロック解除されましたed
おめでとうございます。マウントポイント上のデータは一貫しており、今後の書き込みから保護されています。
なぜfuser
劣っているのかlsof
fuser
以前に使用しないのはなぜですか?可能ですが 、デバイスではなくディレクトリでfuser
動作するため、ファイル名空間からマウントポイントを削除して引き続き使用したい場合は、次のようにする必要があります。fuser
- マウントポイントを一時的
mount -o bind /media/hdd /mnt
に別の場所に複製します
- 元のマウントポイントを非表示にし、名前空間をブロックします。
方法は次のとおりです。
null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"
# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked. https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"
# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"
# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"
あなたはそれから:
- 元の名前空間が非表示(これ以上ファイルを開くことができず、問題が悪化することはありません)
- 実行する複製バインドマウントされたディレクトリ(デバイスではなく)
fuser
。
これはより複雑ですが[1]、以下を使用できます。
fuser -vmMkiw <mountpoint>
これは、書き込み用に開いているファイルを使用して、プロセスを強制終了するように対話的に要求します。もちろん、マウントポイントをまったく非表示にすることなくこれを行うことができますが、上記はumount -l
に、危険はありません。
-w
スイッチプロセスを書くに制限し、-i
あなたはそれをあなたがして使用することができ急ぎの場合、読み取り専用の再マウントそうした後、インタラクティブであります:
fuser -vmMk <mountpoint>
マウントポイントの下でファイルが開いている残りのすべてのプロセスを強制終了します。
うまくいけば、この時点で、デバイスをアンマウントできます。(最上位にumount
モード000
ディレクトリをバインドマウントした場合は、マウントポイントで2回実行する必要があります。)
または使用:
fuser -vmMki <mountpoint>
アンマウントをブロックしている残りの読み取り専用プロセスをインタラクティブに強制終了します。
くそー、私はまだ得るtarget is busy
!
開いているファイルだけがアンマウントブロッカーではありません。こことここを参照してくださいその他の原因とその対策を。
潜んでいるグレムリンが原因でデバイスを完全にマウント解除できない場合でも、少なくともファイルシステムは一貫した状態になっています。
次に、を使用lsof +f -- /dev/device
して、ファイルシステムを含むデバイスで開いているファイルを含むすべてのプロセスをリストし、それらを強制終了できます。
[1]使用するのはそれほど複雑ではありませんmount --move
が、mount --make-private /parent-mount-point
それには影響があることが必要です。基本的に、マウントポイントが/
ファイルシステムの下にマウントされている場合は、これを回避する必要があります。