ФЭНДОМ


ВведениеПравить

Перед тем как перейти к чтению следующих глав, вы должны понять философию ОС Inferno, которая базируется на идее "Всё есть файл". Любой ресурс, предоставляемый операционной системой любому приложению является файлом. Мышь - это файл, экран - файл, видеодаптер - опять файл, сетевое соединение - снова файл. Inferno построена из кирпичиков под названием файл и это особенность дает ей ряд приемуществ, включая сетевую прозрачность, цельность, компактность и просту.

В следующих разделах мы рассмотрим три ключевые компонента модели "Всё есть файл".

Протокол StyxПравить

Коммуникационный протокол Styx (P9 в Plan9) - центральная часть операционной системы Inferno. Все без исключения приложения операционной системы получают доступ к файлам (как локальным, так и удаленным) с его помощью.

Протокол Styx является той самой средой, по которой передаются запросы на открытие, чтение и запись файлов. Тот факт, что приложение, пославшее запрос на открытие файла, передает этот запрос в дальнейшем протоколу Styx, и делает возможным перенаправлять приходящие запросы как внутри локальной системы, так и обращаться к удаленным машинам. При этом, для приложения удаленные ресурсы выглядят в точности аналогично локальным.

Файловые серверыПравить

Файловые серверы представляют собой специальные программы, экспортирующие собственные ресурсы (в виде файлов) по протоколу Styx. Любая другая программа или пользователь может обратиться к этим файлам для получения управления над файловым сервером или использования его возможностей. В Inferno файловые серверы везде: это и драйвера, и файловые системы, и оконный интерфейс, и все что угодно. В идеале, любая программа для ОС Inferno, не носящая утилитарный характер, должна быть файловым сервером.

Хороший пример файлового сервера - сервер соединений cs(8), экспортирующий всего один файл - /net/cs. Его задача - преобразовывать символьные имена удаленных машин и сервисов в инструкции для подключения к этим машинам и сервисам. Сервер соединений должен быть запущен в любой копии Inferno, предназначенной для сетевого взаимодействия. Выполните команду ndb/cs, а затем просмотрите список файлов каталога /net:

> ls /net

Вы должны увидеть файл /net/cs в выводе:

/net/cs
/net/ndb
/net/tcp
/net/udp

Теперь выполните команду ndb/csquery и укажите ей какой-либо адрес:

ndb/csquery
> net!$signer!inflogin
/net/tcp/clone 200.1.1.67!6673

Последняя строка - это и есть инструкция на подключение к серверу $signer (которую мы разберем в следующем подразделе).

ДрайвераПравить

Драйвера устройств в Inferno также представляют собой файловые серверы, единственное отличие которых в том, что они работают в режиме ядра. Обычно драйвера экспортируют ресурсы низлежащего оборудования в виде файлов каталога /dev, но это скорее закономерность, чем требование. Например, драйвер сетевого стека ip(3) экспортирует ресурсы в виде файлов каталога /net, обращаясь к которым можно создать или завершить соединение или получать данные от удаленного узла. Поэтому строка:

/net/tcp/clone 200.1.1.67!6673

из предыдущего раздела, это ничто иное как инструкция о том, что нужно сделать с файлами каталога /net для создания нового подключения к серверу 200.1.1.67 ($signer) и порту 6673 (inflogin), а именно: открыть файл /net/tcp/clone и записать в него строку 200.1.1.67!6673.

Все присутствующие в системе драйвера устройств перечислены в 3-й секции man-страниц и каждому из них соответствует специальный индекс, стостоящий из знака # и символа (например #I - это устройство ip, то есть сетевой стек, а #m - устройство-указатель, в большинсве случаев мышь). Индекс нужен для идентификации устройства в системе и подключения его ресурсов (файлов) к существующему файловому дереву.

Пространство имен Править

В отличие от других ОС, Inferno следует идее обособленных пространств имен для каждого процесса и пользователя. Это значит, что структура видной приложениям (а следовательно и пользователям) файловой системы никогда не бывает статической и может изменяться во времени, причем изменения, произведенные одним приложением/пользователем не отражаются на пространстве имен другого приложения/пользователя.

По самой своей сути пространство имен есть ни что иное, как растущее из корня файловое дерево, к каждой ветви (каталогу) которого в любое время можно подключить новый набор каталогов и файлов, экпортируемых (по протоколу Styx) драйверами, файловыми серверами или удаленными машинами.

