bootparam(7) Miscellaneous Information Manual 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.

'init=...'
Ustawia to pierwotne polecenie do wykonania przez jądro. Jeśli nie jest ono ustawione lub nie może zostać znalezione, to jądra wypróbowuje /sbin/init, następnie /etc/init, później /bin/init i w końcu /bin/sh a ostatecznie panikuje, jeśli wszystkie te próby zawiodą.
'nfsaddrs=...'
Ustawia adres rozruchowy NFS na podany łańcuch. Adres rozruchowy jest używany w przypadku rozruchu sieciowego.
'nfsroot=...'
Ustawia nazwę katalogu głównego NFS na podany łańcuch. Jeśli łańcuch ten nie rozpoczyna się od "/", "," lub cyfry, to jest on poprzedzany przez "/tftpboot/". Ta nazwa katalogu głównego jest używana w przypadku rozruchu sieciowego.
'root=...'
Ten argument mówi jądru, którego urządzenia użyć do jako głównego systemu plików podczas rozruchu. Domyślna wartość tego ustawienia jest skonfigurowana podczas kompilacji i zwykle jest wartością urządzenia głównego systemu, na którym zbudowano jądro. Aby nadpisać tę wartość i wybrać na urządzenie główne np. drugi napęd dyskietek, należy użyć "root=/dev/fd1".
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).
'rootdelay='
Parametr ustawia przerwę (w sekundach) przed próbą zamontowania głównego systemu plików.
'rootflags=...'
Parametr ustawia łańcuch opcji montowania dla głównego systemu plików (więcej informacji również w fstab(5)).
'rootfstype=...'
Opcja 'rootfstype' nakazuje jądru zamontowanie głównego systemu plików tak, jak gdyby był on podanego typu. Może być to przydatne (przykładowo) do zamontowania systemu plików ext3 jako ext2 i usunięcia dziennika w głównym systemie plików, cofając tak naprawdę jego format z ext3 do ext2 bez potrzeby rozruchu komputera z innego nośnika.
'ro' i 'rw'
Opcja 'ro' mówi jądru, by zamontowało główny system plików jako przeznaczony tylko do odczytu, aby fsck mógł pracować na nieruchomym systemie plików. Żaden proces nie może zapisywać plików na systemie plików, dopóki nie zostanie remontowany jako przeznaczony do odczytu i zapisu, np. poprzez "mount -w -n -o remount /" (patrz też mount(8)).
Opcja 'rw' mówi jądru, by zamontować główny system plików jako przeznaczony do odczytu/zapisu. Tak jest domyślnie.
'resume=...'
Przekazuje do jądra położenie zahibernowanych danych, z których chce się wznowić pracę systemu po hibernacji. Zwykle jest to partycja lub plik wymiany. Przykład:

resume=/dev/hda2

'reserve=...'
Ta komenda jest używana do chronienia regionów portów wejścia/wyjścia przed sondowaniem. Postać polecenia:

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

powstrzymuje wszystkie sterowniki urządzeń, poza sterownikiem "blah" od sondowania 0x300-0x31f.
'panic=N'
Domyślnie, jądro nie uruchomi się ponownie po panice, ale za pomocą tej opcji można spowodować, że jądro wykona ponowne uruchomienie systemu po N sekundach (jeśli N jest większe niż zero). Czas ten można również ustawić za pomocą

echo N > /proc/sys/kernel/panic.

'reboot=[warm|cold][,[bios|hard]]'
Od Linuksa 2.0.22 ponowne uruchomienie jest domyślnie "zimne" (cold). Można również wybrać stare ustawienie za pomocą 'reboot=warm'. "Zimny" restart może wymagać zresetowania określonego sprzętu, może również zniszczyć jeszcze nie zapisane dane w buforach dysku. "Ciepły" restart może być szybszy. Domyślnie, ponowne uruchomienie jest "twarde" (hard), poprzez żądanie pulsowania bitu 0 na linii resetu kontrolera klawiatury, lecz istnieje przynajmniej jeden typ płyt głównych, z którym to nie działa. Opcja 'reboot=bios' może w zamian przeskoczyć przez BIOS.
'nosmp' i 'maxcpus=N'
Tylko gdy zdefiniowano __SMP__. Opcja wiersza polecenia 'nosmp' lub 'maxcpus=0' wyłączy całkowicie aktywację SMP, natomiast opcja 'maxcpus=N' ograniczy maksymalną liczbę aktywowanych procesorów w trybie SMP do N.

