問題描述: Linux下掛載后的分區(qū)或者磁盤某些時候需要umount的時候出現(xiàn)類似“umount: /mnt: target is busy.”等字樣,或者“umount: /xxx: device is busy.”。 問題原因: 該報錯通常是由于待卸載磁盤正在使用,導致無法直接卸載。需要將當前使用數(shù)據(jù)盤的進程殺掉,才能卸載。 解決辦法: 方法一、 使用fuser命令處理 安裝fuser命令 [root@server-10 ~]# yum install psmisc 查看在使用的進程 [root@server-10 ~]# fuser -mv /mnt/
USER PID ACCESS COMMAND/mnt: root kernel mount /mnt
root 13830 ..c.. bash 殺死占用的進程,并再次查看
[root@server-10 ~]# fuser -kv /mnt/
USER PID ACCESS COMMAND/mnt: root kernel mount /mnt
root 13830 ..c.. bash
[root@server-10 ~]# fuser -mv /mnt/
USER PID ACCESS COMMAND/mnt: root kernel mount /mnt
確認無進程連接后,使用卸載命令 [root@server-10 ~]# umount /mnt/[root@server-10 ~]# 參數(shù)說明: -k,--kill kill processes accessing the named file -m,--mount show all processes using the named filesystems or block device -v,--verbose verbose output 注意: 可以使用 fuser -km /mnt 進行 kill 進程。 可以使用 kill 命令殺掉查到對應的進程 。 強制 kill 進程可能會導致數(shù)據(jù)丟失,請確保數(shù)據(jù)得到有效備份后,再進行相關(guān)操作。 方法二、通過lsof命令處理 [root@server-10 ~]# lsof /mnt/COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 16302 root cwd DIR 8,17 50 64 /mnt 找到PID對應的進程或者服務,然后殺死或者停止相應服務即可。 轉(zhuǎn)貼地址:http://www./linuxxitongguanli/836.html
為了干凈地關(guān)閉或熱交換 UNIX 或類 UNIX 系統(tǒng)上的存儲硬件,必須能夠卸載使用此設(shè)備上的存儲的所有文件系統(tǒng)。但是,如果正在使用文件系統(tǒng)中的文件或目錄,就無法卸載它。lsof 和 fuser 命令可以幫助您識別并終止那些正在使用存儲設(shè)備上的文件或從存儲設(shè)備執(zhí)行的進程。使用這些命令有助于尋找那些阻止存儲設(shè)備卸載的進程,減少麻煩,讓您能夠繼續(xù)處理更重要的系統(tǒng)管理任務。 所有計算機操作系統(tǒng)都在引導時檢查它們掛載的文件系統(tǒng)是否是一致的,也就是說,確認它們的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和映射到的相關(guān)存儲沒有錯誤。UNIX、Linux 和其他類 UNIX 操作系統(tǒng)采用一種聰明的方法檢查文件系統(tǒng)的一致性(通常使用 fast 命令)。當這些系統(tǒng)掛載文件系統(tǒng)時,它們在文件系統(tǒng)頭中設(shè)置一個值,把文件系統(tǒng)標為 DIRTY,這意味著它正在使用,在向它寫入更新時可能暫時處于不一致的狀態(tài)。在系統(tǒng)關(guān)閉期間卸載文件系統(tǒng)時,把它們標為 CLEAN。在重新引導系統(tǒng)時,只需要檢查仍然標為 DIRTY 的文件系統(tǒng)的一致性。 在系統(tǒng)關(guān)閉過程中,會自動地卸載文件系統(tǒng),這通常在終止所有非系統(tǒng)進程之后進行。但是,卸載文件系統(tǒng)仍然可能失敗并顯示以下消息: 在這里,busy 意味著一個進程正在寫這個文件系統(tǒng)或者進程是從它運行的。在這兩種情況下,都無法卸載文件系統(tǒng),這是計算機系統(tǒng)的基本規(guī)則之一。如果不采用這個規(guī)則,可以 在進程正在寫文件系統(tǒng)包含的文件時卸載文件系統(tǒng),就會讓文件處于不一致的狀態(tài),而文件系統(tǒng)本身標為 CLEAN。 umount 命令的標準 Linux 版本包含一個延遲卸載選項 -l,它有助于卸載正在使用的文件系統(tǒng)。這個命令需要 Linux 內(nèi)核 2.4.11 或更高版本,目前這通常沒問題。執(zhí)行 umount -l /name/of/file system 可以讓指定的文件系統(tǒng)與系統(tǒng)的目錄層次結(jié)構(gòu)脫離,讓新進程不能使用這個文件系統(tǒng),然后當正在訪問它的所有進程都終止時卸載它。這很方便,但是當需要馬上卸載文件系統(tǒng)時它并不合適。 如果需要馬上卸載文件系統(tǒng),而文件系統(tǒng)報告忙碌,還有其他辦法。如果您是系統(tǒng)的惟一用戶,那么只需終止阻止文件系統(tǒng)卸載的進程。這需要查看所有窗口,尋找 并終止正在寫這個分區(qū)或使用它作為當前工作目錄的暫停的進程或后臺進程。但是,在有許多本地用戶和遠程用戶的多用戶系統(tǒng)上,這種方法是不實際的。幸運的 是,開放源碼社區(qū)提供了一些命令,可以輕松地識別并終止這些進程。 用 lsof 尋找打開的文件 lsof (list open files) 命令列出特定的文件系統(tǒng)、目錄或設(shè)備上所有打開的文件以及與它們相關(guān)聯(lián)的進程。在大多數(shù) UNIX 和類 UNIX 系統(tǒng)上都可以使用 lsof 命令。 在默認情況下,lsof 命令列出當前打開的所有文件、共享庫和目錄,并提供盡可能多的相關(guān)信息。即使在負載很輕的系統(tǒng)上,這個命令的輸出也非常長,因此通常通過命令行參數(shù)指定一 個目錄名,或者使用管道篩選它的輸出。例如,假設(shè)希望卸載掛載在 /opt2目錄上的文件系統(tǒng)。為了查看與 /opt2 目錄相關(guān)聯(lián)的所有進程,應該執(zhí)行下面所示的命令。
需要終止所有這些進程,然后才能卸載 /opt2 分區(qū)。因為這個列表中的進程都不能寫任何文件,所以可以使用 kill 命令并指定第二列中列出的進程 ID (PID) 以終止它們,然后就可以順利地卸載分區(qū)。注意,PID 23402 與最后兩行相關(guān)聯(lián) — 第一行表示 more 命令以 /opt2 作為當前工作目錄 (cwd),第二行表示 more 命令打開了 /opt2/resume.txt 文件。 但是,假設(shè) lsof 命令的輸出像下面這樣。 前三個與 /opt2 目錄相關(guān)聯(lián)的命令與前面一樣,但是后兩個命令是由另一個用戶運行的。其中的 emacs 命令用于編輯文件,所以可以讓 USER 列中列出的用戶保存文件并退出,然后終止這個進程。 lsof 命令還有許多選項,可以幫助您識別不同類型的文件系統(tǒng)上打開的文件和目錄、打開了網(wǎng)絡(luò)套接字的進程、正在使用特定的庫的進程等等。lsof 命令的缺點是,必須聯(lián)系用戶并要求他們終止某些進程,或者自己手工終止它們。fuser 命令更復雜,但是更強大,在作為根用戶運行時可以替您執(zhí)行許多進程終止工作。 用 fuser 尋找用戶進程 fuser (find user processes) 命令也是一個開放源碼應用程序,可以幫助您識別阻止文件系統(tǒng)卸載的進程。fuser 命令尋找與作為命令行參數(shù)指定的文件、目錄或文件系統(tǒng)相關(guān)聯(lián)的進程。本文主要關(guān)注對文件系統(tǒng)掛載點使用 fuser。關(guān)于 fuser 命令的更多信息,請參見它的在線參考信息。fuser 命令要求系統(tǒng)支持 /proc 文件系統(tǒng)。因此,在所有 Linux 發(fā)行版和 FreeBSD 系統(tǒng)上都可以使用它。關(guān)于獲得 fuser 命令的源代碼的方法請參見 參考資料。 與 lsof 命令一樣,作為命令行參數(shù)提供文件系統(tǒng)掛載點名稱是使用 fuser 命令識別阻止文件系統(tǒng)卸載的進程的最簡單方法:
fuser 命令的輸出指出正在使用指定掛載點的進程的 PID。每個 PID 后面有一個字母,它表示與 PID 相關(guān)聯(lián)的進程以什么方式使用指定的掛載點。最常見的字母是前面示例所示的 c,這表示指定的進程使用此文件系統(tǒng)上的一個目錄作為當前工作目錄。 但是,fuser 命令的默認輸出不便于最終用戶使用,即使按 Linux 標準來看也是如此。fuser 命令提供一個 -v 選項,它在 fuser 命令的輸出中增加一些與標準 ps 命令相似的輸出,如下面所示。
這更方便,因為它至少指出了進程是什么程序。在通過 fuser 命令獲得 PID 信息之后,可以在終止進程之前結(jié)合使用標準的 ps 和 egrep 命令了解盡可能詳細的相關(guān)信息,如下面所示 然后,可以使用標準的 kill 命令手工終止指定的進程,或者像下一節(jié)中解釋的,使用 fuser 命令的一些高級功能自動地終止它們。 用 fuser 終止進程 在通過參數(shù)指定掛載點時,fuser 命令的 -k 選項會自動地終止找到的進程。當然,必須作為根用戶執(zhí)行 fuser 命令,才能終止屬于其他用戶的進程,如下面所示
在這里,第二個進程 (emacs) 是第一個進程 (bash shell) 的子進程,因此在 fuser 命令殺死第一個進程時它就會終止。
如果希望指定底層物理設(shè)備名,而不是它包含的文件系統(tǒng)的掛載點,那么還必須指定 -m 選項,如下面所示 第一個命令返回的輸出符合預期,因為它引用文件系統(tǒng)的掛載點。第二個命令表明,不能使用標準的 fuser 選項直接查詢底層設(shè)備。第三個命令說明,-m 選項允許直接指定設(shè)備??梢栽诘谝粋€和第三個命令中添加 -k 選項,從而終止與 /dev/sdb1 設(shè)備上的文件系統(tǒng)相關(guān)聯(lián)的進程。 有時候,為了應對一些緊急情況或者刪除掛載的 CD-ROM 或 DVD 等設(shè)備,Linux 或 UNIX 系統(tǒng)管理員需要卸載分區(qū)。在由于設(shè)備忙系統(tǒng)不允許刪除它的情況下,檢查系統(tǒng)上的所有進程是一個很煩人、很緩慢的過程。lsof 和 fuser 命令有助于識別阻止文件系統(tǒng)卸載的進程。如果情況非常緊急,fuser 命令甚至可以替您終止它們。
|