Важно понимать, что это файловое дерево и есть единственный путь взаимодействия пользователя/приложения с операционной системой Inferno. Оно может (и должно) хранить необходимые пользователю приложения, личные данные пользователей, файлы, предоставлющие доступ к ресурсам ОС, ПК и приложений.

Являясь деревом, пространство имен полностью подчиняется идее постоянного роста. Сразу после старта ОС пространство имен системного пользователя eve имеет лишь корень (так называемый корневой каталог /). Чтобы пользователь смог работать с ОС, ядро (на последнем этапе инициализации) создает так называемое начальное пространство имен.

Для этого к корню файловой системы подключается псевдо-стройство "#/", драйвер которого экспортирует минимально необходимый набор каталогов и утилит командной строки (смотрите root(3)). Далее к корню подключается псевдо-устройство "#U" (fs(3)), в результате чего в пространстве имен появляется содержимое каталога, указанного в переменной $EMUROOT низлежащей ОС. Затем последовательно подключаюся другие псевдо-устройства:

  1. консоль "#c" (cons(3)) к каталогу /dev (файлы cons, keyboard, pointer и другие, все они нужны для того, чтобы пользователь смог взаимодействать с ОС),
  2. виртуальная файловая система "#p" (prog(3)) к /prog (набор специальных каталогов, по одному на каждый процесс, нужны для управления процессами),
  3. TCP/IP-стек "#I" (ip(3)) к /net (каталоги tcp, udp и другие) и
  4. окружение исполнения "#e" (env(3)) к /env (по файлу на каждую переменную окружения).

В результате пространство имен пользователя eve оказывается наполненным всем необходимым для работы с операционной системой в режиме командной строки. Отныне он имеет доступ к приложениям, расположенным в каталоге /dis (их экспортирует драйвер псевдо-устройства "#U"), может работать с командной строкой (драйвер устройства "#c" экспортирует файл keyboard), может запускать и завершать приложения (балгодаря файлам, экспортруемым драйвером "#p"), имеет доступ к сети (драйвер "#I") и может изменять переменные окружения (драйвер "#e").

Далее пользователь может запустить менеджер окон wm/wm, который подключит к каталогу /dev псевдо-устройство "#i", драйвер которого экспортирует каталог draw, необходимый для работы с графикой, и пользуясь его возможностями, создаст графический интерфейс.

// TODO: вставить этот пример:
perky$ cd /tmp; pwd                               expected effect
     /tmp
     perky$ echo 'cd /; pwd' > root
     perky$ sh root; pwd
     /                                                 cd applies to script's shell
     /tmp                                              ...but not to toplevel shell

Приведенная последовательность может быть несколько иной в завивсимости от типа низлежащей ОС или факта запуска ОС на голом железе. В любом случае, последовательность команд, нужная для формирования этого пространства имен будет выглядеть так:

bind '#/' /
bind -ac '#U' /
bind -b '#c' /dev
bind '#p' /prog
bind -a '#I' /net
bind -c '#e' /env

Обычно команда bind используется для подключения содержимого уже существующего в текущем пространстве имен каталога к другому каталогу (например, вы можете создать каталог /dev2 и выполнить команду "bind /dev /dev2", которая создаст копию (а точнее зеркальное отражение) файлов каталога /dev в каталоге /dev2). Но bind также применяется для подключения файлов, экспортируемых драйверами устройств.

// TODO

bind source target

    source covers target;   a reference to target subsequently finds source. Roughly similar
    to a symbolic link.

bind -a source target

    source and target form  a union directory; a reference to target subsequently finds both
    directories, where the content of source appears after that of target.

bind -b source target

    source and target form  a union directory; a reference to target subsequently finds both
    directories, where the content of source appears before that of target.

-c additionally permits creation of files in the union directory. A new file name is entered into the first directory within a union where creation is possible.

// TODO

// TODO Mount introduces an external file tree into the namespace, just as it does on unix systems. The file tree is accessed by talking the styx protocol over a file descriptor. The kernel takes care of the styx-part by translating open/read/write/stat/etc system calls into styx messages (the messages are described in section 5 of the manual pages), and the response messages into return values. The mount system call expects a file descriptor to talk styx over. The mount program has convenient syntax for mounting three types of styx servers:

mount /path/to/styx/file target, gets file descriptor by opening /path/to/styx/file

