Капсула Никиты Попова

ru

en

Установка Plan 9

Базовая установка и настройка файлового сервера и сервера авторизации

Опубликовано 2024-11-02. Последние изменение 2024-11-05.

Ввиду своей довольно уникальной архитектуры и используемых подходов установка **Plan 9** **[а именно 9front]** может вызвать множество вопросов даже у опытного системного администратора.

Большая часть этой статьи будет представлять из себя переработанную информацию из справки на сайте проекта[^1].

Справка не раскрывает некоторые тонкие моменты, поэтому я постараюсь дополнить её своим опытом.

В процессе я буду использовать виртуальную машину KVM.

Подготовка

-- Не хватай его сразу. Не хватай его сразу, Урри. Выясни сначала как он управляется. Выясни как он управляется сначала.
-- Не понял, повторите!
-- Узнай где у него кнопка!

Перед началом вы должны ответить на несколько вопросов:

- Какую конфигурацию имеет ваша локальная сеть?

- Какое оборудование установленно в вашей машине и поддерживается ли оно в ОС? **[список поддерживаемого оборудования доступен на сайте проекта[^2]]**

- Какое имя будет у машины и вашего пользователя?

Если у вас возникли трудности на этом этапе, то я советую вам прекратить и вернуться позже.

После того, как вы получили ответы на эти вопросы, мы можем идти дальше.

Для начала скачайте подходящий вам установочный **ISO** образ системы с сайта проекта[^3] и создайте загрузочную флешку.

Если вы выбрали для первой попытки установку на виртуальную машину **[что я вам и советую]**, то просто примонтируйте к ВМ образ диска и начните закрузку.

Если всё было сделано правильно вы увидите процесс загрузки.

Первая загрузка

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

В большинстве можно остановиться на значениях по умолчанию **[обычно указаны в квадратных скобках]**, если они доступны.

Пользователь

 user[glenda]:

Предлагаемый пользователь по умолчанию - **glenda**.

Запуск системы на этой машине будет происходить под этим пользователем.

Такой пользователь в контексте **Plan 9** зовётся **hostowner** (владелец хоста).

Концепция корневого пользователя **root** была упразднена по причинам проблем с безопасностью.

Владелец хоста имеет высокие полномочия на конкретной машине, но ограничен в доступе к файлам других пользователей.

Для первой установки лучше его не менять.

Просто нажимаем `Enter`.

vgasize, monitor, mouseport

Следующими вопросами будут запрошены данные о дисплее и мыши:

vgasize is (text, 640x480x8, 1024x768x16, ...) [1024x768x16]
monitor is (vesa, xga, lcd, ...) [vesa]
mouseport is (ps2, ps2intellimouse, 0, 1, 2) [ps2]

На основании ответов будут установлены переменные окружения `$vgasize`, `$monitor` и `$mouseport`.

Эти значения также будут записаны в файл `plan9.ini`, из которого будут использоваться при последующий загрузках.

- `monitor` - в любое значение, кроме `vesa` будет пропускать эмуляцию **VESA BIOS** и будет выполнятся попытка использования нативного драйвера **VGA** для видео карты.

Список поддерживаемых системой дисплеев и видео карт может быть найден в файле `/lib/vgadb`.

Дополнительную информацию вы можете найти на страницах справки **vga(3)**, **vga(8)** и **vgadb(6)**.

- `vgasize` - используется для хранения разрешения и разрядности дисплея.

Тут можете прописать любое значение, поддерживаемое вашим дисплеем.

- `mouseport` - Значение по умолчанию для `ps2` должно подходить в большинстве случаев.

При установке на ноутбук или при использовании мыши с колесом прокрутки может понадобиться выставить его в `ps2intellimouse`.

После завершения загрузки вы можете изменить установленные значения в файле `plan9.ini`.

Пример содержимого `plan9.ini`:

monitor=vesa
vgasize=1024x768x16
mouseport=ps2intellimouse

Завершение первой загрузки

Запуск

После ответов на вопросы процесс загрузки попробует запустить стандартный графический мультиплексор **rio**, приветствующий вас серым рабочим столом с запущеным монитором нагрузки **stats** и окном с оболочкой **rc**.

"Безупречная серость." rio

Имейте ввиду, что если пользователь был изменён, то вы увидите просто серый экран.

Инициализация подготовлена только для пользователя **glenda**.

