В середине декабря 2002 года в систему была добавлена новая характеристика, заменяющая устаревший файл загрузки #//boot на загрузочный каталог и, взамен двоичного файла, требующего компиляции, появился сценарий.
В конфигурационном файле ядра появился новый раздел под названием «bootdir», который содержит список файлов, заменяющих #//boot. В каталоге #/больше нет двоичных файлов.
Типичный раздел bootdir выглядит примерно вот так:
bootdir bootpcdisk.out boot /386/bin/ip/ipconfig /386/bin/auth/factotum /386/bin/disk/kfs /386/bin/cfs
который сообщает, что каталог /boot содержит четыре файла: boot, ipconfig, factotum, kfs и cfs, скопированные из указанных источников.
Все ядра имеют специальный файл boot$CONF.out, указывающий на загрузочные файлы в /boot.
Теперь, когда все находится в /boot, для всех ядер был изменен initcode; /boot/boot изменен для выполнения /boot/ipconfig (взамен /ipconfig), и т.п. Наконец, изменениям подвергся auth_getkey, теперь для работы с любым типом ядра он сперва выполняет поиск /factotum, а затем /boot/factotum.
Загрузочный файл /386/bin/ip/ipconfig переключается на _386_bin_ip_ipconfig.root.s, а затем _386_bin_ip_ipconfig.root.8. Немного уродливое имя, ноmk нормально обрабатывает его. Одно неудачное последствие большого имени — это то, что _386_bin_auth_factotum.root.s является слишком длинным для соединения с текущими файловыми серверами. Вы конечно можете использовать сервер lnfs для работы, но я бы не стал. Для устранения зависимости отlnfs(4) при постройке ядер в файл portmkfile было добавлено новое правило, которое копирует factotum и ipconfig в factotum.hack и ipconfig.hack. После этого раздел bootdir выглядит примерно так:
bootdir bootpcdisk.out boot ipconfig.hack ipconfig factotum.hack factotum /386/bin/disk/kfs /386/bin/cfs
грустно (!), но проблема устраняется при использовании именно длинных имен файлов.
Pc initcode также был изменен, поскольку до этого он обычно делал:
exec("/boot", ["boot", 0]);
на ассемблере (pc/initcode.s), сейчас он делает:
open("#c/cons", OREAD); open("#c/cons", OWRITE); open("#c/cons", OWRITE); bind("#c", "/dev", MAFTER); bind("#ec", "/env", MAFTER); bind("#e", "/env", MCREATE|MAFTER); bind("#s", "/srv", MREPL|MCREATE); execl("/boot/boot", "/boot/boot", 0);
на С (port/initcode.c). Указатель устанавливает достаточное пространство имен, когда /boot/boot может быть сценарием оболочки. В конечном счете другие архитектуры также должны изменятся.
Другим примером является ядро под названием pcext, построенное мною однажды ночью. Оно использует rx и trampoline для соединения через шлюз машины Plan 9 к корневому файловому серверу. В нем используется такой bootdir:
bootdir bootext boot /386/bin/rc /rc/lib/rcmain /386/bin/bind /386/bin/cat /386/bin/cp /386/bin/echo /386/bin/mount /386/bin/sleep factotum.hack factotum /386/bin/ip/ipconfig /386/bin/cfs /386/bin/aux/srvthru
(также не требует lnfs для постройки).
Srvthru — очевидная в этих случаях программа: она подключается к rx, производит аутентификацию, запускает trampoline на настоящем файловом сервере, а затем подключает cfs к соединению.
Указателем является сценарий оболочки bootext, существенно упрощающий работу:
#!/boot/rc -m /boot/rcmain cd /boot cp '#r/rtc' '#c/time' bind -a /boot /bin bind -a '#I' /net bind -a '#l0' /net bind -a '#S' /dev bind '#p' /proc bind '#d' /fd bind -a /boot / ipconfig echo 'authdom=cs.bell-labs.com auth=204.178.31.3' >>/net/ndb factotum -sfactotum -u -a 204.178.31.3 cargs=() if(~ $#cfs 1 && ! ~ $cfs off) cargs=(-c $cfs) srvthru $cargs tcp!204.178.31.2!17009 il!emelie!9fs boot emelie mount -c /srv/boot /root bind -ac /root / bind -c /root/mnt /mnt mount -a '#s/factotum' /mnt rootdir=/root rootspec= /386/init -t /boot/rc -m/boot/rcmain -i # in case init fails
Он заботится обо всем, что традиционно делает /boot, используя srvthru как путь установки /srv/boot (а также /srv/emelie).
Copyright © 2003 Перевод Андрей С. Кухар. Последняя модификация 22.08.2003