ビジー状態のデバイスをアンマウントする方法


244

私は毎日複数のユーザーによってアクセスされているいくつかのsambaドライブを持っています。(SQLテーブルから)共有ドライブを認識し、すべてのユーザーがアクセスできる特別なディレクトリにマウントするためのコードがすでにあります。

SQLテーブルからドライブを削除した場合(事実上それをオフラインにした場合)、ビジー状態のデバイスをアンマウントする方法はありますか?これまでのところ、どのような形式でもumount機能しないことがわかりました。

データを破壊する可能性を無視して-現在読み取られているデバイスをアンマウントすることは可能ですか?


3
umountの失敗のより多くの原因に対処するより一般的な答えは、こちらoletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole

2
こんにちは、おそらくあなたcdはdirをマウントしました、そしてあなたは再びrootまたはログインになりました、そして他のシェルが閉じ込められました。やるexitすべてのシェルに。
Smeterlink

回答:


456

はい!!ビジー状態のデバイスをすぐに切り離す方法があります(ビジー状態で強制的にアンマウントできない場合でも)。後ですべてクリーンアップできます。

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

注意:

  1. これらのコマンドは、実行中のプロセスを混乱させ、データの損失や開いているファイルの破損を引き起こす可能性があります。ターゲットのDEVICE / NFSファイルにアクセスするプログラムは、エラーをスローするか、強制アンマウント後に正常に動作しない可能性があります。
  2. マウントされたフォルダ/ドライブ/デバイス内にないときに、これらのコマンドを実行してみてください。

22
注:-lここでは小文字ですL(「遅延アンマウント」の場合)。(この関連回答を参照してください。)
ジョージ

4
働いた。1つのニュアンス。FTPクライアントを介してログインしている場合、フォルダーを正常にアンマウントするにはログアウトする必要があります。
Alexander Kim

彼らは動作しません。彼らは両方とも永遠にハングアップします。(Debian 8、cifs-utils 2:6.4-1)
Hubro

1
-l/ --lazy開いているファイルは破損しませんが、Linuxでは、デバイスが実際にマウント解除されて削除できる時期がわからない
Tom Hale

1
ちょっと怖い。他のプロセスがまだアクセスしている間に、レイジーアンマウントしてから再マウントしました。最終的に同じ場所に2回マウントしたと思いますか?それが何をしたかわからない。
sudo 2017

120

可能であれば、ビジープロセスを見つけて特定し、プロセスを強制終了してから、Samba共有をアンマウントして、損傷を最小限に抑えます。

  • lsof | grep '<mountpoint of /dev/sda1>' (またはマウントされたデバイスが何であれ)

  • pkill target_process(名前で忙しいプロシージャを殺します| kill PID| killall target_process

  • umount /dev/sda1 (またはマウントされたデバイスが何であれ)


6
それは何も返しません。ネットワークドライブであり、ドライブにアクセスしている他のコンピューターのプロセスが見えないためです。「fuser」コマンドについても同様です。
最大の

ああ、地獄...あなたはsambaコマンドが必要です... / usr / bin / smbclient service <password>:これがあなたを始めるかどうか確認してください... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor

2
smbコマンドは実際には非推奨になり、「umount.cifs」...に置き換えられましたが、これも機能しません。忙しいうちにアンマウントできないことに悩まされているようです。
最大の

あなたはAsuswrt-マーリンを使用している場合は、インストールする必要がありますlsof# opkg install lsof
Tonatio

1
いくつかの結果を取得するには、lsofをsudoする必要があります
aheigins

78

アンマウントしようとするときに、マウントされたデバイス内にいないことを確認してください。


4
正確に言うと、(たとえばcdコマンドを使用して)現在のフォルダー(ターゲットデバイスにある)をターミナルで開くだけで、アンマウントプロセスを停止できません:)
jave.web

2
はい、デバイスのディレクトリでシェルを実行していました。ターミナルウィンドウと出来上がりを閉じました
出来上がり sh78 2018

また、マウントしようとしているマウントポイント内に他のマウントポイントがないことを確認してくださいumount
勝利

@victeありがとう。Solaris 11でpfexec mount -F vboxfs carpetacompartida〜/ Documentsを使用してフォルダーをマウントしていました。しかし、ドキュメントにはサブフォルダがあり、それが問題でした。
ダニ・彩

44

以下を試してください。ただし、フラグを実行する前に、デバイスがビジー状態になっている実行中のプロセスをすべて強制終了することに注意しください-k

-iフラグ作るには、fuser殺害の前にお願いします。

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>何も返されませんでしたが、これはうまくいきます!fuser -m /dev/<my-device>それを殺す前にプロセスを知りたい場合に備えて提案することもできます。
modulitos 2016

3
fuserコマンドを実行すると、すぐにVPSから切断されました。
giorgio79 2016年

21

避ける umount -l

これを書いている時点では、トップ投票の回答はの使用を推奨していumount -lます。

umount -l危険またはせいぜい安全ではない。要約すれば:

  • 実際にデバイスをアンマウントするのではなく、名前空間からファイルシステムを削除するだけです。開いているファイルへの書き込みは続行できます。
  • btrfsファイルシステムの破損を引き起こす可能性があります

