Plan 9: экстремальный KISS #1

by hugeping on 2020-10-10 16:02:21

Введение

Про операционную систему Plan 9 я слышал не раз. Но всё это время, мой интерес не переходил в активную фазу, ограничиваясь пассивным любопытством и чтением статей. Так продолжалось до настоящего момента, пока я всё-таки не попался в сети проекта http://9front.org [1]

Я не буду здесь писать энциклопедическую информацию о Plan 9. Но если совсем кратко, то создатели Unix в лице Bell Labs (среди сотрудников которой числятся Кен Томпсон, Деннис Ритчи, Роб Пайк) однажды взяли и решили сделать _правильную_ ОС, без оглядки на проклятый Legacy Unix, в том числе и POSIX. Доведя идею "всё есть файл" до абсолюта и стерев грань между локальными и удалёнными файловыми системами. В качестве примера: tcp/ip это тоже файловая система. Поэтому, если мы подключим к себе удалённую ФС /net, получится что-то вроде NAT. Вот так просто и естественно. В общем, получилась бескомпромиссная, распределённая и при этом крайне простая и красивая ОС. Которая (с некоторыми оговорками) оказалась ненужной. Потому что существующие решения просто работают, и миру этого достаточно...

Но ребята из проекта http://9front.org [2] форкнули Plan 9 и начали делать патчи, которые в том числе помогают Plan 9 работать на современном оборудовании. Итак, 9front можно сказать, это Plan 9, который лучше всего годится для того, чтобы ��оставить его на железо.

http://hugeping.tk/lib/uploads/mothra.png [3]

На данный момент у меня есть работающий 9front на eeepc 1000px в котором можно даже что-то делать. До этого, я около полугода запускал 9front в qemu и читал различную информацию. И, честно говоря, мало что понимал. Я гробил файловые системы, не мог отредактировать файл и вообще... Не понимал ничего. В общем, я решил начать цикл статей о Plan 9, в которых я буду рассказывать о своём субъективном опыте. Конечно, я не знаток этой ОС, поэтому если кто-то может -- поправляйте меня в комментариях.

Первые шаги

Итак, начнём.

Я начинал знакомство с ОС с чтения руководства dash с http://9front.org [4] Руководство написано с юмором, с его помощью вы можете попробовать поставить 9front в qemu или на реальное железо (чего я бы пока не делал).

И вот, мы ставим ОС, отвечая на странные вопросы инсталлятора, стартуем... Иии... Что это?

Забудьте про всё, что вы знали. Здесь другой мир. Он прекрасен, но чтобы это понять, вам придётся пойти по пути аскетики и самоотречения. :) Шучу (почти). Для работы с Plan 9 нужна графика и мышь. Без этого -- просто никак. Это может быть ударом для вас. Поверьте, я сам пользуюсь emacs и помню кучу клавиатурных комбинаций. Здесь вам это не понадобится. Пройдёт немало времени, пока вы не привыкните к такому положению вещей и не начнёте получать от этого своеобразное удовольствие (ясность сознания). :)

На ноуте, в принципе, можно обойтись тачпадом. Короче, нужны три кнопки мыши. С случае тачпада это может быть тап 1, 2 или 3-мя пальцами. Или (в случае физических кнопок): 1я, 2я и 2я кнопка вместе с shift.

После загрузки вы увидите нечто, напоминающее терминал. Не спешите радоваться! Это не терминал, к которому вы привыкли. Ладно, наберите ls нажмите ввод. Ну, хоть что-то известное! Правда, вывод какой-то совсем уж аскетичный...

В общем, в этом окне (новые окна вы можете создавать нажав 2ю кнопку мыши и выбрав в меню New) вы можете что-то запускать. Если вы запускаете графическую программу, то её содержимое заменит собой содержимое окна. Это не то, к чему вы привыкли, но это удобно. Чем-то напоминает тайловые оконные менеджеры, когда вы заранее создаёте фреймы. Но пока просто наберите man rio и почитайте, как работать в этом странном "оконном менеджере".

Окно не скроллируется по умолчанию на новый вывод. Вы можете изменить это поведение нажав 3-ю кнопку мыши и выбрав scroll. То, что окно не скроллируется, минимизирует необходимось использования пейджера. Вы просто скроллите кнопками вверх/вниз. Хотя, пейджер всё-таки есть и называется 'p'.

Про историю команд -- забудьте. Клавиши вверх/вниз всегда скроллят окно. Перемещаться по тексту и по истории ими нельзя.

Текст в окне - это просто текст. Вы можете менять его, копировать и вставлять. Таким образом, можно воспринимать его как историю команд. Выбираете мышкой и делаете send. Команда выполнится.

Некоторые хоткеи всё-таки есть, и они -- на вес золота:

