MOUNT - Linux手册页

时间:2019-08-20 17:59:00  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2020-08-13

名称

mount-挂载文件系统

语法

#include <sys/mount.h>

int mount(const char *source, const char *target,
          const char *filesystemtype, unsigned long mountflags,
          const void *data);

说明

mount()将源指定的文件系统(通常是引用设备的路径名,但也可以是目录或文件的路径名,或者是虚拟字符串)附加到路径名指定的位置(目录或文件)在目标。

挂载文件系统需要适当的特权(Linux:CAP_SYS_ADMIN功能)。

内核支持的filesystemtype参数的值在/ proc / filesystems中列出(例如," btrfs"," ext4"," jfs"," xfs"," vfat"," fuse"," tmpfs"," cgroup" ," proc"," mqueue"," nfs"," cifs"," iso9660")。当加载适当的模块时,其他类型可能会变为可用。

数据参数由不同的文件系统解释。通常,它是此文件系统可理解的一串用逗号分隔的选项。有关每种文件系统类型可用选项的详细信息,请参见mount(8)。

mount()的调用将执行多种常规类型的操作之一,具体取决于mountflags中指定的位。通过测试在mountflags中设置的位来确定执行哪个操作的选择,并按以下列出的顺序进行测试:

*
重新挂载现有的挂载:mountflags包含MS_REMOUNT。
*
创建绑定安装:mountflags包含MS_BIND。
*
更改现有安装的传播类型:mountflags包含MS_SHAREDMS_PRIVATE,MS_SLAVE或MS_UNBINDABLE之一。
*
将现有的挂载移动到新位置:mountflags包含MS_MOVE。
*
创建一个新的安装:mountflags不包含以上所有标志。

这些操作中的每一个将在此页面的后面详细介绍。可以在mountflags中指定其他标志以修改mount()的行为,如下所述。

Additional mount flags

下面的列表描述了可以在mountflags中指定的其他标志。请注意,某些操作类型会忽略这些标志中的某些或全部,如本页面稍后所述。

MS_DIRSYNC(since Linux 2.5.19)
使此文件系统上的目录更改同步。 (可以使用chattr(1)为单个目录或子树获得此属性。)
MS_LAZYTIME(since Linux 4.0)

Reduce on-disk updates of inode timestamps (atime, mtime, ctime)
by maintaining these changes only in memory.
The on-disk timestamps are updated only when:

(a)
inode需要进行一些与文件时间戳无关的更改;
(b)
该应用程序使用fsync(2),syncfs(2)或sync(2);
(c)
从内存中清除未删除的inode;要么
(d)
自将inode写入磁盘以来已超过24小时。
该安装选项可显着减少更新inode时间戳(尤其是mtime和atime)所需的写入。但是,如果发生系统崩溃,磁盘上的atime和mtime字段可能会过时24小时。
使用此选项可能会带来很多好处的工作负载示例包括对预分配文件的频繁随机写入,以及还启用了MS_STRICTATIME挂载选项的情况。 (结合使用MS_STRICTATIME和MS_LAZYTIME的好处是stat(2)将返回正确更新的atime,但仅在上述情况下,atime更新才会刷新到磁盘。)
MS_MANDLOCK
允许对此文件系统中的文件进行强制锁定。 (如fcntl(2)中所述,必须仍然按文件启用强制锁定。)从Linux 4.5开始,此安装选项需要CAP_SYS_ADMIN功能和配置有CONFIG_MANDATORY_FILE_LOCKING选项的内核。
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_REC(since Linux 2.4.11)
与MS_BIND一起使用以创建递归绑定安装,并与传播类型标志一起使用以递归地更改子树中所有安装的传播类型。有关更多详细信息,请参见下文。
MS_RELATIME(since Linux 2.6.20)
当访问此文件系统上的文件时,仅当atime的当前值小于或等于文件的上次修改时间(mtime)或上次状态更改时间(ctime)时,才更新文件的上次访问时间(atime)。该选项对于程序(例如mutt(1))很有用,这些程序需要知道自上次修改文件以来何时读取文件。从Linux 2.6.30开始,内核默认使用此标志提供的行为(除非指定了MS_NOATIME),并且需要MS_STRICTATIME标志才能获得传统的语义。另外,从Linux 2.6.30开始,如果文件的存在时间超过1天,则该文件的上次访问时间将始终更新。
MS_SILENT(since Linux 2.6.17)
禁止在内核日志中显示某些(printk())警告消息。此标志取代了具有相同含义的,名称错误且已过时的MS_VERBOSE标志(从Linux 2.4.12开始可用)。
MS_STRICTATIME(since Linux 2.6.30)
访问此文件系统上的文件时,请始终更新上次访问时间(一次)。 (这是Linux 2.6.30之前的默认行为。)指定此标志将覆盖设置MS_NOATIME和MS_RELATIME标志的效果。
MS_SYNCHRONOUS
使在此文件系统上的写入同步(就像为打开到该文件系统的所有文件指定了open_2的O_SYNC标志)。

