2015年4月13日 星期一

[Linux 文章收集] 卸載 (unmount)/退出檔案系統

Source From Here
Preface
在 Unix/Linux 使用檔案系統/儲存裝置 (storage device) 完畢後,您需要卸載 (unmount - 掛載 mount 的相反動作) 檔案系統,否則您不能移除該抽取式儲存裝置 (removable storage device) 或中斷系統。因為這樣會有機會損壞檔案系統或掉失部份資料。

卸載的工作一般是使用命令 umount 進行。 有些媒體 (media) 包括光碟、軟碟、JAZ 碟、ZIP 碟和 ipod 等可能需要使用命令 eject 才可以令電腦同時卸載和退出媒體。

現代的 X Window 桌面環境包括 GNOME 和 KDE 等使用 HAL 和 D-Bus 等,令掛載、存取、卸載和退出等工作都可以很輕易地在桌面上進行。然而在欠缺 X Window 的文字模式、伺服器環境或舊 X Window 系統中,就往往需要使用命令 umount 和 eject。

卸載 (umount)
要卸載檔案系統,可以使用命令「umount 儲存裝置」或「umount 掛載點」,例如:
$ umount /dev/sdc1

如果輸入 umount 命令後停頓下來,一般表示系統正在把仍在緩衝區 (buffer) 中的資料寫入儲存裝置。此時切忌移除該儲存裝置,否則將有機會損壞檔案系統或掉失部份資料。待提示符 # 或 $' 再出現時才表示卸載完畢. 如果中間沒有什麼錯誤訊息出現,一般都表示卸載成功。您可以使用 df 或 mount 等命令列出已掛載的檔案系統以確定有關檔案系統已成功卸載。

退出媒體 (eject media)
有些媒體 (media) 包括光碟、軟碟、JAZ 碟、ZIP 碟和 ipod 等可能需要由軟件控制才可能從電腦中退出媒體,這時就需要使用 eject 了。使用方法是「eject 名稱」,例如:
$ eject /media/disk

參數 “名稱” 可以是裝置檔案 (/dev/cdrom  /dev/sdb1 ) 或裝置的掛置點 (/media/disk  /mnt )。亦可以是以上兩者略上 /dev/、/media/ 或 /mnt/ 等父目錄名稱。執行 eject 時, 如果發現 “名稱” 的第一個字元是 “/” 或 “.”,會直接退出所指裝置。否則會在前加上 /dev/、/media/、/mnt/、/dev/cdroms、/dev/rdsk、/dev/dsk 或 ./,直接找到所指裝置。所以您可以直接使用 cdrom、sdb1 和 disk 等退出裝置:
$ eject scd0

解決卸載失敗問題 “device is busy”
大部人在卸載或退出儲存裝置時都曾遇見以下訊息而被拒絶卸載或退出:
umount: /media/cdrom0: device is busy

這表示有些程式仍在開啟儲存裝置中某些檔案作讀或寫,如果這時移除裝置,有機會會損壞檔案系統、掉失資料和損害該程式,所以系統會拒絶卸載或退出。此時,您需找出仍在使用儲存裝置的程式並要求它們關閉相關檔案 (一般的方法是直接結束相關程式),才可以正常卸載或退出媒體。其中一個方法就是可以使用「fuser -m 掛載點」列出正在使用裝置掛載點目錄以下檔案的程式:
$ fuser -m /media/cdrom0
/media/cdrom0 6015c 6132

表示程式識別碼 (PID) 為 6015 和 6132 的程式是在使用 /media/cdrom0 或以下的檔案。PID 後的英文字母表示檔案/目錄如何被使用:
* c - 當前目錄
* e - 程式被執行的目錄
* f - 開啟檔案。fuser 的預設顯示模式會省去 f
* F - 開啟檔案作寫入。fuser 的預設顯示模式同樣會省去 F
* r - 根目錄
* m - 使用 mmap 開啟了檔案或分享程式庫 (shared library)

在 fuser 命令加上選項 -v 可以顯示較詳細的資訊:
$ fuser -vm /media/cdrom0
USER PID ACCESS COMMAND
/media/cdrom0: johndoe 6015 ..c.. bash
johndoe 6132 f.... rhythmbox

亦使用命令「ps auxw | grep PID」獲知個別程式的詳細資訊:
$ ps auxw | grep 6132
johndoe 6132 0.4 3.0 220017 57104 ? S+ 18:27 0:00 rhythmbox

以上畫面顯示音樂播放程式 Rhythmbox 使用了光碟,您只需要關掉 Rhythmbox 或播放清單,就可以卸載或退出光碟。

除 fuser 外,亦使用命令 「lsof 掛載點」列出正在使用裝置掛載點目錄以下檔案的程式:
$ lsof /media/cdrom0
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 7531 johndoe cwd DIR 11,0 4096 1856 /media/cdrom0
lsof 7698 johndoe cwd DIR 11,0 4096 1856 /media/cdrom0
lsof 7699 johndoe cwd DIR 11,0 4096 1858 /media/cdrom0

以上畫面表示有一個 bash 和兩個 lsof 程式正在使用 /media/cdrom0,您需要令它們全部關閉 /media/cdrom0 才可以退出光碟。當然,直接結束相關程式是最簡單或一般情況下唯一的方法。此時您可能會發覺有些很諷刺的事情發生。超過一半的情況,您所使用的命令模式或終端機就是正在使用裝置和阻止您退出卸載的程式,如上面畫面就是這個程式,bash 程式就是正在使用的命令模式,而兩個 lsof 程式就是剛為查詢而輸入的命令,它們合部都使用 /media/cdrom0 作為當前工作目錄 (current working directory),令系統拒絕卸載。解決方法就是改變工作目錄至 /media/cdrom0 及以下以外的目錄就可以了.

很多情況下,我們需要終止有關程式才可以令它不再使用有關裝置而讓我們卸載或退出裝置。這當然不是一個好方法,有關程式如未儲存檔案,可能會遺失一些資料。但這卻是最簡單快捷的方法。建議初學者在無計可施時才好出此懶人的下策:


相關連結
* 解決不能卸載的方法
- Donncha O Caoimh (2008-02-13). “How to umount when the device is busy”. The Weblog of Donncha O Caoimh.
- Tsung (2008-11-18). “Linux: umount 時 出現 "Device is busy" 的解法”. Tsung's Blog.


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...