- C-a, C-e -- в начало и в конец строки;

- C-u -- стереть всё слева от курсора;

- C-f -- автодополнение путей в файловой системе (tab -- забудьте);

- C-b -- прыжок к приглашению;

- del - аналог C-c в Unix.

Ещё нюанс. Допустим, вы написали:

ls /usrr/glenda

Заметили, что опечатались. Вернулись курсором к r и стёрли его, нажали ввод.

Упс!

ls /usr
/glenda

При выполнении команд, курсор должен находиться в конце ввода! А так, выполнилась команда ls /usr. Используйте C-e.

К этому нужно привыкнуть и это непросто. Все рефлексы заточены на другое. В современных Linux командная строка обвешена дополнениями и клавиатурными сокращениями, но здесь всё не так. Что взамен? Простота! Нет никакого терминала, есть просто поток текста. И всё. Черные буквы на светлом фоне. Всё есть текст.

Ещё несколько советов

- Используйте lc вместо ls. Вывод lc информативней. Например, после имён каталогов ставится /;

- Копирование в буфер обмена здесь называется snarf;

- Домашний каталог это $home или /usr/glenda в установке по умолчанию;

- Когда вы пишете что-то вроде grep, не надо заключать строки в "". Тогда в ввод эти кавычки и уйдут. Тут вам не bash, тут rc. У него совсем другие (более простые) правила эскейпинга. Можете использовать одинарные кавычки, если нужно. Например: g 'Kcaps' /sys/include/*. Да, g -- это рекурсивный grep;

- Некоторые утилиты расположены в подкаталогах. Например, ip/ping. Что это значит? Что выполняемый файл лежит в /bin/ip/ping;

- Посмотреть свой ip адрес: cat /net/ndb;

- Используйте walk | grep как аналог find;

- Скачать что-то (man hget);

- Смотреть pdf или картинки (man page);

- Браузеры: mothra, abaco (довольно падучий), можно собрать netsurf. Об этом будет другая статья;

- Для переключения раскладки можно запустить: kbmap /sys/lib/kbmap/us /sys/lib/kbmap/ru и переключать мышкой. Чтобы сделать переключение с клавиатуры, можно немного поменять rio, об этом -- в другой раз;

- Копировать каталоги здесь можно с помощью dircp, cp -R -- нет;

- fshalt -r -- перезагрузка;

- fshalt -- выключение;

- В домашнем каталоге есть bin/rc каталог. Здесь можете писать свои скрипты и они будут доступны для запуска. На самом деле, реализовано это за счёт bind. Сейчас поясню...

Bind

В домашнем каталоге, lib/profile есть файл - который можно назвать аналогом .profile. Сделайте его cat и посмотрите. Видите?

bind -a $home/bin/rc /bin

bind позволяет делать объединение файловых систем. -a -- добавить файловую систему после. В данном случае, мы добавили bin/rc в пространство /bin. Короче, все наши скрипты из bin/rc видны в /bin. (man bind)

Следующая строка, заметьте, использует $cputype. Дело в том, что кросскомпиляция есть из коробки, и есть разные компиляторы (man 6c). И разные каталоги для бинарников для разных архитектур.

Интересно ещё вот что, если вы что-то забиндите в окне rio, а потом запустите другое окно -- не удивляйтесь, что там этого не будет. Пространство файловой системы наследуется процессами. Поэтому в новом окне будет пространство rio. То-есть, каждый процесс может настраивать свое файловое пространство как угодно.

Поэтому в profile стартует webfs (это реалиазция http протоколов в виде файловой системы -- ну потому что здесь _всё_ реализовано в виде файловой системы) -- тогда все процессы из rio (который тоже стартует из profile) смогут работать с вебом.

То, что пространство ФС персональное для каждого процесса имеет интересный практический плюс. Например, смонтировали вы флешку, чтобы отмонтировать её -- вам достаточно прибить окно. Ну или все окна, в которых вы её смонтировали. Хотя команда unmount тоже есть (обратите внимание, не umount, а unmount).

Из profile стартует графическая система rio с флагом -i riostart.

riostart

Делаем cat /bin/riostart.

Это вот и есть стартовый скрипт rio. Можете кастомизировать под себя. Например, запустив kbmap с нужными параметрами (переключалка раскладки клавиатуры). Упс... Мы ещё не умеем редактировать файлы.

Редактируем временную зону в acme

Давайте начнём учиться редактировать с того, что выставим нормальную временную зону. Дело в том, что в 9front нет Российских временных зон из коробки. Но это не беда. Ведь всё есть файл!

Пишем:

acme /adm/timezone/local

Открылся редактор acme. В нём -- ваша текущая временная зона. На самом деле acme это не только редактор, это среда. Что-то вроде emacs в Plan 9. Детище Роба Пайка, который, наверняка, писал golang именно в нём. Но только это KISS emacs. :) Я не способен сейчас научить вас работать в acme (тем более, что я сам только учусь), но кратко опишу его принципы.

В acme мы имеем что-то вроде тайлового оконного менеджера. Можем создавать столбцы (3-кнопка на Newcol) и делить их на части (3-кнопка на New).

В acme тоже "всё есть текст". Это значит, что вы можете редактировать зону меню так же, как и текст. Пока не делайте этого, просто не пугайтесь если вдруг сотрёте кнопку Newcol. Просто напишите её там, где вам удобно. :)

Например, добавьте в зоне меню команду win. Просто текст win. 3-кнопкой нажмите на win и запустите "терминальное" окно внутри acme. Другие полезные команды смотрите в man acme. Вы можете писать скрипты, которые будут командами. Скрипты могут выводить текст и потреблять текст из редакторы. Таким образом, можно сделать, например, команду indent параграфа. Кроме того, acme поддерживает файловую систему (да-да, как и всё тут!), с помощью которой можно управлять редактором. Так что в acme можно читать почту и делать что-то ещё, что вам понадобится, просто дописывая нужную вам функциональность.

Поиск делается дописыванием текста после меню | Look, выделением этого текста и 3-кнопка. Так же можно просто выделять текст и жать 2-кнопку.

Открыть файл по номеру строки: добавьте к имени файла в меню :число, выберете всё это и нажмите 2-кнопку.

Режим авто-отступа есть. Он включается Indent on (да, да - допишите это в меню и выполните).

Итак, у вас открыт редактор на файле local. Надо стереть содержимое файла. Стрелочки? СТРЕЛОЧКИ СКРОЛЛЯТ ТЕКСТ! shift-стрелочки? Нет! Выделяем текст мышкой и нажимаем backspace!

Да, настал момент суровой правды. Вы не можете перемещаться по строкам с помощью стрелок курсора даже в текстовом редакторе! Так что или бегите (пока можете), или -- продолжим.

На самом деле, это жутко раздражает по началу. Но потом, я стал замечать за собой некоторую дисциплину. Всё не так плохо, сознание разгружается. Просто редактируем текст по правилам этого мира. Сейчас, по прошествии времени, я даже нахожу в этом какое-то удовольствие и отдушину (после emacs).

Да! Подсветки синтаксиса нет. Робу не нравится смотреть на код, как на новогоднюю ёлку.

Итак, вернёмся к временной зоне. Для московского времени я оставил одну строку:

MSK 10800 MSK 10800

Это временная зона GMT+3 (в секундах). Зимнее и летнее время.

Сохраняем файл. Ах, да... 3-я кнопка мыши по Put. Если Put пропал - вы сохранили файл. Выйдете из редактора самостоятельно.

Но это ещё не всё! Если у вас в BIOS время настроено в UTC, то надо сделать следующее:

acme /rc/bin/termrc.local

Впишите строку:

TIMESYNCARGS=(-ra1000000)

И сохраните. Ну или вы могли бы убрать параметр L из TIMESYNCARGS в файле /bin/termrc в самом начале, но это хуже. /bin/termrc запускает termrc.local.

/bin/termrc - это скрипт, который стартует вашу терминальную станцию.

Немного об архитектуре

То, что вы поставили себе в qemu (или на ноутбук?), в терминах Plan 9 называется терминальной станцией. Дело в том, что Plan 9 это сетевая система, где предусмотрены разные типы станций: терминал, файловый сервер, cpu-сервер итд. Границы между ними стёрты с помощью сетевой файловой системы 9p. Теорию почитайте тут: http://doc.cat-v.org/plan_9/4th_edition/papers/ [5] А в 9front вы получаете как бы всё в одном: терминальная станция, файловый сервер и т.д. Но в теории, это всё можно настроить на отдельных машинах. И именно так Plan-9 использовалась в Bell-Labs.

Файловая система

По умолчанию предлагается использовать CWFS.

"Файловая система" тут тоже реализована как служба-процесс. К которому можно подсоединиться и что-то сделать. Например, подключение к консоли:

con -C /srv/cwfs.ctl
help

Можете проверить fscache командой check.

CWFS это на самом деле интересная файловая система. Точнее -- файловый сервер. Он состоит как бы из двух областей. Есть fscache - в котором и идёт постоянная работа. И есть fsworm (Write Once Read Many) - это место куда архивируются данные и никогда не стираются. То-есть, когда-то ночью грязные блоки fscache сбрасываются в fsworm. Потом снова работаем с fscache. Сброс грязных блоков - это команда dump. Вы можете выполнять её руками через консоль: con -C /srv/cwfs.ctl, тем самым вы освобождаете место в кеше!

fsworm позволяет посмотреть любой слепок из тех, когда были сделаны dump. Смонтировать их можно так:

9fs dump
Не выключайте питание во время дампа!

По началу я никак не мог понять, почему у меня кончается место на диске! Оказывается, забивался сравнительно небольшой fscache. Надо было бы сдампить его в fsworm. Конечно, cwfs на нетбуке это немного странно. :) Что я буду делать, когда забью fsworm? Вероятно, пересоздам его заново, скопировав последнее состояние в fscache?

Редактирование plan9.ini

После первой установки, скорее всего вам понадобится поменять что-то в параметрах загрузчика. (man plan9.ini) Например, выставить более комфортное разрешение vesa. Включить acpi, поменять тип мыши и др.

Для этого надо подмонтировать специальный fat раздел:

9fs 9fat
acme /n/9fat/plan9.ini

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

На этом же разделе, кстати, находится ядро. Но о компиляции ядра мы поговорим в другой раз.

Доступ к файловой системе по сети из Linux

acme $home/bin/rc/export

Содержимое файла:

#!/bin/rc
aux/listen1 -t 'tcp!*!564' /bin/exportfs -r /

Запустите скрипт в окне и монтируйте с Linux:

9pfuse <адрес>:564 <точка монтирования>

Исходники системы находятся в /sys/src/ :)

Заключение

К сожалению, вводная статья получилась сумбурной. Очень много информации и всё очень связано: начинаешь что-то писать, сразу понимаешь, что надо рассказать сначала о другом компоненте. Берёшь другое -- снова та же история.

Погружение в Plan 9 для меня было непростым процессом, и я сам ещё нахожусь в самом начале пути. Но в следующих статьях я попробую писать более конкретно, сосредоточившись на конкретных практических задачах.

Примерный план статей такой:

- Собираем netsurf и irc (git, hg, порты, golang);

- Изменяем исходные коды системы (смена раскладки клавиатуры);

- Музыка (и видео???);

- Мои патчи: ethernet alc, ethernet athn, acpi, vgadb;

- Сравнение исходного кода ядер: openbsd, Linux, plan9.

Если что, пишите свои предложения/вопросы.

/* XPM */
static char * glenda_xpm[] = {
"48 62 2 1",
" 	c None",
".	c #000000",
"                                                ",
"            ....                                ",
"           .. ....                              ",
"          .. ......                             ",
"          .. ......                             ",
"           .  .......                           ",
"    .      .. .... ...                          ",
"  ......   ..  .......                          ",
" ..   ...   .. ........                         ",
" .. ..  ... ... .......                         ",
" .. .... ... .. ............                    ",
" .  ..... ...... .....     ..........           ",
" .. ......  ......              ......          ",
"  .. ......  ...                   ...          ",
"  ... ............                   ...        ",
"   ... ...........                     ..       ",
"    ..  ...........       ..            ..      ",
"     ... ..........      ....            ..     ",
"      ... .... ...       . ..             .     ",
"       ....... ...       .... ..............    ",
"        .... ....          .................    ",
"        ........          ......        .....   ",
"        .......          ....             ...   ",
"        ..              ....            . ...   ",
"        .              ....              .....  ",
"        .             ....               ... .  ",
"        .            ....                ... .. ",
"        .            ...                ..... . ",
"        .           ...                .....  . ",
"        .           ...       ..       ...... . ",
"       ..          ...       ...           .  . ",
"       ..          ...        ..           .  . ",
"      ....         ...                     .  . ",
"      .. .         ..              ....   ..  . ",
"      .. .         ..             ......  .. .. ",
"        ...        ..            ........ .. .  ",
"          .        ...           ........ .. .  ",
"          ..       ...           ........ ....  ",
"          ..        ..            ......  ...   ",
"          ...       ...            .. .   ..    ",
"          ....       ..             ...  ...    ",
"          ......     ...                 ...    ",
"          .........   ...               .....   ",
"          ......  .........           .... ..   ",
"            ...      ................... ....   ",
"           .......         ............ .. .    ",
"            . ........              .   ...     ",
"            .      ............    ........     ",
"           ..           . .......... .....      ",
"          ...                       .   ..      ",
"          ...                          ...      ",
"         .....                         ...      ",
"        .......                       ...       ",
"         .......                     ....       ",
"         ........                  .....        ",
"         .........               .......        ",
"          ..........           .....  ..        ",
"                 ....     .....   ..  ..        ",
"                   ......    ..    .....        ",
"                      ..........  .....         ",
"                          ..........            ",
"                                ..              "};

P.S. Edited: 2020-10-11 10:28:47

http://9front.org [1]

http://9front.org [2]

http://hugeping.tk/lib/uploads/mothra.png [3]

http://9front.org [4]

http://doc.cat-v.org/plan_9/4th_edition/papers/ [5]