从Linux 2.4开始,可以在每个安装的基础上设置上述标志中的某些标志,而其他标志则应用于已安装文件系统的超级块,这意味着同一文件系统的所有安装都共享这些标志。 (以前,所有标志都是每个超级块。)

每个安装点标志如下:

*
从Linux 2.4开始:MS_NODEV,MS_NOEXEC和MS_NOSUID标志可基于每个安装点进行设置。
*
从Linux 2.6.16开始:MS_NOATIME和MS_NODIRATIME。
*
从Linux 2.6.20开始:MS_RELATIME。

每个超块都有以下标志:MS_DIRSYNCMS_LAZYTIMEMS_MANDLOCK,MS_SILENT和MS_SYNCHRONOUS。这些标志的初始设置在文件系统的第一次安装中确定,并将由同一文件系统的所有后续安装共享。随后,可以通过重新安装操作更改标志的设置(请参见下文)。这样的更改将通过与文件系统关联的所有安装点可见。

从Linux 2.6.16开始,可以在每个安装点以及基础文件系统超级块的基础上设置或清除MS_RDONLY。仅当文件系统和挂载点均未标记为只读时,挂载的文件系统才可写。

Remounting an existing mount

通过在mountflags中指定MS_REMOUNT,可以重新安装现有的安装。这使您可以更改现有安装的安装标志和数据,而不必卸载和重新安装文件系统。目标应该与初始mount()调用中指定的值相同。

source和filesystemtype参数将被忽略。

mountflags和data参数应与原始mount()调用中使用的值匹配,但那些有意更改的参数除外。

可以更改以下安装标志:MS_LAZYTIMEMS_MANDLOCKMS_NOATIMEMS_NODEVMS_NODIRATIMEMS_NOEXECMS_NOSUIDMS_RELATIMEMS_RDONLYMS_STRICTATIME(其作用是清除MS_NOATIME和MS_RELATIMERON标记)和MS_NOATIME。重新安装期间尝试更改MS_DIRSYNC和MS_SILENT标志的设置的操作将被忽略。请注意,通过相关文件系统的所有安装点都可以看到对每个超级块标志的更改(因为每个超级块标志都被所有安装点共享)。

从Linux 3.17开始,如果在mountflags中未指定MS_NOATIMEMS_NODIRATIME,MS_RELATIME或MS_STRICTATIME,则重新安装操作将保留这些标志的现有值(而不是默认为MS_RELATIME)。

从Linux 2.6.26开始,MS_REMOUNT标志可以与MS_BIND一起使用,以仅修改每个安装点标志。这对于在不更改基础文件系统的情况下设置或清除安装点上的"只读"标志特别有用。将mountflag指定为:

MS_REMOUNT | MS_BIND | MS_RDONLY

将使通过此挂载点的访问为只读,而不会影响其他挂载点。

Creating a bind mount

如果mountflags包含MS_BIND(从Linux 2.4开始可用),则执行绑定安装。绑定安装使文件或目录子树在单个目录层次结构的另一点可见。绑定安装可能会跨越文件系统边界并跨越chroot(2)监狱。

文件系统类型和数据参数将被忽略。

mountflags参数中的其余位(下面描述的MS_REC除外)也将被忽略。 (绑定安装具有与基础安装点相同的安装选项。)但是,有关使现有绑定安装为只读的方法,请参见上面有关重新安装的讨论。

默认情况下,当目录被绑定安装时,仅该目录被安装;如果目录树下有任何子安装,则它们不是绑定安装的。如果还指定了MS_REC标志,则将执行递归绑定安装操作:源子树下的所有子安装(不可绑定的安装除外)也将绑定安装在目标子树的相应位置。

Changing the propagation type of an existing mount

如果mountflags包含MS_SHAREDMS_PRIVATE,MS_SLAVE或MS_UNBINDABLE中的一种(自Linux 2.6.15起都可用),则将更改现有安装的传播类型。如果指定了多个这些标志之一,则会导致错误。

更改传播类型时只能指定的其他标志是MS_REC(如下所述)和MS_SILENT(将被忽略)。

