web-dev-qa-db-fra.com

Qu'est-ce que `run-init` réellement?

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?

3
naive231

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:

  1. Il saute dans le nouveau système de fichiers racine
  2. Vérifie qu'il s'agit du nouveau système de fichiers racine
  3. Vérifie s'il est sur initramfs
  4. Nettoie tous les répertoires (pourquoi gaspiller la RAM?)
  5. Monte le nouveau système de fichiers racine
  6. et exécute init dans le nouveau système de fichiers racine

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.

6
rth

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.

1
Drew McGowen

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

0
Sergey Kovalev