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/ А в 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