it-swarm-es.com

¿Qué es realmente `run-init`?

Hay una secuencia de comandos init en el disco RAM inicial durante el proceso de arranque. En la última operación, dice que:

# Chain to real filesystem
exec run-init ${rootmnt} ${init} "[email protected]" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."

Busco todos los scripts en el contenido de ramdisk, y no puedo encontrar ningún nombre de archivo o nombre de función como ese. ¿Cuál es el run-init en realidad?

3
naive231

run-init es un ejecutable binario, vive en/usr/lib/klibc/bin/run-init y en su initramfs y lo proporciona el paquete klibc-utils en Ubuntu No es un script, por lo que no puede echar un vistazo directamente al interior, puede consultar su código fuente ejecutando apt source klibc-utils o navegando por el repositorio ascendente en https://git.kernel.org/cgit/libs/ klibc/klibc.git .

Entonces, la función principal está en run-init.c , pero es solo un contenedor para la función run_init, que vive aquí en runinitlib.c

run_init hace mucho trabajo:

  1. Salta al nuevo sistema de archivos raíz
  2. Comprueba que este es el nuevo sistema de archivos raíz
  3. Comprueba si está en initramfs
  4. Limpia todo el directorio (¿por qué desperdiciar la RAM?)
  5. Monta el nuevo sistema de archivos raíz
  6. y ejecuta init en el nuevo sistema de archivos raíz

Creo que sería muy complicado hacer todo este trabajo mediante un script, debido a las dependencias, pero el archivo ejecutable binario puede hacerlo muy fácilmente.

6
rth

De acuerdo con dpkg-query es parte del paquete klibc-utils. Algunas excavaciones en el código fuente muestran una llamada a execv para iniciar el proceso de inicio en el sistema de archivos real. Si eso falla, run-init volverá, desencadenando así el panic en la última línea.

1
Drew McGowen

Ubuntu 14.04LTS En la carpeta vacía crea el archivo [get-it.sh]

#!/bin/sh

cp /boot/initrd* initrd.cpio.gz
mkdir initrd
cd initrd
zcat ../initrd.cpio.gz | cpio -di
find | grep run-init
cd ..

y ejecútelo: bash get-it.sh

el archivo run-init estará en ./bin/run-init

También puede obtener initrd desde el CD de instalación

0
Sergey Kovalev