mount {program} target, starts program and uses its stdin as file descriptor

Причина использования команды bind для подключения файлов, экспортируемых драйверами устройств, кроется в том, что согласно внутренним механизмам работы Inferno, эти файлы уже существуют в пространстве имен (они появляются во время инициализации драйвера), но до фактического вызова bind к ним невозможно получить доступ. Именно для этого были придуманы инексы.
Вы можете убедится в этом просмотрев листинг файлов, экпортируемых любым из описанных выше драйверов устройств:
// TODO: разобрать это все
perky$ ls -q '#/'                                   root, inplicitly bound to /
      80000004.00000000     #/chan
      80000001.00000000     #/dev
      80000003.00000000     #/net
      80000005.00000000     #/nvfs
      80000002.00000000     #/prog

      perky$ ls -q '#A'                                   audio, sound input and output
      00000001.00000000 #A/audio                          bound to /dev
      00000002.00000000 #A/audioctl

      perky$ ls -q '#C/cmd'                               host commands
      80000004.00000000 #C/cmd/0                          bound to /
      00000003.00000000 #C/cmd/clone

      perky$ ls -q '#D'                                   SSL, filter for sockets
      00000002.00000000 #D/clone                          bound to /0/ssl etc.

      perky$ ls -q '#I'     '#I/tcp' '#I/udp'             IP, internet connections
      80010002.00000000     #I/tcp                        bound to /net
      80000002.00000000     #I/udp
      00010003.00000000     #I/tcp/clone
      00000003.00000000     #I/udp/clone

      perky$ ls -dq '#U'                                  host file system
      81000002.336c9483 #U                                bound to /

      perky$ ls -q '#c'                                   console etc., bound to /dev
      00000001.00000000     #c/cons                       console, input and output
      00000002.00000000     #c/consctl                    console, state
      00000003.00000000     #c/keyboard                   keyboard, uninterpreted
      00000004.00000000     #c/memory                     memory allocation state
      00000005.00000000     #c/null                       the void
      00000006.00000000     #c/pin                        PIN, can be written once
      00000007.00000000     #c/pointer                    mouse, position and buttons
      00000008.00000000     #c/random                     random characters
      00000009.00000000     #c/sysname                    host name (shell prompt)
      0000000b.00000000     #c/time                       microseconds since the epoch
      0000000a.00000000     #c/user                       user's name

Вы можете увидеть последовательность команд, которые были выполнены для создания текущего пространства имен, запустив следующую команду:

ns

Настройка сетевой карты Править

Для наглядной демонстрации того, как используются пространства имен и файловые серверы в повседневной работе с Inferno, рассмотрим пример настройки сетевой карты (если вы используете гостевой вариант Inferno, этого делать не потребуется, так Inferno будет использовать сетевой стек низлежащей ОС):

1. Подключаем устройство #I или #I0 к каталогу /net:

bind -a '#I0' /net

2. Получаем новый сетевой интерфейс:

cat /net/ipifc/clone

3. Устанавливаем связь между сетевой картой и интерфейсом:

echo -n 'bind ether ether0' > /net/ipifc/0/ctl

4. Задаем интерфейсу IP адрес и маску сети:

echo -n 'add 192.168.0.2 255.255.255.0' > /net/ipifc/0/ctl

5. Добавляем запись в таблицу маршрутизации и прописываем маршрут по-умолчанию

echo -n 'add 0.0.0.0 0.0.0.0 192.168.0.1' > /net/iproute

Все эти команды необязательно выполнять при каждом запуске ОС, в разделе Настройка будет приведен пример перманентной настройки сети, которая будет осуществляться в автоматическом режиме при каждом запуске ОС.

Сетвое взаимодействиеПравить

An existing namespace can be exported with styxlisten. Use it as in the following example:

styxlisten 'tcp!*!styx' export / This will listen for tcp connections on the port "styx" (which is defined in /lib/ndb/common to be 6666). All connections will be served by a single invocation of export / (styxlisten expects the program to serve the styx protocol on its file descriptor 0). The program "export" simply exports the namespace starting at the parameter it is passed, the root of the file system in this case. These simple programs (they are just over 300 lines combined!) give a lot of power. Just as with mount, option -A disables authentication on the connection.

mount net!www.example.org!styx target, gets file descriptor by dialing net!www.example.org!styx

Обнаружено использование расширения AdBlock.


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

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на ФЭНДОМЕ

Случайная вики