源,文件系统类型和数据参数将被忽略。

传播类型标志的含义如下:

MS_SHARED
共享此安装点。紧接在此安装点下的安装和卸载事件将传播到属于此安装对等组的其他安装点。此处的传播意味着对等组中的所有其他安装点下将自动发生相同的安装或卸载。相反,在对等安装点下发生的安装和卸载事件将传播到该安装点。
MS_PRIVATE
将此安装点设为私有。安装和卸载事件不会传播到该安装点或从该安装点传播出去。
MS_SLAVE
如果这是共享装载点,是包含其他成员的对等组的成员,则将其转换为从站装载。如果这是一个共享装载点,它是不包含其他成员的对等组的成员,请将其转换为私有装载。否则,安装点的传播类型将保持不变。
当安装点是从站时,安装和卸载事件会从以前是其成员的(主)共享对等组传播到该安装点。此安装点下的安装和卸载事件不会传播到任何对等方。
挂载点可以是另一个对等组的从站,同时与它所属的对等组共享挂载和卸载事件。
MS_UNBINDABLE
使其无法绑定。这就像一个私有安装,并且此安装不能绑定安装。在目录子树上执行递归绑定安装(带有MS_BIND和MS_REC标志的mount())时,在复制该子树以生成目标子树时,会自动修剪(即不复制)该子树中的所有不可绑定的安装。

默认情况下,更改传播类型只会影响目标安装点。如果在mountflags中也指定了MS_REC标志,则目标下所有安装点的传播类型也会更改。

有关安装传播类型(包括分配给新安装的默认传播类型)的更多详细信息,请参见mount_namespaces(7)。

Moving a mount

如果mountflags包含标志MS_MOVE(从Linux 2.4.18开始可用),则移动一个子树:source指定一个现有的安装点,而target指定该安装点将被重新定位到的新位置。此举是原子的:子树绝不会卸载。

mountflags参数中的其余位将被忽略,文件系统类型和数据参数也将被忽略。

Creating a new mount point

如果在mountflags中未指定MS_REMOUNTMS_BINDMS_MOVEMS_SHAREDMS_PRIVATE,MS_SLAVE或MS_UNBINDABLE,则mount()将执行其默认操作:创建一个新的安装点。 source指定新挂载点的源,而target指定创建挂载点的目录。

使用filesystemtype和data参数,并且可以在mountflags中指定其他位以修改调用的行为。

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

错误说明

下面给出的错误值是由文件系统类型无关的错误引起的。每种文件系统类型可能都有其自己的特殊错误和自身的特殊行为。有关详细信息,请参见Linux内核源代码。

EACCES
路径的组成部分不可搜索。 (另请参见path_resolution(7)。)
EACCES
尝试挂载只读文件系统而未给出MS_RDONLY标志。
由于各种原因,文件系统可能是只读的,包括:它驻留在只读光盘上;它位于具有设置为将设备标记为只读的物理交换机的设备上;文件系统实现是在只读支持下编译的;或在最初挂载文件系统时检测到错误,因此该文件系统被标记为只读,并且无法重新安装为读写(直到错误被修复)。
某些文件系统尝试挂载只读文件系统时返回错误EROFS。
EACCES
块设备源位于通过MS_NODEV选项安装的文件系统上。
EBUSY
尝试将新的安装直接堆叠在该安装名称空间中创建的具有相同源和目标的现有安装点之上。
EBUSY
无法以只读方式重新挂载源,因为它仍保持打开状态以供写入。
EFAULT
指针参数之一指向用户地址空间之外。
EINVAL
源具有无效的超级块。
EINVAL
尝试了重新安装操作(MS_REMOUNT),但是源尚未安装在目标上。
EINVAL
尝试了移动操作(MS_MOVE),但是源下的安装树包括不可绑定的安装,而目标是具有传播类型MS_SHARED的安装点。
EINVAL
尝试了移动操作(MS_MOVE),但是源安装的父安装具有传播类型MS_SHARED。
EINVAL
尝试了移动操作(MS_MOVE),但是源不是挂载点,或者是aq / aq。
EINVAL
请求了绑定操作(MS_BIND),其中源引用了安装名称空间魔术链接(即/ proc / [pid] / ns / mnt魔术链接或对该链接的绑定安装)以及父安装的传播类型。目标是MS_SHARED,但是传播所请求的绑定安装可能会导致循环依赖关系,从而可能导致无法释放安装命名空间。
EINVAL
mountflags包含MS_SHAREDMS_PRIVATE,MS_SLAVE或MS_UNBINDABLE中的多个。
EINVAL
mountflags包括MS_SHAREDMS_PRIVATE,MS_SLAVE或MS_UNBINDABLE,并且还包含MS_REC或MS_SILENT以外的其他标志。
EINVAL
尝试将无法绑定的安装绑定到安装。
EINVAL
在无特权的挂载命名空间(即,由无特权的用户创建的用户命名空间拥有的挂接命名空间)中,尝试了未指定(MS_REC)的绑定挂载操作(MS_BIND),这将显示以下文件之一的文件系统树。绑定目录的子安装。
ELOOP
路径名解析期间遇到太多链接。
ELOOP
尝试了移动操作,并且目标是源的后代。
EMFILE
(如果不需要块设备:)虚拟设备表已满。
ENAMETOOLONG
路径名比MAXPATHLEN长。
ENODEV
内核中未配置的文件系统类型。
ENOENT
路径名为空或不存在的组件。
ENOMEM
内核无法分配空闲页面以将文件名或数据复制到其中。
ENOTBLK
源不是阻止设备(并且需要设备)。
ENOTDIR
目标或源的前缀不是目录。
ENXIO
块设备源的主要数字超出范围。
EPERM
呼叫者没有所需的特权。
EROFS
尝试挂载只读文件系统而未给出MS_RDONLY标志。请参阅上方的EACCES。

