mount(2) - Linux 手册页
名称
mount - 挂载文件系统
概要
#include <sys/mount.h> int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);
描述
mount() 将 source 指定的文件系统(通常是设备名称,但也可以是目录名称或虚拟设备)挂载到 target 指定的目录上。
挂载文件系统需要适当的权限(Linux 中为 CAP_SYS_ADMIN 能力)。
从 Linux 2.4 开始,单个文件系统可以在多个挂载点可见,并且多个挂载可以叠加在同一个挂载点上。
内核支持的 filesystemtype 参数值列在 /proc/filesystems 中(例如:"minix", "ext2", "ext3", "jfs", "xfs", "reiserfs", "msdos", "proc", "nfs", "iso9660")。加载相应的模块后,可能会有更多类型可用。
mountflags 参数的高 16 位可以包含幻数 0xC0ED (MS_MGC_VAL)(这在 2.4 之前的内核版本中是必需的,但现在已不再需要,如果指定也会被忽略),低 16 位则包含各种挂载标志。
- MS_BIND (Linux 2.4 及更高版本)
- 执行绑定挂载,使文件或目录子树在文件系统内的另一个位置可见。绑定挂载可以跨越文件系统边界并跨越 chroot(2) 监牢。filesystemtype 和 data 参数被忽略。在 Linux 2.6.26 之前,mountflags 也会被忽略(绑定挂载具有与底层挂载点相同的挂载选项)。
- MS_DIRSYNC (自 Linux 2.5.19 起)
- 使对此文件系统的目录更改变为同步的。(此属性可以通过 chattr(1) 对单个目录或子树进行设置。)
- MS_MANDLOCK
- 允许对此文件系统中的文件进行强制锁定。(仍需按文件启用强制锁定,如 fcntl(2) 中所述。)
- MS_MOVE
- 移动一个子树。source 指定现有的挂载点,target 指定新位置。该移动是原子的:子树在任何时刻都不会被卸载。filesystemtype、mountflags 和 data 参数被忽略。
- MS_NOATIME
- 不更新此文件系统上(所有类型)文件的访问时间。
- MS_NODEV
- 不允许访问此文件系统上的设备(特殊文件)。
- MS_NODIRATIME
- 不更新此文件系统上目录的访问时间。此标志提供了 MS_NOATIME 所提供功能的一个子集;也就是说,MS_NOATIME 隐含了 MS_NODIRATIME。
- MS_NOEXEC
- 不允许从此文件系统执行程序。
- MS_NOSUID
- 从此文件系统执行程序时,不遵守 set-user-ID 和 set-group-ID 位。
- MS_RDONLY
- 以只读方式挂载文件系统。
- MS_RELATIME (自 Linux 2.6.20 起)
- 当访问此文件系统上的文件时,仅在当前 atime 值小于或等于文件的最后修改时间 (mtime) 或最后状态更改时间 (ctime) 时,才更新文件的最后访问时间 (atime)。此选项对于像 mutt(1) 这样需要知道文件自上次修改后何时被读取的程序非常有用。自 Linux 2.6.30 起,内核默认采用此标志提供的行为(除非指定了 MS_NOATIME),并且需要使用 MS_STRICTATIME 标志才能获得传统的语义。此外,自 Linux 2.6.30 起,如果文件的最后访问时间超过 1 天,则始终会更新。
- MS_REMOUNT
- 重新挂载现有的挂载。这允许您更改现有挂载的 mountflags 和 data,而无需卸载并重新挂载文件系统。target 应与初始 mount() 调用中指定的值相同;source 和 filesystemtype 将被忽略。
可以更改以下 mountflags:MS_RDONLY, MS_SYNCHRONOUS, MS_MANDLOCK;在内核 2.6.16 之前,还可以更改:MS_NOATIME 和 MS_NODIRATIME;此外,在内核 2.4.10 之前,还可以更改:MS_NOSUID, MS_NODEV, MS_NOEXEC。
- MS_SILENT (自 Linux 2.6.17 起)
- 禁止在内核日志中显示某些 (printk()) 警告消息。此标志取代了命名不当且已过时的 MS_VERBOSE 标志(自 Linux 2.4.12 起可用),其含义相同。
- MS_STRICTATIME (自 Linux 2.6.30 起)
- 访问此文件系统上的文件时,始终更新最后访问时间 (atime)。(这是 Linux 2.6.30 之前的默认行为。)指定此标志会覆盖设置 MS_NOATIME 和 MS_RELATIME 标志的效果。
- MS_SYNCHRONOUS
- 使对此文件系统的写入变为同步的(就像对此文件系统的所有文件打开操作都指定了 open(2) 的 O_SYNC 标志一样)。
- 从 Linux 2.4 开始,MS_NODEV, MS_NOEXEC 和 MS_NOSUID 标志可在每个挂载点基础上进行设置。从内核 2.6.16 开始,MS_NOATIME 和 MS_NODIRATIME 也可以在每个挂载点基础上进行设置。MS_RELATIME 标志也可以在每个挂载点基础上进行设置。
data 参数由不同的文件系统解释。通常它是该文件系统所理解的以逗号分隔的选项字符串。有关每种文件系统类型可用选项的详细信息,请参见 mount(8)。
返回值
成功时返回零。出错时返回 -1,并相应地设置 errno。
错误
下面给出的错误值来自与文件系统类型无关的错误。每种文件系统类型可能有其自身的特殊错误和特殊行为。详细信息请参阅 Linux 内核源代码。
- EACCES
路径的一个组成部分不可搜索。(另请参阅 path_resolution(7)。)或者,在未给出 MS_RDONLY 标志的情况下尝试挂载只读文件系统。或者,块设备 source 位于以 MS_NODEV 选项挂载的文件系统上。
EBUSY
source 已经挂载。或者,它无法重新挂载为只读,因为它仍有以写方式打开的文件。或者,它无法挂载到 target 上,因为 target 正忙(它是某个线程的工作目录、另一个设备的挂载点、有打开的文件等)。
EFAULT
其中一个指针参数指向用户地址空间之外。
EINVAL
source 具有无效的超级块。或者,尝试了重新挂载 (MS_REMOUNT),但 source 未挂载在 target 上。或者,尝试了移动 (MS_MOVE),但 source 不是挂载点,或者为 '/'。
ELOOP
路径名解析过程中遇到过多的符号链接。或者,尝试移动时,target 是 source 的子目录。
EMFILE
(如果不需要块设备时:) 虚拟设备表已满。
- ENAMETOOLONG
- 路径名长度超过了 MAXPATHLEN。
- ENODEV
内核中未配置 filesystemtype。
ENOENT
路径名为空或包含不存在的组件。
ENOMEM
内核无法分配空闲页来复制文件名或数据。
- ENOTBLK
- source 不是块设备(且需要设备)。
- ENOTDIR
- target 或 source 的前缀不是目录。
- ENXIO
块设备 source 的主设备号超出范围。
EPERM
调用者没有所需的权限。
版本
MS_DIRSYNC, MS_MOVE, MS_REC, MS_RELATIME 和 MS_STRICTATIME 的定义仅在 2.12 版本中才添加到 glibc 头文件中。
符合
此函数是 Linux 特有的,不应用于旨在可移植的程序中。
说明
原始 MS_SYNC 标志在 1.1.69 版本中被重命名为 MS_SYNCHRONOUS,当时在 <mman.h> 中添加了不同的 MS_SYNC。
在 Linux 2.4 之前,尝试在以 MS_NOSUID 挂载的文件系统上执行 set-user-ID 或 set-group-ID 程序会失败并返回 EPERM。从 Linux 2.4 开始,在这种情况下,set-user-ID 和 set-group-ID 位会被静默忽略。
进程命名空间
- 从内核 2.4.19 开始,Linux 提供了进程挂载命名空间。挂载命名空间是进程可见的文件系统挂载集合。挂载点命名空间可以在多个进程之间共享(通常也是如此),一个进程对命名空间的更改(即挂载和卸载)对所有共享同一命名空间的其他进程可见。(2.4.19 之前的 Linux 情况可以看作是系统中的每个进程共享一个单一的命名空间。)
由 fork(2) 创建的子进程共享其父进程的挂载命名空间;挂载命名空间在 execve(2) 调用期间被保留。
如果满足以下条件,进程可以获得私有挂载命名空间:它是使用 clone(2) 的 CLONE_NEWNS 标志创建的,在这种情况下,其新命名空间被初始化为调用 clone(2) 的进程命名空间的副本;或者它使用 CLONE_NEWNS 标志调用 unshare(2),这会导致调用者的挂载命名空间获得它之前与其他进程共享的命名空间的私有副本,以便调用者未来的挂载和卸载对其他进程(调用者随后创建的子进程除外)不可见,反之亦然。
Linux 特有的 /proc/PID/mounts 文件公开了具有指定 ID 的进程在挂载命名空间中的挂载点列表;详细信息请参见 proc(5)。
参见
umount(2), namespaces(7), path_resolution(7), mount(8), umount(8)