Scroll to navigation

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).

Начиная с 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 битах:

Выполнять привязку монтирования, при этом файл или каталог становятся видимыми в другой точке внутри файловой системы. Привязки монтирования могут пересекать границы файловой системы и изменять ограничения chroot(2). Аргументы filesystemtype и data игнорируются. До Linux 2.6.26 включительно, также игнорировался и mountflags (привязка монтирования имела те же параметры монтирования что и точка монтирования, к которой она подключалась).
Осуществлять изменения каталогов на этой файловой системе синхронно. Это свойство может быть получено для отдельных каталогов или дерева подкаталогов с помощью chattr(1).
Разрешить обязательную блокировку файлов в этой файловой системе. Обязательная блокировка всё равно сначала должна быть включена для определённого файла как описано в fcntl(2).
Переместить подкаталог. В source указывается существующая точка монтирования, а в target — новое расположение. Перемещение производится атомарно: ни в один момент времени подкаталог не будет являться размонтированным. Аргументы filesystemtype, mountflags и data игнорируются.
Не обновлять время доступа для (всех типов) файлов в этой файловой системе.
Запретить доступ к устройствам (специальным файлам) в этой файловой системе.
Не обновлять время доступа для каталогов в этой файловой системе. Данный флаг частично предоставляет свойство MS_NOATIME; то есть при MS_NOATIME подразумевается MS_NODIRATIME.
Запретить исполнение программ в этой файловой системе.
Не учитывать биты set-UID и set-GID при исполнении программ в этой файловой системе.
Смонтировать файловую систему в режиме только для чтения.
При доступе к файлу на этой файловой системе значение времени последнего доступа к файлу (atime) обновляется, только если текущее значение atime меньше или равно времени последнего изменения файла (mtime) или времени последнего изменения состояния файла (ctime). Этот флаг полезен для программ (например, mutt(1)), которым нужно знать, что файл был прочитан с момента его последнего изменения. Начиная с Linux 2.6.30 в ядро это поведение включено по умолчанию (если не указан MS_NOATIME), а чтобы получить обычное поведение нужно указать флаг MS_STRICTATIME. Также, начиная с Linux 2.6.30 время последнего доступа к файлу всегда обновляется, если оно устаревает на один день.
Перемонтировать уже существующую точку. При этом можно изменить mountflags и data уже существующей точки монтирования без фактического размонтирования файловой системы. Значения source и target должны соответствовать значениям, указанным при первоначальном вызове mount(); аргумент filesystemtype игнорируется.

Следующие флаги в mountflags могут быть изменены: MS_RDONLY, MS_SYNCHRONOUS, MS_MANDLOCK; до ядра версии 2.6.16 также могут быть изменены: MS_NOATIME и MS_NODIRATIME; и, кроме того, до ядра версии 2.4.10 также могут быть изменены: MS_NOSUID, MS_NODEV, MS_NOEXEC.

Не выводить определённые (printk()) предупреждающие сообщения в журнал ядра. Этот флаг заменяет неправильно названный и устаревший флаг MS_VERBOSE (доступный начиная с Linux 2.4.12), который выполняет такую же функцию.
Всегда обновлять время последнего доступа (atime) при доступе к файлам на этой файловой системе. (Это выполнялось по умолчанию до Linux 2.6.30.) Задание этого флага отменяет поведение флагов MS_NOATIME и MS_RELATIME.
Осуществлять запись на эту файловую систему синхронно (как если бы флаг O_SYNC для open(2) был указан для всех файлов, открытых на этой файловой системе).

Начиная с Linux 2.4 флаги MS_NODEV, MS_NOEXEC и MS_NOSUID можно установить на каждую точку монтирования. Начиная с ядра версии 2.6.16 MS_NOATIME и MS_NODIRATIME также можно установить на каждую точку монтирования. Флаг MS_RELATIME также можно установить на каждую точку монтирования.

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

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

В компоненте пути запрещён поиск (смотрите также path_resolution(7)). Или была попытка монтирования файловой системы, доступной только для чтения, без указания флага MS_RDONLY. Или блочное устройство source находится на файловой системе, смонтированной с параметром MS_NODEV.
source уже смонтирована. Или она не может быть перемонтирована в режим только для чтения, так как всё ещё содержит файлы, которые открыты на запись. Или она не может быть смонтирована в target, так как target сейчас занята (является рабочим каталогом какой-то нити, точкой монтирования другого устройства, содержит открытые файлы и т.д.).
Один из аргументов-указателей указывает на каталог за пределами пользовательского адресного пространства.
source содержит некорректный суперблок. Или была предпринята попытка перемонтирования (MS_REMOUNT), но source ещё не была смонтирована в target. Или была предпринята попытка перемещения (MS_MOVE), но source не является точкой монтирования, или это «/».
Во время разбора имён найдено слишком много ссылок. Или сделана попытка перемещения, а target является подкаталогом source.
(В случае, если не требуются блочные устройства): таблица фиктивных устройств переполнена.
Значение пути длиннее чем MAXPATHLEN.
Тип из filesystemtype в ядре не настроен.
Указан пустой путь или одна из его частей не существует.
Ядро не может выделить свободную страницу для копирования имени файла или данных.
Значение source не является блочным устройством (а устройство было запрошено).
Значение target или префикс source не является каталогом.
Старший номер блочного устройства source вне допустимого диапазона.
Вызывающий процесс не имеет требуемых привилегий.

ВЕРСИИ

Определения MS_DIRSYNC, MS_MOVE, MS_REC, MS_RELATIME и MS_STRICTATIME были добавлены в заголовочные файлы glibc начиная с версии 2.12.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данная функция есть только в Linux и не должна использоваться в программах, которые задуманы как переносимые.

ЗАМЕЧАНИЯ

Изначальный флаг 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(5).

СМОТРИТЕ ТАКЖЕ

umount(2), path_resolution(7), mount(8), umount(8)

2012-05-10 Linux