Estoy tratando de depurar un guión de inicio en un sistema Linux; Estoy tratando de pasar init=/bin/sh
al kernel para que se inicie sh
sin iniciar init
para poder ejecutar la secuencia de inicio manualmente.
Lo que he encontrado es que el núcleo está comenzando de init
todos modos. Durante el arranque, uno de los mensajes de printk es la línea de comando, y eso muestra que la línea se está configurando correctamente; Además, puedo afectar otras cosas usando la línea de comando del núcleo. He comprobado para asegurarme de que el camino existe; lo hace.
Este es un sistema busybox, e init es un enlace simbólico a busybox; así que para asegurarme de que busybox no haga magia extraña cuando su PID es 1, también intenté ejecutar un programa que no sea busybox como init; eso tampoco funcionó. Parece que no importa lo que haga, init se ejecuta.
¿Qué podría estar causando este comportamiento?
init
? Es posible que simplemente estén ignorando la línea de comando ... es posible que desee examinar el initrd y ver qué están haciendo realmente los scripts.Respuestas:
Al mirar la fuente del kernel de Linux, veo que si el archivo / init existe, el kernel siempre intentará ejecutarlo suponiendo que se está iniciando un disco RAM. Verifique su sistema para ver si / init existe, si es así, entonces ese es probablemente su problema.
fuente
execute_command
primero, que proviene delinit=
parámetro de línea de comando del núcleo . Si no puede ejecutarlo, imprime una advertencia e intenta ejecutarseinit
en varias ubicaciones. Esto está eninit/main.c
la funcióninit_post()
. Miré a través de los mensajes printk del kernel y encontré la advertencia en la salida de mi kernel, así que ahora tengo que descubrir por qué no puede iniciar / bin / sh o cualquier otra cosa que intento iniciar.rdinit
Al parecer, debe usar al iniciar desde ramdisk: unix.stackexchange.com/a/430614/32558travesuras initrd
Si está utilizando initrd o initramfs, tenga en cuenta lo siguiente:
rdinit=
se usa en lugar deinit=
Si
rdinit=
no se da, los intentos de rutas predeterminadas son:/sbin/init
,/etc/init
,/bin/init
y/bin/sh
aunque no/init
Cuando no se usa initrd,
/init
es el primer camino que se intenta, seguido por los demás.v4.15 RTFS: todo está contenido dentro del archivo https://github.com/torvalds/linux/blob/v4.15/init/main.c .
Primero aprendemos que:
execute_comand
es lo que se pasa a:init=
ramdisk_execute_command
es lo que se pasa a:rdinit=
como se puede ver en:
donde
__setup
es una forma mágica de manejar los parámetros de la línea de comandos.start_kernel
, el "punto de entrada" del núcleo, llamarest_init
, que "llama"kernel_init
en un hilo:Entonces,
kernel_init
hace:y
kernel_init_freeable
hace:TODO: entiendo
sys_access
.También tenga en cuenta que hay más diferencias entre inits ram y no inits ram, por ejemplo, manejo de consola: ¿ Diferencia en la ejecución de init con initramfs incrustado versus externo?
fuente
En
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
Encontré:
Así que probablemente intente ridinit = / bin / sh
fuente
Puede personalizar su kernel de Linux y recompilarlo. Para el kernel 4.9, edite la función "kernel_init" en init / main.c e intente ejecutar primero la siguiente línea:
Además, podría deberse a los parámetros del kernel pasados por BootLoader.
fuente