umount() - 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位是各种挂载标志(如libc4和libc5中的<linux/fs.h>以及glibc2中的<sys/mount.h>中定义的)。
| 标签 | 描述 |
|
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 | 使此文件系统的写入同步(就像对所有对此文件系统打开的文件都指定了open(2)的O_SYNC标志一样)。 |
| 从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位只是被静默忽略。
另请参阅
广告
|