Argumenty rozruchowe do użycia przez deweloperów jądra

'debug'
Komunikaty jądra są przekazywane do demona (np. klogd(8) lub podobnego), tak że mogą zostać zapisane na dysku. Wiadomości o priorytetach powyżej console_loglevel są także wypisywane na konsoli (informacje na temat poziomów priorytetów zawiera syslog(2)). Domyślnie console_loglevel jest ustawiona na logowanie wszystkiego co ważniejsze niż KERN_DEBUG. Ten argument rozruchowy dodatkowo nakazuje wypisywanie wiadomości o priorytecie KERB_DEBUG.. Poziom logowania konsoli można również ustawić podczas pracy systemu dzięki plikowi /proc/sys/kernel/printk (opisanemu w syslog(2)), operacji syslog(2) SYSLOG_ACTION_CONSOLE_LEVEL lub dmesg(8).
'profile=N'
Możliwe jest włączenie funkcji profilowania jądra, aby dowiedzieć się na co jądro zużywa cykle procesora. Profilowanie jest włączane, za pomocą ustawienia zmiennej prof_shift na wartość niezerową. Można to zrobić podając CONFIG_PROFILE w chwili kompilacji lub używając opcji 'profile='. Wartość prof_shift będzie wynosić N, jeśli zostanie podana lub CONFIG_PROFILE_SHIFT, gdy poda się ją, lub 2 - wartość domyślną. Ważność tej zmiennej jest taka, że daje ona rozdrobnienie profilowania: za każdym cyknięciem zegara, jeśli system wykonywał kod jądra, licznik jest zwiększany:

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.

Argumenty rozruchowe do użytku z ramdyskiem

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.
'load_ramdisk=N'
Jeśli N=1 - ładuje ramdysk, przy N=0 nie ładuje ramdysku (tak jest domyślnie).
'prompt_ramdisk=N'
Jeśli N=1 - prosi o włożenie dyskietki (tak jest domyślnie), jeśli N=0 - nie prosi (dlatego parametr ten nigdy nie jest potrzebny).
'ramdisk_size=N' lub (przestarzałe) 'ramdisk=N'
Ustawia maksymalny rozmiar ramdysków na N kB. Domyślny wynosi 4096 (4 MB).
'ramdisk_start=N'
Ustawia startowy numer bloku (przesunięcie na dyskietce, gdzie ramdysk się rozpoczyna) na N. Jest to potrzebne w przypadku, gdy ramdysk znajduje się za obrazem jądra.
'noinitrd'
Tylko gdy jądro zostało skompilowane z CONFIG_BLK_DEV_RAM i CONFIG_BLK_DEV_INITRD. Obecnie, można skompilować jądro tak, aby używało initrd. Gdy ta funkcja jest włączona, proces rozruchowy załaduje jądro i początkowy ramdysk; następnie jądro konwertuje initrd do "normalnego" ramdysku, który jest montowany w trybie do odczytu i zapisu, jako urządzenie główne; następnie wykonywane jest /linuxrc; później montowany jest "rzeczywisty" główny system plików, a system plików initrd jest przenoszony do /initrd; na końcu wykonywana jest zwykła sekwencja rozruchowa (np. wywołanie /sbin/init).
Szczegółowy opis funkcji initrd zawiera plik źródeł jądra Documentation/admin-guide/initrd.rst (lub Documentation/initrd.txt przed Linuksem 4.10).
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.