В остальных случаях система остаётся чистой.

Немного об управлении

Для управления мультиплексером **rio** используется трёхкнопочная мышь.

- ЛКМ - указание фокуса и выделение, ничего особенного;

- СКМ - контекстное меню, которое будет различаться для разных приложений;

- ПКМ - меню **rio**, позволяет создавать, изменять и удалять окна.

Приложения запускаются в окнах **rio**.

Но самое интересно, что в окне **rio** может быть запущен ... **rio**.

И ещё. И ещё.

При работе с flash-накопителя для первого знакомства этого может быть достаточно.

Система будет созранять своё состояние как обычный live-образ любой другой ОС.

Так что вы можете перейти к следующим статьям цикла.

Если же вы достаточно исследовали live-образ **Plan 9** и чувствуете, что готовы к построению полноценной вычислительной сети **[в контексте Plan 9 используется термин grid]** - то мы продолжаем.

Установка базовой системы

Установка выполняется **rc**-сценарием `/rc/bin/inst`.

Чтобы начать установку выполните в терминале команду `inst/start`.

term% inst/start

Следуйте инструкциям, чтобы завершить установку, при необходимости выбрав значения по умолчанию.

Каждый шаг может быть пройден повторно путём ввода его имени в запросе.

Запуск сценария inst/start

Теперь перейдём к шагам установки.

configfs

Файловая система `cwfs64x` использует постоянное и временное хранилища на разных разделах.

Файловая система `hjfs` более однородна, но работает медленнее.

Если ваш диск менее 12 ГиБ, то вам необходимо выбрать `hjfs`.

В этом примере мы продолжим используя `cwfs64x`.

You can install the following types of systems:
    cwfs64x     the cached-worm file server
    hjfs        the new 9front file server (experimental!)
File system (cwfs64x, hjfs)[cwfs64x]:

configfs

partdisk

На этом шаге нам необходимо создать разделы.

Сценарий установки сообщит вам какие диски он смог обнаружить.

Выбираем тот, что не эмуляция оптического диска и жмём `Enter`.

The following disk devices were found.

sdC0 - QEMU DVD-ROM
    empty                  0 3916        (3916 cylinders, 29.99 GB)
  * p1

sdF0 -

Disk to partition (sdC0, sdD0)[no default]: sdF0
The disk you selected HAS NO master boot record on its first sector.
(Perhaps it is a completely blank disk.)
Shall we create a blank EFI partition table (GPT)
or install traditional DOS partition table (MBR)?

Диск у нас пустой, так что создадим свежую **MBR** таблицу.

Install mbr or gpt (mbr, gpt)[no default]: mbr

This is disk/fdisk; use it to create a Plan 9 partition.
If there is enough room, a Plan 9 partition will be
suggested; you can probably just type ’w’ and then ’q’.

cylinder = 8225280 bytes

В этом примере мы будем использовать весь диск.

Просто записываем предложенные изменения.

>>> w
>>> q

partdisk

prepdisk

Из-за особенностей **CWFS** нам необходимо выполнить дополнительное разбиения раздела на подразделы.

The following Plan 9 disk partitions were found.

/dev/sdF0/plan9
  empty                  0 62910477    (62910477 sectors, 29.99 GB)

Plan 9 partition to subdivide (/dev/sdC0/plan9)[no default]:
Use the Plan 9 partition created in the previous step. Type /dev/sdC0/plan9 and hit enter.
This is disk/prep; use it to subdivide the Plan 9 partition.
If it is not yet subdivided, a sensible layout will be suggested;
you can probably just type `w` and then `q`.

no plan9 partition table found
9fat 204800
nvram 1
other 8957953
fscache 8957953
fsworm 44789770
>>>

И снова принимаем значения по умолчанию.

>>> w
>>> q

prepdisk

mountfs

Теперь, когда подразделы созданы, мы указываем как их монтировать и форматируем их.

Если предыдущие шаги прошли без проблем, то сценарий установки обнаружит созданные нами разделы самостоятельно.

Просто нажимаем `Enter` на каждом из вопросов.

The please choose your cwfs64x partitions

--rw-r----- S 0 glenda glenda 4586471936 Jul  4 13:28 /dev/sdC0/fscache

Cwfs cache partition (/dev/sdC0/fscache)[/dev/sdC0/fscache]:
--rw-r----- S 0 glenda glenda 22932362240 Jul  4 13:28 /dev/sdC0/fsworm

