MOUNT(2)

ИМЯ
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).

Вариант filesystemtype доступные ядру перечислены в /proc/filesystems (например: "btrfs", "ext4", "jfs", "xfs", "vfat", "fuse", "tmpfs", "cgroup", "proc", "mqueue", "nfs", "cifs", "iso9660"). Дополнительные типы становятся доступными после загрузки соответствующих модулей.

Аргумент data рассматривается каждой файловой системой по-своему. Обычно, это строка параметров, перечисленных через запятую, которые понимает файловая система. О том, какие параметры доступны для каждого типа файловой системы смотрите mount(8).

Вызов mount() выполняет один из нескольких типов операций, в зависимости от значений, указанных в mountflags. Выбор выполняемой операции определяется путем тестирования значений, установленных в mountflags, с проведением тестов в следующем порядке:

*   Перемонтировать существующие точки монтирования: mountflags включает MS_REMOUNT.

*   Создать привязку (bind mount): mountflags включает MS_BIND.

*   Изменить тип существующего монтирования: mountflags включает одно из MS_SHARED, MS_PRIVATE, MS_SLAVE или MS_UNBINDABLE.

*   Переместить существующее монтирование в новое место: mountflags включает MS_MOVE.

*   Создать новое монтирование: mountflags не содержит ни один из указанных выше флагов.

Каждая из этих операций подробно описана далее на этой странице. Для изменения поведения mount() могут быть указаны дополнительные флаги в mountflags, как описано ниже.

  Дополнительные флаги для монтирования
Ниже расположенный список дополнительных флагов, которые можно использовать в mountflags. Обратите внимание на то, что некоторые из них или даже все игнорируются операциями. Такие случае будут описаны далее по тексту.

MS_DIRSYNC (начиная с Linux 2.5.19)
    Осуществлять изменения каталогов на этой файловой системе синхронно. Это свойство может быть получено для отдельных каталогов или дерева подкаталогов с помощью chattr(1).

