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


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

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

umount2() - 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 在從此檔案系統執行程式時,不遵守設定使用者 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 使此檔案系統上的寫入同步(就好像對所有對此檔案系統開啟的檔案都指定了O_SYNC標誌到open(2)一樣)。
從 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_EXPIREMNT_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

廣告


  

廣告



廣告
© . All rights reserved.