mount() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

mount() - 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 位包含各種掛載標誌(如 <linux/fs.h>(對於 libc4 和 libc5)和 <sys/mount.h>(對於 glibc2)中定義的)。

標籤描述
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
 在從此檔案系統執行程式時,不遵守 set-user-ID 和 set-group-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_EXPIRE 的第二個umount2() 呼叫將解除安裝已過期的掛載點。此標誌不能與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 不是掛載點。或者,使用MNT_EXPIREMNT_DETACHMNT_FORCE 呼叫了umount2()。
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 掛載的檔案系統上執行 set-user-ID 或 set-group-ID 程式將以EPERM 失敗。從 Linux 2.4 開始,在這種情況下,set-user-ID 和 set-group-ID 位只是被靜默忽略。

另請參閱



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.