Cwfs worm partition (/dev/sdC0/fsworm)[/dev/sdC0/fsworm]:
--rw-r----- S 0 glenda glenda 4586471936 Jul  4 13:28 /dev/sdC0/other

Cwfs other partition (/dev/sdC0/other)[/dev/sdC0/other]:

Далее нам будет предложено форматировать (ream) раздел, соглашаемся.

Since this is a fresh install, we choose yes to ream (format) the file system:
Ream the file system? (yes, no)[no]: yes
Starting cwfs64x file server for /dev/sdC0/fscache
Reaming file system
bad nvram key
bad authentication id
bad authentication domain
nvrcheck: can’t read nvram
config: config: config: auth is now disabled
config: config: config: config: config: config: current fs is "main"
cmd_users: cannot access /adm/users
63-bit cwfs as of Wed Jul  4 00:59:30 2012
    last boot Tue Jul 17 13:34:57 2012
Configuering cwfs64x file server for /dev/sdC0/fscache
Mounting cwfs64x file server for /dev/sdC0/fscache
% mount -c /srv/cwfs /n/newfs
Mounting cwfs64x file server for /dev/sdC0/other
% mount -c /srv/cwfs /n/other other

mountfs

confignet

Пришло время сконфигурировать сеть.

We will configure the ethernet.

Please choose a method for configuring your ethernet connection.

    manual - specify IP address, network mask, gateway IP address
    automatic - use DHCP and SLAAC to automatically configure

Configuration method (manual, automatic)[automatic]:

confignet

автоматическое

В этом примере я остановлюсь на автоматической конфигурации, так как у меня настроен **DHCP**.

Если вы также будете использовать **DHCP**, то не забудьте зарезервировать адрес на сервере.

Нажмите `Enter`, чтобы перейти к следующему шагу.

ручная

Ручная настройка не представляет сложности.

Необходимо просто указать **IP** адрес, маску сети, шлюз и **DNS** сервер.

Configuration method (manual, automatic)[automatic]: manual
ip address [no default]: 192.168.2.10
network mask [no default]: 255.255.255.0
gateway address [no default]: 192.168.2.1
dns server [192.168.2.1]:
starting ethernet manual config

mountdist

Укажем сценарию установки где ему искать файлы для установки.

Please wait... Scanning storage devices...
    /dev/sdC0/9fat
    /dev/sdC0/data
    /dev/sdC0/fscache
    /dev/sdC0/fsworm
    /dev/sdC0/other
    /dev/sdD0/data

The following storage media were detected.
Choose the one containing the distribution.

    /dev/sdD0/data (iso9660 cdrom)

Distribution disk (/dev/sdD0/data, /dev/sdC0/fscache, /)[/]:

Образ CD уже примонтирован в корень, просто укажем `/` и жмём `Enter`.

% mount /srv/boot /n/distmedia

Which directory contains the distribution?

Location of archives [/]:

И снова, корень CD уже в корне системы, также укажем `/` и жмём `Enter`.

mountdist

copydist

На этом шаге будет производиться копирование файлов дистрибутива системы на сконфигурированные разделы.

Сценарий не отображает прогресс установки.

Следить за процессом можно лишь отслеживая нагрузку на мониторе **stats(8)**.

Процесс занимает от 5 минут до часа в зависимости от скорости работы вашего диска.

Прогресс copydist

По завершении вы должны увидеть следующее сообщение:

Завершение copydist

Оно означает, что файлы системы успешно скопированы на целевые разделы.

ndbsetup

Дадим нашему хосту имя.

По умолчанию будет назначено **cirno**.

Setup network configuration

sysname [cirno]: test-fs

ndbsetup

tzsetup

Настраиваем часовой пояс.

Setup Time Zone

