¿Todos los argumentos del núcleo son realmente utilizados por el núcleo?


11

¿Por qué Linux permite 'init = / bin / bash'?

Leí esto, las respuestas dicen que es KERNEL el que ejecuta este programa init.

Entonces comencé a preguntarme, Linux generalmente viene con un initramfs, que eventualmente se montará y pivot_root en un sistema de archivos raíz real. Entonces, ¿qué significa este initargumento? El camino en el initramfs? O como supuse, no lo lee el núcleo sino el init de initramfs para ejecutar el init real.

Además, el root=UUID=xxxxargumento, ¿es eso realmente leído por el núcleo o simplemente por init de initramfs para encontrar el sistema de archivos raíz real?

Parece que puedo pasar cualquier argumento que quiera como argumentos del kernel, entonces, ¿son todos leídos por el kernel o al menos algunos de ellos solo son significativos para los programas de espacio de usuario?

Respuestas:


18

Los parámetros pasados ​​en la línea de comando del núcleo no tienen que ser significativos para el núcleo: la documentación de los parámetros del núcleo dice

El kernel analiza los parámetros desde la línea de comandos del kernel hasta "-"; si no reconoce un parámetro y no contiene un '.', el parámetro se pasa a init: los parámetros con '=' van al entorno de init, otros se pasan como argumentos de línea de comando a init. Todo después de "-" se pasa como un argumento a init.

Esto no se aplica inity rootque realmente son parámetros del núcleo, y son manejados por el núcleo. También pueden ser utilizados por el espacio de usuario, ya que aparecen en /proc/cmdline. (Así, por ejemplo, systemd tiene quieten cuenta el parámetro del núcleo para reducir su salida).

Cuando el kernel se inicia con un initramfs, el kernel rootno usa el initparámetro directamente, y el parámetro solo se usa si rdinitfalla. initel inicio se maneja en kernel_init, que funciona de la siguiente manera:

  • si hay un "comando de ejecución de ramdisk" (ya sea el valor dado rdiniten la línea de comando del núcleo, o /init) que es accesible, el núcleo intenta ejecutarlo;
  • si eso falla, y hay un "comando de ejecución" (el valor dado initen la línea de comando del kernel), el kernel intenta ejecutarlo y entra en pánico si no puede;
  • como último recurso, el núcleo intenta ejecutar /sbin/init, /etc/init, /bin/init, y /bin/sh; si ninguno de esos puede ejecutarse, entra en pánico .

Cuando hay un initramfs, todo esto sucede allí, y el volumen objetivo no está montado por el núcleo. Lo que sucede después de que el núcleo ejecuta el primer initprograma (normalmente, el /initscript en initramfs) depende del programa, no del núcleo. Los argumentos a los que no se pasa inittodavía están disponibles /proc/cmdlinesi el /procsistema de archivos está montado.


También un poco curioso, ¿qué pasa si init-in-the-initramfs es un archivo set-uid-non-root? ¿Un archivo sin bit ejecutable? ¿Se ejecutará como root de todos modos? ¿Qué pasa si está roto ELF o no puede encontrar ld-linux.soELF o una secuencia de comandos de recursión demasiado profunda o algo simplemente no puede ser ejecutable?
炸鱼 薯条 德里克

3
Estoy bastante seguro de que el kernel no carga el programa especificado en "init =" desde initramfs. Si un initramfs está en uso, parece que se ejecuta normalmente antes de que se ejecute el programa init especificado por el usuario (no estoy seguro de si es el núcleo el que hace esto o el código en initramfs).
plugwash

@ 炸鱼 薯条 德里克 Para especificar un programa alternativo en lugar de /inital arrancar desde un disco RAM , puede usar el rdinit=/path/toparámetro de arranque.
pizdelect

3

Pasar argumentos de kernel personalizados es una forma de personalizar un sistema durante una instalación de KickStart, por ejemplo, un servidor PXE podría establecer:

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

donde labse usa en la configuración de KickStart para hacer cosas diferentes que para otras compilaciones del sistema:

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

Aquí para configurar un diseño de sistema de archivos diferente al utilizado en otros tipos de sistemas. Esperemos que se usen etiquetas diferentes para las personalizaciones locales que las que usa el núcleo, dado el espacio de nombres único involucrado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.