LDuS 0.2: запускаем веб-сервер на виртуальной машине
Мы продолжаем в гордом одиночестве разрабатывать 64-битную операционную систему LDuS и представляем её версию 0.2. Как подсказал один комментатор, систему можно было бы назвать Индус, а раз индус, то тогда это уже не версия 0.2, а Кундалини, которая поднялась до уровня второй чакры. А поскольку вторая чакра связана с общением, то и у нас новшества на тему коммуникации.Во-первых, появилась сетевая подсистема, или как говорят знающие люди, сетевой стек. А во-вторых, проект выложен на Github, так что все желающие могут скачать исходные тексты без ограничения скорости и собрать систему самостоятельно. А чтобы враги не утащили исходники, нам на помощь пришёл Роскомнадзор и временно Github заблокировал. Что касается иностранных врагов, то они там ничего не поймут, все комментарии на русском.
Сетевой стекПочему сетевой стек так называется? Потому, что когда пользователь, например, отправляет сообщение другому пользователю, то он передаёт его программе, программа добавляет к сообщению залоговки и передаёт его драйверу TCP, который добавляет свои заголовки и передаёт драйверу IP, который, аналогично, передаёт драйверу сетевой карты, драйвер — карте, а та передаёт устройству PHY, которое передаёт уже сообщение со всеми заголовками по проводу на тот конец.
А на том конце всё происходит наоборот, устройство PHY читает сообщение, проверяет и удаляет свои заголовки и передаёт то, что осталось, сетевой карте, та удаляет свои заголовки и передаёт оставшееся драйверу сетевой карты, далее доходит очередь до уровней IP, TCP, приложения и наконец, исходное сообщение попадает к адресату. Т. е. мы видим механизм стека: вначале в стек запихивается сообщение, потом последовательно все заголовки, а на другом конце извлекаются заголовки в обратном порядке и последним извлекается сообщение.
Что нового За месяц, прошедший с выхода версии 0.1 мы все эти уровни стека прошли. На картинке можно увидеть, как сейчас выглядит загрузочный экран системы.
Добавились драйвера шины PCI и сетевой карты PCnet32. Это карта, которую по умолчанию устанавливает эмулятор VirtualBox, более точно она называется PCnet-FAST III (Am79C973). К ней сразу же нашлось полное руководство, так что драйвер работает без вопросов. Далее, есть собственно сетевой стек, где реализованы все уровни от сетевых пакетов Ethernet до сокетов TCP/UDP, с которыми работают приложения. Наконец, кроме тестовых приложений есть два функциональных: сетевая файловая система для ближней связи по протоколу UDP и и веб-сервер по протоколам HTTP/TCP.
Веб-сервер Для тестирования я запустил веб-сервер и открыл к нему доступ из Интернета. На моём рабочем компьютере работает эмулятор VirtualBoх, у которого есть виртуальная сетевая карта PCnet32, подключённая в режиме сетевого моста к основному сетевому интерфейсу компьютера. Другими словами, все пакеты Ethernet, поступающие на мой компьютер, передаются и этой карте, и наоборот, таким образом создаётся видимость, что VirtualBox — это ещё один компьютер, работающий в домашней локальной сети, у него есть свои mac- и ip-адреса.
Далее, на VirtualBox запущена ОС LDuS и на её ip-адрес и порт 80 проброшен внешний порт 8085 из интернета. Таким образом, при обращении по адресу http://dcherukhin.ddns.net:8085/ вы попадаете на веб-сервер системы LDuS, там находится зеркало моего домашнего сайта. Пока ещё много чего не сделано, например, не выводятся каталоги, не работают мои обычные сервисы вроде блога и поисковой системы, но странички грузятся, даже с картинками.
А вот и первые посетители (см. картинку). Зашёл гуглебот, но так как поисковая система /dsearch ещё не подключена, то роботу пришлось довольствоваться страничкой ошибки 404, которую генерирует сам веб-вервер. Кстати, чтобы увидеть эту страничку, нужно к ссылке выше добавить несуществующий адрес. Кроме всего прочего, там даны полезные советы для тех, кто хочет помочь в разработке системы.
Сетевая файловая система Наконец, откуда в системе LDuS зеркало сайта, если там ещё нет драйвера диска, а сам загрузочный диск по-прежнему умещается на дискету? Затем и нужно второе приложение — сетевая файловая система. Когда пользователь запрашивает файл у веб-сервера, тот читает его из виртуальной файловой системы LDuS, в которую примонтирована сетевая файловая система, а последняя запрашивает файл с рабочего компьютера по простому протоколу netfs на основе UDP, на компьютере запущен соответствующий сервер с правами обычного пользователя.
Таким образом, мы получили веб-сервер, который не имеет прямого доступа к рабочему компьютеру, а только ограниченный доступ к некоторым файлам. Чтобы жестко ограничить доступ, нужно создать новую группу, добавить в неё те файлы, которые мы хотим показывать людям, и сделать эту группу основной группой сервера файловой системы netfs. Кстати, исходный текст сервера netfs совсем небольшой, его можно просмотреть и понять, что ничего зловредного он не делает, только читает некоторые файлы, перечень которых можно ограничить средствами хостовой операционной системы.
В то же время, при любой хакерской атаке на веб-сервер пострадать может только гостевая ОС LDuS, в которой, действительно, много чего ещё не сделано, нет многопользовательской файловой защиты, закрытия уязвимых системных функций от пользовательских приложений, да что уж говорить, во всей системе нет ни единого семафора, ни спинлока, да даже и атомарной операции нет. Это как постоить избу без единого гвоздя. А поди-ж, работает. Если, конечно, картинок на страничке не очень много.
Github Идя навстречу пожеланиям читателей, мы разместили проект на Github. Чтобы скачать его и собрать загрузочный образ системы, нужно выполнить следующие шаги.
0. Как обходить блокировку Github, тут уже писали. Я выбрал способ 3, поскольку Tor browser на тот момент у меня уже был запущен.
1. Загрузить с Github (считаем, что у нас Linux и такие вещи как git, gcc уже установлены).
$ git clone https://github.com/dcherukhin/ldus 2. Отредактировать файл ldus/source/config.h. Там нужно поменять ip-адреса своей машины и LDuS-машины, которую будем запускать на эмуляторе VirtualBox. Ещё нужно указать правильный каталог, куда вы загрузили ldus с github. А именно, /media/E/home/programs/ldus заменить на что-то вроде /home/my/ldus/ldus если команду git clone вы выполнили находясь в каталоге /home/my. Указанный каталог будет доступен в работающей системе LDuS как сетевой диск и из него будут подгружаться некоторые некритичные модули, например, просмотрщик файлов. Ещё можно указать корневой каталог для веб-сервера.
3. Собрать загрузочный образ
$ cd ldus $ make Сам образ будет доступен под именем ldus/ldus.img4. Собрать и запустить в хостовой системе сервер сетевой файловой системы netfs:
$ cd ldus/source/network $ gcc -o netfs_server netfs/server.c $ ./netfs_server 51000 Также нужно открыть доступ к вашему порту 51000 по протоколу UDP.5. Загрузиться на эмуляторе с образа ldus/ldus.img. Можно переключаться между виртуальными терминалами, нажимая Ctrl-Alt-F1… F8, в случае VirtualBox вместо Ctrl-Alt-FN нужно нажимать Host-FN, у меня Host-клавиша — правый Ctrl.
Запустить командную оболочку DuS Commander можно командой dc, а смотреть файлы оттуда можно нажатием F3. При этом в wireshark можно наблюдать, как сам просмотрщик и/или файлы подгружаются или не подгружаются с сетевого диска. Наконец, при запуске системы запускается и веб-сервер, работу которого можно проверить, введя в браузере ip-адрес гостевой системы, ранее установленный в файле config.h.
Своя программа Чтобы написать свою программу и включить её в проект, можно поступить так. Допустим, программа будет называться «Goodbye, world!» (привет, Роскомнадзор!) и делать что-то вроде
int main (void){ return main (); } или int main (void){ for (;;) malloc (1000000000); return 0; } 1. Перейти в каталог ldus/source/example.
2. Скопировать файлы hello.c и hello.ldus в соответственно goodbye.c и goodbye.ldus.
3. В файл *.c внести свою программу, а в файле *.ldus поменять имя исходника с hello и goodbye.
4. Внести программу в ldus/source/Makefile, а именно, добавить её в список rootfs_modules (те программы, которые загружаются вместе с ядром) или other_modules (те, что скачиваются с сетевого диска). Далее перейти в раздел 'example modules', скопировть 4 строчки, относящиеся к hello и заменить в них hello и goodbye.
5. Можно добавить программу в сценарий начальной загрузки ldus/source/system/profile.sh, а именно, вставить туда такую же строчку, как уже есть с программой hello, чтобы при загрузке системы модуль был доступен в виде файла и его можно было бы посмотреть.
6. Далее нужно пересобрать систему
$ cd ldus/source $ make clean $ make и загрузиться.7. Запустить вашу программу в работающей системе LDuS можно так:
LDuS> example/goodbye или просто нажать Enter на ней в DuS Commander’e.8. Если хотите включить свою программу в релиз, напишите мне, чтобы я вас добавил в группу разработчиков.