卸載 (unmount)/退出檔案系統

FlossDoc,自由中文開源知識庫

GNOME 等桌面環境一般都可以在右選單選擇卸載或退出
Enlarge
GNOME 等桌面環境一般都可以在右選單選擇卸載或退出

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

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

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

目录

卸載 (umount)

要卸載檔案系統,可以使用命令「umount 儲存裝置」或「umount 掛載點[1](“u” 後確實沒有 “n”,並白字),例如:

umount /dev/sdc1

如果輸入 umount 命令後停頓下來,一般表示系統正在把仍在緩衝區 (buffer) 中的資料寫入儲存裝置。此時切忌移除該儲存裝置,否則將有機會損壞檔案系統或掉失部份資料。待提示符 #$' 再出現時才表示卸載完畢:

$ umount /dev/sdc1
$

如果中間沒有什麼錯誤訊息出現,一般都表示卸載成功。您可以使用 dfmount 等命令列出已掛載的檔案系統以確定有關檔案系統已成功卸載。

退出媒體 (eject media)

有些媒體 (media) 包括光碟、軟碟、JAZ 碟、ZIP 碟和 ipod 等可能需要由軟件控制才可能從電腦中退出媒體,這時就需要使用 eject 了。eject[2] 的使用方法是「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 掛載點[3]列出正在使用裝置掛載點目錄以下檔案的程序:

$ 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 掛載點[4]列出正在使用裝置掛載點目錄以下檔案的程序:

$ 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 及以下以外的目錄就可以了:

$ cd
$ pwd
/home/johndoe
$ eject cdrom0
$

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

$ umount /media/sdb1
umount: /media/sdb1: device is busy
umount: /media/sdb1: device is busy
$ lsof /media/sdb1
COMMAND   PID    USER   FD   TYPE DEVICE SIZE NODE NAME
bash    67429 johndoe  cwd    DIR   11,0 4096 4257 /media/sdb1/documents
$ kill 67429
$ lsof /media/sdb1
COMMAND   PID    USER   FD   TYPE DEVICE SIZE NODE NAME
bash    67429 johndoe  cwd    DIR   11,0 4096 4257 /media/sdb1/documents
$ kill -9 67429
$ lsof /media/sdb1
$ umount /media/sdb1
$ umount /media/sdb1

參考資料

  1. GNU/Linux Manpage: umount(8) - unmount file systemsLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - GNU/Linux 中的 umount(8) 說明文件
  2. GNU/Linux Manpage: eject(1) - eject removable mediaLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - GNU/Linux 中的 eject(1) 說明文件
  3. GNU/Linux Manpage: fuser(1) - identify processes using files or socketsLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - GNU/Linux 中的 fuser(1) 說明文件
  4. GNU/Linux Manpage: lsof(8) - list open filesLinux.pngUbuntu.pngDebian.png[SuSE][OpenSuSE] - GNU/Linux 中的 lsof(8) 說明文件

相關頁面

相關連結

Personal tools
廣告橫額