• MNT_EXPIRE (начиная с версии Linux 2.6.8) — помечает точку монтирования как просроченную. Если исходный системный вызов umount2() осуществлен с указанием данного флага и точка монтирования не занята, то такой вызов завершается ошибкой EAGAIN, однако при этом точка монтирования помечается как просроченная. (Если точка монтирования занята, то тогда системный вызов завершается ошибкой EBUSY, а точка монтирования не помечается как просроченная.) Точка монтирования остается просроченной до тех пор, пока ее не использует никакой из процессов. Второй системный вызов umount2() с указанием флага MNT_EXPIRE размонтирует просроченную точку монтирования. Так обеспечивается механизм размонтирования файловой системы, которая не использовалась в течение некоторого интервала времени. Данный флаг нельзя указывать совместно с флагом MNT_DETACH или MNT_FORCE.
• MNT_FORCE — осуществляет принудительное размонтирование, даже если устройство занято (только для точек монтирования NFS). Использование этого флага может вызвать потерю данных.
• UMOUNT_NOFOLLOW (начиная с версии Linux 2.6.34) — не разыменовывает аргумент target, если это символическая ссылка. Флаг предназначен для использования в некоторых программах set-user-ID-root, которые разрешают непривилегированным пользователям выполнять размонтирование, для того чтобы избежать проблем с безопасностью, которые могли бы возникнуть в том случае, если символическая ссылка target изменена и указывает на другое местоположение.
Теперь мы рассмотрим некоторые усовершенствованные функции, которые можно применять при монтировании файловых систем. Разберем использование большинства из них на примере команды mount(8). Таких же результатов можно добиться, если какая-либо программа осуществит системный вызов mount(2).
14.9.1. Монтирование файловой системы в нескольких точках монтирования
В ядре Linux версий до 2.4 файловую систему можно было монтировать только в одной точке монтирования. Начиная с версии 2.4, файловую систему можно монтировать в нескольких местах внутри файловой системы. Поскольку каждая точка монтирования отображает одно и то же поддерево, изменения, сделанные посредством одной точки монтирования, становятся видны и в остальных, как показано в следующем сеансе работы в оболочке:
$ su
Password:
# mkdir /testfs
# mkdir /demo
# mount /dev/sda12 /testfs
# mount /dev/sda12 /demo
# mount | grep sda12
/dev/sda12 on /testfs type ext3 (rw)
/dev/sda12 on /demo type ext3 (rw)
# touch /testfs/myfile
# ls /demo
lost+found myfile
Из вывода команды ls понятно, что изменение, выполненное посредством первой точки монтирования (/testfs), видно через вторую точку монтирования (/demo).
В подразделе 14.9.4 при описании связанных точек монтирования приводится один пример, демонстрирующий удобство монтирования файловой системы в нескольких точках.
Именно потому, что устройство можно смонтировать в нескольких точках, системный вызов umount() не может принимать имя устройства в качестве аргумента, начиная с версии Linux 2.4.
14.9.2. Создание стека монтирования в одной точке
В версиях ядра до 2.4 точку монтирования можно было использовать только один раз. Начиная с версии ядра 2.4, Linux позволяет создавать стек из нескольких точек монтирования в единичной точке монтирования. При каждом новом монтировании скрывается поддерево каталогов, которое было видимым ранее в данной точке монтирования. При размонтировании точки, размещенной на вершине стека, становится видимой скрытая ранее точка, как показано в следующем сеансе работы в оболочке:
$ su
Password:
# mount /dev/sda12 /testfs
# touch /testfs/myfile
# mount /dev/sda13 /testfs