版本

在版本2.12中,将MS_DIRSYNCMS_MOVEMS_PRIVATEMS_RECMS_RELATIMEMS_SHAREDMS_SLAVE,MS_STRICTATIME和MS_UNBINDABLE的定义添加到了glibc标头中。

遵循规范

此功能特定于Linux,不应在打算移植的程序中使用。

备注

从Linux 2.4开始,单个文件系统可以安装在多个安装点,并且多个安装可以堆叠在同一安装点上。

mountflags参数的前16位可能具有魔术数字0xC0ED(MS_MGC_VAL)。 (在DESCRIPTION中讨论的所有其他标志都占据16位的低位mountflags。)在2.4之前的内核版本中需要指定MS_MGC_VAL,但是由于Linux 2.4不再需要,因此如果指定,它将被忽略。

当将其他MS_SYNC添加到时,原始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位。

Mount namespaces

从内核2.4.19开始,Linux提供了装载名称空间。装载名称空间是进程可见的文件系统装载的集合。挂载名称空间可以在多个进程之间共享(并且通常是共享的),并且一个共享进程对名称空间的更改(即挂载和卸载)对于共享同一名称空间的所有其他进程都是可见的。 (2.4.19之前的Linux情况可以认为是系统上每个进程共享一个名称空间的情况。)

fork(2)创建的子进程共享其父级的mount名称空间; mount命名空间在execve(2)中保留。

在以下情况下,一个进程可以获取一个私有挂载名称空间:它是使用clone(2)CLONE_NEWNS标志创建的,在这种情况下,其新名称空间被初始化为名为clone(2)的进程名称空间的副本;或它使用CLONE_NEWNS标志调用unshare(2),这将导致调用者的安装名称空间获得其先前与其他进程共享的名称空间的私有副本,以便调用者将来进行的安装和卸载对于其他进程是不可见的(调用者随后创建的子进程除外),反之亦然。

有关安装名称空间的更多详细信息,请参见mount_namespaces(7)。

Parental relationship between mount points

每个安装点都有一个父安装点。所有安装点的总体父级关系定义了安装名称空间中的进程所看到的单个目录层次结构。

创建安装点时,将定义新安装点的父级。在通常情况下,新挂载的父节点是文件系统的挂载点,该文件系统包含新挂载所在的目录或文件。如果将新安装架堆叠在现有安装架的顶部,则新安装架的父级是堆叠在该位置的先前安装架。

可以通过/ proc / [pid] / mountinfo文件发现安​​装点之间的父级关系(请参见下文)。

/proc/[pid]/mounts and /proc/[pid]/mountinfo

特定于Linux的/ proc / [pid] / mounts文件在具有指定ID的进程的安装命名空间中公开安装点列表。 / proc / [pid] / mountinfo文件提供了有关安装点的更多信息,包括传播类型和安装ID信息,这些信息使得可以发现安装点之间的父级关系。有关此文件的详细信息,请参见proc(5)和mount_namespaces(7)。

另外参见

mountpoint(1),chroot(2),ioctl_iflags(2),pivot_root(2),umount(2),mount_namespaces(7),path_resolution(7),findmnt(8),lsblk(8),mount(8), umount(8)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/