MS_LAZYTIME (начиная с Linux 4.0)
    Можно уменьшить количество обращений к диску, если сохранять дескрипторы меток времени (atime, mtime, ctime) только в памяти. Временные метки на диске обновляются только в следующих случаях:

    (a) дескрипторы необходимо обновить для некоторого изменения, не связанного с временными метками файлов;

    (b) приложение использует fsync(2), syncfs(2), or sync(2);

    (c) неиспользуемый дескриптор вытесняется из памяти; или

    (d) прошло более 24 часов с момента записи дескриптора на диск.

    Данный параметр монтирования существенно сокращает количество операций записи, необходимых для обновления меток времени inode, особенно mtime и atime. Однако, если произойдёт падение системы, то поля atime и mtime на диске могут оказаться устаревшими на 24 часа.

    В качестве примеров, где данный параметр может принести значительную выгоду это частые произвольные операции записи в уже выделенные файлы, а также случаи, когда также включён параметр монтирования MS_STRICTATIME (преимущество объединения MS_STRICTATIME и MS_LAZYTIME в том, что stat(2) будет возвращать правильное обновлённое время, но обновления 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-UID и set-GID или файловые мандаты при исполнении программ в этой файловой системе.

MS_RDONLY
    Подключить файловую систему в режиме только для чтения.

MS_REC (начиная с Linux 2.4.11)
    Используется вместе с MS_BIND для создания рекурсивной точки монтирования и вместе с флагами типа распространения для рекурсивного изменения типа распространения всех точек монтирования в поддереве. Подробности смотрите далее.

MS_RELATIME (начиная с Linux 2.6.20)
    При доступе к файлу на этой файловой системе значение времени последнего доступа к файлу (atime) обновляется, только если текущее значение atime меньше или равно времени последнего изменения файла (mtime) или времени последнего изменения состояния файла (ctime). Этот флаг полезен для программ (например, mutt(1)), которым нужно знать, что файл был прочитан с момента его последнего изменения. Начиная с Linux 2.6.30 в ядро это поведение включено по умолчанию (если не указан MS_NOATIME), а чтобы получить обычное поведение нужно указать флаг MS_STRICTATIME. Также, начиная с Linux 2.6.30 время последнего доступа к файлу всегда обновляется, если оно устаревает на один день.

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
    Осуществлять запись на эту файловую систему синхронно (как если бы флаг O_SYNC для open(2) был указан для всех файлов, открытых на этой файловой системе).

Начиная с 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_DIRSYNC, MS_LAZYTIME, MS_MANDLOCK, MS_MS_SILENT и MS_SYNCHRONOUS. Начальный настройки этих флагов определяются по первому монтированию файловой системы и будут общими для всех последующих монтирований этой файловой системы. Следовательно, набор флагом можно изменить через операцию перемонтирования (смотрите далее). Эти изменения отразятся на всех точках монтирования, связанных с этой файловой системой.

Начиная с Linux 2.6.16 флаг MS_RDONLY может устанавливаться и сбрасываться на точках монтирования по отдельности, а также на нижележащем суперблоке файловой системы. Смонтированная файловая система будет доступна на запись только, если она сама и её точка монтирования не помечены только для чтения.

  Перемонтированние существующих точек монтирования.
Существующие монтирования можно перемонтировать, указав MS_REMOUNT в mountflags. Это позволяет изменить mountflags и data существующих монтирований без необходимости размонтировать и заново монтировать файловую систему. target должен соответствовать указанному при начальном вызове mount().

Аргументы source и filesystemtype игнорируются.

Аргументы mountflags и data должны совпадать со значениями, используемыми в первоначальном вызове mount(), за исключением параметров, которые были преднамеренно изменены.

В mountflags можно изменять: MS_LAZYTIME, MS_MANDLOCK, MS_NOATIME, MS_NODEV, MS_NODIRATIME, MS_NOEXEC, MS_NOSUID, MS_RELATIME, MS_RDONLY, MS_STRICTATIME (стирает флаги MS_NOATIME и MS_RELATIME) и MS_SYNCHRONOUS. Попытка изменить флаги MS_DIRSYNC и MS_SILENT при перементировании игнорируется без ошибки. Заметим, что изменения флагов суперблока видимы на всех точках монтирования файловой системы (так как флаги суперблока едины для всех точек монтирования).

Начиная с Linux 3.17, если не одно из значений MS_NOATIME, MS_NODIRATIME, MS_RELATIME, или MS_STRICTATIME не указано в mountflags , то при перемонтировании сохраняются текущие значения этих флагов (а не изменяются на значение по умолчанию MS_RELATIME).

Начиная с Linux 2.6.26, флаг MS_RMOUNT можно использовать вместе с MS_BIND для изменения только флагов, касающихся точки монтирования. В частности, это полезно для установки или сброса флага «только для чтения» на точке монтирования без изменения нижележащей файловой системы. При значении mountflags:

    MS_REMOUNT | MS_BIND | MS_RDONLY

будет обеспечен доступ к этой точке монтирования в режиме только для чтения, без изменения других точек монтирования.

  Создание привязки монтирования
Если mountflags содержит MS_BIND (доступен, начиная с Linux 2.4), то выполняется привязка монтирования. Привязка монтирования делает видимым файл или поддерево каталогов в другой точке внутри одной иерархии каталогов. Привязки монтирования могут быть в разных файловых системах и перекрывают заключения chroot(2).

Аргументы filesystemtype и data игнорируются.

Остальные биты (кроме MS_REC, описано ниже) в аргументе mountflags также игнорируются. Однако посмотрите обсуждение перемонтирования, представленное выше, о том, как сделать существующую привязку монтирования доступной только для чтения.

По умолчанию, когда каталогу назначена привязка монтирования, монтируется только этот каталог; если существуют другие подмонтирования в дереве каталогов, то им не назначается привязка монтирования. Если также указан флаг MS_REC, то выполняется операция рекурсивной привязки монтирования: всем подмонтированиям в поддереве source (отличным от непривязываемых монтирований) также назначается привязка монтирования в соответствующее расположение к поддереве target.

  Изменение типа распространения существующего монтирования
Если mountflags содержит один из флагов MS_SHARED, MS_PRIVATE, MS_SLAVE, или MS_UNBINDABLE (все доступны начиная с Linux 2.6.15), то тип распространения существующего монтирования изменяется. Если указано сразу несколько из этих флагов, то возвращается ошибка.

При смене типа распространения можно изменять только флаги MS_REC (описан ниже) и MS_SILENT (игнорируется).

Аргументы source, filesystemtype и data игнорируются.

Назначение флагов типа распространения следующее:

MS_SHARED
    Делает эту точку монтирования общей. События монтирования и размонтирования этой точки сразу же распространяются на другие точки монтирования, являющиеся членами её равноправной группы. Распространение здесь означает, что монтирование или размонтирование автоматически происходит и у всех остальных точек монтирования в равноправной группе. И наоборот, события монтирования и размонтирования, возникшие у точек монтирования равноправной группы, будут распространены и на эту точку монтирования.

MS_PRIVATE
    События монтирования и размонтирования не распространяются в эту точку и от этой точки.

MS_SLAVE
    Если это общая точка монтирования, которая является членом непустой равноправной группы, то она преобразуется в подчинённую точку монтирования. Если это общая точка монтирования, которая является членом пустой равноправной группы, то она преобразуется в индивидуальную точку. В противном случае тип распространения точки монтирования не изменяется.

    Если точка монтирования подчинённая, то события монтирования и размонтирования распространяются на эту точку монтирования из (главной) общей равноправной группы, в которую она раньше входила. События монтирования и размонтирования этой точки не распространяются на членов группы.

    Точка монтирования может быть подчинённой одной равноправной группе и в тоже время может распространять события в другую группу, где она является членом.

MS_UNBINDABLE
    Делает эту точку монтирования непривязываемой. Она подобна индивидуальной точке монтирования плюс недоступна привязка монтирования. При рекурсивной привязке (mount() с флагами MS_BIND и MS_REC) поддерева каталога все привязки внутри поддерева автоматически удаляются (т. е., не копируются) при копировании этого поддерева для создания целевого поддерева.

По умолчанию, изменение типа распространения касается только target точки монтирования. Если в mountflags также указан флаг MS_REC, то тип распространения всех точек монтирования ниже target также изменяется.

Дополнительную информацию по типам распространения монтирования (включая тип распространения по умолчанию, назначаемый новым точкам монтирования) смотрите в mount_namespaces(7).

  Перемещение точки монтирования
Если в mountflags содержится флаг MS_MOVE (доступен, начиная с Linux 2.4.18), то перемещается поддерево: в source задаётся существующая точка монтирования, а target указывается новое расположение, в которое будет перемещена точка монтирования. Перемещение атомарно: поддерево всегда смонтировано.

Оставшиеся биты в аргументе mountflags игнорируются, как и аргументы filesystemtype и data.

  Создание новой точки монтирования
В том случае, если ни одно из значений MS_REMOUNT, MS_BIND, MS_MOVE, MS_SHARED, MS_PRIVATE, MS_SLAVE, или MS_UNBINDABLE не указано в mountflags, вызов mount() выполняет действие по умолчанию: создаёт новую точку монтирования. В source задаётся источник новой точки монтирования, а значение target указывает каталог, в котором будет создана точка монтирования.

Используются аргументы filesystemtype и data, дополнительные параметры для изменения поведения могут быть указаны в mountflags.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ
Коды ошибок, описанные ниже, не зависят от типа файловой системы. У каждой файловой системы могут быть свои коды ошибок и своё собственное поведение. Подробности смотрите в исходном коде ядра Linux.

EACCES
    Поиск запрещён из-за одной части пути, которая не доступна для просмотра и поиск (см. подробнее в path_resolution(7)).

EACCES
    Было предпринята попытка монтирования файловой системы доступной только на чтение, но без флага ms_rdonly.

EACCES
    Блочное устройство source найдено на файловой системе смонтированное с опцией MS_NODEV

EBUSY
    Попытка выполнить новое монтирование непосредственно поверх существующей точки монтирования, которая была создана в этом пространстве имён монтирования с тем же источником и назначением.

EBUSY
    source не может быть перемонтирован с доступом только на чтение, потому что он все ещё содержит файлы, открытые для записи.

EFAULT
    Один из аргументов-указателей указывает на каталог за пределами пользовательского адресного пространства.

EINVAL
    источник имеет недоступный суперблок.

EINVAL
    Была предпринята попытка перемонтирования (MS_REMOUNT), но source еще не был смонтирован в target.

EINVAL
    Была предпринята попытка перемещения (MS_MOVE), но source не являлся точкой монтирования или был '/'.

EINVAL
    mountflags включает более одного значения из MS_SHARED, MS_PRIVATE, MS_SLAVE, или MS_UNBINDABLE.

EINVAL
    mountflags включает MS_SHARED, MS_PRIVATE, MS_SLAVE, или MS_UNBINDABLE а также включает флаг, отличный от MS_REC или MS_SILENT.

EINVAL
    Была попытка выполнить связанное монтирование, как несвязанное монтирование.

EINVAL
    В непривилегированном пространстве имён монтирования (т. е., пространстве имён монтирования, принадлежащем пространству имён пользователя, которое было создано непривилегированным пользователем) выполнялась операция связанного монтирования (MS_BIND) без указания (MS_REC), которая привела бы к открытию дерева файловой системы, находящемся ниже одного из подмонтирований каталога, к которому выполнялось связывание.

ELOOP
    Во время разбора имён найдено слишком много ссылок.

ELOOP
    Сделана попытка перемещения, но цель оказалась подкаталогом источника.

EMFILE
    (В случае, если не требуются блочные устройства): таблица фиктивных устройств переполнена.

ENAMETOOLONG
    Значение пути длиннее чем MAXPATHLEN.

ENODEV
    Тип из filesystemtype в ядре не настроен.

ENOENT
    Указан пустой путь или одна из его частей не существует.

ENOMEM
    Ядро не может выделить свободную страницу для копирования имени файла или данных.

ENOTBLK
    Значение source не является блочным устройством (а устройство было запрошено).

ENOTDIR
    Значение target или префикс source не является каталогом.

ENXIO
    Старший номер блочного устройства source вне допустимого диапазона.

EPERM
    Вызывающий процесс не имеет требуемых привилегий.

ВЕРСИИ
Определения MS_DIRSYNC, MS_MOVE, MS_PRIVATE, MS_REC, MS_RELATIME, MS_SHARED, MS_SLAVE, MS_STRICTATIME и MS_UNBINDABLE были добавлены в заголовочные файлы glibc начиная с версии 2.12.

СООТВЕТСТВИЕ СТАНДАРТАМ
Данная функция есть только в Linux и не должна использоваться в программах, которые задуманы как переносимые.

ЗАМЕЧАНИЯ
Начиная с Linux 2.4 одна файловая система может быть смонтирована в множество точек монтирования, также множественное монтирование может осуществляться в одну точку.

В верхних 16 битах аргумента mountflags может содержаться магическое число 0xC0ED (MS_MGC_VAL) (все остальные флаги из ОПИСАНИЯ находятся в младших 16 битах mountflags). Указание MS_MGC_VAL было требованием ядра до версии 2.4, но начиная с Linux 2.4 этого больше не нужно, и число игнорируется, если указано.

Изначальный флаг MS_SYNC был переименован в MS_SYNCHRONOUS в 1.1.69, когда в <mman.h> был добавлен другой флаг MS_SYNC.

До Linux 2.4 попытка выполнения программ set-UID или set-GID на файловой системе, подключённой с параметром MS_NOSUID, вызывает ошибку EPERM. Начиная с Linux 2.4 биты set-UID и set-GID в этом случае негласно игнорируются.

  Попроцессные пространства имён
Начиная с ядра версии 2.4.19, Linux предоставляет попроцессные пространства имён монтирования. Пространство имён монтирования — это набор смонтированных файловых систем, которые видимы процессу. Пространства имён точек монтирования могут (обычно так и есть) совместно использоваться несколькими процессами, и изменение пространства имён (т.е., монтирование и размонтирование) одним процессом видимы всеми остальными процессами, использующими одно общее пространство имён. (Поведение до версии 2.4.19 в Linux можно рассматривать так, как если бы всеми процессами в системе использовалось одно пространство имён.)

Процесс-потомок, создаваемый fork(2), использует родительское пространство имён монтирования совместно с родителем; пространство имён монтирования сохраняется при вызове execve(2).

Процесс может получить собственное пространство имён монтирования если: он был создан с помощью clone(2) с флагом CLONE_NEWNS; в этом случае его новое пространство имён инициализируется копией пространства имён процесса, который вызвал clone(2); или он вызовет unshare(2) с флагом CLONE_NEWNS; в этом случае пространство имён вызвавшего получит свою копию пространства имён, которое он раньше совместно использовал с другими процессами, и дальнейшие монтирования и размонтирования вызвавшим будут невидимы другим процессам (за исключением потомков, которые вызывающий создаст позже) и наоборот.

В файле /proc/[pid]/mounts (имеется только в Linux) отображается список точек монтирования в пространстве имён монтирования процесса с соответствующем ID. В файле /proc/[pid]/mountinfo отображается дополнительная информация о точках монтирования, включая тип распространения и информационный идентификатор монтирования, который позволяет обнаруживать связи между точками монтирования. Описание этих файлов смотрите в proc(5) и mount_namespaces(7).

СМОТРИТЕ ТАКЖЕ
mountpoint(1), ioctl_iflags(2), umount(2), mount_namespaces(7), path_resolution(7), findmnt(8), lsblk(8), mount(8), umount(8)