Jak stworzyć własną dystrybucję Linuxa

Szymon Bargłowski




1. Wstęp

Linux From Scratch (w skrócie LFS) — „Linux od zera”: projekt Open Source mający na celu pomóc zaawansowanym użytkownikom Linuxa w tworzeniu własnej dystrybucji. Zawiera podręcznik LFS Book i podstawowe pakiety źródłowe niezbędne do stworzenia prostej, tekstowej dystrybucji (aby stworzyć graficzną dystrybucję, samemu trzeba zdobyć źródła potrzebnych pakietów). [Wikipedia]

2. Wersje / rozszerzenia

LFS Główny podręcznik, na którym opierają się wymienione poniżej pozycje. LFS opisuje krok po kroku sposób budowania systemu Linux poczynając od samego kodu jądra.
BLFS „BEYOND LINUX FROM SCRATCH” Opisuje jak przerobić świeżo zakończoną instalację opisaną w LFS na skonfigurowany według naszych potrzeb kompletny system.
ALFS „AUTOMATED LINUX FROM SCRATCH” Udostępnia narzędzia do zautomatyzowanego wykonania czynności opisanych w LFS i BLFS. Zawiera GUI oraz biblioteki służące do obsługi Internetu.
CLFS „CROSS LINUX FROM SCRATCH” Udostępnia narzędzia do kompilacji krzyżowej systemu Linux na wielu różnych typach systemów (zgodnie z LFS).
HLFS „HARDENED LINUX FROM SCRATCH” skupia się na budowaniu systemu LFS z większym naciskiem na bezpieczeństwo. HLFS zawiera w sobie również elementy BLFS.



3. Czemu warto zainteresować się LFS:



4. Instalacja

4.1 Przygotowanie
Budujemy własny system LFS używając wcześniej zainstalowanej dystrybucji. Tego gotowego systemu Linux (hosta) używamy jako punktu wyjścia, ponieważ będą potrzebne takie programy jak kompilator, linker i jakaś powłoka, żeby zbudować nasz nowy system.

4.2 Nowe partycje
Zalecane jest stworzenie nowej partycji, aby dokonać na niej instalacji LFS (system minimalny — około 1,2GB, pełny do 3GB), a do tego małej partycji wymiany (swap), która może być swapem dotychczas używanej dystrybucji Linux’a. W tym celu używamy cfdisk albo fdisk.

4.3 System plików na nowej partycji
Na nowej partycji zakładamy system plików, dawniej był to na ogół ext2, dzisiaj stosuje się jego rozszerzenie z dziennikowaniem (journaling), H-drzewami i innymi ulepszeniami, zwane ext3.

4.4 Montowanie nowej partycji
Mamy system plików, więc chcemy mieć dostęp do naszej partycji. Uzyskujemy go poprzez montowanie jej pod katalogiem /mnt/lfs (tak jest w książce LFS), chociaż tak naprawdę jego nazwa nie ma znaczenia.

4.5 Pakiety i łatki
Lista wszystkich pakietów, których potrzebujemy do budowy podstawowego systemu Linux znajduje się pod adresem:

http://republika.pl/loz/lfs/chapter04/packages.html

Całkowita wielkość tych pakietów zajmuje 134Mb, a ich wymienianie mija się z celem prezentacji. Ważniejsze łatki znajdziemy pod adresem:

http://republika.pl/loz/lfs/chapter04/patches.html

4.6 Konstruowanie tymczasowego systemu
W tym punkcie kompilujemy i instalujemy minimalny system Linux. Będzie on zawierać wystarczające narzędzia do konstrukcji ostatecznego systemu LFS w następnym punkcie. Najpierw budujemy kompilator, assembler, linker i biblioteki, a potem wykorzystujemy je do stworzenia pozostałych podstawowych narzędzi. Celem tych działań jest stworzenie tymczasowego środowiska pozwalającego nam oderwać się od systemu macierzystego. Pliki skompilowane w tym rozdziale zostaną ze względu na swoją „tymczasowość” umieszczone w katalogu $LFS/tools, żeby nie mieszać ich z późniejszymi plikami.

W pierwszej kolejności instalujemy Binutils (pozyskując linkera i assemblera), ponieważ wykonywanie skryptu configure dla wielu programów konfiguruje je w oparciu m.in. o wersję tak ważnych narzędzi jak ld i as, wybierając opcje, jakie należy im podawać.

Następnie instalujemy pakiety GCC i Glibc w wymienionej kolejności. Glibc jest samowystarczalny pod względem swoich mechanizmów budowania i w zasadzie nie polega na parametrach (ustawieniach) domyślnych zestawów narzędziowych.

Po zainstalowaniu Glibc trochę go dopasowujemy tak, aby zapewnić, że przeszukiwanie i linkowanie będzie miało miejsce jedynie w zakresie z prefiksem /tools. Instalujemy dopasowany ld, który ma wbudowaną konstrukcyjnie ścieżkę ograniczoną do /tools/lib. Następnie poprawiamy plik specyfikacji gcc aby wskazywało na nasz nowy dynamiczny linker w /tools/lib. Ten ostatni krok ma istotne znaczenie dla całego procesu (ścieżka do tego linkera będzie osadzana w każdym wykonywalnym pliku).

Podobną sztuczkę i z tego samego powodu musimy wykonać w przypadku GCC i Binutils, uwalniając się ostatecznie od systemu macierzystego.

4.7 Instalowanie podstawowych programów systemu
W tym punkcie wchodzimy na miejsce budowy i zaczynamy na poważnie konstruowanie naszego systemu LFS. Jako root wykonujemy polecenie chroot do naszego małego tymczasowego systemu, tworzymy pewne pomocne rzeczy (np. ustawiamy zmienne środowiskowe) i rozpoczynamy instalowanie kolejnych pakietów (kolejność ich instalacji jest opisana w książce LFS). Ze względu na ilość nie zamieszczam ich w tej prezentacji.

Do pomyślnego zakończenia instalacji brakuje nam ustawienia skryptów ładowania systemu (setclock, ewentualnie loadkeys — jeżeli wcześniej nie postanowiliśmy wkompilować układu klawiatury w jądro, syslogd, localnet, network). Następnie tworzymy plik /etc/fstab, budujemy jądro i dokonujemy konfiguracji GRUB-a, żeby móc wybrać nasz LFS przy uruchamianiu komputera. Pod koniec można jeszcze uszczuplić naszą dystrybucję usuwając niepotrzebne z naszego punktu widzenia elementy (np. symbole debuggowania zajmują kilkadziesiąt Mb, a nie są potrzebne wszystkim użytkownikom)

5. LiveCD

LiveCD jest po prostu systemem operacyjnym, przechowywanym na bootowalnej płytce CD. Uruchamia się on w pamięci RAM, bez potrzeby instalowania go na dysku twardym. Są oczywiście wersje, które mogą zostać zbootowane z PenDrive’a, większość może również odwoływać się do innych dysków twardych, czy napędów znajdujących się w komputerze. LiveCD może zostać z powodzeniem użyty jako system macierzysty (host) do zbudowania systemu LFS, mimo, że nie zawiera tylu różnych narzędzi, co pełny system. Ciekawy jest fakt, że większość LiveCD oparto o system Linux.