Następna strona Poprzednia strona Spis treści

4. Budowanie głównego systemu plików.

Tworzenie głównego systemu plików wymaga wyselekcjonowania plików niezbędnych dla działania systemu. W tym rozdziale opiszemy, jak zbudować skompresowany główny system plików. Rzadziej spotykanym rozwiązaniem jest stworzenie nieskompresowanego systemu plików na dyskietce, która będzie mogła zostać bezpośrednio zamontowana jako główna. Taka alternatywa jest opisana w rozdziale Systemy plików bez ramdysku.

4.1 Wiadomości ogólne.

Główny system plików musi zawierać to wszystko, co potrzebne jest do prawidłowego działania pełnego systemu Linux. Aby tego dokonać, dyskietka musi spełniać minimalne wymagania dla systemu Linux, to znaczy musi posiadać:

Oczywiście system staje się użyteczny tylko wtedy, gdy można coś na nim uruchomić. Dyskietka główna w zasadzie staje się użyteczna tylko wtedy, gdy można wykonać poniższe czynności:

Opiszemy jak stworzyć skompresowany system plików, nazwany tak dlatego, że jest on spakowany na dyskietce a podczas startu systemu zostaje zdekompresowany do ramdysku. W skompresowanym systemie plików można zmieścić sporo plików (około sześć megabajtów) na standardowej dyskietce 1.44MB. System plików jest większy niż dyskietka, więc nie można go tworzyć na dyskietce. Musimy stworzyć go gdzie indziej, skompresować a następnie skopiować na dyskietkę.

4.2 Tworzenie systemu plików.

Aby stworzyć główny system plików potrzebne jest wolne urządzenie, na którym muszą zmieścić się pliki przed kompresją. Potrzebujesz urządzenia o rozmiarze co około czterech megabajtów. Istnieje kilka możliwości:

Gdy już wybrałeś jedną z tych możliwości, przygotuj URZĄDZENIE za pomocą polecenia:

      dd if=/dev/zero of=URZĄDZENIE bs=1k count=3000

Ta komenda wyzerowuje urządzenie. Ten krok jest bardzo ważny, ponieważ system plików zostanie później skompresowany, więc niewykorzystany obszar powinien zostać wypełniony zerami, aby otrzymać jak najlepszą kompresję.

Następnie stwórz system plików. Jądro Linuxa rozpoznaje i kopiuje z dyskietki głównej do ramdysku dwa rodzaje systemów plików. Są to minix i ext2, jednak preferowany jest ten drugi. Jeśli zdecydujesz się na ext2, to przydatna może okazać się opcja -i, dzięki której możesz stworzyć więcej i-węzłów niż jest to przyjęte domyślnie. Zalecane jest użycie opcji -i 2000, aby nie zabrakło ci i-węzłów. Ewentualnie możesz zaoszczędzić sporo i-węzłów poprzez usunięcie wielu niepotrzebnych plików z katalogu /dev. Na dyskietce 1.44MB polecenie mke2fs domyślnie utworzy 360 i-węzłów. Na mojej dyskietce ratunkowej wystarcza w zupełności 120 i-węzłów, jednak gdy dołączysz wszystkie urządzenia z katalogu /dev z pewnością przekroczysz 360. Użycie skompresowanego systemu plików daje do dyspozycji więcej miejsca, czyli jednocześnie większą ilość domyślnych i-węzłów, ale ciągle może okazać się konieczna redukcja liczby plików czy zwiększenie liczby i-węzłów.

Tak więc polecenie które użyjesz powinno wyglądać mniej więcej tak:

      mke2fs -m 0 -i 2000 URZĄDZENIE

(Jeśli korzystasz z urządzenia zwrotnego, to w miejsce URZĄDZENIA powinieneś podać nazwę pliku. W tej sytuacji program mke2fs zapyta czy naprawdę chcesz to zrobić, odpowiedz tak).

Program mke2fs automatycznie wykryje ilość wolnego miejsca i odpowiednio się skonfiguruje. Opcja -m 0 zapobiega rezerwowaniu miejsca dla użytkownika root, powiększając w ten sposób dostępny obszar na dysku.

Następnie zamontuj urządzenie:

      mount -t ext2 URZĄDZENIE /mnt

(Musisz stworzyć katalog /mnt jeśli jeszcze nie intnieje.) W pozostałych działach wszystkie nazwy katalogów będą podawane wzgędem katalogu /mnt.

4.3 Zapełnianie systemu plików.

Poniżej znajduje się minimalny zestaw katalogów dla twojego głównego systemu plików:

