Архитектура OS Inferno — 2

    Один из краеугольных камней архитектуры Inferno — юниксовая идея с файлами-устройствами доведена до предела: в Inferno файлами представлено абсолютно всё. Например, в Inferno нет понятия «сокет».

    Файлы


    В Inferno файлами представлены не только устройства (аналог /dev/) и процессы (аналог /proc/), но и такие вещи как DNS resolver, сокеты и переменные окружения (environment) (список не полный :)).

    Например, для того, чтобы открыть tcp-соединение на сайт www.habrahabr.ru, нужно проделать следующие операции:
    • открыть файл /net/cs
    • записать в него строку 'tcp!www.habrahabr.ru!http'
    • считать из него ответ (это будет строка '/net/tcp/clone 217.147.30.151!80')
    • открыть файл /net/tcp/clone
    • считать из него число (идентификатор этого соединения, далее ID), при этом в каталоге /net/tcp/ автоматически появится новый подкаталог /net/tcp/ID/ с файлами ctl, data, status, etc.
    • записать в файл /net/tcp/ID/ctl строку 'connect 217.147.30.151!80'
    • читать/писать файл /net/tcp/ID/data

    Пояснения к примерам. Примеры для краткости приведены на sh, а не Limbo.
    • ; — приглашение sh.
    • >[1=0] — перенаправление STDOUT на STDIN.
    • <>/path — открытие STDIN на чтение+запись в /path.
    • read — читает из STDIN и выводит на STDOUT заданное кол-во байт.
    • `{...} — это выполнить команду и вернуть её вывод.

    ; { echo -n 'tcp!www.habrahabr.net!http' >[1=0]; read -o 0 8192; } <>/net/cs
    /net/tcp/clone 209.85.84.157!80
    
    ; { id=`{read}
        echo 'connect 209.85.84.157!80' >/net/tcp/$id/ctl
        echo 'HEAD / HTTP/1.0'          >/net/tcp/$id/data
        echo 'Host: www.habrahabr.ru'   >/net/tcp/$id/data
        echo                            >/net/tcp/$id/data
        read                            </net/tcp/$id/data
      } <>/net/tcp/clone
    HTTP/1.1 200 OK
    Date: Sun, 27 May 2007 11:33:42 GMT
    Server: Apache/2.0.52 (Red Hat)
    X-Powered-By: PHP/5.1.4
    Set-Cookie: vsid=3X02X521137108; expires=Fri, 25-May-2012 11:33:43 GMT; path=/
    Connection: close
    Content-Type: text/html; charset=UTF-8
    

    С переменными окружения работа идёт аналогично — есть каталог /env/, файлы в котором это имена переменных, а содержимое файлов — значения переменных. Соответственно создание/удаление файла это создание/удаление переменной окружения.

    Для доступа к информации по процессам используется каталог /prog/. Причём абсолютно все операции выполняются через его подкаталоги и файлы — в том числе отладка (т.е. не нужен сискол POSIX ptrace) и получение информации о статусе процесса (т.е. не нужны сисколы wait/waitpid).

    Работа всех этих виртуальных файлов обеспечивается разными средствами — например /net/tcp/ и /env/ реализованы через драйвера Inferno, а DNS ресолвер /net/cs реализован обычным приложением.

    Такой подход позволил упростить множество вещей:
    • для работы с сетью достаточно обычного файлового API, отдельные функции POSIX (socket, connect, bind, listen, etc.) стали не нужны
    • аналогично, нет специального API для работы с переменными окружения (clearenv, putenv, setenv, getenv, etc.)
    • поскольку протокол Styx позволяет расшаривать файлы по сети, то можно делать, например, следующие трюки:
      • если машина в локальной сети, не имеющая реального IP-адреса, подмонтирует себе каталог /net/ шлюза в инет, то она получит прямой выход в инет без необходимости настраивать на шлюзе штуки типа NAT или маскарада
      • если на удалённый сервер подмонтировать по сети файлы /dev/cons, /dev/keyboard и /dev/pointer с рабочей станции, то на сервере можно будет запускать графические приложения которые будут управляться с терминала рабочей станции — и всё это без специального протокола а-ля X-Window!.. плюс получаем встроенную (в Styx) авторизацию, аутентификацию и шифрование
      • если на локальную машину подмонтировать каталог /prog/ (аналог /proc/) с удалённого сервера, то можно будет локальным отладчиком отлаживать процессы выполняющиеся на удалённой машине — и отладчик об этом даже знать не будет, потому что он просто работает через файлы в /prog/

    Но, с моей точки зрения, гораздо важнее не то, что отпала необходимость в куче сисколов, а то, что «объектов» особенности поведения которых необходимо знать для качественного программирования стало намного меньше! К примеру, в юниксах у файлов одни особенности, у специальных файлов (юникс-сокеты, пайпы, некоторые устройства) другие, а у сокетов третьи — а в Inferno всё это одинаковые файлы с одинаковым поведением.

    Распределённые вычисления


    «Правильная» программа в Inferno должна писаться не в стиле традиционных юниксовых утилит (читаем STDIN, пишем STDOUT), а в стиле файлового сервера Styx. Иными словами входом/выходом у такой утилиты должен быть не STDIN/STDOUT, а виртуальный файл или каталог с файлами а-ля /net/cs или /net/tcp/.

    Это позволит очень легко строить распределённые системы. Например, предположим в нашем проекте есть модуль который что-то считает. Он реализован в виде отдельного процесса, который экспортирует файл ./calc, в который можно писать задания и считывать из него результат. Если возникает потребность ускорить вычисления перенеся эту подзадачу на отдельный, более мощный сервер, то достаточно двух шагов: запустить этот модуль на другом сервере; подмонтировать файл ./calc с этого сервера. И всё — остальная часть проекта даже не заметит что этот модуль выполняется на другом сервере!

    Namespaces


    Пространства имён (namespace) в Inferno аналогичны тем, которые используются во многих языках программирования… только в Inferno они применяются к файлам и каталогам.

    Фактически привилегии и возможности программы под Inferno ограничены тем, к каким файлам (ибо любой ресурс = файл) она имеет доступ. Манипулируя namespace можно для каждого приложения создать свою, изолированную (а-ля chroot) среду, со своими устройствами в /dev/ (как выше в примере с удалённым терминалом), со своими сетевыми картами в /net/ (как выше в примере с NAT), etc.

    К примеру, в винде есть такая фича — вы логинитесь с любого компа в сети и получаете СВОЙ рабочий стол и СВОЙ каталог «мои документы». В Inferno вы, залогинившись с любого терминала и имея доступ к своим ключам/сертификатам можете манипулируя namespace создать 100% ту же самую среду, которую вы имеете на своём основном компе. И для реализации этого никаких специальных «фич» в Inferno нет — обычные команды mount, bind и протокол Styx.

    Возможно всё это звучит не очень принципиально, но принцип работы с приложениями кардинально изменяется — обычно мы пытаемся добиться того, чтобы приложение работало в самых разных условиях (что значительно его усложняет), а в Inferno мы для каждого приложения с помощью namespace, команд mount и bind создаём именно ту среду, на которую расчитано это приложение.
    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 42

      0
      А кто автор? Если ты сам написал, то респект! :)
        +2
        К сожалению, по Inferno очень мало информации, даже на английском. Так что приходится всё самому писать. Надеюсь, все понимают что это не официальная документация и что я наверняка где-то что-то недопонял, что-то некорректно описал, etc. Воспринимайте эти статьи просто как наблюдения новичка, ковыряющего несколько месяцев систему.

        Естественно, если кто-то будет сообщать о неточностях - я буду только рад их обсудить и поправить статьи!
          0
          Кхм. Извините. А можно опубликовать этот текст на своём сайте? Разумеется с указанием ссылки на вас и на оригинал, приведёный здесь.
            +1
            Безусловно можно. Я бы даже сказал - нужно. Нести свет Inferno в массы это душеполезное занятие. :)
            0
            В таком случае вы молодец! :)
              0
              Очень интересно было бы узнать какие системные требования нужны ОС Inferno и на каком железе она работает.
                0
                На официальном сайте всё написано. Если коротко - то работает на всём. Она разрабатывалась для работы на всём изначально - так ставилась задача. Поэтому требования у неё смешные - 1 MB RAM. :) На диске в минимальной версии (для запуска вашего приложения) под линухом весит примерно 1.1MB (1 мегабайт 100 килобайт). Разрабатывается она на довольно старом железе из, насколько я понимаю, в основном идеологических соображений. Т.е. на любом современном железе она просто летает.
            0
            Звучит очень многообещающе и красиво. Спасибо за интересное повествование интересной информации.
            Надо будет как-нибудь поглазеть хотя бы что это за зверь :)
              +1
              "Иными словами входом/выходом у такой утилиты должен быть на STDIN/STDOUT, а виртуальный файл или каталог с файлами а-ля /net/cs или /net/tcp/. "

              наверное так:

              "Иными словами входом/выходом у такой утилиты должен быть НЕ на STDIN/STDOUT, а виртуальный файл или каталог с файлами а-ля /net/cs или /net/tcp/."
              ?
                0
                Oops, спасибо, исправил!
                +1
                Конкретно в этом аспекте организации вычислений inferno полностью повторяет Plan9, документацию на которую можно раздобыть тут http://plan9.bell-labs.com/ . Можно почитать об идеологии и о том, как всё работает. Это я к тому, что документации мало.
                  0
                  А антивирусы для Inferno уже есть ? А firewall ? А Winrar ?
                    0
                    Нда... жизнь без антивируса - это уже почти фантастика. Нет, нету там антивируса. И, надеюсь, никогда не будет. Ибо он там просто не нужен.

                    Файрвола тоже нет. А зачем? Как в Inferno делается NAT я уже описал. :) Как закрывается приложению доступ в сеть? Да просто запускаете его в namespace где нет каталога /net и все дела. Трафик считать? Я видел в каталоге /net/ файлы stats и status - не знаю что там, но подозреваю что она, статистика.

                    Что касается winrar, то это, безусловно, упущение. Но оно легко преодолевается через вызов команд host OS - когда нужно будет из проги под Inferno распаковать rar-архив вы просто прямо из этой проги вызовете winrar. :)
                      –4
                      Что же это за ОС дремучая, в которой нет антивируса. Вот когда Касперский выйдет, тогда поставлю посмотреть.

                      Ну хоть LineAge работает под нее ?
                        0
                        Вы законченный юзер ;)
                          0

                          Ну хоть LineAge работает под нее ?

                          Если перепишите на Limbo то легко :)
                            0
                            Логично предположить, что под эту ОС пока не написано вирусов ;)
                              0
                              Дамс, уважаемый, вы не на тот сайт зашли
                                0
                                А Вы - диггер (топик за май) и без чувства юмора.
                            0
                            По-моему RAR — это зло. То есть, он конечно в определённый момент был полезен, но сейчас ещё один закрытый формат архивов никому пользы не приносит.

                            Или кому-то приносит? Поправьте меня...
                              0
                              Какая вам разница закрытый формат архиватора или нет? Альтернативы, столь же удобной и всеплатформенной, я не вижу :)
                                0
                                Есть 7z - удобный, всеплатформенный, да еще и очень настраиваемый в плане алгоритма сжатия. Чем на альтернатива?
                                  0
                                  Привожу реальный пример, есть в природе сервер с которого некоторое время назад файлы качались с добавлением в начало файла html текста. WinRAR`у на подобные фокусы наплевать, он ищет свой заголовочек и работает после него. А вот 7z не принимал архив без удаления лишнего.

                                  Я не помню, есть ли в 7z возможность добавлять информацию для восстановления и резервные тома на случай повреждения/утери одного из основных томов?
                                    0
                                    Возможно, что и нет. Хотя думаю, большинство пользователей rar эту специфику не то, что не используют, но даже и не знают о ней.
                                      0
                                      Вы про пропуск левого заголовка? Да, я до момента когда столкнулся с такой проблемой в 7z тоже не задумывался о том как работает RAR. Он просто распаковывал мне всё что нужно.

                                      Или про резервирование? Резервирование очень полезно в случаях пересылки по ненадёжным каналам и хранении файлов на разных бесплатных серверах. Скажем если порезать фильм на 7-8 кусков + парочку запасных оставить себе то при пропадании любых двух частей основного архива вы сможете докачать резервные куски, что позволяет увеличить время жизни фильма и снизит расход вашего НЖМД.
                                        0
                                        Пропуск левого заголовка, на мой взгляд, - это своего рода костыль для систем, не умеющих нормально отдавать файлы, не более того.
                                        А резервирование может быть полезно, тут я не спорю, хотя и потребности острой никогда не возникало - видимо просто редко пользуюсь бесплатными серверами и ненадежными каналами.
                                          +1
                                          p.s. Предлагаю закруглить оффточную для блога (и поста) тему. Все же об OS Inferno речь, а не о rar.
                                  +1
                                  Закрытый — значит с ним не могут нормально работать все приложения, которым это нужно, а архиваторы может писать только один человек. Меня zip всем устраивает и по всеплатформенности rar с ним вообще сравнивать смешно. Кстати открытость привела к тому, что его используют для упаковки .jar, .pk3/.pk4, .egg, Open Document и много ещё чего.
                                    0
                                    Сравните степень сжатия RAR и ZIP
                                      +1
                                      Ну да, хреновая степень сжатия, но это часто не принципиально, а если что, bzip2 его и готово. В принципе наверно когда у тебя только windows, то использование rar более-менее оправдано, но мне приходится постоянно работать и с mac и с linux, поэтому rar кажется слегка маргинальной технологией. Да и вообще, закрытые форматы — это уже не модно :)
                                    0
                                    .tar.bz2
                                0
                                Я где-то года полтора назад колупался с этой осью - но к моему позору так и не разобрался, да подходящих проблем небыло. Теперь вот еще раз посмотрю.
                                  0
                                  Правильно ли я понимаю, что Inferno представляет собой развитие идей Plan9 в несколько более современном варианте?
                                    0
                                    На мой взгляд, Inferno - развитие Plan9 в сторону идей виртуальных машин и переносимости/встраиваемости системы.
                                    0
                                    К автору просьба - чуток написать про применения инферно. Я ей интересовался на самом раннем этапе, насколько я понял из англоязычной литература - она позиционируется не как десктоп-система, а как как втроенная ОС для промышленности.
                                      0
                                      Применение выглядит примерно так: ставите Inferno на все близлежащие рабочие станции, сервера, встроенные девайсы... и получаете единую среду, возможность доступа по сети к любым ресурсами всех машин где стоит Inferno, возможность писать распределённые приложения которые будет выполнять этот "кластер", возможность просто разрабатывать софт в очень простой и элегантной среде.

                                      При этом самое смешное, что все эти рабочие станции и сервера даже не заметят что на них что-то такое установили и будут работать как обычно, выполняя свои текущие функции - Inferno на них будет просто работать как обычный сетевой сервис, слушать несколько портов и иногда что-то делать (если вы запустите на этой машине какой-то софт по сети).
                                        0
                                        червь :)
                                          0
                                          В идеале - да... :)
                                          0
                                          В футбол на ходулях играть тоже элегантно :)
                                            +1
                                            шик!

                                            представил себе кластер из четырёх домашних десктопов
                                            с разницей в 2 года, последний - самый новый.
                                            и что имеем? кластер, требующий минимум конфигурации,
                                            НО: позволяющий с моего (пятого) мобильного устройства
                                            иметь доступ ко всем портам\железкам, расставленным по iДому
                                            и ДАЖЕ к железкам на ISA шине, на стареньком 440bx O_O
                                          0
                                          в предыдущей части вы писали, что в Инферно нет fork(), exec() etc., а здесь пишите, что работа организована через файлы.
                                          а запуск программы - это тоже что-то типа записи в файл /prog/run имени выполняемого файла? :)
                                            0
                                            Запуска программы нет. Есть spawn функции. Есть загрузка (load) модулей. fork() и exec() действительно нет.

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

                                          Самое читаемое