Linux konfiguracja, dysk startowy i testy!
W obecnych czasach nowoczesnych okienkowych wersji Linuxa, poniższy tekst trąci już myszką:-)
Ale dla osób pracujących w środowisku znakowym, posługujących się starszymi wersjami systemu, a nade wszystko użytkowników, którzy chcą poznać ten system od podszewki, poniższy materiał będzie pierwszym z cyklu wspominkowego i dociekliwego wprowadzenia do systemu. Wiele z tych informacji może i jest przydatna do dnia dzisiejszego, czy to w przypadku kłopotów z systemem, czy chęci głębszego poznania systemów z rodziny Linux.
LINUX FAQ - DLA ADMINISTRATORÓW I PASJONATÓW
The
Linux Bootdisk HOWTO?
Dokument ten opisuje,
jak tworzyć swoje własne dyskietki startowe dla Linuxa. Dyskietki
te mogą zostać użyte jako dyskietki ratunkowe, lub w celu
przetestowania nowych składników systemu. Jeśli nie czytałeś
jeszcze Linux FAQ i powiązanych dokumentów, takich jak Linux
Installation HOWTO czy Linux Install Guide, to nie powinieneś
tworzyć dyskietek startowych. Jeśli potrzebujesz jedynie dyskietki
ratunkowej na wypadek awarii, to zajrzyj do dodatku Gotowe
dyskietki.
1. Przedmowa.
1.1 Uwagi na temat wersji.
Graham Chapman (
Ten adres e-mail jest ukrywany przed spamerami, włącz obsługę JavaScript w przeglądarce, by go zobaczyć
)
napisał oryginalną wersję Bootdisk-HOWTO i opiekował się tym
dokumentem aż do wersji 3.1. Tom Fawcett (
Ten adres e-mail jest ukrywany przed spamerami, włącz obsługę JavaScript w przeglądarce, by go zobaczyć
)
dodał sporo materiału na temat jądra 2.0 i jest on opiekunem tego
dokumentu od wersji 3.2. W dokumencie pozostało sporo oryginalnego
tekstu Chapmana.
Dokument ten jest napisany w oparciu o jądro
Linux-a w wesji 2.0 lub późniejszej. Jeśli posiadasz
starsze jądro (1.2.xx lub niższe), to zajrzyj do poprzedniej wersji
Bootdisk-HOWTO, którą możesz znaleźć na Stronie
domowej Grahama Chapmana.
Informacje zawarte w tym dokumencie dotyczą
platformy Intel. Wiele z nich może być również
poprawnych dla innych procesorów, ale nie mamy na ten temat
żadnych danych. Prosimy o kontakt ludzi mających doświadczenia z
dyskietkami startowymi na innych platformach sprzętowych.
Linux dyskietka startowa/ratunkowa
Wprowadzenie do Linuxa
Dyskietki startowe są przydatne w wielu sytuacjach,
takich jak:
-
Testowanie nowego
jądra.
-
Odzyskiwanie danych
po awarii dysku -- od utraconego boot sektora aż po uszkodzenie
głowicy.
-
Leczenie uszkodzonego
systemu. Nawet drobne potknięcie w czasie gdy jesteś zalogowany
jako root może unieruchomić cały system. Żeby go naprawić,
trzeba będzie wystartować go z dyskietki startowej.
-
Uaktualnianie plików krytycznych dla
działania systemu, takich jak libc.so.
Istnieje kilka sposobów otrzymywania dyskietek
startowych:
-
Użycie dyskietki z
dystrybucji takiej jak Slackware. Umożliwi ci ona przynajmniej
wystartowanie systemu.
-
Użycie pakietu
ratunkowego do stworzenia dyskietek ratunkowych.
-
Nauczenie się co jest potrzebne do działania
dyskietki startowej, a następnie zbudowanie jej samodzielnie.
Niektórzy używają tej ostatniej metody i
robią wszystko sami. Dzięki temu jeśli coś pójdzie nie
tak, to wiadomo co zrobić aby to naprawić. Dodatkowo jest to bardzo
dobra metoda na nauczenie się jak działa Linux.
Ten dokument zakłada podstawową znajomość zasad
administracji systemu Linux. Przykładowo powinieneś wiedzieć coś
katalogach, systemach plików i dyskietkach. Powinieneś
wiedzieć, jak używać poleceń mount
i df.
Powinieneś wiedzieć, do czego służą i jak wyglądają pliki
/etc/passwd i fstab. Powinieneś wiedzieć, że większość poleceń
w tym HOWTO powinna być wykonywana gdy jesteś zalogowany jako root.
Konstruowanie swojej własnej dyskietki startowej od
zera może być skomplikowane. Jeśli nie czytałeś Linux FAQ i
powiązanych dokumentów, takich jak Linux Installation HOWTO i
Linux Installation Guide, to nie powinieneś tworzyć dyskietek
startowych. Jeśli potrzebujesz jedynie działającej dyskietki
startowej na wypadek awarii, to o wiele
łatwiej będzie ściągnąć gotową. Aby je znaleźć, zajrzyj do
dodatku Gotowe
dyskietki.
3. Dyskietki
startowe i proces startu systemu Linux
Dyskietka startowa jest po prostu miniaturowym
systemem Linux na dyskietce. Musi on spełniać wiele funkcji
wykonywanych przez zwykły, pełnowymiarowy system Linux. Zanim
spróbujesz stworzyć własną dyskietkę, musisz zrozumieć
podstawy startowania systemu Linux. Prezentujemy tutaj jedynie
podstawy, które są wystarczające do zrozumienia reszty tego
dokumentu. Wiele szczegółów i opcji alternatywnych
zostało ominiętych.
3.1 Proces startu systemu.
Wszystkie komputery PC rozpoczynają proces startu
systemu przez wykonanie kodu znajdującego się w pamięci ROM
(konkretnie w BIOS-ie), który ładuje jeden sektor z sektora
0, cylindra 0 napędu startowego. Napęd startowy to zazwyczaj
pierwszy napęd dyskietek (oznaczony A:
w DOS-ie i /dev/fd0 w Linuxie). Następnie BIOS próbuje
wykonać zawartość tego sektora. Na większości dyskietek
startowych sektor 0, cylinder 0 zawiera:
-
kod programu
ładującego takiego jak LILO, który, aby wystartować
system, lokalizuje jądro, ładuje je i wykonuje.
-
początek jądra systemu operacyjnego, takiego
jak Linux.
Jeśli jądro Linuxa zostało przekopiowane
bezpośrednio na dyskietkę, to pierwszy sektor dyskietki będzie
jednocześnie pierwszym sektorem jądra. Kod znajdujący się w
pierwszym sektorze będzie kontynuował proces startu ładując
resztę jądra z dyskietki.
Gdy jądro zostanie w całości załadowane,
rozpoczyna ono inicjalizację sterowników. Następnie próbuje
ono załadować i zamontować główny system plików
z jednego z urządzeń. Główny system plików to po
prostu system montowany jako ``/''. Jądro musi wiedzieć, gdzie
szukać głównego systemu plików, jeśli nie znajdzie
tam obrazu który można załadować, zawiesza się.
W niektórych sytuacjach -- często w czasie
startowania z dyskietki -- główny system plików
zostaje załadowany do ramdysku, czyli do pamięci RAM która
jest traktowana przez system tak, jakby była dyskiem. Istnieją dwa
powody dla których system ładuje się do ramdysku. Po
pierwsze, RAM jest o wiele szybszy niż dyskietka, tak więc operacje
systemowe są wykonywane szybko. Po drugie, jądro może załadować
skompresowany system plików z dyskietki i rozpakować
go do ramdysku, dzieki czemu na dyskietce można zmieścić o wiele
więcej plików.
Gdy główny system plików zostanie
załadowany i zamontowany, ujrzysz taką informację:
VFS:
Mounted root (ext2 filesystem) readonly.
Następnie system odnajduje w głównym
systemie plików program init
(w katalogu /bin
lub /sbin)
i wykonuje go. init
odczytuje swój plik konfiguracyjny /etc/inittab, szuka lini
oznaczonej sysinit
i wykonuje podany tam skrypt. Skrypt sysinit
to najczęściej plik /etc/rc, /etc/init.d/boot lub podobny. Ten
skrypt to seria komend powłoki, które inicjalizują
podstawowe usługi systemu, oraz wykonują czynności takie jak:
-
Uruchamianie fsck
na wszystkich dyskach,
-
Ładowanie
potrzebnych modułów jądra,
-
Startowanie pamięci
swap,
-
Inicjalizacja sieci,
-
Montowanie dysków wymienionych w fstab.
Ten skrypt często wywołuje inne skrypty
odpowiadające za inicjalizację poszczególnych modułów.
Na przykład, w typowej procedurze inicjalizacyjnej systemów
zgodnych z SysV, katalog /etc/rc.d/ zawiera złożoną strukturę
podkatalogów, których pliki odpowiedzialne są za
załączanie i wyłączanie poszczególnych usług systemu.
Jednak na dyskietce startowej skrypty sysinit są na ogół
bardzo proste.
Gdy skrypt sysinit zakończy pracę, kontrola powraca
do programu init,
który następnie wchodzi na domyślny
poziom pracy, podany w pliku inittab
przy słowie kluczowym initdefault.
Linie poziomów pracy na ogół wyszczególniają
program taki jak getty,
który jest odpowiedzialny za obsługę komunikacji przez
konsolę i terminale. To własnie program getty
wypisuje znaną wszystkim linię zachęty ``login:''.
Wywołuje on następnie program login,
który przeprowadza weryfikacje i ustanawia sesję użytkownika.
3.2 Typy dysków.
Po zapoznaniu się z podstawami procesu startowania
systemu, możemy zdefiniować różne typy dyskietek. Dzielimy
je na cztery rodzaje.
startowa
Dyskietka zawierająca jądro
które może zostać uruchomione. Dyskietka może zostać użyta
do wystartowania jądra, które następnie może załadować
główny system plików z innego dysku. Jądro na
dyskietce startowej zwykle musi wiedzieć, gdzie znaleźć swój
główny system plików.
Często dyskietka startowa
ładuje główny system plików z innej dyskietki, ale
jest także móżliwe ładowanie głównego systemu
plików z twardego dysku. Najczęściej robi się to po to, aby
przetestować nowe jądro (w rzeczywistości podczas kompilacji
nowego jądra polecenie ``make
zdisk'' utworzy taką dyskietkę
startową).
główna
Dyskietka z systemem plików
zawierającym pliki wymagane do uruchomienia systemu Linux. Taka
dyskietka nie musi zawierać jądra czy programu ładującego.
Gdy jądro zostało już
wystartowane, główna dyskietka może zostać użyta, aby
uruchomić system niezależnie od innego dysku. Zazwyczaj główna
dyskietka jest automatycznie kopiowana do ramdysku. Znacznie
przyspiesza to dostęp do danych, oraz zwalnia miejsce w stacji na
dyskietkę narzędziową.
startowa/główna
Dyskietka zawierająca
zarówno jądro, jak i główny system plików.
Innymi słowy zawiera ona wszystko, co potrzebne do wystartowania i
uruchomienia Linuxa bez twardego dysku. Zaletą takich dyskietek jest
ich zwięzłość -- wszystko znajduje się na jednej dyskietce.
Jednak rozmiary wszystkich elementów ciągle się powiększają,
więc coraz trudniej zmieścić wszystko na jednej dyskietce, nawet
przy użyciu kompresji.
narzędziowa
Dyskietka ta zawiera system
plików, ale nie jest on jednak montowany jako główny
system plików. Jest to dodatkowa dyskietka z danymi. Używa
się jej aby dostarczyć dodatkowe programy narzędziowe
niemieszczące się na głównej dyskietce.
Gdy mówimy o ``tworzeniu dyskietki
startowej'', mamy na myśli tworzenie zarówno części
startowej (jądra) jak i głównej (plików). Mogą one
znajdować się razem lub osobno. Najbardziej elastycznym
rozwiązaniem w przypadku dyskietek ratunkowych jest użycie osobnej
dyskietki startowej i głównej, oraz jednej lub więcej
dyskietki narzędziowej.
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ć:
-
Podstawową strukturę
systemu plików,
-
Minimalny zestaw
katalogów: /dev,
/proc, /bin, /etc, /lib, /usr, /tmp,
-
Podstawowy zestaw
programów użytkowych: sh,
ls, cp, mv, itd.,
-
Minimalny zestaw
plików konfiguracyjnych: rc,
inittab, fstab, itd.,
-
Urządzenia:
/dev/hd*,
/dev/tty*, /dev/fd0, etc.,
-
Biblioteki zapewnieniające podstawowych funkcji
używanych przez programy użytkowe.
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:
-
Sprawdzić system
plików na innym dysku. Na przykład aby sprawdzić główny
system plików na dysku twardym musisz uruchomić system z
innego dysku, takiego jak dyskietka startowa. Następnie musisz
uruchomić program fsck
sprawdzający dysk twardy gdy nie jest on zamontowany.
-
Odzyskać całość lub część twardego dysku
z kopii zapasowej, używając programów kompresujących i
archiwizujących takich jak cpio,
tar, gzip i ftape.
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:
-
Użyj ramdysku (URZĄDZENIE = /dev/ram0).
W takiej sytuacji pamięć operacyjna jest wykorzystywana do
zasymulowania dysku. Ramdysk musi być odpowiedniej wielkości, tak,
aby zmieścił się na nim tworzony system plików. Jeśli
korzystasz z LILO, to w pliku konfiguracyjnym (/etc/lilo.conf)
powinna znajdować się linia:
RAMDISK_SIZE
= nnn
która
ustala ilość przydzielanej pamięci RAM. Wartością domyślną
jest 4096K, co powinno wystarczyć do naszych celów.
Prawdopodobnie nie powinieneś tworzyć takiego ramdysku na
komputerze z mniej niż 8MB RAM. Upewnij się czy istnieje urządzenie
/dev/ram0, /dev/ram czy /dev/ramdisk. Jeśli nie, to utwórz
/dev/ram0 za pomocą polecenia mknod
(liczba główna 1, poboczna 0).
-
Dobrym rozwiązaniem
jest wystarczająco duża partycja na dysku twardym.
-
Użyj użądzenia zwrotnego, które
umożliwia traktowanie pliku na dysku jako urządzenia. Korzystając
z urządzenia zwrotnego możesz stworzyć na dysku twardym plik
mający trzy megabajty i zbudować w nim system plików. Wpisz
man losetup
aby uzyskać informacje na temat korzystania z urządzeń zwrotnych.
Jeśli nie posiadasz losetup,
możesz go znaleźć razem z kompatybilnymi wersjami mount
i umount
w pakiecie util-linux
pod adresem ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/.
Jeśli nie posiadasz
urządzenia zwrotnego (/dev/loop0, /dev/loop1, itd.) w systemie, to
musisz je stworzyć za pomocą polecenia ``mknod
/dev/loop0 b 7 0''. Po zainstalowaniu
nowych wersji mount
i umount
stwórz na dysku plik tymczasowy o odpowiednim rozmiarze (np.
/tmp/fsfile). Możesz użyć komendy
dd
if=/dev/zero of=/tmp/fsfile bs=1k count=<it/nnn/
aby stworzyć plik o
długości nnn
bloków.
W poniższych przykładach
użyj nazwy pliku zamiast słowa URZĄDZENIE. Gdy montujesz taki
plik, musisz dodać opcję ``-o
loop'' aby poinformować system, że jest
to urządzenie zwrotne. Na przykład polecenie
mount
-o loop -t ext2 /tmp/fsfile /mnt
zamontuje plik
/tmp/fsfile (poprzez urządzenie zwrotne) w katalogu /mnt.
Polecenie df
potwierdzi to.
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:
-
/dev
-- Urządzenia, wymagane do operacji wejścia/wyjścia
-
/proc
-- Katalog wymagana przez system plików proc
-
/etc
-- Pliki konfiguracyjne systemu
-
/sbin
-- Programy krytyczne dla działania systemu
-
/bin
-- Podstawowe programy uważane za część systemu
-
/lib
-- Biblioteki dzielone
-
/mnt
-- Miejsce montowania innych systemów plików
-
/usr
-- Dodatkowe narzędzia i aplikacje
(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:
-
Zawsze wymagane przez
system, np. rc,
fstab, passwd.
-
Wymagane w niektórych
sytuacjach.
-
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:
-
Pliki, które
należy skonfigurować:
-
rc.d/*
-- skrypty startu systemu i zmiany poziomu pracy
-
fstab
-- lista systemów plików, które należy
zamontować
-
inittab
-- parametry dla programu init,
uruchamianego przy starcie systemu.
-
Pliki, które
należy poprawić:
-
passwd
-- spis użytkowników, katalogów domowych itd.
-
group
-- grupy użytkowników
-
shadow
-- hasła użytkowników, możesz nie posiadać tego pliku.
-
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.
-
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.
#!/bin/sh
/bin/mount
-av
/bin/hostname
Kangaroo
Upewnij
się, że katalogi są poprawne. W zasadzie nie musisz uruchamiać
hostname,
jednak jest to zalecane.
/dev/ram0
/ ext2 defaults
/dev/fd0
/ ext2 defaults
/proc
/proc proc defaults
Możesz też skopiować
pozycje z istniejącego pliku fstab,
ale nie powinieneś automatycznie montować partycji na twardym
dysku. Użyj przy nich opcji noauto.
Pamiętaj, twój dysk twardy może być uszkodzony, gdy
będziesz korzystał z dyskietki startowej.
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.
5. Wybieranie
jądra.
W tej chwili posiadasz skompresowany główny
system plików. Następny krok to zbudowanie lub wybranie
jądra. W wiekszości przypadków możliwe jest skopiowanie
aktualnego jądra i wystartowanie z niego dyskietki. Jednak w
niektórych przypadkach będziesz chciał stworzyć swoje
własne jądro.
Pierwszym powodem jest jego rozmiar. Jeśli tworzysz
pojedyńczą dyskietkę startową/główna, to jądro będzie
jednym z największych plików na dyskietce, więc będziesz
musiał jak najbardziej zredukować jego rozmiar. Aby zmniejszyć
rozmiar jądra, skompiluj je z minimalną liczbą opcji konieczną do
działania systemu. Powinieneś wyłączyć wszystko, co nie jest
potrzebne. Można spokojnie wyrzucić obsługę sieci, jak również
obsługę wszystkich napędów i innych urządzeń których
nie potrzebujesz w czasie korzystania z dyskietki. Pamiętaj, że
twoje jądro musi
posiadać wbudowaną obsługę ramdysku oraz systemu plików
ext2.
Po wybraniu minimalnej konfiguracji jądra,
powinieneś zastanowić się co jeszcze może być ci potrzebne.
Naczęściej korzysta się z dyskietki startowej aby sprawdzić i
odzyskać uszkodzone dane w systemie plików, a do tego możesz
potrzebować wbudowanej obsługi w jądrze. Na przykład jeśli swoje
kopie zapasowe przechowujesz na taśmie używając Ftape, to jeśli
utracisz swój system plików i napędy zawierające
Ftape, nie będziesz mógł odtworzyć danych z taśm
zapasowych. Będziesz musiał przeinstalować Linuxa, ściągnąć i
przeinstalować ftape i dopiero wtedy odczytywać kopie zapasowe.
Generalnie chodzi o to, aby instalować w jądze
obsługę wszystkich potrzebnych urządzeń wejścia/wyjścia.
Procedura kompilowania jądra jest opisana w
dokumentacji dołączonej do jądra. Jest ona bardzo łatwa, najpierw
zajrzyj do katalogu /usr/src/linux. Jeśli masz probemy ze
skompilowaniem jądra, to raczej nie powinieneś brać się do
tworzenia dyskietki startowej. Pamiętaj, aby skompresować jądro
poleceniem ``make
zImage''.
6. Składnie tego
wszystkiego: tworzenie dyskietek.
W tym momencie powinieneś posiadać jądro oraz
skompresowany główny system plików. Jeśli tworzysz
dyskietkę startową/główną, sprawdź, czy oba pliki
zmieszczą się na dyskietce. Jeśli tworzysz osobno dystkietkę
startową i główną, sprawdź, czy główny system
plików zmieści się na jednej dyskietce.
Powinieneś zdecydować, czy używać LILO do
wystartowania jądra. Alternatywnym rozwiązaniem jest skopiowanie
jądra bezpośrednio na dyskietkę i wystartowanie bez LILO. Zaletą
korzystania z LILO jest to, że umożliwia on przekazanie pewnych
parametrów do jądra które mogą być konieczne do
inicjalizacji sprzętu. Sprawdź plik /etc/lilo.conf. Jeśli istnieje
on i zawiera linię ``append=...'',
prawdopodobnie musisz przekazać jakieś parametry. Wadą korzystania
z LILO jest to, że tworzenie dyskietki jest bardziej skomplikowane,
i zajmuje trochę więcej miejsca. Musisz utworzyć odrębny system
plików, który nazwiemy systemem plików jądra,
do którego skopiujesz jądro i kilka innych plików
wymaganych przez LILO.
Jeśli zamierzasz korzystać z LILO, czytaj dalej.
Jeśli chcesz skopiować jądro bezpośrednio na dyskietkę, przejdź
do działu Przenoszenie
jądra bez LILO.
6.1 Przenoszenie jądra z LILO.
Pierwszą rzeczą, która
musisz zrobić, jest stworzenie małego pliku konfiguracyjnego dla
LILO. Powinien on wyglądać mniej więcej tak:
boot
=/dev/fd0
install
=/boot/boot.b
map
=/boot/map
read-write
backup
=/dev/null
compact
image
= KERNEL
label
= Bootdisk
root
=/dev/fd0
Znaczenia tych parametrów szukaj w
dokumentacji LILO. Prawdopodobnie będziesz chciał również
dodać do pliku linię append=...
taką samą, jak w pliku /etc/lilo.conf na dysku twardym.
Zapisz ten plik jako bdlilo.conf.
Następnie musisz stworzyć mały system plików,
który nazwiemy systemem plików jądra, aby
odróżnić go od głównego systemu plików.
Najpierw sprawdź, jak duży powinien być ten system
plików. Weź rozmiar twojego jądra w blokach (rozmiar
pokazywany przez komendę ``ls
-l KERNEL'' podzielony przez 1024 i
zaokrąglony w górę) i dodaj 50. Około pięćdziesiąt
bloków to obszar potrzebny na i-węzły oraz pozostałe pliki.
Jeśli chcesz, możesz dokładnie obliczyć ten obszar, lub po prostu
użyć liczby 50. Jeśli tworzysz osobno dyskietkę startową i
główną, to możesz spokojnie przeznaczyć nawet więcej
miejsca, jako że pierwsza dyskietka jest w całości przeznaczona na
jądro. Nazwijmy tę liczbę BLOKI_JĄDRA.
Włóż dyskietkę do stacji dysków
(przyjmiemy że jest nią /dev/fd0) i utwórz na niej system
plików ext2:
mke2fs -i
8192 -m 0 /dev/fd0 BLOKI_JĄDRA
Opcja ``-i
8192'' oznacza, że chcemy jeden inode co
8192 bajty. Następnie zamontuj system plików, usuń katalog
lost+found
oraz utwórz katalogi dev
i boot
dla LILO:
mount
/dev/fd0 /mnt
rm
-rf /mnt/lost+found
mkdir
/mnt/{boot,dev}
Następnie utwórz urządzenia /dev/null i
/dev/fd0. Zamiast szukania ich numerów, możesz po prostu
skopiować je z twardego dysku używając opcji -R:
cp -R
/dev/{null,fd0} /mnt/dev
LILO wymaga kopii swojego programu startującego,
boot.b,
który możesz przegrać z twardego dysku. Zwykle znajduje się
on w katalogu /boot:
cp
/boot/boot.b /mnt/boot
Na koniec skopiuj plik konfiguracyjny LILO który
utworzyłeś poprzednio oraz swoje jądro. Oba pliki mogą zostać
umieszczone w głównym katalogu:
cp
bdlilo.conf KERNEL /mnt
W tej chwili w systemie plików jądra znajduje
się wszystko co potrzebne dla LILO, więc jesteś teraz gotowy do
uruchomienia go. Opcja -r
oznacza instalowanie programu startującego w katalogu innym niż
główny:
lilo -v -C
bdlilo.conf -r /mnt
LILO powinien zakończyć działanie bez żadnych
błędów, następnie system plików powinien wyglądać
podobnie jak poniżej:
total
361
1
-rw-r--r-- 1 root root 176 Jan 10 07:22 bdlilo.conf
1
drwxr-xr-x 2 root root 1024 Jan 10 07:23 boot/
1
drwxr-xr-x 2 root root 1024 Jan 10 07:22 dev/
358
-rw-r--r-- 1 root root 362707 Jan 10 07:23 vmlinuz
boot:
total
8
4
-rw-r--r-- 1 root root 3708 Jan 10 07:22 boot.b
4
-rw------- 1 root root 3584 Jan 10 07:23 map
dev:
total
0
0
brw-r----- 1 root root 2, 0 Jan 10 07:22 fd0
0 crw-r--r--
1 root root 1, 3 Jan 10 07:22 null
Nie przejmuj się, jeśli rozmiary plików sę
nieco inne.
Następnie pozostaw dysk w napędzie i przenieś się
do działu Konfiguracja
słowa ramdysku.
6.2 Przenoszenie jądra bez LILO.
Jeśli nie
korzystasz z LILO, to skopiuj jądro na dyskietkę startową używając
komendy dd:
%
dd if=KERNEL of=/dev/fd0 bs=1k
353+1
records in
353+1
records out
W tym przykładzie dd
zapisał 353 kompletne rekordy oraz 1 niekompletny, tak więc jądro
zajmuje teraz pierwsze 353 bloki na dyskietce. Nazwij tę liczbę
BLOKI_JĄDRA
i zapamiętaj ją, ponieważ będzie ona potrzebna w następnym
dziale.
Na koniec ustaw dyskietkę jako główne
urządzenie i skonfigguruj je tak, aby było dostępne do zapisu i
odczytu:
rdev
/dev/fd0 /dev/fd0
rdev -R
/dev/fd0 0
Pamiętaj, aby użyć opcji -R
pisanej wielką literą w drugiej komendzie rdev.
6.3 Konfiguracja słowa ramdysku.
Wewnątrz obrazu jądra
znajduje się słowo ramdysku, które mówi, gdzie
znajduje się główny system plików, oraz zawiera pewne
inne opcje. Słowo to można zmieniać za pomocą polecenia rdev,
a interpretowane jest w następujący sposób:
bity
0-10: Przemieszczenie ramdysku, w blokach 1024-bajtowych
bity
11-13: nieużywane
bit
14: Flaga oznaczająca, że ramdysk na zostać załadowany
bit
15: Flaga oznaczająca, aby pytać przez ładowaniem
głównego
systemu plików
Jeśli bit 15 jest ustawiony, to podczas startu
zostaniesz poproszony o włożenie do napędu nowej dyskietki. Jest
to konieczne w przypadku korzystania z dwóch dyskietek.
Istnieją dwa przypadki, w zależności od tego, czy
budujesz pojedynczą dyskietkę startową/główną, czy dwie
osobne dyskietki, startową i główną.
-
Jeśli budujesz
system na jednej dyskietce, to skompresowany główny system
plików zostanie umieszczony zaraz za jądrem, więc
przemieszczenie ramdysku będzie następnym wolnym blokiem za jądrem
(czyli powinno wymosić tyle samo, ile BLOKI_JĄDRA).
Bit 14 zostanie ustawiony na 1, a bit 15 będzie wynosił zero.
-
Jeśli budujesz zestaw dwóch dyskietek,
to główny system plików rozpocznie się w bloku zero
drugiej dyskietki, więc przemieszczenie będzie wynosić zero. Bity
14 oraz 15 będą ustawione na 1.
Po skrupulatnych obliczniach wartości słowa
ramdysku, ustaw ją poleceniem rdev
-r. Upewnij się, że podałeś wartość
dziesiętną. Jeśli
korzystasz z LILO, to argumentem dla rdev
powinna być ścieżka do jądra,
np. /mnt/vmlinuz.
Jeśli kopiowałeś jądro za pomocą polecenia dd,
to użyj zamiast tego nazwę urządzenia stacji dysków (np.
/dev/fd0).
rdev -r
JĄDRO_LUB_STACJA_DYSKÓW WARTOŚĆ
Jeśli korzystasz z LILO, odmontuj teraz dyskietkę.
6.4 Przenoszenie głównego
systemu plików.
Ostatnim krokiem jest przeniesienie głównego
systemu plików.
dd
if=rootfs.gz of=/dev/fd0 bs=1k seek=BLOKI_JĄDRA
dd
if=rootfs.gz of=/dev/fd0 bs=1k
Moje gratulacje, dyskietki są już gotowe! Zawsze
powninieneś przetestować swoje dyskietki startowe zanim odłożysz
je na bok do czasu awarii! Jeśli coś się
nie uda, czytaj dalej.
7. Rozwiązywanie
problemów.
Po stworzeniu dyskietek
kilka pierwszych prób wystartowania systemu często kończy
się niepowodzeniem. Najlepszym podejściem podczas budowania
głównego systemu plików jest łączenie elementów
istniejącego systemu tak, aby system dyskietkowy przynajmiej
wyświetlał komunikaty na konsoli. Gdy zacznie on komunikować się
z tobą, jesteś już w połowie drogi do sukcesu, ponieważ możesz
zobaczyć, co sprawia problemy i naprawić je pojedynczo aż system
będzie działał poprawnie. Jeśli system po prostu wiesza się bez
żadnego komunikatu, to odnalezienie przyczyny staje się trudne.
Stworzenie systemu, który zostanie poprawnie wystartowany do
momentu, w którym będzie mógł komunikować się z
użytkownikiem, wymaga zainstalowania i skonfigurowania kilku
komponentów. Zalecaną metoda badania problemu gdy system nie
chce się komunikować z użytkownikiem jest następująca:
Kernel
panic: VFS: Unable to mount root fs on XX:YY
Jest
to powszechny problem i ma jedynie kilka przyczyn. Po pierwsze,
sprawdz nazwę urządzenia XX:YY z listą. Czy to poprawne
urządzenie główne? Jeśli nie, prawdopodobnie nie
uruchomiłeś rdev
-R, lub zrobiłeś to na złym obrazie.
Jeśli kod urządzenia jest poprawny, sprawdź uważnie sterowniki
włączone do jądra. Upewnij się że stacja dysków, ramdysk
i system plików ext2 zostały wbudowane.
-
Sprawdź, czy główna
dyskietka faktycznie zawiera odpowiednie katalogi. Może się
zdarzyć, że skopiujesz nieodpowiedni katalog, w rezultacie
otrzymując na głównej dyskietce przykładowo katalog
/rootdisk/bin zamiast /bin.
-
Sprawdź, czy plik
/lib/libc.so jest dowiązaniem do tego samego pliku, co /lib/libc.so
na twardym dysku.
-
Sprawdź, czy
symboliczne dowiązania z katalogu /dev
na dysku twardym istnieją także dla odpowiednich urządzeń na
głównej dyskietce. W wielu sytuacjach szczególnie
istotne jest /dev/console.
-
Sprawdź, czy
dołączyłeś pliki /dev/tty1,
/dev/null, /dev/zero, /dev/mem, /dev/ram
i /dev/kmem.
-
Sprawdź konfigurację
jądra, obsługa wszystkich zasobów wymaganych do zalogowania
się musi być wbudowana w jądro, a nie w postaci modułów.
Tak więc obsługa ramdysku i systemu plików
ext2 musi być wbudowana.
-
Sprawdź, czy w jądrze główne
urządzenie oraz parametry ramdysku są ustawione poprawnie.
Gdy przeanalizujesz już wszystkie powyższe
przypadki, możesz sprawdzić następujące pliki:
-
Upewnij się, że
istnieje plik /sbin/init lub /bin/init. Upewnij się, że ma on
uprawnienia do wykonywania.
-
Uruchom ldd
init aby sprawdzić biblioteki wymagane
przez init. Na ogół jest to jedynie libc.so,
ale zawsze warto sprawdzić. Upewnij się, że istnieją wymagane
biblioteki i program ładujący.
-
Upewnij się, że
posiadasz odpowiedni program ładujący biblioteki -- ld.so
dla bibliotek a.out lub ld-linux.so
dla bibliotek ELF.
-
Sprawdź odwołania
do getty
(lub podobnego programu, jak agetty,
mgetty
czy getty_ps)
w pliku inittab.
Porównaj je z plikiem inittab
na dysku twardym. Przejrzyj strony man używanych programów.
Właśnie w pliku inittab
może wystąpić najwięcej problemów, ponieważ jego
składnia zależy od konkretnego systemu i wersji programu init.
Jedynym rozwiązaniem jest przeczytanie stron man o init
oraz inittab,
prześledzenie, co dokładnie system robi po wystartowaniu. Sprawdź,
czy w pliku /etc/inittab znajduje się pozycja inicjalizacji
systemu. Zawiera ona ścieżkę do skryptu inicjalizacji systemu,
który musi istnieć.
-
Tak samo jak w
przypadku init,
uruchom ldd
podając jako parametr twój program getty
i sprawdź, czy istnieją wszystkie potrzebne biblioteki oraz
program ładujący.
-
Upewnij się, że
dołączyłeś powłokę (np. bash
czy ash),
która potrafi wykonać wszystkie skrypty rc.
-
Jeśli na dyskietce istnieje plik
/etc/ld.so.cache, to odśwież go.
Jeśli init
startuje, ale otrzymujesz komunikat:
Id xxx
respawning too fast: disabled for 5 minutes
pochodzi on z programu init
i oznacza, że getty
lub login
kończą pracę zaraz po uruchomieniu. Sprawdz pliki getty
i login
i wszystkie potrzebne im biblioteki. Upewnij się, że ich wywołania
w pliku /etc/inittab są prawidłowe. Jeśli otrzymujesz dziwne
komunikaty od getty,
może to oznaczać, że jego wywołanie z /etc/inittab jest
nieprawidłowe. Opcje dla programów getty są
zróżnicowane, nawet poszczególne wersje agetty
posiadają niekompatybilne ze sobą opcje przy wywołaniu.
Jeśli podajesz poprawną nazwę użytkownika, ale
system pyta natychmiast o inną nazwę, to problemem może być PAM
bądź NSS. Zajrzyj do działu PAM
i NSS. Problem może być także
spowodowany tym, że korzystasz z haseł shadow, ale nie skopiowałeś
pliku /etc/shadow na dyskietkę.
Jeśli próbujesz uruchomić jakiś program,
przykładowo df,
który znajduje się na dyskietce, ale otrzymujesz komunikat:
df: not
found, to sprawdź dwie rzeczy. Po
pierwsze, upewnij się, że katalog w którym znajduje się
program jest w zmiennej PATH. Po drugie, sprawdź, czy istnieją
wszystkie potrzebne biblioteki oraz program ładujący.
8. Różne
tematy.
8.1 Redukcja głównego
systemu plików.
Czasem główny system
plików jest zbyt duży, aby zmieścić się na dyskietce,
nawet po kompresji. Poniżej podano kilka sposobów
zmniejszenia rozmiaru systemu plików, uporządkowanych według
efetywności:
Zwiększ gęstość dyskietki
Standardowo dyskietki są
formatowane na 1440K, ale dostępne są formaty o większej gęstości.
Program fdformat umożliwia formatowanie dyskietki na następujące
wielkości: 1600, 1680, 1711, 1743, 1760, 1840 i 1920. Większość
napędów 1440K obsługuje dyskietki 1722K, więc dla dyskietek
startowych zawsze używam tego formatu. Zobacz stronę man fdformat
oraz /usr/src/linux/Documentation/devices.txt.
Wymień powłokę
Najbardziej populare powłoki
dla Linuxa, takie jak bash
i tcsh,
zajmują bardzo dużo miejsca i wymagają wielu bibliotek. Istnieją
jednak alternatywne powłoki, takie jak ash,
lsh,
kiss
czy smash,
które są o wiele mniejsze i wymagają mniej (lub żadnych)
bibliotek. Większość tych zastępczych powłok jest dostępna pod
adresem http://metalab.unc.edu/pub/Linux/system/shells/.
Upewnij się, że powłoka z której korzystasz potrafi wykonać
wszystkie polecenia w plikach rc
na dyskietce.
Obetnij biblioteki i programy
Biblioteki i programy są
często nieobcięte (zawierają symbole dla debuggera). Taki plik po
uruchomieniu na nim file
będzie oznaczony jako `not
stripped'. Podczas kopiowania programów
do głównego systemu plików dobrym pomysłem jest
korzystanie z polecenia:
objcopy
--strip-all ŹRÓDŁO CEL
Gdy kopiujesz biblioteki,
użyj:
objcopy
--strip-debug ŹRÓDŁÓ CEL
Przenieś mniej ważne pliki na dyskietkę
narzędziową
Jeśli jakieś programy nie
są wymagane do wystartowania systemu i zalogowania się, to możesz
przenieść je na dyskietkę narzędziową. Szczegółów
szkukaj w dziale Tworzenie
dyskietki narzędziowej. Możesz
także zastanowić się nad przeniesieniem modułów na
dyskietkę narzędziową.
8.2 Systemy plików bez
ramdysku.
Dział Budowanie
głównego systemu plików
zawiera informacje na temat tworzenia skompresowanego głównego
systemu plików, który po uruchomieniu systemu jest
ładowany do ramdysku. Ta metoda posiada wiele zalet, więc jest
często używana. Jednak niektóre systemy posiadają za mało
pamięci RAM, w takich sytuacjach główny system plików
może zostać zamontowany bezpośrednio, a nie kopiowany do ramdysku.
W sumie łatwiej stworzyć taki właśnie system
plików niż skompresowany, ponieważ może on zostać
zbudowany bezpośrednio na dyskietce, a nie na jakimś innym
urządzeniu i nie musi on być kompresowany. Opiszemy tutaj ogólnie
różnice w tworzeniu takiego właśnie systemu plików.
Jeśli zdecydujesz się z niego korzystać, pamiętaj, że będziesz
miał do dyspozycji o wiele mniej
miejsca.
-
Oblicz, ile wolnego
miejsca pozostanie na główny system plików. Jeśli
tworzysz pojedynczą dyskietkę startową/główną, to musisz
zmieścić na niej wszystkie bloki jądra oraz wszystkie bloki
głównego systemu plików.
-
Korzystając z
programu mke2fs
utwórz na dyskietce główny system plików o
odpowiedniej wielkości.
-
Zapełnij system
plików tak, jak to opisano w osobnym dziale.
-
Gdy już skończysz,
odmontuj system plików i przenieś go do pliku na dysku, ale
nie kompresuj go.
-
Przenieś jądro na
dyskietkę, tak jak to opisano w osobnym dziale. Podczas obliczania
słowa ramdysku wyzeruj bit 14, aby zaznaczyć, że główny
system plików nie ma być ładowany do ramdysku. Uruchom rdev
z odpowiednimi parametrami.
-
Przenieś główny system plików
tak, jak poprzednio.
Istnieje kilka dróg na skróty. Jeśli
budujesz dwu-dyskietkowy zestaw, to możesz stworzyć kompletny
system plików bezpośrednio na drugiej dyskietce, bez potrzeby
przenoszenia go na twardy dysk i z powrotem. Jeśli budujesz
pojedynczą dyskietkę startową/główną i korzystasz z LILO,
to możesz zbudować jeden
system plików na całej dyskietce, zawierający jądro, pliki
LILO oraz pliki główne, a następnie uruchomić LILO jako
ostatni krok.
8.3 Tworzenie dyskietki
narzędziowej.
Tworzenie dyskietki
narzędziowej jest stosunkowo proste, wystarczy stworzyć system
plików na sformatowanej dyskietce i skopiować do niego pliki.
Aby korzystać z niej podczas używania dyskietki startowej,
wystarczy zamontować ją ręcznie po uruchomieniu systemu.
We wcześniejszych rozdziałach wspomnieliśmy, że
dyskietka narzędziowa powinna zostać zamontowana w katalogu /usr.
W tej systuacji programy powinny być umieszczone w katalogu /bin
dyskietki narzędziowej, aby po zamontowaniu były dostępne pod
ścieżką /usr/bin. Dodatkowe biblioteki wymagane przez programy
powinny zostać umieszczone w katalogu /lib
na dyskietce.
Istnieje kilka istotnych aspektów, o których
należy pamiętać podczas projektowania dyskietki narzędziowej:
-
Nie umieszczaj na
dyskietce narzędziowej plików krytycznych dla działania
systemu, ponieważ będzie ją można zamontować dopiero po
wystartowaniu systemu.
-
Nie możesz w tym
samym czasie korzystać z napędu taśmowego i napędu dyskietek.
Oznacza to, że jeśli posiadasz napęd taśmowy, to nie będziesz
miał do niego dostępu gdy dyskietka narzędziowa jest zamontowana.
-
Dostęp do plików na dyskietce
narzędziowej będzie bardzo powolny.
W Dodatku Spis
plików przykładowej dyskietki startowej
możesz zobaczyć przykładowe pliki na dyskietce narzędziowej. Oto
kilka pomysłow na programy, które mogą okazać się
przydatne: programy do badania i manipulacji dyskami (format,
fdisk) i systemami plików (mke2fs,
fsck, debugfs, isofs.o), mały edytor
tekstów (elvis,
jove), narzędzia do kompresji i
archiwizacji (gzip,
tar, cpio, afio), narzędzia do obsługi
taśm (mt,
tob, taper), narzędzia komunikacyjne
(ppp.o,
slip.o, minicom) i narzędzia do obsługiu
urządzeń (setserial,
mknod).
9. Jak robią to
profesjonaliści.
Pewnie zauważyłeś, że
dyskietki startowe używane przez największe dystrybucje, takie jak
Slackware, RedHat czy Debian, wydają się o wiele bardziej
skomplikowane, niż te opisane w tym dokumencie. Profesjonalne
dyskietki startowe są bazowane na tych samych założeniach, które
tu podaliśmy, ale wykorzystują różne triki, ponieważ takie
dyskietki mają o wiele większe wymagania. Po pierwsze, muszą
współpracować z szeroką gamą sprzętu, tak więc muszą
one umieć komunikować się z użytkownikiem i ładować odpowiednie
sterowniki urządzeń. Po drugie, muszą być przygotowane do
działania z wieloma różnymi opcjami instalacji, dodatkowo
wykonując pewne działania automatycznie. Po trzecie dystrybucyjne
dyskietki startowe na ogół spęłniają zarówno rolę
instalacyjną, jak i ratunkową.
Niektóre dyskietki startowe korzystają z
usługi zwanej initrd (initial ramdisk). Została ona
wprowadzona w jądrze wersji 2.0.x i daje o wiele większą
elastyczność, startując jądro w dwóch fazach. Na początku
ładowany jest początkowy obraz ramdysku z dyskietki startowej.
Początkowy ramdysk to główny system plików
zawierający programy, które zostaną uruchomione zanim
zostanie załadowany prawdziwy główny system plików.
Ten program najczęściej bada otoczenie i/lub prosi użytkownika o
wybranie różnych opcji startowych, takich jak urządzenie, z
którego zostanie załadowany prawdziwy główny system
plików. Często ładuje on też dodatkowe moduły nie
wbudowane do jądra. Gdy działanie tego programu zakończy się,
jądro ładuje prawdziwy główny obraz i uruchamianie jest
kontynuowanie normalnie. Więcej informacji o initrd
szukaj w /usr/src/linux/Documentation/initrd.txt i
ftp://elserv.ffm.fgan.de/pub/linux/loadlin-1.6/initrd-example.tgz.
Poniżej znajduje się podsumowanie tego, jak
działają dyskietki startowe poszczególnych dystrybucji,
oparte na przeglądaniu ich systemu systemu plików i/lub kodu
źródłowego. Nie gwarantujemy, że ta informacja jest
dokładna, ani że nic się nie zmieniło od czasu opisanej wersji.
Slackware (v.2.1) po prostu startuje system przy
użyciu LILO, tak jak to opisano w dziale Przenoszenie
jądra z LILO. Dyskietki startowe
Slackware przy starcie wypisują komunikat (``Welcome
to the Slackware Linux bootkernel disk!'')
używając do tego parametru LILO message.
Informuje to użytkownika, że może podać dodatkowe parametry
startowe, jeśli to konieczne. Po wystartowaniu, główny
system plików jest ładowany z drugiej dyskietki. Użytkownik
uruchamia skrypt setup
który rozpoczyna instalację. Zamiast korzystać z jądra
opartego na modułach, Slackware daje użytkownikowi do dyspozycji
wiele różnych jąder, do wyboru zależnie od konfiguracji
sprzętowej.
RedHat (v.4.0) także korzysta z LILO. Ładuje
skompresowany ramdysk z pierwszej dyskietki, który uruchamia
specjalnie napisany program init.
Program ten pyta o sterowniki i, jeśli to konieczne, ładuje pliki z
dodatkowej dyskietki.
Debian (v.1.3) jest prawdopodobnie najbardziej
skomplikowanym zestawem dyskietek startowych. Korzysta on z programu
ładującego SYSLINUX, który ustala osopowiednie parametry, a
następnie używa obrazu initrd
aby poprowadzić użytkownika przez procedurę instalacji. Wygląda
na to, że korzysta on zarówno z przerobionego programu init,
jak i z przerobionej powłoki.
10. Najczęściej
zadawane pytania (FAQ).
Q. Próbuje wystartować system z dyskietki,
ale nic się nie dzieje. Co mam zrobić?
Zajrzyj do działu Rozwiązywanie
problemów powyżej.
Q. Jak działają dyskietki startowe dystrybucji
Slackware/Debian/RedHat?
Zajrzyj do działu Jak
to robią profesjonaliści
powyżej.
Q. W jaki sposób stworzyć dyskietkę
startową ze sterownikiem XYZ?
Najłatwiej zdobyć jądro z dystrybucji Slackware.
Jądra Slackware zawierają sterowniki do jak największej ilości
urządzeń, więc jeśli posiadasz kontroler IDE lub SCSI, istnieją
duże szanse, że sterownik do urządzenia jest dołączony do
jednego z jąder Slackware.
Przejdz do katalogu a1
i wybierz jądro odpowiednie dla posiadanego typu kontrolera. Sprawdz
w pliku xxxxkern.cfg dla odpowiedniego jądra czy zawiera ono
odpowiednie sterowniki. Jeśli urządzenie jest na tej liście, to
jądro to powinno wystartować twój system. Ściągnij plik
xxxxkern.tgz i skopiuj go na dyskietkę, tak jak opisano powyżej, w
dziale na temat tworzenia dyskietek startowych.
Następnie musisz sprawdzić główne
urządzenie tego jądra, korzystając z komendy rdev:
rdev zImage
Komenda rdev
wyświetli aktualne główne urządzenie dla tego jądra. Jeśli
nie odpowi |