回避策/代替策

の有用な動作はumount -l絶対パス名によるアクセスからファイルシステムを隠すことです。これにより、moutpointの使用を最小限に抑えます。

000アンマウントするディレクトリに対する権限を持つ空のディレクトリをマウントすることで、これと同じ動作を実現できます。

次に、マウントポイントの下にあるファイル名への新しいアクセスは、アクセス許可なしで新しくオーバーレイされたディレクトリにヒットします。これにより、アンマウントへの新しいブロッカーが防止されます。

最初にしよう remount,ro

ロックを解除する主なアンマウントの成果は、読み取り専用の再マウントです。remount,roバッジを獲得すると、次のことがわかります。

  1. 保留中のすべてのデータがディスクに書き込まれました
  2. 今後の書き込みはすべて失敗します
  3. デバイスを物理的に切断する必要がある場合、データは一貫した状態にあります。

mount -o remount,ro /dev/device 書き込み用に開いているファイルがある場合、失敗することが保証されているので、まっすぐに試してください。あなたはラッキーだと思うかもしれません、パンク!

運が悪い場合は、書き込み用にファイルを開いているプロセスのみに注目してください。

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

その後、デバイスを読み取り専用で再マウントし、一貫した状態を確保できます。

この時点で読み取り専用で再マウントできない場合は、ここにリストされている他の考えられる原因のいくつかを調査してください

読み取り専用の再マウント実績がロック解除されましたed

おめでとうございます。マウントポイント上のデータは一貫しており、今後の書き込みから保護されています。

なぜfuser劣っているのかlsof

fuser以前に使用しないのはなぜですか?可能ですが 、デバイスではなくディレクトリfuser動作するため、ファイル名空間からマウントポイントを削除して引き続き使用したい場合は、次のようにする必要があります。fuser

  1. マウントポイントを一時的mount -o bind /media/hdd /mntに別の場所に複製します
  2. 元のマウントポイントを非表示にし、名前空間をブロックします。

方法は次のとおりです。

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"

あなたはそれから:

  1. 元の名前空間が非表示(これ以上ファイルを開くことができず、問題が悪化することはありません)
  2. 実行する複製バインドマウントされたディレクトリ(デバイスではなく)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それには影響があることが必要です。基本的に、マウントポイントが/ファイルシステムの下にマウントされている場合は、これを回避する必要があります。


1
--lazy非常に危険な場合、umountmanページに警告だけが表示されないのはなぜですか?「レイジーアンマウント。ファイル階層からファイルシステムを切り離し、ビジー状態で
なくなっ

7

exportfs -vを使用して、エクスポートされたNFSファイルシステムを確認します。見つかった場合は、exportfs -d share:/ directoryで削除します。これらは、fuser / lsofリストに表示されず、umountが成功しない場合があります。


1
このアドバイスをありがとう。ロックを解除するには、exportfs -uaを使用する必要がありました。
FuePi 2015

6

チェックアウトumount2

Linux 2.1.116では、umount2()システムコールが追加されました。これは、umount()と同様に、ターゲットをアンマウントしますが、操作の動作を制御する追加のフラグを許可します。

MNT_FORCE(Linux 2.1.116以降)ビジー状態であっても強制的にアンマウントします。(NFSマウントの場合のみ。)MNT_DETACH(Linux 2.4.11以降)レイジーアンマウントを実行します。マウントポイントを新しいアクセスに使用できないようにし、マウントポイントがビジーでなくなったときに実際にアンマウントを実行します。MNT_EXPIRE(Linux 2.6.8以降)マウントポイントに期限切れのマークを付けます。マウントポイントが現在使用中でない場合、このフラグを使用したumount2()への最初の呼び出しはエラーEAGAINで失敗しますが、マウントポイントに期限切れのマークを付けます。マウントポイントは、どのプロセスからもアクセスされない限り、期限切れのままです。MNT_EXPIREを指定する2番目のumount2()呼び出しは、期限切れのマウントポイントをアンマウントします。このフラグは、MNT_FORCEまたはMNT_DETACHと一緒に指定することはできません。戻り値

成功した場合、ゼロが返されます。エラーの場合は-1が返され、errnoが適切に設定されます。


残念ながら、これらはNFSマウントではなく、CIFSです。MNT_DETACHを試してみます。ただし、umount -lが機能しない場合、これが大きく異なるとは思えません。ありがとう!
最大の

2

誰かが、ターミナルを使用していて、現在のディレクトリがアンマウントしたいパスの中にある場合、エラーが発生すると述べています。
補足として、この場合、lsof | grep path-to-be-unmounted以下の出力が必要です。

bash ... path-to-be-unmounted

1

何かが機能する別の方法は、編集/etc/fstabnoautoフラグの追加、マシンの再起動です。デバイスはマウントされません。何が終わっても、フラグを削除して再起動してください。


0

ニッチな回答:

そのデバイスにzfsプールがある場合、少なくともそれがファイルベースのプールであるlsof場合、使用量は表示されません。しかし、あなたは単に実行することができます

sudo zpool export mypoo

次にアンマウントします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.