Монтирование файловых систем
В большинстве традиционных ядер Unix-подобных операционных систем каждая файловая система может быть смонтирована только один раз. Предположим, что файловая система Ext2, хранящаяся на дискете /dev/fdO, монтируется на /Яр при помощи команды:
mount -t ext2 /dev/fdO /flp
Пока эта файловая система не будет размонтирована командой umount, любая попытка монтирования, использующая /dev/fdO, закончится неудачно.
В Linux все не так. Здесь можно многократно монтировать одну и ту же файловую систему. Конечно, если файловая система смонтирована п раз, то к ее корневому каталогу можно обратиться через п точек монтирования, по одной на каждую операцию. Хотя конкретная файловая система доступна через разные точки монтирования, в действительности она уникальна. Таким образом, для них всех существует только один объект-суперблок, независимо от того, сколько раз файловая система была смонтирована.
Смонтированные файловые системы образуют иерархическую структуру: точка монтирования одной файловой системы может быть каталогом другой файловой системы, которая, в свою очередь, смонтирована на третьей, и т. д.
Удивительно, но точка монтирования файловой системы может быть каталогом этой же файловой системы, если она уже была смонтирована. Например:
mount -t ext2 /dev/fdO /flp; touch /flp/foo
mkdir /flp/mnt; mount -t ext2 /dev/fdO /flp/mnt
Теперь к пустому файлу foo, принадлежащему файловой системе с дискеты, можно обращаться и как /flp/foo, и как /flp/mnt/foo.
Кроме того, можно наслаивать” несколько смонтированнных файловых систем на одну точку монтирования. Каждая новая файловая система, смонтированная на этой точке, скрывает предыдущую, хотя процессы, уже использующие файлы и каталоги прежней файловой системы, могут продолжать это делать. Когда самая верхняя файловая система размонтируется, та, что была под ней, снова становится видна.
Нетрудно догадаться, что отслеживание смонтированных файловых систем может быстро превратиться в сплошной кошмар. Для каждой операции монтирования ядро должно хранить в памяти точку монтирования и флаги, а также информацию о том, как соотносится монтируемая файловая система с уже смонтированными. Все эти данные находятся в дескрипторе смонтированной файловой системы, имеющем тип vfsmount. Поля этого дескриптора Структуры vfsmount хранятся в нескольких циклических двунаправленных связных списках:
- хеш-таблица, индексируемая по адресу дескриптора vfsmount родительской файловой системы и адресу объекта элемент каталога” каталога, являющегося точкой монтирования. Эта хеш-таблица хранится в массиве mount hashtabie, размер которого зависит от объема доступной оператив
ной памяти. Каждый элемент таблицы является головой циклического двунаправленного связного списка дескрипторов, имеющих одно и то же хеш-значение. Поле mnt hash дескриптора содержит указатели на соседние элементы этого списка;
- циклический двунаправленный список всех дескрипторов смонтированных файловых систем, принадлежащих конкретному пространству имен (создается для каждого пространства имен). Поле list структуры namespace содержит голову этого списка, а поле mnt iist дескриптора vf smount содержит указатели на соседние элементы списка;
- циклический двунаправленный список всех дочерних смонтированных файловых систем (для каждой смонтированной файловой системы). Голова каждого списка хранится в поле mnt mounts дескриптора смонтированной файловой системы, а поле mnt chiid дескриптора содержит указатели на соседние элементы списка.
Спин-блокировка vfsmnt iock защищает список объектов смонтированных файловых систем от попыток одновременного обращения.
Поле mnt fiags дескриптора содержит значение, образованное флагами, определяющими, как следует обрабатывать некоторые типы файлов в смонтированной файловой системе. Эти флаги, которые, кстати, можно установить с помощью опций команды mount
Приведем несколько функций, обрабатывающих дескрипторы смонтированных файловых систем:
- aiioc vfsmnt (name)— выделяет и инициализирует дескриптор смонтированной файловой системы;
- free vfsmnt (mnt)— освобождает дескриптор смонтированной файловой системы, на который указывает mnt;
- lookup mnt (mnt, dentry) — ищет дескриптор в хеш-таблице и возвращает его адрес.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница