Czy wszystkie argumenty jądra są naprawdę używane przez jądro?

11

Dlaczego Linux zezwala na „init = / bin / bash”?

Przeczytałem to, odpowiedzi mówią, że to KERNEL uruchamia ten program init.

Potem zacząłem się zastanawiać, Linux zwykle zawiera initramfs, który ostatecznie zamontuje i przestawi katalog główny na prawdziwy główny system plików. Co więc oznacza ten initargument? Ścieżka w initramfs? Lub, jak zgadłem, nie jest czytany przez jądro, ale przez init initramfs w celu wykonania prawdziwego init.

Również root=UUID=xxxxargument, że jest naprawdę czytany przez jądra lub po prostu przez init z initramfs aby znaleźć prawdziwe głównego systemu plików?

Wygląda na to, że mogę przekazać dowolny argument jako argumenty jądra, więc czy wszystkie są odczytywane przez jądro, czy przynajmniej niektóre z nich mają znaczenie tylko dla programów w przestrzeni użytkownika?

炸鱼 薯条 德里克
źródło

Odpowiedzi:

18

Parametry przekazywane w wierszu poleceń jądra nie muszą mieć znaczenia dla jądra: dokumentacja parametrów jądra mówi

Jądro analizuje parametry z wiersza poleceń jądra do „-”; jeśli nie rozpoznaje parametru i nie zawiera „.”, parametr jest przekazywany do init: parametry z „=” idą do środowiska init, inne są przekazywane jako argumenty wiersza poleceń do init. Wszystko po „-” jest przekazywane jako argument do init.

Nie dotyczy to initi rootktóre tak naprawdę są parametrami jądra i są obsługiwane przez jądro. Można na nie oddziaływać również w przestrzeni użytkownika, ponieważ pojawiają się w /proc/cmdline. (Tak więc na przykład systemd bierze quietpod uwagę parametr jądra w celu zmniejszenia jego wydajności).

Kiedy jądro jest uruchamiane z initramfs, rootparametr nie jest używany przez jądro bezpośrednio, a initparametr jest używany tylko w przypadku rdinitniepowodzenia. inituruchamiane jest uruchamianie kernel_init, które działa w następujący sposób:

  • jeśli istnieje „ramdyskowe polecenie wykonania” (albo wartość podana rdinitw wierszu poleceń jądra, albo /init), które jest dostępne, jądro próbuje je uruchomić;
  • jeśli to się nie powiedzie, a pojawi się „polecenie wykonania” (wartość podana initw wierszu poleceń jądra), jądro próbuje je uruchomić i spanikuje, jeśli nie może;
  • w ostateczności, jądro próbuje uruchomić /sbin/init, /etc/init, /bin/init, i /bin/sh; jeśli żadnego z nich nie da się uruchomić, panikuje .

Kiedy jest initramfs, wszystko to się tam dzieje, a wolumin docelowy nie jest montowany przez jądro. To, co dzieje się po uruchomieniu pierwszego initprogramu przez jądro (zazwyczaj /initskrypt w initramfs), zależy od programu, a nie od jądra. Argumenty, które nie zostały przekazane, initsą nadal dostępne, /proc/cmdlinejeśli /procsystem plików jest podłączony.

Stephen Kitt
źródło
Również trochę ciekawy, co jeśli init-in-the-initramfs jest plikiem ustawionym na inny niż root? Plik bez bitu wykonywalnego? Czy mimo to zostanie uruchomiony jako root? Co się stanie, jeśli jest uszkodzony ELF lub nie może znaleźć ld-linux.soELF lub zbyt głębokiego skryptu rekurencji lub czegoś po prostu nie można wykonać?
炸鱼 薯条 德里克
3
Jestem prawie pewien, że jądro nie ładuje programu określonego w „init =” z initramfs. Jeśli initramfs jest w użyciu, wydaje się, że działa normalnie przed uruchomieniem programu init określonego przez użytkownika (nie jestem pewien, czy robi to jądro, czy kod w initramfs).
płukanie
@ 炸鱼 薯条 德里克 Aby określić alternatywny program zamiast /inituruchamiania z ramdysku, można użyć rdinit=/path/toparametru rozruchu.
pizdelect
3

Przekazywanie niestandardowych argumentów jądra jest jednym ze sposobów dostosowania systemu podczas instalacji KickStart, na przykład serwer PXE może ustawić:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

gdzie labjest następnie używany w konfiguracji KickStart do robienia innych rzeczy niż w przypadku innych wersji systemu:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

Tutaj, aby ustawić inny układ systemu plików niż używany w innych typach systemów. Mamy nadzieję, że do lokalnych dostosowań używane są inne etykiety niż używane przez jądro, biorąc pod uwagę pojedynczą przestrzeń nazw.

gałązka
źródło