Il y a un script init
dans le disque virtuel initial pendant le processus de démarrage. Lors de la dernière opération, il est indiqué que:
# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."
Je recherche tous les scripts dans le contenu du disque mémoire, et je ne trouve aucun nom de fichier ou de fonction comme celui-ci. En réalité, quel est le run-init
?
run-init
est un exécutable binaire, il réside dans/usr/lib/klibc/bin/run-init et dans votre initramfs et est fourni par le paquetage klibc-utils
dans Ubuntu. Ce n'est pas un script, vous ne pouvez donc pas y jeter un coup d'oeil directement, vous pouvez en vérifier le code source en exécutant apt source klibc-utils
ou en parcourant le référentiel en amont à partir de https://git.kernel.org/ cgit/libs/klibc/klibc.git .
Donc, la fonction principale est dans run-init.c , mais c'est juste un wrapper pour la fonction run_init
, qui réside ici dans runinitlib.c
run_init
fait beaucoup de travail:
Je crois qu'il serait très compliqué de faire tout ce travail avec un script, à cause des dépendances, mais un fichier exécutable binaire peut le faire très facilement.
Selon dpkg-query
cela fait partie du package klibc-utils
. Un peu de fouille dans le code source montre un appel à execv
pour démarrer le processus d’initialisation sur le système de fichiers réel. Si cela échoue, run-init
reviendra, déclenchant ainsi le panic
sur la dernière ligne.
Ubuntu 14.04LTS Dans un dossier vide, créez un fichier [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 ..
et lancez-le: bash get-it.sh
le fichier run-init sera dans ./bin/run-init
Aussi, vous pouvez obtenir initrd à partir du CD d'installation