(Pokazana tutaj struktura katalogów odnosi się jedynie do głównych dyskietek. Prawdziwe systemy Linux używają bardziej złożonych i rygorystycznych zasad ustalania gdzie plik powinien się znajdować, zwanych Filesystem Hierarchy Standard).

Trzy katalogi w głównym systemie plików pozostaną puste, więc wystarczy je utworzyć komendą mkdir. Katalog /proc to po prostu miejsce, w którym umieszczony zostanie system plików proc. Katalogi /mnt i /usr są tylko miejscami montowania innych systemów plików gdy dyskietka startowa/główna już działa. Także te katalogi wystarczy jedynie utworzyć.

Pozostałe cztery katalogi są opisane w następnych działach.

/dev

Katalog /dev zawiera specjalne pliki dla każdego wykorzystywanego przez system urządzenia, katalog ten jest obowiązkowy. Jest to zwykły katalog, więc może zostać stworzony poleceniem mkdir. Jednak poszczególne pliki urządzeń muszą zostać utworzone w nietypowy sposób, za pomocą komendy mknod.

Istnieje jednak droga na skróty, możesz skopiować zawartość istniejącego już katalogu /dev i skasować niepotrzebne pliki. Podczas kopiowania musisz użyć opcji -R, dzięki temu nie będzie kopiowana zawartość plików. Upewnij się, że użyłeś R pisanego wielką literą. Jeśli użyjesz małej litery -r, prawdopodobnie będziesz kopiował zawartość wszystkich swoich twardych dysków, a raczej tyle, ile się z nich zmieści na dyskietce. Tak więc uważaj i użyj komedy:

      cp -dpR /dev /mnt

przyjmując że system plików jest zamontowany w /mnt. Opcja dp spowoduje, że połączenia symboliczne zostaną skopiowane jako połączenia, a nie odpowiadające im pliki, oraz zostaną zachowane oryginalne atrybuty plików, włączając w to prawa własności.

Jeśli jednak masz ochotę trochę się pomęczyć, użyj komendy ls -l aby wyświetlić główne i pomniejsze numery potrzebnych urządzeń, a następnie utwórz je w katalogu docelowym używając polecenia mknod.

Gdy pliki zostaną skopiowane, warto sprawdzić czy posiadasz wszystkie potrzebne urządzenia. Na przykład ftape korzysta z napędów taśmowych, więc musisz skopiować to urządzenie jeśli chcesz mieć dostęp do napędu taśmowego z dyskietki startowej.

Pamiętaj, że każdy plik urządzenia wymaga jednego i-węzła, więc i-węzły są cennym zasobem, szególnie w przypadku systemów dyskietkowych. Dobrym pomysłem jest usunięcie niepotrzebnych urządzeń z katalogu /dev dyskietki. Wiele urządzeń jest kompletnie nieprzydatnych w konkretnych systemach. Na przykład jeśli nie posiadasz żadnych dysków SCSI, możesz bez żadnych problemów usunąć wszystkie urządzenia zaczynające się na sd. Jeśli nie masz zamiaru korzystać z portu szeregowego, możesz usunąc wszystkie pliki zaczynające się od cua.

Upewnij się, że posiadasz następujące urządzenia: console, kmem, mem, null, ram, tty1.

/etc

Ten katalog musi zawierać pliki konfiguracyjne. Zwykle pliki w tym katalogu dzielą się na trzy grupy:

  1. Zawsze wymagane przez system, np. rc, fstab, passwd.
  2. Wymagane w niektórych sytuacjach.
  3. Pozostałe śmieci.

Pliki, które nie są najważniejsze, mogą zostać znalezione za pomocą komendy:

      ls -ltru

Wyświetla ona listę plików posortowaną według daty ostatniego dostępu, więc jeśli plik nie był czytany, to znaczy że można go pominąć na głównej dyskietce.