Time Zone (Argentina, Australia_ACT, Australia_Broken-Hill,
Australia_LHI, Australia_NSW, Australia_North, Australia_Queensland,
Australia_South, Australia_Sturt, Australia_Tasmania,
Australia_Victoria, Australia_West, Australia_Yancowinna, Brazil_Acre,
Brazil_DeNoronha, Brazil_East, Brazil_West, CET, Canada_Atlantic,
Canada_Central, Canada_East-Saskatchewan, Canada_Eastern,
Canada_Mountain, Canada_Newfoundland, Canada_Pacific, Canada_Yukon,
Chile_Continental, Chile_EasterIsland, Cuba, EET, Egypt, GB-Eire, GMT,
HST, Hongkong, Iceland, Iran, Israel, Jamaica, Japan, Libya,
Mexico_BajaNorte, Mexico_BajaSur, Mexico_General, NZ, NZ_CHAT, Navajo,
PRC, Poland, ROC, ROK, Singapore, Turkey, US_Alaska, US_Arizona,
US_Central, US_East-Indiana, US_Eastern, US_Hawaii, US_Michigan,
US_Mountain, US_Pacific, US_Yukon, W-SU, WET)[US_Eastern]: GMT

Вводим наиболее подходящий нам из списка и жмём `Enter`.

tzsetup

bootsetup

Настройка загрузки системы.

Setup Plan 9 FAT boot partition (9fat)

Plan 9 FAT partition (/dev/sdC0/9fat)[/dev/sdC0/9fat]:

Принимаем значение раздела загрузки по умолчанию.

Все переменные окружения, указанные при первом запуске, сейчас будут сохранены в `/n/9fat/plan9.ini`.

Также ядро системы будет скопировано в раздел **9fat**.

dossrv: serving /srv/dos
Initializing Plan 9 FAT partition.

% disk/format -r 2 -d -b /386/pbs /dev/sdC0/9fat
Initializing FAT file system
type hard, 12 tracks, 255 heads, 63 sectors/track, 512 bytes/sec
used 4096 bytes
% mount -c /srv/dos /n/9fat /dev/sdC0/9fat
% rm -f /n/9fat/9bootfat /n/9fat/plan9.ini /n/9fat/9pc
% cp /n/newfs/386/9bootfat /n/9fat/9bootfat
% chmod +al /n/9fat/9bootfat
% cp /tmp/plan9.ini /n/9fat/plan9.ini
% cp /n/newfs/386/9pc /n/9fat/9pc

If you use the Windows NT/2000/XP master boot record
or a master boot record from a Unix clone (e.g., LILO or
FreeBSD bootmgr), it is probably safe to continue using
that boot record rather than install the Plan 9 boot record.

Так как в нашем случае нет соседней системы мы выбираем запись **Plan 9** в главную загрузочную область и помечаем раздел активным.

Install the Plan 9 master boot record (yes, no)[no default]: yes
Mark the Plan 9 partition active (yes, no)[no default]: yes

The Plan 9 partition is now marked as active.

bootsetup

finish

Последний шаг отключит образ CD и завершит работу.

Подтверждаем нажатием клавиши `Enter` для перезагрузки компьютера.

Ваша первая установка **9front** завершена.

Поздравляю!

Настройка сервера авторизации и файлового сервера

