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 位将被静默忽略。
另请参阅
广告
|