This is a rather free-form bulgarian translation of "Plan 9 from Bell Labs". Courtesy of L. Ionkov.
Това е сравнително свободен превод на документа "Plan 9 from Bell Labs". Оригиналния превод е на Лъчезар Йонков, формат и допълнителна обработка на Андрей Мирчовски. За допълнителна документация относно План 9 вижте оригиналната страницa на bell-labs (ако желаете да направите превод на някой от документите там пишете ми -- ще сложа вашия превод тук).
Тези от вас които нямат проблеми с руския език (май английския вече замести руския като модерен втори език) можете да погледнете руския превод на същите документи на страницата на Андрей Кухар тук.
Системните извиквания за работа с файловата структура са mount bind and unmount.
Системното извикване mount добавя (монтира) дърво сервирано от файлов сървър в текущия namespace. Като връзка към файловия сървър, ядрото получава файлов дескриптор. Комуникацията м/у ядрото и сървър-а се извършва чрез писане и четене в този дескриптор. Протокола на съобщенията се нарича 9P и позволява обхождане на дървото, четене/запис на съдържанието на файловете и т.н.
Системното извикване bind позволява монтирането на част от вече съществуващия namespace на друго място.
Plan9 позволява при монтиране, предишното съдържание на директорията да продължи да е достъпно. При извикване на mount или bind, може да се укаже дали новото дърво да се "залепи" най-отпред, най-отзад, или напълно да замени съдържанието на директорията в която се монтира. При обхождане на директориите, всички монтирани в нея дървета се обхождат в съответния ред.
Архитектурата на Plan9 показва предимствата си много добре при работа в мрежа. Простотата на връзката м/у ядро и файлов сървър прави много лесно отдалеченото използване на файлови сървъри. Използвайки командите import и cpu потребителя може да забрави къде се записват файловете му и на коя машина се изпълняват процесите му.
Командата import позволява на потребителя да монтира в текущия namespace част от namespace-a на отдалечена машина. Обикновено потребителя работи на бездисков компютър, използвайки файловата система предоствена от файлов сървър.
Командата cpu е по-интересна. Да предположим че потребителя има изградена някаква файлова структура на локалния си компютър (монтирайки различни локални и отдалечени файлови сървъри). В един момент потребителя решава че локалния му компютър е много бавен за програмата която иска да ползва. Пише
cpu veryfastserverи се озовава на ужасно бързия сървър veryfastserver, запазвайки напълно файловата йерархия която е виждал на терминала. За него единственото което се е променило е скоростта на изпълнение на програмата. Да предположим че програмата е написана така, че докато изпълнява много бавната си задача, се опитва да забавлява потребителя свирейки нещо на звуковата карта. Тъй като файловата йерархия е същата като на локалния компютър, устройството /dev/audio сочи към звуковата карта на локалния компютър, а не към тази на сървъра. И потребителя ще чуе мелодията в неговите слушалки, вместо да стряска другите потребители седящи близо до сървър-а :). Или пък ако потребителя си е конфигурирал мрежата по специален начин, напр. да рутира през друг рутер, програмата ще използва неговата конфигурация на локалната машина, въпреки че се изпълнява на сървър-а на които има друга конфигурация на мрежата.
Всичко в Plan9 се вижда като сбор от файлове -- ethernet карта, IP протокол, процес и т.н. Тъй като не всички компютри в мрежата са с еднакви процесори, създателите на ОС-а са решили (и спазват до голяма степен) да ползват текстови команди за управление на системните обекти. Така ако трябва да се изпрати параметър 20, той се записва като низ "20" вместо като поредица от байтове с някакъв вид endianness. На пръв поглед това решение не е удачно, но то има някои предимства които не се забелязват веднага.
Ще се опитам да покажа как са представени някои системни обекти и какви са предимствата от такова представяне:
Предстаявянето на процеса като сбор от файлове е подобно на това в Unix. За всеки процес в /proc има директория с име pid-a на процеса. Едно от различията които си заслужава да спомена е файла ctl. Писането на текстови съобщения в този файл, променя различни параметри на процеса. Например
stop спира процеса start възстановява изпълнението на процеса kill убива процеса pri n сменя приоритета на процеса wire n "залепя" процеса към n-тия процесор
Всичката информация която дебъгер-а ползва за процеса, се намира в /proc/XXX. По този начин отдалеченото дебъгване на процес на машината X от машината Y се състои от импортирането на файловата система /proc на машината X някаде във файловата система на Y и указването на мястото на монтиране на дебъгера.
Структурата на файловия сървър представящ IP протокола изглежда така:
/net/ipifc/clone /net/ipifc/stat /net/ipifc/N /net/ipifc/N/status /net/ipifc/N/ctl
където N е число представящо номера на интерфейса. За да се създаде нов интерфейс, се отваря файла /net/ipifc/clone. Това създава нова поддиректория и връща номера на новия интерфейс. Писането във файла /net/ipifc/N/ctl конфигурира интерфейс-а. Например за да се "върже" интерфейса 3 към втората ethernet карта, се извиква:
$ echo bind ether /net/ether1 > /net/ipifc/3/ctl
/net/ether1 е пътя до директорията, описваща втората Ethernet карта. За да се зададат локални IP адреси на интерфейса се извиква:
$ echo add 192.168.33.1 255.255.255.0 > /net/ipifc/3/ctl
Разбира се съществуват и команди които вършат същата работа, но е приятно да знаеш че можеш да конфигурираш всичко само със shell script и echo ;)
Структурата на файловия сървър представящ TCP стека изглежда така:
/net/tcp/clone /net/tcp/stats /net/tcp/N /net/tcp/N/data /net/tcp/N/ctl /net/tcp/N/listen
Да предположим че искаме да отворим TCP връзка до компютъра с адрес 192.168.10.1 на порт 22:
$ cat /net/tcp/clone 5
създава нова връзка която може да се контролира чрез файловете в /net/tcp/5.
$ echo conect 192.168.10.1!22 > /net/tcp/5/ctl $
След тази команда, четенето и записа във файла /net/tcp/5/data осъществява четене и запис по TCP връзката.
Отново, има C функции (dial()), които вършат черната работа вместо програмиста.