| BOOTPARAM(7) | Podręcznik programisty Linuksa | BOOTPARAM(7) |
bootparam - wprowadzenie do parametrów rozruchowych jądra Linux
Jądro (kernel) Linux przyjmuje pewne "opcje wiersza poleceń"", lub "parametry rozruchowe" podczas uruchamiania. Ogólnie jest to używane do przekazywania jądru informacji o parametrach sprzętu, których samodzielnie nie potrafi ono określić lub by zapobiec wartościom, które jądro by normalnie wykryło.
Kiedy jądro jest uruchamiane bezpośrednio przez BIOS, nie ma możliwości przekazywania żadnych parametrów. Tak więc, aby móc mieć tę możliwość, trzeba używać programu rozruchowego zdolnego do przekazywania parametrów, takiego jak GRUB.
Wiersz poleceń jądra jest przetwarzany w listę łańcuchów (argumentów rozruchowych) rozdzielonych spacjami. Większość argumentów rozruchowych przyjmuje postać:
nazwa[=wartość_1][,wartość_2]...[,wartość_10]
gdzie "nazwa" jest unikalnym słowem kluczowym, które jest używane do określania, która część jądra ma otrzymać związane z nim wartości. Poszczególne argumenty rozruchowe są zwyczajnie oddzielone spacjami, w formacie wyżej podanym. Proszę zauważyć, że limit 10 wartości jest rzeczywisty, jako że obecnie kod obsługuje jedynie 10 oddzielonych przecinkami parametrów dla słowa kluczowego (można jednak użyć tego samego słowa kluczowego drugi raz, aby pomieścić dodatkowe parametry).
Większość sortowania jest zakodowana w pliku źródłowym jądra init/main.c. Najpierw jądro sprawdza czy argument jest jednym ze specjalnych argumentów "root=", "ro", "rw", lub "debug". Znaczenie tych specjalnych argumentów jest opisane dalej w tym dokumencie.
Potem przechodzi przez listę funkcji konfigurujących, aby zobaczyć czy podany tekst argumentu (taki jak "foo") nie jest związany z funkcją konfigurującą ("foo_setup()") dla konkretnego urządzenia, lub części jądra. Jeśli przekazało się jądru linię foo=3,4,5,6 to przeszuka ono tablice bootsetupowe aby sprawdzić, czy "foo" było zarejestrowane. Jeśli było, wywołuje funkcję konfigurującą związaną z "foo" (foo_setup()) i przekazuje jej argumenty 3, 4, 5 i 6 podane w linii poleceń jądra.
Wszystko, co jest w postaci "foo=bar", co nie jest akceptowane jako funkcja konfigurująca, jak opisano powyżej, zostaje zinterpretowane jako zmienna środowiskowa, która ma być ustawiona. (Bezużytecznym?) przykładem może być użycie "TERM=vt100" jako argumentu rozruchowego.
Wszelkie pozostałe argumenty, które nie były wybrane przez jądro i nie były zinterpretowane jako zmienne środowiskowe, zostają potem przekazane procesowi PID 1, którym zwykle jest program init(1). Najpopularniejszym argumentem, który jest przekazywany procesowi init jest słowo "single", które mówi mu, by uruchomił komputer w trybie pojedynczego użytkownika, żeby nie odpalał wszystkich normalnych demonów. Proszę sprawdzić na stronie podręcznika init(1), jakie argumenty przyjmuje.
Główne urządzenie można określić symbolicznie lub numerycznie. Forma symboliczna ma postać /dev/XXYN, gdzie XX określa typ urządzenia (np. 'hd' do twardych dysków zgodnych z ST-506, z Y z zakresu 'a'-'d'; 'sd' do dysków zgodnych z SCSI, z Y z zakresu 'a'-'e'), Y jest literą lub numerem napędu, a N numerem (dziesiętnie) partycji na tym urządzeniu.
Proszę zauważyć, że nie ma to nic do czynienia z przeznaczeniem tych urządzeń w bieżącym systemie. Część "/dev/" jest tylko konwencją.
Powyższe urządzenia można przekazywać także w niewygodnej i mniej przenośnej reprezentacji numerycznej, która jest kombinacją numerów głównych/pobocznych (major/minor) urządzeń. (np. /dev/sda3 ma numer główny 8 i poboczny 3, więc można użyć "root=0x803" jako alternatywy).
Opcja 'rw' mówi jądru, by zamontować główny system plików jako przeznaczony do odczytu/zapisu. Tak jest domyślnie.
resume=/dev/hda2
reserve=iobase,extent[,iobase,extent]...
W niektórych komputerach może być niezbędne chronienie sterowników urządzeń od szukania urządzeń (autosondowanie) w określonych regionach. Może to wynikać z błędnej reakcji sprzętu, możliwej błędnej identyfikacji lub po prostu z tego, że nie chce się tego sprzętu inicjalizować.
Argument reserve podaje region portu wejścia/wyjścia, który nie ma być sondowany. Sterownik urządzenia nie będzie sondować zarezerwowanego regionu, chyba że inny argument rozruchowy wyjątkowo mu to nakaże.
Na przykład, wiersz rozruchowy
reserve=0x300,32 blah=0x300
echo N > /proc/sys/kernel/panic.
profile[address >> prof_shift]++;
Surowe informacje profilowania można odczytać z /proc/profile. Prawdopodobnie będzie trzeba użyć narzędzia takiego jak readprofile.c, aby je uporządkować. Zapis do /proc/profile wyczyści liczniki.
Tylko jeśli jądro zostało skompilowane z CONFIG_BLK_DEV_RAM. Generalnie, złym pomysłem jest używanie ramdysku w Linuksie - system sam będzie korzystał z dostępnej pamięci bardziej wydajnie. Jednak w trakcie rozruchu często przydatne okazuje się załadowanie zawartości dyskietki na ramdysk. Może się również okazać, że pewne moduły (np. do systemu plików lub sprzętu) muszą zostać załadowane przed uzyskaniem dostępu do głównego dysku.
W Linuksie 1.3.48, obsługa ramdysku uległa całkowitej zmianie. Wcześniej, pamięć była alokowana statycznie i istniał parametr 'ramdisk=N', który określał jego rozmiar. Mogło to również służyć do ustawienia obrazu jądra w czasie kompilacji. Obecnie, ramdysk używa buforów i powiększa się w sposób dynamiczny. Wiele informacji o bieżącej konfiguracji ramdysku zawiera plik źródeł jądra Documentation/blockdev/ramdisk.txt (w starszych jądrach Documentation/ramdisk.txt).
Są cztery parametry: dwa logiczne i dwa całkowite.
Szczegółowy opis funkcji initrd zawiera plik źródeł jądra Documentation/initrd.txt.
Opcja 'noinitrd' mówi jądru, że choć zostało skompilowane w celu działania z initrd, to nie powinno przechodzić przez powyższe kroki, lecz pozostawić dane initrd w /dev/initrd. To urządzenie może być użyte jedynie jednokrotnie: dane są zwalniane w chwili, gdy ostatni proces, który je używał zamknie /dev/initrd.
Ogólne pojęcia w tej sekcji:
iobase -- pierwszy port I/O, który zajmuje host SCSI. Są one podawane w notacji heksadecymalnej i zazwyczaj leżą w zakresie od 0x200 do 0x3ff.
irq -- przerwanie sprzętowe, które wykorzystuje karta. Prawidłowe wartości zależą od rozpatrywanej karty, lecz zwykle są to 5, 7, 9, 10, 11, 12 i 15. Inne wartości są zwykle używane w peryferiach takich jak dyski twarde IDE, stacje dysków, porty szeregowe, itp.
scsi-id -- identyfikator, którego adapter używa do identyfikowania siebie na szynie SCSI. Tylko niektóre adaptery umożliwiają zmianę tej wartości, jako że większość ma ją trwale ustaloną wewnątrz. Częstą wartością domyślną jest 7, lecz zestawy Seagate i Future Domain TMC-950 używają 6.
parity -- określa, czy adapter SCSI oczekuje od załączonych urządzeń dostarczania wartości parzystości przy wymianach informacji. Podanie jedynki oznacza, że sprawdzanie parzystości jest włączone, a zero ją wyłącza. Znowu jednak nie wszystkie adaptery przyjmują wybranie zachowania parzystości podczas rozruchu.
Niektóre słabo dopracowane urządzenia SCSI nie mogą obsłużyć sondowania LUN nierównego zeru. Dlatego, jeśli flaga kompilacji CONFIG_SCSI_MULTI_LUN nie była ustawiona, nowe jądra sondują domyślnie tylko LUN zero.
Aby podać ilość sondowanych LUN-ów podczas rozruchu, wpisuje się 'max_scsi_luns=n' jako argument rozruchowy, gdzie n jest liczbą między 1 a 8. Aby zapobiec problemom opisanym wyżej, używa się n=1 aby zapobiec denerwowaniu nieprawidłowych urządzeń.
st=buf_size[,write_threshold[,max_bufs]]
Pierwsze dwie liczby są podane w jednostkach kilobajtowych. Domyślna wartość buf_size to 32 KB, a maksymalna wartość to 16384 KB. Wartość write_threshold jest wartością przy której bufor jest przekazywany na kasetę z domyślną wartością 30 KB. Maksymalna liczba buforów zmienia się z liczbą wykrytych napędów, a domyślną wartością jest 2. Przykładowym użyciem może być:
st=32,30,2
Opcje niespecyficzne napędom są przekazywane z przedrostkiem "hd=". Proszę zauważyć, że używanie przedrostka specyficznego dyskowi dla niespecyficznej opcji także zadziała, a opcja zostanie zaaplikowana tak jak oczekiwano.
Proszę zauważyć także, że "hd=" może być użyty w odniesieniu do następnego niepodanego napędu w sekwencji (a, ..., h). W następujących omówieniach, opcja "hd=" będzie cytowana dla zwięzłości. Proszę zapoznać się z plikiem Documentation/ide/ide.txt (lub Documentation/ide.txt w starszych jądrach albo drivers/block/README.ide w archaicznych jądrach) w źródłach jądra Linux, aby dowiedzieć się więcej.
hdb=noprobe hdb=1166,7,17
hd=cylindry,głowice,sektory
Różne sterowniki używają różnych parametrów, ale wszystkie przynajmniej dzielą IRQ, wartość bazowego portu I/O i nazwę. W najogólniejszej formie wygląda to tak:
ether=irq,iobase[,param_1[,param_2,...param_8]],nazwa
Pierwszy nienumeryczny argument jest pobierany jako nazwa. Wartości param_n (jeśli mają zastosowanie) zwykle mają różne znaczenia dla różnych kart/sterowników. Typowe wartości param_n są używane do podawania rzeczy takich jak adres pamięci dzielonej, wyboru interfejsu, kanału DMA i podobnych.
Najpopularniejszym wykorzystaniem tego parametru jest wymuszenie sondowania drugiej karty ethernetowej, jako że domyślnie sondowana jest tylko jedna. Można tego dokonać prostym:
ether=0,0,eth1
Proszę zauważyć, że wartości zera dla IRQ i bazy I/O w powyższym przykładzie mówią sterownikowi, by je wysondował automatycznie.
Ethernet-Howto zawiera rozległą dokumentację o używaniu wielorakich kart i o specyficznych implementacjach karta/sterownik wartości param_n. Zainteresowani powinni odnieść się do odpowiedniej sekcji w tamtym dokumencie.
Istnieje wiele opcji sterownika stacji dyskietek i wszystkie są wymienione w Documentation/blockdev/floppy.txt (lub Documentation/floppy.txt w starszych jądrach albo drivers/block/README.fd w archaicznych jądrach) w źródle jądra Linux. Tam można znaleźć szczegółowe informacje.
Sterownik dźwięku może także akceptować argumenty rozruchowe do przesłonięcia wartości wkompilowanych. Nie jest to zalecane i jest raczej złożone. Jest to opisane w pliku w źródłach jądra Linux Documentation/sound/oss/README.OSS (drivers/sound/Readme.linux w przypadku starszych wersji jądra). Przyjmuje parametr rozruchowy postaci:
sound=urządzenie1[,urządzenie2[,urządzenie3...[,urządzenie10]]]
T - rodzaj urządzenia: 1=FM, 2=SB, 3=PAS, 4=GUS, 5=MPU401, 6=SB16, 7=SB16-MPU401
aaa - heksadecymalnie zapisany adres I/O.
I - heksadecymalnie zapisana linia przerwań (np. 10=a, 11=b, ...)
d - kanał DMA.
Jak widać, jest to całkiem bałaganiarskie i lepiej wkompilować swoje własne wartości do sterownika. Używanie argumentu "sound=0" wyłączy sterownik dźwięku.
lp=0 lp=auto lp=reset lp=port[,port...]
Format argumentu to wiele nazw portów. Np. lp=none,parport=0 użyje pierwszego portu równoległego do lp1 i wyłączy lp0. Aby wyłączyć cały sterownik drukarki, można użyć lp=0.
Aktualne informacje znajdują się w pliku źródeł jądra Documentation/kernel-parameters.txt.
Angielska wersja tej strony pochodzi z wydania 4.05 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Przemek Borys (PTM) <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.05 oryginału.
| 2015-05-07 | Linux |