umount2() - 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 位是各種掛載標誌(如 <linux/fs.h> 中為 libc4 和 libc5 定義的,在 <sys/mount.h> 中為 glibc2 定義的)。
| 標籤 | 描述 |
|
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 | 使此檔案系統上的寫入同步(就好像對所有對此檔案系統開啟的檔案都指定了O_SYNC標誌到open(2)一樣)。 |
| 從 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 位將被靜默忽略。
另請參閱
廣告
|