ИМЯ
umount, umount2 -
размонтирует
файловую
систему
ОБЗОР
#include <sys/mount.h>
int umount(const char *target);
int umount2(const char *target, int flags);
ОПИСАНИЕ
Вызовы umount()
и umount2()
удаляют
подключение
(самого
верхнего
уровня) к
файловой
системе,
примонтированной
к target.
Для
размонтирования
файловых
систем
требуются
права (Linux:
мандат CAP_SYS_ADMIN).
В Linux 2.1.116
добавлен
системный
вызов umount2(),
который,
подобно umount(),
размонтирует
заданный
объект, но
позволяет
указать
дополнительные
флаги flags,
контролирующие
поведение
операции:
- MNT_FORCE
(начиная с Linux
2.1.116)
- Попросить
файловую
систему
прервать
ожидающие
запросы
перед
попыткой
размонтирования.
Это может
позволить
выполнить
размонтирование
без
ожидания
недоступного
сервера, но
может
привести к
потере
данных.
Если после
прерывания
запросов
некоторые
процессы
продолжат
обращаться
к файловой
системе,
размонтирование
не будет
выполнено.
В Linux 4.12 MNT_FORCE
поддерживается
только в
следующих
файловых
системах: 9p
(начиная с Linux
2.6.16), ceph (начиная
с Linux 2.6.34), cifs
(начиная с Linux
2.6.12), fuse (начиная
с Linux 2.6.16), lustre
(начиная с Linux
3.11) и NFS
(начиная с Linux
2.1.116).
- MNT_DETACH
(начиная с Linux
2.4.11)
- Выполнить
отложенное
размонтирование:
сделать
точку
монтирования
недоступной
для новых
подключений,
немедленно
размонтировать
файловую
систему и
все
файловые
системы,
смонтированные
ниже по
дереву и по
таблице
монтирования,
и
выполнить
настоящее
размонтирование
только
когда
точка
доступа
станет
свободной.
- MNT_EXPIRE
(начиная Linux
2.6.8)
- Пометить
точку
монтирования
как
недействительную.
Если точка
монтирования
в это время
не
используется,
то
первоначальный
вызов umount2() с
этим
флагом
завершится
с ошибкой
EAGAIN, но
пометит
точку
монтирования
как
недействительную.
Точка
монтирования
остаётся
недействительной
до тех пор,
пока
какой-нибудь
процесс не
запросит к
ней доступ.
Второй
вызов umount2() с
флагом MNT_EXPIRE
размонтирует
недействительную
точку
монтирования.
Этот флаг
нельзя
указывать
вместе с MNT_FORCE
или MNT_DETACH.
- UMOUNT_NOFOLLOW
(начиная с Linux
2.6.34)
- Не
следовать
по ссылке,
если target
является
символьной
ссылкой.
Это флаг
помогает
избежать
проблем с
безопасностью
в
программах
принадлежащих
root и с
установленным
битом set-user-ID,
которые
позволяют
непривилегированным
пользователям
размонтировать
файловые
системы.
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ
При
успешном
выполнении
возвращается
0. В случае
ошибки
возвращается
-1, а errno
устанавливается
в
соответствующее
значение.
ОШИБКИ
Коды
ошибок,
описанные
ниже, не
зависят от
типа
файловой
системы. У
каждой
файловой
системы
могут быть
свои коды
ошибок и
своё
собственное
поведение.
Подробности
смотрите в
исходном
коде ядра Linux.
- EAGAIN
- Вызов umount2() с
флагом MNT_EXPIRE
успешно
пометил
незанятую
файловую
систему
как
недействительную.
- EBUSY
- Объект target
не может
быть
размонтирован,
так как он
занят.
- EFAULT
- Объект target
указывает
вне
адресного
пространства,
доступного
пользователю.
- EINVAL
- Значение
target не
является
точкой
монтирования.
- EINVAL
- Вызов umount2()
был вызван
с флагом
MNT_EXPIRE и с MNT_DETACH
или MNT_FORCE.
- EINVAL
(начиная с Linux
2.6.34)
- Вызов umount2()
был сделан
с неверным
значением
флага flags.
- ENAMETOOLONG
- Значение
пути
длиннее
чем MAXPATHLEN.
- ENOENT
- Указан
пустой
путь или
одна из его
частей не
существует.
- ENOMEM
- Ядро не
может
выделить
свободную
страницу
для
копирования
имени
файла или
данных.
- EPERM
- Вызывающий
процесс не
имеет
требуемых
привилегий.
ВЕРСИИ
Флаги MNT_DETACH
и MNT_EXPIRE
доступны в
glibc начиная с
версии 2.11.
СООТВЕТСТВИЕ
СТАНДАРТАМ
Эти
функции
есть
только в Linux, и
они не
должны
использоваться
в
переносимых
программах.
ЗАМЕЧАНИЯ
Вызов umount() и
общие
точки
монтирования
Действия
на точку
монтирования,
являющуюся
общей,
включая
операции
umount(), будут
переданы
каждой
общей
точке
монтирования
в этой
группе и
каждой
подчинённой
точке
монтирования
в этой
группе. Это
означает,
что umount()
члена из
набора
общих
точек
монтирования
приведёт к
размонтированию
всех в его
членов, а
также всех
их
подчинённых.
Это
распространение
действия
размонтирования
может быть
особенно
удивительным
в системах,
где каждая
точка
монтирования
является
общей по
умолчанию.
В таких
системах
рекурсивно
привязываемое
монтирование
корневого
каталога
файловой
системы в
подкаталог,
а затем
размонтирование
этого
подкаталога
с MNT_DETACH
приведёт к
тому, что
каждая
точка
монтирования
в
пространстве
имён
монтирования
будет
размонтирована
в
отложенном
режиме.
Чтобы umount()
также не
делал,
перед
вызовом umount()
точка
монтирования
может быть
перемонтирована
с помощью
вызова mount() с
аргументом
mount_flags, в
который
добавлены
MS_REC и MS_PRIVATE.
Историческая
справка
Изначально
функция umount()
вызывалась
как umount(device) и
возвращала
ENOTBLK при
попытке
работы с
любым не
блочным
устройством.
В Linux 0.98p4 был
добавлен
вызов umount(dir)
для
поддержки
анонимных
устройств.
В Linux 2.3.99-pre7 был
убран
вызов umount(device),
остался
только umount(dir)
(теперь
устройства
могут быть
подключены
более чем к
одной
точке,
поэтому
указания
только
устройства
недостаточно).