В данной статье рассматривается устройство системы в контексте системного администрирования - основные понятия и методы, процесс загрузки, принцип работы подсистем, сервисов итд.
В Plan9, как и в UNIX-подобных системах, для организации совместной работы широко используется скриптовый язык rc. Поэтому важно иметь как минимум базовые знания по нему. Язык rc во многом похож на bash, даже более простой, но с некоторыми индивидуальными особенностями.
Загрузка системы
Процесс загрузки системы трехуровневый, во многом подобен таковому в Linux, хотя и немного сложнее. Но при наличии знаний и опыта в Linux-системах сложностей с пониманием не будет.
Сама система располагается на отдельном разделе, который монтируется при загрузке. Процесс загрузки достаточно гибкий и имеет большое количество опций и возможностей. Подробно это описано в мануалах booting(8), boot(8), 9boot(8), plan9.ini(8), root(3), init(8). В простейшем случае рассмотрим загрузку с раздела в случае простейшей конфигурации - установки на виртуальную машину, эмулирующую PC-x64.
Загрузочный раздел представляет собой небольшой раздел в формате FAT16. В нем хранятся файлы ядра (имя зависит от архитектуры, для систем x64 9pc64), загрузчика 9bootfat и начальной конфигурации plan9.ini, каталог для загрузки UEFI efi и некоторые другие. Содержимое каталога можно посмотреть, примонтировав его и перейдя в каталог:
9fs 9fat
cd /n/9fat
Необходимость такого раздела и выделения в отдельный этап загрузки связана с тем, что подразумевается возможность загрузки бездисковых систем и начальный загрузчик должен скачиваться с другого сервера по PXE.
На стадии установки системы этот раздел помечается как активный и в него загружается MBR, либо настраивается как UEFI. При загрузке системы управление передается загрузчику 9bootfat. Задача загрузчика прочесть конфигурацию из plan9.ini, проинициализировать оборудование для дальнейшей загрузки и ядро, имя которого (9pc64) также считывается из файла конфигурации. Также загрузчик монтирует раздел, указанный в plan9.ini в качестве корневого и передает управление программе /boot/boot, которая монтирует корневую файловую систему из файла bootfs.paq. Затем управление передается файлу init расположенном в каталоге, соответствующем архитектуре системы, в частности /amd64/init Программа init запускает rc и скрипты настройки системы - /rc/bin/cpurc либо /rc/bin/termrc, в зависимости от типа сервера, указанного в plan9.ini (по умолчанию cpu). Данными скриптами производится монтирование интерфейсов ядра, подключение и инициализация сетевых сервисов, системных устройств, установки хостнейма, синхронизация времени итп. Далее rc инициализирует начальную конфигурацию выполняя /rc/lib/rcmain. После чего система обращается в каталог lib/profile пользователя, указанного в plan9.ini (по умолчанию glenda), и производит для него настройку окружения. В профиле указываются варианты дальнейшей загрузки системы для конкретного пользователя, в частности, старт графической оболочки rio и ее настройки.
9boot
Файл загрузчика в зависимости от вариантов загрузки может иметь разное имя: 9bootfat, 9bootiso, 9boothyb, 9bootpxe, bootia32.efi, bootx64.efi, efiboot.fat
Загрузчик имеет интерактивный режим, в который он переходит, когда встречает в параметрах plan9.ini значение ask либо при различных ошибках файла конфигурации (неподдерживаемые значения, неправильный формат, отсутствие важных параметров, отсутствие самого файла конфигурации). В интерактивном режиме можно вручную набрать все параметры, указываемые в файле plan9.ini в таком же формате: параметр=значение. При этом имеющиеся проинициализированные параметры будут переназначены введенными. Также загрузчик может выполнять некоторые команды:
-
clear [префикс]
- сброс параметра, указанного в качестве префикса. Без префикса сбрасывает всю конфигурацию plan9.ini -
show
- отображает текущую конфигурацию в памяти. -
wait
- выход из интерактивного режима в консоль. -
boot
- закрытие консоли и попытка загрузить ядро.
Загрузчик работает с параметрами, считанными из файла конфигурации в память и после загрузки файл конфигурации не обновляет. Если производилась модификация параметров, их надо прописать в уже загруженной системе:
9fs 9fat
acme /n/9fat/plan9.ini
Параметры конфигурации становятся переменными среды и их можно прочесть в соответствующих файлах в каталоге /env:
for (i in bootfile bootargs mouseport monitor vgasize tiltscreen user nobootprompt) {echo -n $i^'='; cat /env/$i;echo}
plan9.ini
Файл конфигурации предоставляет возможности гибкой и многовариантной стартовой конфигурации, организации загрузочного меню итп. Более подробно описание файла конфигурации и всех его параметров можно посмотреть в мануале plan9.ini(8). В простейшем случае рабочий файл выглядит так:
bootfile=9pc64
bootargs=local!/dev/sdF0/fscache
mouseport=ps2intellimouse
monitor=vesa
vgasize=1440x900x16
tiltscreen=none
user=glenda
nobootprompt=local!/dev/sdF0/fscache
-
bootfile - имя ядра. При отсутствии или некорректном имени загрузчик переходит в интерактивный режим и просит ввести имя файла с ядром. После ввода можно попробовать загрузиться командой
boot
. -
bootargs - Путь к корневому разделу, который устанавливается инсталлятором системы.
-
mouseport - Настройки мыши. Для наилучшей поддержки современных мышек использовать ps2intellimouse
-
monitor - тип монитора.
-
vgasize - Размер экрана и глубина цветности. В Linux список корректных значений разрешения монитора можно посмотреть командой
xrandr
-
tiltscreen - Поворот экрана, можно указать градус поворота. Но лучше не надо.
-
user - Имя пользователя, от имени которого стартует система. На первых порах оставить glenda
-
nobootprompt - Добавленный параметр со значением, аналогичным bootargs. Добавление данного параметра делает загрузку автоматической.
Сразу после установки в параметрах bootargs, mouseport, vgasize, user будет проставлено значение ask и перед загрузкой придется вводить их заново либо подтверждать заданные по умолчанию. Поэтому после установки надо примонтировать загрузочный раздел и отредактировать plan9.ini. Также вместо bootargs надо задать параметр nobootprompt с аналогичным значением.
Допустимы комментарии - строки начинающиеся с #.
boot
Данная программа является первой, запускаемой с момента начала загрузки системы, запускается исключительно ядром. Ее задача примонтировать образ корневой системы, хранящейся в файле /boot/bootfs.paq.
boot и bootrc инициализируют интерпретатор rc подключает носитель основной файловой системы (локальный раздел либо удаленный файловый сервер), производит авторизацию при необходимости и передает управление программе init, устанавливает две переменные среды /env/cputype и /env/terminal описывающие тип процессора.
bootfs.paq
Это минималистичный образ файловой системы, подобный initrd. Расположен в каталоге /boot вместе с программой для его распаковки paq. Его содержимое можно посмотреть в /n/paq, набрав команду paqfs bootfs.paq
. Там же можно посмотреть /n/paq/rc/bin/bootrc, упомянутый в предыдущем разделе. В нем в частности описан процесс последовательной перемонтировки каталогов.
Насколько можно понять, из образа bootfs.paq разворачивается минимальная файловая система в каталог /root временного корневого каталога, в который затем перемонтируется содержимое этого каталога /root. Каталог /root это заполнитель, для того чтобы к его подкаталогам можно было примонтировать каталоги корневой системы основного раздела.
init
Инициализация системы при загрузке. Производит инициализацию пространства имен, вызов интерпретатора rc (но можно указать другой), и далее в зависимости от переданного параметра cpurc или termrc. Также init устанавливает переменные окружения $service, $objtype, $user и $timezone согласно параметрам, переданным ей при запуске.
cpurc и termrc
cpurc или termrc запускаются из init и настраивают загружающуюся машину в режим соответственно сервера или терминала. Режим сервера многопользовательский и не требует авторизации при загрузке. Режим терминала однопользовательский и спрашивает пароль после инициализации загрузчика.
Оба скрипта производят следующее: монтирование интерфейсов ядра, каталогов, инициализируют каталог устройств /dev, подключают сервис авторизации, инициализируют сеть если на данном этапе она еще не была поднята, подключают swap.
lib/profile
В данном файле содержатся команды, индивидуальные для подключающегося пользователя, формирующие его рабочее пространство. Изначально этот файл генерируется при создании пользователя (см. newuser(8)), затем его можно дополнить по своему усмотрению. В файле предусмотрены варианты запуска машины в режиме сервера и терминала, и можно предусмотреть разную конфигурацию для них.
Из этого файла уже далее стартует rio и тут можно дополнительно настроить его запуск - включить прокрутку окон консоли (параметр -s), установить черный фон для нее (параметр -b) передать параметром скрипт, в котором указаны программы, их окна с размерами и координатами на экране.