Hurd-транслятор
Транслятор — любой сервер, работающий в ОС Hurd, который предоставляет базовый интерфейс файловой системы. ОС Hurd позволяет установить транслятор на любой файл или каталог, на доступ к которым у пользователя, устанавливающего транслятор, есть права доступа. Транслируемые объекты файловой системы — инод представляют собой нечто среднее между символьными ссылками и точками монтирования, которые известны в Unix-подобных операционных системах.
Обзор обычной файловой системы в Unix-подобной ОС
До того как пытаться разобраться в том, что такое транслятор, необходимо познакомиться с тем, что из себя представляет обычная файловая система (ФС). Файловая система это набор построенных иерархически каталогов и файлов.
Для получения доступа к любому файлу используется текстовая строка, которая есть ни что иное как путь к файлу. Далее, существует технология создания и использования символьных ссылок, которые позволяют через себя обращаться к единственному файлу из каталогов, расположенных в разных местах в иерархическом дереве каталогов, также есть возможность создания жёстких ссылок, которые позволяют назначить единственному файлу сразу несколько имён. Также существуют специальные файлы устройств для обеспечения обмена данными с драйверами устройств, расположенными в ядре системы, и также есть каталоги, которые служат в качестве точек монтирования для разделов жёстких дисков и других устройств хранения данных. И ещё существуют файлы принадлежащие к типу FIFO.
Несмотря на то, что эти объекты различаются между собой, у них всех есть общие свойства, например, у них всех есть владелец и группа, с которыми они ассоциированы, так же как и соответствующие права доступа (permissions). Вся эта информация хранится в специальном файле, обозначаемом термином — инод (inode). Это общее свойство объектов файловой системы: Каждый объект имеет один инод, связанный с ним, (жёсткие ссылки в этом отношении необычны, потому что у набора жёстких ссылок, связанных с файлом, один и тот же инод на всех). Иногда инод содержит дополнительные записи. Например, инод может содержать путь к файлу, на который указывает символьная ссылка.
Однако, эти общие свойства обычно не используются на прямую в программах из-за того, что для этого существуют абстрагированные программные интерфейсы. К любому иноду может быть получен доступ посредством вызова POSIX-функций, например функций read() и write(). Например, чтобы добавить поддержку новых типов объектов в ФС (например, новый тип ссылок) в обычное монолитное ядро unix, придётся переписать исходные коды по отдельности для каждого типа используемых файловых систем.
В системе Hurd всё иначе. Хотя в системе Hurd специальный сервер файловой системы может работать со специальными свойствами объектов стандартных типов, например, ссылками (с «быстрыми ссылками» (fast links) в файловой системе ext2, например), ядро системы Hurd имеет обобщённый интерфейс, который позволяет добавлять новые возможности в систему, не прибегая для этого к модифицированию исходных текстов системы.
Трюк состоит в том, чтобы поместить транслирующую программу между действительным содержимым транслируемого файла и пользовательской программой и соответственно пользователем, который получает доступ к этому файлу. Такая транслирующая программа называется транслятором, потому что она способна обрабатывать поступающие запросы различными способами. Другими словами, транслятор это сервер, работающий в системе Hurd, который предоставляет базовый интерфейс файловой системы.
Трансляторы обладают интересными свойствами. С точки зрения ядра, они всего лишь пользовательские процессы. Это означает, что трансляторы могут запускаться любым пользователем. Пользователю не нужны привилегии суперпользователя для установки или модификации транслятора, всё что требуется — это права доступа к иноду (файлу), который транслируется. Многие трансляторы не требуют файлов для трансляции и работы, они могут предоставлять информацию, сформированную ими самими. Вот почему информация о трансляторах хранится в инодах.
Трансляторы должны участвовать во всех операциях файловой системы, которые затрагивают иноды, которые они транслируют. Из-за того, что они не ограничены перечнем обычных объектов ФС (файлы устройств, ссылки и т. п.), они могут возвращать в качестве результатов своей работы данные, которые разработчик считает необходимым. Можно представить себе транслятор, который работает как каталог при доступе к нему командами ls или cd, и в то же время работает как файл при обращении к нему командой cat.
Примеры
Точки монтирования
Точку монтирования можно рассматривать как некий инод, транслируемый специальным сервером. Его назначение — транслировать операции файловой системы в точку монтирования, принадлежащую другой файловой системе, скажем, на другой раздел диска.
В действительности, именно так реализована файловая система в ОС Hurd. Файловая система это транслятор. Этот транслятор принимает некое устройство хранения данных в качестве аргумента и способен обслуживать операции с файловой системой полностью прозрачно.
Файлы устройств
Существует множество различных файлов устройств, и в системах с монолитным ядром все они работают благодаря поддержке ядра. В системе Hurd все файлы устройств поддерживаются трансляторами. Один и тот же транслятор может поддерживать множество похожих файлов устройств, например, все разделы диска. Таким образом, количество необходимых трансляторов достаточно невелико. Однако заметьте, что для доступа к каждому файлу устройства запускается отдельная задача транслятора. Но из-за того, что Hurd — по-настоящему многозадачная система, это не требует больших накладных расходов.
Когда необходим доступ к аппаратной части компьютера, транслятор обычно начинает общаться с ядром, чтобы получить данные из устройств. Однако если доступ к аппаратным устройствам не требуется, нет и необходимости обращаться к ядру системы. Например, устройство /dev/zero не требует доступа к аппаратной части и может быть полностью реализовано в пространстве исполнения пользовательских программ.
Символьные ссылки
Символьная ссылка также может рассматриваться как транслятор. Попытка доступа к символьной ссылке инициирует запуск соответствующего транслятора, который передаст поступающие запросы на файловую систему, которая содержит файл, на который эта ссылка указывает.
Однако ради лучшей производительности файловые системы имеющие собственную поддержку символьных ссылок могут использовать эту свою функцию, чтобы реализовать механизм ссылок по-другому, внутри себя, и таким образом доступ по символьной ссылке не будет приводить к запуску отдельного процесса транслятора. Однако для пользователя это будет по-прежнему выглядеть как вызов пассивного транслятора (см. далее объяснение того, что такое пассивный транслятор).
Система Hurd несёт с собой транслятор симлинков, и это значит, что любой сервер для работы с различными типами файловых систем (ext2 и т. п.), имеющий поддержку работы через трансляторы, автоматически получает возможность работы с симлинками (и firmlinks, и файлами устройств и т. п.). Это означает, что вы можете быстро получить доступ к файлам, а добавить поддержку симлинков и другие возможности посредством самого сервера попозже.
Пассивные трансляторы, активные трансляторы
Есть два типа трансляторов: пассивные и активные. Это действительно два различных вида трансляторов, так что не желательно путать их друг с другом, но эти два типа программ взаимодействуют.
Активные трансляторы
Активный транслятор это выполняющийся процесс транслятора, как это рассказано выше. Можно установить или убрать активный транслятор с помощью команды settrans -a. Ключ -a необходим, чтобы сообщить программе settrans о том, что требуется модификация активного транслятора.
Команда settrans может принимать три типа аргументов. Первое, можно установить опции для самой команды settrans, например как ключ -a для того, чтобы модифицировать активный транслятор. Затем нужно указать инод, который нужно модифицировать. Запомните, что транслятор всегда ассоциирован с инодом, расположенном в дереве каталогов и файлов. Можно модифицировать только один инод за раз. Если программе settrans больше не посылается дополнительных аргументов, то она попытается удалить существующий транслятор. Насколько осторожно она будет удалять транслятор, зависит от указанной опции форсированного удаления (если транслятор используется каким-то процессом, то будет сообщение об ошибке «device or resource busy», если только транслятор не будет выгружен с помощью грубой силы).
Но если будут указаны дополнительные аргументы, то они будут интерпретированы как командная строка для запуска транслятора. Это значит, что следующий аргумент это имя исполняемого транслятора. Все последующие аргументы это опции для самого транслятора, а не для команды settrans.
Для примера, чтобы смонтировать раздел в формате ext2fs, можно выполнить команду settrans -a -c /mnt /hurd/ext2fs /dev/hd2s5. Опция -c создаст новую точку монтирования, если она не существовала до этого. Кстати, точка монтирования не обязательно должна быть каталогом. Для того, чтобы отмонтировать это обратно, нужно выполнить команду settrans -a /mnt.
Пассивные трансляторы
Пассивный транслятор устанавливается и модифицируется с тем же синтаксисом, что и активный транслятор (но без ключа -a), то есть всё сказанное выше относиться в полной мере и к пассивным трансляторам. Однако есть различия: пассивные трансляторы не запускаются сразу.
Это имеет смысл, потому что это как раз то, что обычно и требуется. Не требуется монтирования раздела диска, если только не происходит действительного обращения к файлам на этом разделе. Не требуется активация сетевого интерфейса и сети, если только не происходит обмен данными по каналам связи, и так далее.
Вместо этого, когда происходит вызов пассивного транслятора, он автоматически считывается из инода и запускается как активный транслятор и при этом используются команды из командной строки, которая хранилась в иноде. Это похоже на то, как устроен и работает Linux automounter. Однако это не некий дополнительный бонус, который вы сами должны установить, но интегральная часть системы. Так что установка пассивного транслятора откладывает запуск и исполнение транслятора до того момента, когда он действительно будет нужен. Кроме этого, если активный транслятор, запущенный через пассивный транслятор умрёт по каким-то причинам, при следующем же доступе к соответствующему иноду транслятор снова будет запущен.
Есть ещё больше различий: активный транслятор может умереть или потеряться. Как только выполняемый процесс активного транслятора убит (для примера, из-за того что был перезагружен компьютер), он будет невозвратимо утрачен. Пассивные же трансляторы не выгружаемы и сохраняются в иноде во время перезагрузки ровно до тех пор, пока их не модифицируют с помощью программы settrans или пока не удалят инод, к которому они прикреплены. Это значит, что нет необходимости иметь в системе конфигурационный файл с данными о точках монтирования.
И ещё одно: Если уже есть установленный пассивный транслятор, всё равно можно установить другой активный транслятор. Только если транслятор был запущен автоматически и при этом не существовало уже запущенного процесса активного транслятора когда произошла попытка доступа к иноду, только в этом случае вызывается пассивный транслятор.
Управление трансляторами
Как рассказано ранее, можно использовать команду settrans для установки пассивных и активных трансляторов. Есть много опций для изменения поведения команды settrans в случае, если что-то пойдёт не так, и для определения её действий. Вот примеры обычного использования этой команды:
- settrans -c /mnt /hurd/ext2fs /dev/hd2s5
Монтирует раздел диска, транслятор сохраниться после перезагрузки.
- settrans -a /mnt /hurd/ext2fs ~/dummy.fs
Монтирует файловую систему внутрь файла данных, транслятор исчезнет, если он умрёт или после перезагрузки компьютера.
- settrans -fg /nfs-data
Заставляет транслятор отключиться.
Можно также воспользоваться командой showtrans, чтобы просмотреть данные о том, прикреплён транслятор к некому иноду или нет. Однако эта команда выведет данные лишь о пассивных трансляторах.
Также можно изменить опции режима работы активного (файловая система) транслятора с помощью команды fsysopts, не перегружая для этого транслятор. Это очень удобно. Например, можно сделать то, что в Linux называется «remounting a partition read-only», просто вызвав команду fsysopts /mntpoint --readonly. Если он сможет, работающий активный транслятор изменит своё поведение в соответствии с полученным запросом. Команда fsysopts /mntpoint, вызванная без параметров, показывает текущие установки.
Ссылки
- www.debian.org (англ.)