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

广告


  

广告



广告