umount() - Unix、Linux系統呼叫
廣告
名稱
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) 虛擬根目錄。filesystemtype、mountflags和data引數將被忽略。 |
MS_DIRSYNC(自Linux 2.5.19起) | 使此檔案系統的目錄更改同步。(可以使用chattr(8)獲得單個目錄或子樹的此屬性。) |
MS_MANDLOCK | 允許在此檔案系統中的檔案上進行強制鎖定。(仍然必須在每個檔案的基礎上啟用強制鎖定,如fcntl(2)中所述。) |
MS_MOVE | 移動子樹。source指定現有的掛載點,target指定新位置。移動是原子的:在任何時候都不會解除安裝子樹。filesystemtype、mountflags和data引數將被忽略。 |
MS_NOATIME | 不更新此檔案系統上(所有型別的)檔案的訪問時間。 |
MS_NODEV | 不允許訪問此檔案系統上的裝置(特殊檔案)。 |
MS_NODIRATIME | 不更新此檔案系統上目錄的訪問時間。 |
MS_NOEXEC | 不允許從此檔案系統執行程式。 |
MS_NOSUID | 執行來自此檔案系統的程式時,不遵守設定使用者ID和設定組ID位。 |
MS_RDONLY | 以只讀方式掛載檔案系統。 |
MS_REMOUNT | 重新掛載現有掛載。這允許您更改現有掛載的mountflags和data,而無需解除安裝和重新掛載檔案系統。source和target應與初始mount()呼叫中指定的值相同;filesystemtype將被忽略。 可以更改以下mountflags:MS_RDONLY、MS_SYNCHRONOUS、MS_MANDLOCK;在2.6.16之前的核心中,還可以更改以下內容:MS_NOATIME和MS_NODIRATIME;此外,在2.4之前的核心中,還可以更改以下內容:MS_NOSUID、MS_NODEV、MS_NOEXEC。 |
MS_SYNCHRONOUS | 使此檔案系統的寫入同步(就像對所有對此檔案系統開啟的檔案都指定了open(2)的O_SYNC標誌一樣)。 |
從Linux 2.4開始,MS_NODEV、MS_NOEXEC和MS_NOSUID標誌可以在每個掛載點設定。從2.6.16核心開始,MS_NOATIME和MS_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_EXPIRE的umount2()呼叫將解除安裝已過期的掛載點。此標誌不能與MNT_FORCE或MNT_DETACH一起指定。 |
返回值
成功時,返回零。出錯時,返回-1,並適當地設定errno。
錯誤
以下錯誤值是由與檔案系統型別無關的錯誤導致的。每個檔案系統型別可能有其自身的特殊錯誤及其自身的特殊行為。有關詳細資訊,請參閱核心原始碼。
錯誤程式碼 | 描述 |
EACCES | 路徑的一個元件不可搜尋。(另請參閱path_resolution(2)。)或者,嘗試掛載只讀檔案系統時未提供MS_RDONLY標誌。或者,塊裝置source位於使用MS_NODEV選項掛載的檔案系統上。 |
EAGAIN | 指定MNT_EXPIRE的umount2()呼叫成功地將空閒檔案系統標記為已過期。 |
EBUSY |
source已經掛載。或者,由於它仍然儲存有開啟以進行寫入的檔案,因此無法將其重新掛載為只讀。或者,由於target仍在繁忙(它是某個任務的工作目錄,另一個裝置的掛載點,具有開啟的檔案等),因此無法將其掛載到target上。或者,由於它繁忙,因此無法解除安裝它。 |
EFAULT | 一個指標引數指向使用者地址空間之外。 |
EINVAL |
source具有無效的超級塊。或者,嘗試重新掛載(MS_REMOUNT),但source尚未掛載到target上。或者,嘗試移動(MS_MOVE),但source不是掛載點,或者為’/’。或者,嘗試解除安裝,但target不是掛載點。或者,umount2() 與MNT_EXPIRE一起呼叫,並且同時使用了MNT_DETACH或MNT_FORCE。 |
ELOOP | 在路徑名解析期間遇到過多的連結。或者,在target是source的子代時嘗試移動。 |
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位只是被靜默忽略。
另請參閱
廣告
|