Монтирование и демонтирование файловой системы Unix/Linux

Файловое дерево формируется из отдельных частей, называемых файловыми системами, каждая из которых содержит корневой каталог и список его подкаталогов и файлов. Термин "файловая система" имеет, по сути, два значения. С одной стороны, это составная часть файлового дерева, а с другой — все файловое дерево и алгоритмы, с помощью которых ядро управляет им. Как правило, значение термина становится ясным из контекста.

Большинство файловых систем представляет собой разделы диска или логические тома с памятью на дисках, но, как уже было сказано, файловая система может принять облик всего, что подчиняется определенным функциональным правилам, — сетевых файловых систем, компонентов ядра, резидентных дисков и т.д. В Linux и Solaris есть даже оригинальная файловая система, позволяющая монтировать отдельные файлы, как если бы они были физическими устройствами. Это очень удобно для разработки образов файловых систем, поскольку отпадает необходимость в перераспределении дисковой памяти.

В большинстве случаев файловые системы присоединяются к файловому дереву с помощью команды mount. (Мы говорим "в большинстве случаев", поскольку в файловой системе ZFS (в Solaris) принят несколько другой подход к монтированию и демонтированию, не говоря уже о других аспектах администрирования файловых систем. Возможно, читатели ожидали придирчивых комментариев относительно непозволительной несовместимости в этой части систем, но структура ZFS представляет собой значительное усовершенствование, и мы с нетерпением ожидаем того дня, когда оно будет взято на вооружение другими системами. Между тем мы считаем своим долгом описывать файловую систему ZFS несколько обособленно.) Эта команда связывает каталог существующего файлового дерева, называемый точкой монтирования, с корневым каталогом новой файловой системы. На время монтирования доступ к прежнему содержимому точки монтирования становится невозможным. Впрочем, в большинстве случаев точка монтирования — это пустой каталог.

Например, команда $ sudo mount /dev/sda4 /users

монтирует на устройстве /dev/hda4 файловую систему /users. По окончании монтирования можно с помощью команды ls /users просмотреть содержимое файловой системы. Список смонтированных пользователями файловых систем хранится в файле /etc/ fstab, /etc/vfstab (Solaris) или /etc/filesystems (AIX). Благодаря этому возможны автоматическая проверка (с помощью команды fsck) и монтирование (с помощью команды mount) файловых систем на этапе начальной загрузки, а также выполнение коротких команд наподобие mount /usr (точное местонахождение монтируемой файловой системы ищется в файле /etc/fstab). Информация, содержащаяся в этом файле, служит документацией к схеме расположения файловых систем на диске.

Файловые системы демонтируются командой umount. "Занятую" файловую систему демонтировать невозможно. В ней не должно быть ни открытых файлов, ни выполняющихся процессов с их текущими каталогами. Если демонтируемая файловая система содержит исполняемые программы, они не должны быть запущены.

В системе Linux предусмотрена возможность "ленивого" демонтирования (с помощью команды umount -1), которая удаляет файловую систему из иерархии имен, но в действительности не демонтирует ее до тех пор, пока все существующие файловые ссылки не будут закрыты. Полезность этой опции достаточно спорна. Во-первых, нет никакой гарантии, что существующие ссылки когда-либо будут закрыты сами по себе, кроме того, "наполовину демонтированное" состояние файловой системы может нарушать семантическую целостность для использующих ее программ. Они могут выполнять операции чтения и записи с существующими дескрипторами файлов, но не могут открывать новые файлы или выполнять какие-либо другие операции файловой системы.

Команда umount -f предназначена для "насильственного" демонтирования занятой файловой системы и поддерживается во всех рассмотренных нами системах. Однако не стоит использовать ее в системах, не использующих NFS. Кроме того, она может не применяться к определенным типам файловых систем (например, для таких, как системы ext3 или ext4, которые ведут системные журналы).

Вместо использования команды umount -f, когда оказывается, что файловая система, которую вы пытаетесь демонтировать, занята, запустите команду fuser, чтобы узнать, какие процессы работают с файловой системой. Команда fuser -с точка монтирования выводит идентификаторы всех процессов, обращающихся к файлам или каталогам указанной файловой системы, а также ряд буквенных кодов, которые отображают природу этой активности.

$    fuser -с /usr

/usr:    157tm   315ctom   474tom   5049tom   84tm   496ctom   490tm 16938c    16902ctm   358ctom   484tm

Буквенные коды зависят от конкретной системы

Для того чтобы в точности определить, что собой представляют эти процессы, вызовите команду ps, передав ей список идентификаторов, о которых сообщила команда fuser.

$ ps -fp "157 315 5049"

UID  PID PPID С  STIME TTY TIME CMD root 5049 490 0 Oct 14 ? 0:00 /usr/bin/Xll/xdm root 157   1 0 Jun 27 ? 5:26 /usr/sbin/named lp 315   1 0 Jun 27 ? 0:00 /usr/lib/lpsched

Список идентификаторов взят в кавычки, чтобы интерпретатор передал его команде ps как один аргумент.

В системах Linux можно избежать необходимости задания идентификаторов (PID) в команде ps, выполнив команду fuser с флагом -v. Этот вариант команды генерирует более читабельный результат, который включает имя команды. $ fuser -cv /usr

USER     PID         ACCESS                COMMAND

/usr      root           444  ....m atd

root        499         … ..m        sshd

root        520  ....m lpd

Буквенные коды в столбце ACCESS такие же, как в результате выполнения команды fuser -с.

Более удачной альтернативой команде fuser является утилита lsof. Утилита lsof — более сложная программа, чем fuser, и, соответственно, результаты ее работы более содержательны. Она доступна на сайте people. f reebsd. org/~abe и работает во всех наших примерах систем.

В системном сценарии, предназначенном для поиска конкретной информации об использовании файловых систем процессами, располагают возможностью непосредственного чтения файлов, хранящихся в каталоге /ргос. Однако команда lsof -F, форматирующая вывод команды lsof для облегчения синтаксического анализа, — более простое и переносимое решение: Для запроса только той информации, которая действительно необходима, следует использовать дополнительные флаги командной строки.

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.