MOUNT(2) | Руководство программиста Linux | 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, с проведением тестов в следующем порядке:
Каждая из этих операций подробно описана далее на этой странице. Для изменения поведения mount() могут быть указаны дополнительные флаги в mountflags, как описано ниже.
Ниже расположенный список дополнительных флагов, которые можно использовать в mountflags. Обратите внимание на то, что некоторые из них или даже все игнорируются операциями. Такие случае будут описаны далее по тексту.
Начиная с Linux 2.4 одни из показанных выше флагов можно устанавливать на точки монтирования (свой набор на каждой), а другие — на суперблок смонтированной файловой системы, то есть все монтирования одной файловой системы имеют одинаковый набор этих флагов (ранее все флаги применялись к суперблоку).
Флаги набора для точки монтирования:
Следующие флаги указываются для суперблока: 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 игнорируются.
Назначение флагов типа распространения следующее:
По умолчанию, изменение типа распространения касается только 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.
Определения 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)
2019-03-06 | Linux |