2013年2月22日 星期五

Linux 無法 umount 某個目錄,出現 "Device is busy" 的訊息,要如何解決?

在 Linux 系統下,當任何目錄是用 mount 來掛載,後續要解除掛載(umount)的時候,若是有程式 使用,或是有 user cd 在那個目錄上的話,此時就沒有辦法 umount 掉,在 umount 時會出現 "Device is busy" 的訊息。

要怎麼找出是哪個程式掛在那個目錄上? 然後去把那個程式砍掉呢?

這時候可以使用 fuser 指令來處理



-m 參數顯示所有使用指定該資源的系統程序,後面可以跟掛載點,或是dev設備
-v 參數輸出詳細訊息,可以看出是哪個程式還在佔用著資源
fuser 還會告訴你程序的 PID,知道了 PID,你就可以隨便怎麼處置這個程序了。

假設現在 mount 掛載的目錄是 /mnt/sdb1

    查詢: fuser -m /mnt/sdb1
    顯示: /mnt/sdb1: 11025c

就代表是 Process  ID 11025(PID) 有使用到這個目錄,後面 c 代表的意義可以參考下列說明:

    c: current directory.
    e: executable being run.
    f: open file. f is omitted in default display mode.
    F: open file for writing. F is omitted in default display mode.
    r: root directory.
    m: mmap'ed file or shared library.

如果要把這個資源釋放,讓 /mnt/sdb1 可以 umount 的話,fuser 有以下幾種做法:

-k 參數可以把霸佔著該裝置的所有 PID 砍掉:
fuser -m -k /mnt/sdb1

如果你不確定是否要 kill 所有佔用該設備的 PID,你可以加一個 -i 參數,這樣每 kill 一個 PID 之前,都會詢問你的意見

fuser -m -v -i -k /mnt/sdb1
就會問你是不是要把 11025 這個 PID kill 掉,選 y 就會 kill 掉

訊息如下:
        USER      PID   ACCESS COMMAND
/mnt/sdb1: root      11025 ..c..  bash
Kill process 11025 ? (y/N) y

沒有留言: