umount() - Unix、Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考資料     討論論壇     關於TP  

umount() - Unix、Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

mount, umount - 掛載和解除安裝檔案系統

概要

#include <sys/mount.h> 

int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);

int umount(const char *target);

int umount2(const char *target, int flags);

描述

mount() 將由source指定的檔案系統(通常是裝置名稱,但也可能是目錄名稱或虛擬裝置)連線到由target指定的目錄。umount() 和 umount2() 移除掛載在target上的(最頂層)檔案系統的連線。

掛載和解除安裝檔案系統需要相應的許可權(Linux:CAP_SYS_ADMIN 能力)。

從Linux 2.4開始,單個檔案系統可以在多個掛載點可見,並且多個掛載可以堆疊在同一個掛載點上。

核心支援的filesystemtype引數的值列在/proc/filesystems中(例如“minix”、“ext2”、“msdos”、“proc”、“nfs”、“iso9660”等)。載入相應的模組後,可能會出現其他型別。

mountflags引數的高16位可以是魔術數字0xC0ED(MS_MGC_VAL)(在2.4之前的核心版本中需要,但現在不再需要,如果指定則忽略),低16位是各種掛載標誌(如libc4和libc5中的<linux/fs.h>以及glibc2中的<sys/mount.h>中定義的)。

標籤描述
MS_BIND (Linux 2.4及以後版本)執行繫結掛載,使檔案或目錄子樹在檔案系統中的另一個位置可見。繫結掛載可以跨越檔案系統邊界並跨越chroot(2) 虛擬根目錄。filesystemtypemountflagsdata引數將被忽略。
MS_DIRSYNC(自Linux 2.5.19起)使此檔案系統的目錄更改同步。(可以使用chattr(8)獲得單個目錄或子樹的此屬性。)
MS_MANDLOCK 允許在此檔案系統中的檔案上進行強制鎖定。(仍然必須在每個檔案的基礎上啟用強制鎖定,如fcntl(2)中所述。)
MS_MOVE 移動子樹。source指定現有的掛載點,target指定新位置。移動是原子的:在任何時候都不會解除安裝子樹。filesystemtypemountflagsdata引數將被忽略。
MS_NOATIME 不更新此檔案系統上(所有型別的)檔案的訪問時間。
MS_NODEV 不允許訪問此檔案系統上的裝置(特殊檔案)。
MS_NODIRATIME 不更新此檔案系統上目錄的訪問時間。
MS_NOEXEC 不允許從此檔案系統執行程式。
MS_NOSUID 執行來自此檔案系統的程式時,不遵守設定使用者ID和設定組ID位。
MS_RDONLY 以只讀方式掛載檔案系統。
MS_REMOUNT 重新掛載現有掛載。這允許您更改現有掛載的mountflagsdata,而無需解除安裝和重新掛載檔案系統。sourcetarget應與初始mount()呼叫中指定的值相同;filesystemtype將被忽略。

可以更改以下mountflagsMS_RDONLYMS_SYNCHRONOUSMS_MANDLOCK;在2.6.16之前的核心中,還可以更改以下內容:MS_NOATIMEMS_NODIRATIME;此外,在2.4之前的核心中,還可以更改以下內容:MS_NOSUIDMS_NODEVMS_NOEXEC

MS_SYNCHRONOUS 使此檔案系統的寫入同步(就像對所有對此檔案系統開啟的檔案都指定了open(2)的O_SYNC標誌一樣)。
從Linux 2.4開始,MS_NODEVMS_NOEXECMS_NOSUID標誌可以在每個掛載點設定。從2.6.16核心開始,MS_NOATIMEMS_NODIRATIME也可以在每個掛載點設定。
data引數由不同的檔案系統解釋。它通常是由此檔案系統理解的逗號分隔選項的字串。有關每個檔案系統型別的可用選項的詳細資訊,請參閱mount(8)。
Linux 2.1.116添加了umount2()系統呼叫,它與umount()一樣,解除安裝目標,但允許額外的flags控制操作的行為。
MNT_FORCE(自Linux 2.1.116起)即使繁忙也強制解除安裝。(僅適用於NFS掛載。)
MNT_DETACH(自Linux 2.4.11起)執行延遲解除安裝:使掛載點對新的訪問不可用,並在掛載點不再繁忙時實際執行解除安裝。
MNT_EXPIRE(自Linux 2.6.8起)將掛載點標記為已過期。如果掛載點當前未使用,則使用此標誌對umount2()的初始呼叫將以錯誤EAGAIN失敗,但會將掛載點標記為已過期。只要沒有任何程序訪問掛載點,它就會保持過期狀態。第二個指定MNT_EXPIREumount2()呼叫將解除安裝已過期的掛載點。此標誌不能與MNT_FORCEMNT_DETACH一起指定。

返回值

成功時,返回零。出錯時,返回-1,並適當地設定errno

錯誤

以下錯誤值是由與檔案系統型別無關的錯誤導致的。每個檔案系統型別可能有其自身的特殊錯誤及其自身的特殊行為。有關詳細資訊,請參閱核心原始碼。

錯誤程式碼描述
EACCES 路徑的一個元件不可搜尋。(另請參閱path_resolution(2)。)或者,嘗試掛載只讀檔案系統時未提供MS_RDONLY標誌。或者,塊裝置source位於使用MS_NODEV選項掛載的檔案系統上。
EAGAIN 指定MNT_EXPIREumount2()呼叫成功地將空閒檔案系統標記為已過期。
EBUSY source已經掛載。或者,由於它仍然儲存有開啟以進行寫入的檔案,因此無法將其重新掛載為只讀。或者,由於target仍在繁忙(它是某個任務的工作目錄,另一個裝置的掛載點,具有開啟的檔案等),因此無法將其掛載到target上。或者,由於它繁忙,因此無法解除安裝它。
EFAULT 一個指標引數指向使用者地址空間之外。
EINVAL source具有無效的超級塊。或者,嘗試重新掛載(MS_REMOUNT),但source尚未掛載到target上。或者,嘗試移動(MS_MOVE),但source不是掛載點,或者為’/’。或者,嘗試解除安裝,但target不是掛載點。或者,umount2() 與MNT_EXPIRE一起呼叫,並且同時使用了MNT_DETACHMNT_FORCE
ELOOP 在路徑名解析期間遇到過多的連結。或者,在targetsource的子代時嘗試移動。
EMFILE (如果不需要塊裝置:(虛擬裝置表已滿。
ENAMETOOLONG 路徑名長於MAXPATHLEN。
ENODEV 核心中未配置filesystemtype
ENOENT 路徑名為空或具有不存在的元件。
ENOMEM 核心無法分配空閒頁面來複制檔名或資料。
ENOTBLK source不是塊裝置(並且需要裝置)。
ENOTDIR 第二個引數或第一個引數的字首不是目錄。
ENXIO 塊裝置source的主裝置號超出範圍。
EPERM 呼叫者沒有所需的許可權。

符合標準

這些函式是Linux特有的,不應在旨在可移植的程式中使用。

歷史

原始的umount()函式被稱為umount(device),當使用塊裝置以外的東西呼叫時,它將返回ENOTBLK。在Linux 0.98p4中,添加了umount(dir)呼叫,以便支援匿名裝置。在Linux 2.3.99-pre7中,移除了umount(device)呼叫,只留下umount(dir)(因為現在裝置可以在多個位置掛載,因此指定裝置是不夠的)。

當將不同的MS_SYNC新增到<mman.h>時,原始的MS_SYNC標誌在1.1.69中重新命名為MS_SYNCHRONOUS。

在Linux 2.4之前,嘗試在使用MS_NOSUID掛載的檔案系統上執行設定使用者ID或設定組ID程式將失敗並返回EPERM。從Linux 2.4開始,在這種情況下,設定使用者ID和設定組ID位只是被靜默忽略。

另請參閱



previous next Printer Friendly

廣告


  

廣告



廣告