'max_scsi_luns=...'
Urządzenie SCSI może mieć wiele "podurządzeń" zawartych w nim samym. Najpopularniejszym przykładem jest jeden z nowych CD-ROM-ów SCSI, który obsługuje naraz więcej niż jeden dysk. Każdy CD jest adresowany jako "Logical Unit Number" (LUN) (ang. logiczny numer jednostki) tego urządzenia. Jednak większość urządzeń takich jak twarde dyski, napędy kasetowe i inne jest pojedynczymi urządzeniami z LUN równym zero.
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ń.
Niektóre parametry konfiguracji sterownika kasetowego SCSI mogą być osiągnięte przez użycie następującego:

st=buf_size[,write_threshold[,max_bufs]]

Pierwsze dwie liczby są podane w jednostkach kilobajtowych. Domyślna wartość buf_size to 32k B, 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

Szczegóły można znaleźć w pliku Dcumentation/scsi/st.txt (lub drivers/scsi/README.st w starszych jądrach) w źródłach jądra Linux.

Sterownik IDE przyjmuje wiele parametrów, od specyfikacji geometrii dysku do wsparcia dla wadliwych chipów kontrolera. Specyficzne opcje dysku mogą być podawane poprzez użycie "hdX=" z X pomiędzy "a"–"h".
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.
Tych opcji używa się do przekazywania fizycznej geometrii dysku. Jedynie pierwsze trzy wartości są wymagane. Wartości cylinder/head/sectors będą tymi używanym przez fdisk. Wartość wpcom (write precompensation) jest ignorowana dla dysków IDE. Podana wartość IRQ będzie używana dla interfejsu, na którym rezyduje napęd i nie jest tak naprawdę parametrem specyficznym napędowi.
Chip CMD-640 interfejsu dual IDE jest wadliwy; zaprojektowano go tak, że gdy napędy z drugiego interfejsu są używane równocześnie z napędami pierwszego, dane ulegają zniszczeniu. Używanie tej opcji mówi sterownikowi by upewnił się, że oba interfejsy nigdy nie są używane naraz.
Nie sonduje danego dysku. Np.

hdb=noprobe hdb=1166,7,17

wyłączy sondowanie, lecz wciąż poda geometrię dysku, więc będzie zarejestrowany jako prawidłowe urządzenie blokowe, a więc będzie się nadawać do użytku.
Niektóre napędy czasami mają trwale załączony bit WRERR_STAT. To usprawnia działanie tych wadliwych urządzeń.
Mówi to sterownikowi IDE, że w miejscu normalnego dysku IDE mamy CD-ROM typu ATAPI. W większości wypadków, CD-ROM jest wykrywany automatycznie, lecz jeśli tak nie jest, to to powinno pomóc.
Standardowy sterownik dysków może przyjmować argumenty geometrii dla dysków podobnie do sterownika IDE. Proszę zauważyć jednak, że oczekuje on jedynie trzech wartości (C/H/S) -- więcej lub mniej spowoduje ciche zignorowanie podanego polecenia. Podobnie też, przyjmuje jedynie "hd=" jako argument, np. "hda=" jest tu nieprawidłowe. Format jest następujący:

hd=cylindry,głowice,sektory

Jeśli są tam zainstalowane dwa dyski, powyższe jest powtarzane z parametrami geometrii dla drugiego dysku.

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]]]

gdzie każda wartość urządzenieN jest formatu 0xTaaaId, a bajty są użyte następująco:

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='

Składnia:

lp=0
lp=auto
lp=reset
lp=port[,port...]

Można przekazać sterownikowi drukarki, który port ma użyć, a którego nie. To ostatnie przydaje się, jeśli nie chce się aby sterownik drukarki zajął wszystkie dostępne porty równoległe, dzięki czemu inne sterowniki (np. PLIP, PPA) mogą ich użyć w zamian.
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.

klogd(8), mount(8)

Aktualne informacje znajdują się w pliku źródeł jądra Documentation/admin-guide/kernel-parameters.txt.

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

2 maja 2024 r. Linux man-pages 6.8