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

广告


  

广告



广告