Na mojej głównej dyskietce mam około 15 plików konfiguracyjnych. Zmniejsza to ilość pracy, którą trzeba poświecić na poprawę trzch grup plików:

  1. Pliki, które należy skonfigurować:
    1. rc.d/* -- skrypty startu systemu i zmiany poziomu pracy
    2. fstab -- lista systemów plików, które należy zamontować
    3. inittab -- parametry dla programu init, uruchamianego przy starcie systemu.
  2. Pliki, które należy poprawić:
    1. passwd -- spis użytkowników, katalogów domowych itd.
    2. group -- grupy użytkowników
    3. shadow -- hasła użytkowników, możesz nie posiadać tego pliku.
    4. termcap -- the terminal capability database.
    Gdy liczy się bezpieczeństwo, pliki passwd i shadow powinny zostać okrojone, aby uniemożliwić kopiowanie haseł poza system. Upewnij się, że plik passwd zawiera przynajmniej użytkownika root. Jeśli chcesz umożliwić logowanie się innym użytkownikom, to upewnij się czy istnieją ich powłoki i katalogi domowe. termcap, baza danych terminali, zwykle liczy kilkaset kilobajtów. Wersja znajdująca się na dyskietce powinna być okrojona tak, aby zawierała jedynie używany terminal(e), czyli najczęściej jedynie wpis linux-console.
  3. Pozostałe pliki. Na razie działają, więc można zostawić je w spokoju.

Teraz trzeba skonfigurować jedynie dwa pliki, ich zawartość jest zaskakująco mała.

Plik inittab powinien być zmodyfikowany tak, aby pozycja sysinit uruchamiała rc, czy jakiś inny skrypt startowy. Dodatkowo, jeśli nie chcesz pozwolić użytkownikom logować się przez port szeregowy, dodaj znak komentarza przed każdą linią getty zawierającą na końcu urządzenie ttys lub ttyS. Pozostaw porty tty, abyś mógł się zalogować z konsoli.

Minimalny plik inittab wygląda tak:

      id:2:initdefault:
      si::sysinit:/etc/rc
      1:2345:respawn:/sbin/getty 9600 tty1
      2:23:respawn:/sbin/getty 9600 tty2

Plik inittab określa, co system robi w niektórych sytuacjach i na poszczególnych poziomach pracy. Upewnij się, że istnieją wszystkie nazwy plików wymienione w inittab, init zawiesi się bez żadnego komunikatu o błędzie, jeśli nie znajdzie któregoś z wymienionych tam programów.

Należy sprawdzić, czy komendy znajdujące się w pliku inittab odpołują się do programów, które istnieją w odpowiednim katalogu. Jeśli umieścisz programy na dyskietce korzystając ze spisu w dodatku Spis plików przykładowej dyskietki głównej i skopiujesz plik inittab z dysku bez dokonania poprawek, to prawdopodobnie ponad połowa wpisów w tym pliku będzie się odwoływała do nieistniejących programów czy nieprawidłowych katalogów.

Niektóre programy nie mogą zostać przeniesione gdzie indziej, ponieważ inne programy szuają ich w ściśle określonym miejscu. Na przykład w moim systemie /etc/shutdown wymaga /etc/reboot. Jeśli przeniosę reboot do /bin/reboot i wykonam komendę shutdown, to wystąpi błąd, ponieważ nie może on znaleźć pliku reboot.

Jeśli chodzi o resztę, to skopiuj pozostałe pliki tekstowe oraz potrzebne programy z katalogu /etc. Jako przykład może służyć dodatek Spis plików przykładowej dyskietki startowej. Prawdopodobnie wystarczy skopiować tylko te pliki, które tam wypisano, jednak poszczególne systemy bardzo się różnią, więc nie możesz być pewien, czy nazwy pliku na tej liście pokrywają się z nazwami w twoim systemie. Jedyną pewną metodą jest sprawdzenie w pliku inittab, które pliki są wymagane.

Większość systemów posiada katalog /etc/rc.d/ zawierający skrypty dla poszczególnych poziomów pracy. Aby system działał, wymagany jest przynajmniej jeden skrypt rc, jednak prościej skopiować plik inittab i katalog /etc/rc.d z istniejącego systemu i wyciąć niepotrzebne dla systemu dyskietkowego pozycje ze skryptów w katalogu rc.d.

/bin i /sbin

Katalog /bin jest odpowiednim miejscem dla dodatkowych programów użytkowych wykonujących podstawowe operacje, takich jak ls, mv, cat czy dd. W dodatku Spis plików przykładowej dyskietki startowej znajdziesz przykładową listę plików katalogu /bin i /sbin. Nie zawiera ona jednak programów potrzebnych do odtwarzania plików z kopii zapasowych, takich jak cpio, tar i gzip, ponieważ, aby zaoszczędzić miejsce, umieszczam je na osobnej dyskietce narzędziowej. Gdy główna/startowa dyskietka zostaje wystartowana, zostaje ona skopiowana do ramdysku, pozostawiając miejsce w napędzie do zamontowania kolejnej dyskietki --- dyskietki narzędziowej. Zwykle montuję ją w katalogu /usr.

Tworzenie dyskietki narzędziowej jest opisane dalej, w dziale Budowanie dyskietki narzędziowej. Zalecane jest skopiowanie tych samych wersji programów, co użyte do stworzenia kopii zapasowej, aby nie zdarzyło się, że nie możesz odtworzyć swojej kopii, ponieważ wersje są niekompatybilne.

Upewnij się, że skopiowałeś następujące programy: init, getty lub ich odpowiedniki, login, mount, jakąś powłokę potrafiącą uruchomić skrypty rc, dowiązanie sh do powłoki.

/lib

W katalogu /lib umieszczasz potrzebne biblioteki dzielone oraz programy służące do ich ładowania. Jeśli wymagane biblioteki nie zostaną odnalezione w katalogu /lib, to system się nie zostanie wystartowany. Przy odrobinie szczęścia możesz ujrzeć komunikat mówiący o błędzie.

Prawie każdy program wymaga co najmniej biblioteki libc, libc.so.N, gdzie N to numer wersji. Sprawdz w swoim katalogu /lib. Plik libc.so.N jest na ogół symbolicznym dowiązaniem do aktualnej wersji:

 % ls -l /lib/libc*
 -rwxr-xr-x   1 root     root      4016683 Apr 16 18:48 libc-2.1.1.so*
 lrwxrwxrwx   1 root     root           13 Apr 10 12:25 libc.so.6 ->

W tym przypadku potrzebny jest plik libc-2.1.1.so. Aby dowiedzieć się, jakie jeszcze biblioteki są potrzebne, powinieneś sprawdzić wszystkie pliki wykonywalne które chcesz umieścić na dyskietce i sprawdzić ich zależności komendą ldd. Na przykład:

      % ldd /sbin/mke2fs
              libext2fs.so.2 => /lib/libext2fs.so.2
              libcom_err.so.2 => /lib/libcom_err.so.2
              libuuid.so.1 => /lib/libuuid.so.1
              libc.so.5 => /lib/libc.so.5

Wymagany jest każdy plik po prawej stronie. Pamiętaj, że wymienione biblioteki mogą być tylko symbolicznymi dowiązaniami.

Zauważ, że niektóre biblioteki są całkiem spore i mogą nie zmieścić się w głównym systemie plików. Na przykład biblioteka libc.so wspomniana wyżej liczy około 4MB. Prawdopodobnie będziesz musiał okroić biblioteki przed kopiowaniem. Zajrzyj do działu Redukowanie głównego systemu plików po więcej informacji.

Dodatkowo w katalogu /lib musisz umieścić program ładujący biblioteki. Jest to plik ld.so (dla bibliotek a.out) lub ld-linux.so (dla bibliotek ELF). Jeśli nie jesteś pewien którego z nich potrzebujesz, wykonaj komendę file z nazwą biblioteki jako parametr. Na przykład:

        % file/lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
        /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
        /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
        /lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped

QMAGIC oznacza, że wersja 4.7.2 jest biblioteką a.out, a ELF oznacza, że wersja 5.4.33 i 2.1.1 jest biblioteką ELF.

Skopiuj odpowiedni program ładujący biblioteki do tworzonego głównego systemu plików. Powinieneś dokładnie sprawdzić, czy posiadasz wszystkie konieczne biblioteki i odpowiedni program ładujący. Jeśli jądro nie potrafi załadować potrzebnej biblioteki, na ogół zawiesza się bez żadnego komunikatu.

4.4 Providing for PAM and NSS.

System może wymagać dynamicznie ładowanych bibliotek niewidocznych dla ldd.

PAM (Pluggable Authentication Modules).

Jeśli twój system korzysta z PAM (Pluggable Authentication Modules), to musisz się na to przygotować, ponieważ w przeciwnym wypadku nie będziesz mógł się zalogować. Ogólnie mówiąc PAM to skomplikowany modularny sposób uwierzytelniania użytkowników i kontroli ich dostępu do usług. Jeśli w katalogu /etc znajduje się katalog pam.conf lub pam.d, musisz dołączyć pewne minimalne wsparcie dla PAM. (Możesz także uruchomić ldd na pliku login, jeśli w wyjściu znajdzie się tekst libpam.so, potrzebujesz PAM).

Na szczęście kwestie bezpieczeństwa nie są zazwyczaj istotne przy tworzeniu dyskietki startowej, jako że każdy posiadający fizyczny dostęp do komputera może z nim zrobić wszystko. Tak więc możesz po prostu wyłączyć PAM tworząc w głównym systemie plików prosty plik /etc/pam.conf, taki jak ten:


OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so

Skopiuj także plik /lib/security/pam_permit.so do głównego systemu plików. Ta biblioteka liczy jedynie 8KB.

Zauważ, że taka konfiguracja daje każdemu pełny dostęp do plików i usług w systemie. Jeśli z jakiś względów bezpieczeństwo dyskietki startowej jest dla ciebie ważne, musisz skopiować niektóre lub wszystkie pliki konfiguracyjne PAM z twardego dysku. Przeczytaj uważnie dokumentację PAM i skopuj wszystkie potrzebne biblioteki z /lib/security do głównego systemu plików.

Musisz także skopiować na dyskietkę plik /lib/libpam.so, ale o tym już wiesz, ponieważ uruchomiłeś ldd na /bin/login, który pokazał zależność.

NSS (Name Service Switch).

Jeśli korzystasz z glibc (aka libc6), będziesz musiał przygotować się na usługi nazw, w przeciwnym wypadku nie będziesz mógł się zalogować. Plik /etc/nsswitch.conf kontroluje dostęp do bazy danych dla poszczególnych usług. Jeśli nie planujesz korzystać z usług przez sieć (np. DNS i NIS), musisz przygotować jedynie prosty plik nsswitch.conf, taki jak ten:


     passwd:     files 
     shadow:     files 
     group:      files 
     hosts:      files
     services:   files
     networks:   files
     protocols:  files
     rpc:        files
     ethers:     files
     netmasks:   files     
     bootparams: files
     automount:  files 
     aliases:    files
     netgroup:   files
     publickey:  files

Określa to, że każda usługa będzie udostępniana jedynie poprzez lokalne pliki. Będziesz musiał także dołączyć plik /lib/libnss_files.so.1, który będzie dynamicznie ładowany aby obsłużyć żądania.

Jeśli chcesz mieć dostęp do sieci z dyskietki startowej, możesz utworzyć bardziej rozbudowany plik nsswitch.conf. Aby dowiedzieć się więcej, zajrzyj na stronę man nsswitch. Pamiętaj że musisz dołączyć plik /lib/libnss_usługa.so.1 dla każdej usługi.

4.5 Moduły.

Jeśli posiadasz jądro obsługujące moduły, to musisz zastanowić się, które moduły mogą być potrzebne po wystartowaniu systemu. Prawdopodobnie potrzebujesz modułów ftape i zftape jeśli posiadasz napęd taśmowy, modułów do urządzeń SCSI jeśli takie posiadasz i ewentualnie modułów do obsługi PPP i SLIP jeśli chcesz mieć dostęp do sieci.

Te moduły powinny zostać umieszczone w katalogu /lib/modules. Powinieneś także dołączyć programy insmod, rmmod i lsmod. Jeśli chcesz automatycznie ładować moduły, to możesz dołączyć modprobe, depmod i swapout. Jeśli korzystasz z kerneld, to dołącz go razem z plikiem /etc/conf.modules.

Jednak największą zaletą korzystania z modułów jest możliwość przeniesienia niektórych z nich na dystkietkę narzędziową, oszczędzając w ten sposób miejsce na głównej dyskietce. Gdy potrzebna jest obsługa wielu różnych urządzeń, takie podejście jest lepsze niż budowa jednego wielkiego jądra z wieloma wbudowanymi sterownikami.

Pamiętaj, aby wystartować skompresowany system plików ext2, musisz posiadać wbudowaną w jądro obsługę ext2 i ramdysku. Nie mogą znajdować się one w postaci modułów.

4.6 Końcowe detale.

Pewne programy systemowe, takie jak login, do poprawnego działania wymagają pliku /var/run/utmp i katalogu /var/log. Tak więc:

      mkdir -p /mnt/var/{log,run}
      touch /mnt/var/run/utmp

Na koniec, gdy skopiowałeś już wszystkie wymagane biblioteki, uruchom program ldconfig aby odświeżyć plik /etc/ld.so.cache w głównym systemie plików. Plik ten informuje program ładujący gdzie znaleźć biblioteki. Aby odświeżyć ld.so.cache wykonaj następujące komendy:

      chdir /mnt; chroot /mnt /sbin/ldconfig

Polecenie chroot jest konieczne, ponieważ ldconfig zawsze odświeża plik cache dla głównego katalogu.

4.7 Kopiowanie na dyskietkę.

Gdy już skończyłeś tworzenie głównego systemu plików, odmontuj go, skopiuj do pliku i skompresuj:

      umount /mnt
      dd if=URZĄDZENIE bs=1k | gzip -v9 > rootfs.gz

Zostanie utworzony plik rootfs.gz który jest skompresowanym głównym systemem plików. Powinieneś sprawdzić, czy zmieści się na dyskietce, jeśli nie, to będziesz musiał cofnąć się i usunąć jakieś pliki. Dział Redukowanie głównego systemu plików zawiera kilka porad na ten temat.


Następna strona Poprzednia strona Spis treści