Основано на этом примере - [youtube](https://www.youtube.com/watch?v=wRpCnHTTbGU "Auth & File Server Setup, using 9front").

Выполнить этот шаг будет немного сложнее.

Но его нужно выполнить только единожды, чтобы официально запустить файловый сервер.

Здесь много зависимых этапов, и их нужно выполнить правильно, чтобы все работало.

Поскольку у нас будет комбинация сервера авторизации и файлового сервера, нам нужно будет настроить обе эти системы.

Авторизация будет выполнять проверку паролей, а файловая система будет следить за тем, чтобы у пользователей был доступ к нужным файлам.

Первое, что необходимо сделать, это установить владельца хоста для системы.

Разработчики **Plan 9** отказались от использования корневого пользователя **root**, поскольку это было связано с очевидными проблемами безопасности.

Вместо этого у каждой системы есть назначенный владелец хоста (**host owner**).

Владелец хоста обладает неограниченной властью над любыми процессами, выполняемыми в системе, которой он владеет.

Таким образом, владелец хоста может отключить процессы и получить доступ практически ко всему оборудованию.

В случае с файловым сервером владелец хоста не имеет безграничного доступа к файлам.

Только в особом случае, когда владелец хоста загружается в консольном режиме с отключенной авторизацией.

Настройка NVRAM

Мы уже видели раздел **NVRAM** [ранее](#prepdisk), это небольшая часть хранилища, называемая **Энергонезависимой оперативной памятью** (**Non-Volatile RAM**) по историческим причинам, и она содержит токен пароля для владельца хоста.

Это позволяет системе загружаться с авторизацией без необходимости вводить пароль в командной строке загрузки.

Чтобы убедиться, что система использует его, я добавлю его в `plan9.ini`.

Некоторые системы делают это автоматически, но я просто хочу быть уверенным.

Итак, давайте смонтируем раздел **9fat**.

% 9fs 9fat
% sam /n/9fat/plan9.ini

Здесь мы можем указать, откуда взять раздел **NVRAM**, и это также может быть задано в виде файла.

bootfile=9pc64
nvram=/dev/sdF0/nvram
bootargs=local!/dev/sdF0/fscache
mouseport=ps2
monitor=vesa
vgasize=1024x768x16

tiltscreen=none

И теперь мы перезагрузим систему, чтобы это вступило в силу.

% fshalt -r

Запись в NVRAM

Теперь мы перезагрузили систему с указанным разделом **NVRAM**, и следующим шагом будет запись в него.

- `authid` - будет указывать владельца хоста, которым будет **glenda**.

- `authdom` - в данном случае запрашивается доменное имя.

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

Если нет - укажите что-нибудь в качестве заглушки.

- `secstore key` - используется для другой системы авторизации, и я пока не буду его использовать.

Нажмите `Enter` и оставьте поле пустым.

- `password` - пароль для пользователя **glenda**.

% auth/wrkey
authid: glenda
authdom: testdom
secstore key:
password:

Вот и все.

Добавление пользователей в авторизацию

Следующим шагом будет добавление пользователя **glenda** в систему авторизации, и мы также добавим в неё обычного пользователя.

Итак, сначала нам нужно убедиться, что у нас есть доступ к ключам.

% auth/keyfs

Итак, мы начнём с пользователя **glenda**:

- `Password` - введите тот же пароль;

- `Confirm password` - и ещё раз;

- `assign new Inferno/POP secret? [y/n]: n` - пока не важно, просто установите значение "нет";

- `Expiration date (YYYYMMDD or never)[never]:` не будем беспокоиться о сроке истечения, установите значение "никогда";

- `Post id:`, `User's full name:`, `Department #:`, `User's email address:`, `Sponsor's email address:` - это если у вас в офисе полно людей.

% auth/changeuser glenda
Password:
Confirm password:
assign new Inferno/POP secret? [y/n]: n
Expiration date (YYYYMMDD or never)[never]:
Post id:
User's full name:
Department #:
User's email address:
Sponsor's email address:
user glenda installed for Plan 9

Вот так-то.

И я добавлю обычного пользователя **testuser**.

В основном параметры все те же.

% auth/changeuser testuser
Password:
Confirm password:
assign new Inferno/POP secret? [y/n]: n
Expiration date (YYYYMMDD or never)[never]:
Post id:
User's full name:
Department #:
User's email address:
Sponsor's email address:
user testuser installed for Plan 9

Добавление пользователей в файловую систему

Следующим шагом будет добавление нашего нового **testuser** в файловую систему.

Пользователь **glenda** автоматически был указан в качестве одного из пользователей файловой системы при выполнении базовой установки.

И теперь нам нужно добавить **testuser**, чтобы он также мог владеть файлами.

Для этого нам нужно отправить команду на командный сервер файловой системы.

% echo newuser testuser >>/srv/cwfs.cmd

Итак, теперь новый пользователь **testuser** добавлен в файловую систему **CWFS**.

Настройка сетевой базы данных

Следующий шаг - отредактировать файл сетевой базы данных, чтобы назначить эту систему в качестве сервера аутентификации и файлового сервера.

Этот файл находится в `/lib/ndb/local`.

Внизу файла у нас есть пример, который мы можем использовать:

# example: adjust to fit your network
#auth=cirno authdom=9front
#ipnet=9front ip=192.168.0.0 ipmask=255.255.255.0
#	ipgw=192.168.0.1
#	dns=192.168.0.1
#	auth=cirno
#	dnsdom=9front
#	cpu=cirno
#	smtp=cirno

Так что нам просто нужно сделать нашу версию этой записи:

auth=test-fs authdom=testdom
ipnet=testdom ip=192.168.2.0 ipmask=255.255.255.0
	ipgw=192.168.2.1
	dns=192.168.2.1
	auth=test-fs
	fs=test-fs
	dnsdom=testdom

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

Теперь нам нужно добавить еще изменений в `plan9.ini`.

Из-за особенностей с **CWFS** нам нужно внести две правки.

- Во-первых, нужно скопировать файл `plan9.ini`, чтобы загрузить систему в режиме настройки и убедиться, что авторизация в файловой системе работает;

- И нам также нужна окончательная конфигурация `plan9.ini`, чтобы сервер загружался нормально, без необходимости взаимодействия.

Итак, давайте снова смонтируем **9fat** и сделаем копию текущего `plan9.ini` и еще одного, который мы будем использовать позже.

9fs 9fat
cp /n/9fat/plan9.ini /n/9fat/plan9.bak.ini
cp /n/9fat/plan9.ini /n/9fat/plan9.new.ini

Для существующего файла первое, что нам нужно сделать, это изменить его с терминала по умолчанию на **CPU** сервер.

А затем к параметрам загрузки мы добавим параметр `-c` для диска для файловой системы, и это переведет его в режим настройки.

bootfile=9pc64
nvram=/dev/sdF0/nvram
service=cpu
bootargs=local!/dev/sdF0/fscache -c
mouseport=ps2
monitor=vesa
vgasize=1024x768x16

tiltscreen=none

Для нового файла мы добавим опцию `-a tcp!*!564` в параметры диска.

Это сообщит системе, что она прослушивает **TCP** порт 564 для получения команд для подключения к файловой системе.

Это также будет **CPU** сервер, и мы изменим параметры загрузки на `nobootprompt`, чтобы он не просил нас нажимать `Enter`.

bootfile=9pc64
nvram=/dev/sdF0/nvram
service=cpu
nobootprompt=local!/dev/sdF0/fscache -a tcp!*!564
mouseport=ps2
monitor=vesa
vgasize=1024x768x16

tiltscreen=none

Итак, мы подготовили оба файла сейчас, потому что после перезагрузки системы графика будет отключена, поэтому не будет работать **rio**, и мы не сможем редактировать файлы с помощью **acme** или **sam**.

Вы можете использовать **ed**, но проще подготовить их сейчас и использовать просто **mv**, чтобы переименовать их позже.

Загрузка в роли сервера

Итак, мы перезагрузили систему, и вы можете видеть, что она ждет, когда я введу значение по умолчанию, которое имеет символ `-c`.

bootargs is (tcp, tls, il, local!device)[local!/dev/sdF0/fscache -c]

Нажмите `Enter`.

Далее появляется ввод `config`.

На этом этапе нам нужно ввести `noauth`.

Система сообщит, что авторизация отключена.

Я снова наберу `noauth`, и авторизация теперь включена.

Затем введите `end` и продолжайте загрузку системы.

config: noauth
auth disabled
config: noauth
auth enabled
config: end

Как вы можете видеть, **rio** не запущен.

Это просто приглашение командной строки.

Мы смонтируем раздел **9fat** и переместим файл `plan9.ini` с параметром конфигурации.

А затем переместите наш новый файл `plan9.ini` и перезагрузите систему еще раз.

# 9fs 9fat
# cd /n/9fat/
# mv plan9.ini plan9.config.ini
# mv plan9.new.ini plan9.ini
# fshalt -r

Теперь вы можете выключить систему, а затем отключить монитор, клавиатуру и мышь и загрузить ее обратно.

Она будет спокойно работать и ждать запросов к файловому серверу.

Подключение

Теперь вам нужен **drawterm**[^4] в вашей основной системе для подключения к файловому серверу.

drawterm -h 192.168.2.10 -u testuser -a 192.168.2.10

Введите пароль пользователя и вуаля!

Теперь вы подключены к файловому серверу.

Вы также можете получить доступ к файлам вашего локального компьютера в `/mnt/term`.

Это довольно полезно, вы можете написать какое-нибудь программное обеспечение в своем обычном текстовом редакторе и протестировать его в среде **Plan 9** без копирования каких-либо файлов.

На этом настройка фалового сервера с авторизацией завершена.

В последующих статьях мы подробней остановимся на применении **Plan 9**, работе в среде и расширении нашей сети.

[1] 9front FQA 4 - 9front Installation Guide

[2] 9front FQA 3 - Hardware

[3] 9front - releases

[4] drawterm

"Установка Plan 9" через WWW

Другие ссылки

Codeberg

e-mail

Fediverse

GitHub

IRC

nostr

© 2024 POLYSERV BY MODERN HOME