Własny Linux od zera na przykładzie Linuksa dla OBDH

   Niniejszy artykuł opisuje tworzenie bardzo prostego Linuksa na potrzeby komputera pokładowego (OBDH) dla studenckiego satelity ESEO.

   Ponieważ OBDH od strony software'owej miał być jak najmniejszy i jak najprostszy a jednocześnie niezawodny, zdecydowaliśmy się na stworzenie własnej mikrodystrybucji Linuksa. Ponieważ tworzone oprogramowanie opiera się na bibliotekach czasu rzeczywistego RTAI konieczne było użycie jądra z patchem Adeos. Wybrany został tandem: jądro 2.6.9 oraz Adeos r9c3. RTAI jest w wersji 3.1. W celu stworzenia naszej dystrybucji wykonaliśmy następujące kroki:
1. Utworzenie i sformatowanie partycji dla Linuksa. Wykorzystany został system plików ext2. Użyć można dowolnego narzędzia, np. fdisk albo jakiegoś klikanego.
2. Utworzenie struktury katalogów (/sbin, /boot, /etc, /bin, /usr) oraz specjalnego katalogu /dev za pomocą paczki z dystrybucji Slackware.
3. Ściągnięcie i rozpakowanie jądra 2.6.9.
4. Nałożenie na źródła jądra Linuksa patcha Adeos r9c3.
5. Konfiguracja jądra polegająca na usunięciu wszystkich niepotrzebnych składników, takich jak obsługa sieci, dźwięku czy USB.
6. Kompilacja jądra i umieszczenie go na dysku docelowym w katalogu /boot. U nas plik jądra nosił nazwę kernel.
7. Instalacja i kompilacja bibliotek oraz modułów RTAI. Aby podnieść niezawodność chcemy nasze programy kompilować statycznie a to wymaga statycznych bibliotek. Konfigurując RTAI włączamy więc tworzenie bibliotek statycznych uruchamiając ./configure z parametrem --enable-static=yes (a potem oczywiście wydajemy polecenia make i make install). Po instalacji kopiujemy moduły RTAI na dysk docelowy w to samo miejsce (/usr/realtime/modules/)
8. Instalacja bootloadera. W tym celu w /etc umieszczamy odpowiedni plik lilo.conf a także pliki lilo w /boot. Podając lilo parametr -r oraz punkt montowania partycji z naszą dystrybucją powodujemy wykonanie przez lilo chroota tą partycję i instalację lilo.
Przykładowa zawartość pliku lilo.conf:

boot = /dev/hdc
disk=/dev/hdc
	bios=0x80
delay=20
timeout = 50
vga = normal
install = /boot/boot.1640
map = /boot/map
root = /dev/hda1
default = Linux
image = /boot/kernel
	label = Linux
	read-only

W pierwszych dwóch linijkach widzimy /dev/hdc gdyż dysk został podłączony do drugiego kontrolera jako master. Ponieważ gdy Linux będzie się z niego bootować dysk będzie podłączony do pierwszego kontrolera, jako root podane jest /dev/hda1. Ponadto konieczna była linijka bios=0x80.
9. Teraz możemy spróbować uruchomić naszego Linuksa. Bootowanie powinno się zakończyć komunikatem Kernel panic w związku z brakiem inita.
10. Piszemy swojego inita. Init wykorzystany w OBDH jest prosty. Najpierw za pomocą funkcji fork() i execlp() uruchamia program insmod, który ładuje do jądra moduły RTAI. Potem otwiera plik /etc/init.conf z którego wczytuje programy do uruchomienia a następnie uruchamia je. Potem wpada w nieskończoną pętlę gdyż zakończenie się procesu inita spowodowałoby Kernel panic. init musi być skompilowany statycznie i musi być w katalogu /sbin.
11. Podczas kompilacji statycznej programów należy pamiętać, aby wywołując gcc podać kompilowany plik przed linkowanymi bibliotekami, np.:
gcc -o test test.c -I/usr/realtime/include -L/usr/realtime/lib -static -lpthread -llxrt