FlossDoc: 请协力 GPLv3 的中文翻译工作。
卸載 (unmount)/退出檔案系統
FlossDoc,自由中文開源知識庫
在 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 掛載點」[1](“u” 後確實沒有 “n”,並非白字),例如:
umount /dev/sdc1
如果輸入 umount 命令後停頓下來,一般表示系統正在把仍在緩衝區 (buffer) 中的資料寫入儲存裝置。此時切忌移除該儲存裝置,否則將有機會損壞檔案系統或掉失部份資料。待提示符 # 或 $' 再出現時才表示卸載完畢:
$ umount /dev/sdc1 $
如果中間沒有什麼錯誤訊息出現,一般都表示卸載成功。您可以使用 df 或 mount 等命令列出已掛載的檔案系統以確定有關檔案系統已成功卸載。
退出媒體 (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
參考資料
- ↑ GNU/Linux Manpage: umount(8) - unmount file systems


[SuSE][OpenSuSE] - GNU/Linux 中的 umount(8) 說明文件 - ↑ GNU/Linux Manpage: eject(1) - eject removable media


[SuSE][OpenSuSE] - GNU/Linux 中的 eject(1) 說明文件 - ↑ GNU/Linux Manpage: fuser(1) - identify processes using files or sockets


[SuSE][OpenSuSE] - GNU/Linux 中的 fuser(1) 說明文件 - ↑ GNU/Linux Manpage: lsof(8) - list open files


[SuSE][OpenSuSE] - GNU/Linux 中的 lsof(8) 說明文件
相關頁面
- 格式化存儲裝置
- 檢查檔案系統
- 設定常規檔案系統檢查
- 設定檔案系統的系統管理員保留空間
- 設定 Ext2/Ext3/Ext4 錯誤處理方案
- 顯示檔案系統標簽
- 改變檔案系統標簽
- 使用 UUID 管理檔案系統
- 顯示各磁碟的可用空間
相關連結
- 解決不能卸載的方法
- 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.
- Manpage (Manual page)
- umount - unmount file systems
- GNU/Linux Manpage: umount(8) - unmount file systems


[SuSE][OpenSuSE] - GNU/Linux 中的 umount(8) 說明文件
- BSD Manpage: umount(8) - unmount file systems


- FreeBSD/NetBSD/OpenBSD 中的 umount(8) 說明文件
- Solaris Manpage: mount(1M) - mount file systems[Solaris] - Solaris 10 中的 mount(1M) 說明文件
- GNU/Linux Manpage: umount(8) - unmount file systems
- eject - eject removable media
- GNU/Linux Manpage: eject(1) - eject removable media


[SuSE][OpenSuSE] - GNU/Linux 中的 eject(1) 說明文件
- NetBSD Manpage: eject(1) - eject a floppy disk, cdrom or tape
- NetBSD 中的 eject(1) 說明文件
- OpenBSD Manpage: eject(1) - magnetic tape and removable media manipulating program
- OpenBSD 中的 eject(1) 說明文件
- Solaris Manpage: eject(1) - eject media such as CD-ROM and floppy from drive[Solaris] - Solaris 10 中的 eject(1) 說明文件
- GNU/Linux Manpage: eject(1) - eject removable media
- fuser - identify processes using files or sockets
- GNU/Linux Manpage: fuser(1) - identify processes using files or sockets


[SuSE][OpenSuSE] - GNU/Linux 中的 fuser(1) 說明文件
- GNU/Linux Manpage: fuser(1) - identify processes using files or sockets
- lsof - list open files
- GNU/Linux Manpage: lsof(8) - list open files


[SuSE][OpenSuSE] - GNU/Linux 中的 lsof(8) 說明文件
- NetBSD Manpage: lsof(8) - list open files
- NetBSD 中的 lsof(8) 說明文件
- GNU/Linux Manpage: lsof(8) - list open files
- umount - unmount file systems

